(二)根据条件进行学生成绩排名
2016-01-02 13:04
246 查看
题目:在函数中进行 10个学生成绩从高到低排名, 再改进函数, 进行 n个学生成绩从高到低排名, 排名方式根据函数的style参数进行,如style为‘a'按升序排,style为 ' d ' 按降序排。 ( a:ascending 升,d:descending 降)
编写多个不同函数,使之能实现不同的排序算法(3种以上),再编写一个通用输出函数,(要求用函数指针做参数)能分别打印不同排序算法的结果。
这是大二的课程设计题目。虽然代码和算法是简单的,但通过这个机会粗略地学习了人机交互,自己在界面和排版上花些功夫。
编写多个不同函数,使之能实现不同的排序算法(3种以上),再编写一个通用输出函数,(要求用函数指针做参数)能分别打印不同排序算法的结果。
这是大二的课程设计题目。虽然代码和算法是简单的,但通过这个机会粗略地学习了人机交互,自己在界面和排版上花些功夫。
#include "stdio.h" #include "windows.h" #define NUM 10 int sort1(int a[NUM]) //用选择法排序输入的10个数,从高到低 { int i,j,t,temp; for(i=0;i<NUM;i++) { t=0; for(j=1;j<NUM-i;j++) { if(a[t]>a[j]) t=j; //t存放 比较小 的数的下标 } if(a[NUM-i-1]!=a[t])//下标t对应的数放在 没排好序的数组最后一个 { temp=a[NUM-i-1]; a[NUM-i-1]=a[t]; a[t]=temp; } } return 1; } int sort2(int a[],int n)//为sort1改版,进行n个学生成绩从高到低排名 { int i,j,t,temp; for(i=0;i<n;i++)//用选择法排序前n个数 { t=0; for(j=1;j<n-i;j++) { if(a[t]>a[j]) t=j; //t存放 比较小 的数的下标 } if(a[n-i-1]!=a[t])//下标t对应的数放在 没排好序的数组最后一个 { temp=a[n-i-1]; a[n-i-1]=a[t]; a[t]=temp; } } return 1; } int sort3(int a[],int n,char style)//将n个学生成绩从高到低排名 { //排名方式根据sort()函数的style参数进行, int i,j,t,temp; //如style为‘a’按升序排,style为’d’按降序排。 switch(style) { case 'a'://style为'a'按升序排,即从小到大 { for(i=0;i<n;i++)//用选择法排序前n个数 { t=0; for(j=1;j<n-i;j++) { if(a[t]<a[j]) t=j; //t存放 比较大 的数的下标 } if(a[n-i-1]!=a[t])//下标t对应的数放在 没排好序的数组最后一个 { temp=a[n-i-1]; a[n-i-1]=a[t]; a[t]=temp; } } break; } case 'd'://style为'd'按降序排,即从大到小 { for(i=0;i<n;i++)//用选择法排序前n个数 { t=0; for(j=1;j<n-i;j++) { if(a[t]>a[j]) t=j; //t存放 比较小 的数的下标 } if(a[n-i-1]!=a[t])//下标t对应的数放在 没排好序的数组最后一个 { temp=a[n-i-1]; a[n-i-1]=a[t]; a[t]=temp; } } break; } default: break; } return 1; } int *bubble_a(int a[],int n)//升序的冒泡法,从小到大 { int i,j,t; for(i=0;i<n-1;i++) { for(j=0;j<n-i-1;j++) if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } return a; } int *bubble_d(int a[],int n)//降序的冒泡法,从大到小 { int i,j,t; for(i=0;i<n-1;i++) { for(j=0;j<n-i-1;j++) if(a[j]<a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } return a; } int *sort_d(int a[],int n)//降序的选择法,即从大到小 { int i,j,t,temp; for(i=0;i<n;i++)//用选择法排序输入的10个数 { t=0; for(j=1;j<n-i;j++) { if(a[t]>a[j]) t=j; //t存放比较 小 的数的下标 } if(a[n-i-1]!=a[t])//下标t对应的数放在 没排好序的数组最后一个 { temp=a[n-i-1]; a[n-i-1]=a[t]; a[t]=temp; } } return a; } int *sort_a(int a[],int n)//升序的选择法,即从小到大 { int i,j,t,temp; for(i=0;i<n;i++)//用选择法排序输入的10个数 { t=0; for(j=1;j<n-i;j++) { if(a[t]<a[j]) t=j; //t存放比较 大 的数的下标 } if(a[n-i-1]!=a[t])//下标t对应的数放在 没排好序的数组最后一个 { temp=a[n-i-1]; a[n-i-1]=a[t]; a[t]=temp; } } return a; } int main() { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); int i,choose,n; int a[NUM],b[NUM];//为了下面的循环演示的方便,将a数组的值存在b数组中。 int *bb; //注:如不需演示,b数组不必建立(因为会消费额外的内存空间) char style; system("mode con cols=100 lines=50");//设置窗口大小 SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//字体颜色 printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 输入10个学生成绩 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); for(i=0;i<NUM;i++) { printf(" "); scanf("%d",&a[i]); b[i]=a[i]; //用b数组存储a数组的初始值,方便找回原先输入的顺序 } /*不断循环菜单,执行相关操作*/ do{ printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃将运行show(int a[],int n,int *(*fun)(a[],int n))函数┃\n"); printf(" ┃ 输入对应的数字,选择你要运行的函数: ┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃1.sort(int a[10])------->10个学生成绩从高到低排名 ┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃2.sort(int a[],int n)---->n个学生成绩从高到低排名 ┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃3.sort(int a[],int n,char style)-->根据style参数排名┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃4.*bubble_a(int a[],int n)-------->升序的冒泡法 ┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃5.*bubble_d(int a[],int n)-------->降序的冒泡法 ┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃6.*sort_a(int a[],int n)---------->升序的选择法 ┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃7.*sort_d(int a[],int n)---------->降序的选择法 ┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃8.直接输出当前数组 ┃\n"); printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃其他数字:退出 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf(" "); scanf("%d",&choose);//选择菜单 system("cls");//清屏 bb=a; switch(choose)//根据选择的数执行相关的函数和操作,其中指针bb指向运行后的数组 { case 1://运行sort(int a[10]) { SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃运行sort(int a[10])0个学生成绩从高到低排名 ┃\n"); printf(" ┗━━━┳━━━━━━━━━━━━━━━┳━━━┛\n"); printf(" ┃ 运行结果为 ┃ \n"); printf(" ┗━━━━━━━━━━━━━━━┛ \n"); printf(" "); sort1(a); bb=a; for(i=0;i<NUM;i++) printf("%5d",bb[i]); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); printf("\n"); break; } case 2://运行sort(int a[],int n) { printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃运行sort(int a[],int n)成绩从高到低排名 ┃\n"); printf(" ┗━━━┳━━━━━━━━━━━━━━━┳━━━┛\n"); printf(" ┃ 输入 形参 n 的值 ┃ \n"); printf(" ┗━━━━━━━━━━━━━━━┛ \n"); do { printf(" "); printf("请输入n的值:"); scanf("%d",&n); //检测n是否合法 getchar(); if(n>NUM ||n<1) { printf("请输入1~%d的一个数\n",NUM); } }while(n>NUM ||n<1); sort2(a,n);//运行sort(int a[],int n) /*输出排序后的数组*/ bb=a; SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行结果为 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); for(i=0;i<n;i++) printf("%5d",bb[i]); printf("\n"); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); break; } case 3: { printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃运行sort(int a[],int n,char style)由style排名 ┃\n"); printf(" ┗━━━┳━━━━━━━━━━━━━━━┳━━━┛\n"); printf(" ┃ 输入n,style的值 ┃ \n"); printf(" ┗━━━━━━━━━━━━━━━┛ \n"); do { printf(" "); printf("请输入n的值:"); scanf("%d",&n); //检测n是否合法 getchar(); if(n>NUM ||n<1) { printf("请输入1~%d的一个数\n",NUM); } }while(n>NUM ||n<1); do { printf(" "); printf("请输入style的值:"); style=getchar(); getchar(); if(style !='a' && style!='d') { printf("请输入a或d\n"); } }while(style!='a' && style!='d'); sort3(a,n,style);//运行sort(int a[],int n,char style) /*输出排序后的数组*/ bb=a; SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行结果为 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); for(i=0;i<n;i++) printf("%5d",bb[i]); printf("\n"); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); break; } case 4: { printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行*bubble_a(int a[],int n)升序的冒泡法 ┃\n"); printf(" ┗━━━┳━━━━━━━━━━━━━━━┳━━━┛\n"); printf(" ┃ 输入 形参 n 的值 ┃ \n"); printf(" ┗━━━━━━━━━━━━━━━┛ \n"); do { printf(" "); printf("请输入n的值:"); scanf("%d",&n); //检测n是否合法 getchar(); if(n>NUM ||n<1) { printf("请输入1~%d的一个数\n",NUM); } }while(n>NUM ||n<1); bb=bubble_a(a,n);//运行*bubble_a(int a[],int n) /*输出排序后的数组*/ SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行结果为 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); for(i=0;i<n;i++) printf("%5d",bb[i]); printf("\n"); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); break; } case 5: { printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行*bubble_d(int a[],int n)降序的冒泡法 ┃\n"); printf(" ┗━━━┳━━━━━━━━━━━━━━━┳━━━┛\n"); printf(" ┃ 输入 形参 n 的值 ┃ \n"); printf(" ┗━━━━━━━━━━━━━━━┛ \n"); do { printf(" "); printf("请输入n的值:"); scanf("%d",&n); //检测n是否合法 getchar(); if(n>NUM ||n<1) { printf("请输入1~%d的一个数\n",NUM); } }while(n>NUM ||n<1); bb=bubble_d(a,n);//运行*bubble_d(int a[],int n) /*输出排序后的数组*/ SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行结果为 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); for(i=0;i<n;i++) printf("%5d",bb[i]); printf("\n"); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); break; } case 6: { printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行*sort_a(int a[],int n)升序的选择法 ┃\n"); printf(" ┗━━━┳━━━━━━━━━━━━━━━┳━━━┛\n"); printf(" ┃ 输入 形参 n 的值 ┃ \n"); printf(" ┗━━━━━━━━━━━━━━━┛ \n"); do { printf(" "); printf("请输入n的值:"); scanf("%d",&n); //检测n是否合法 getchar(); if(n>NUM ||n<1) { printf("请输入1~%d的一个数\n",NUM); } }while(n>NUM ||n<1); bb=sort_a(a,n);//运行*sort_a(int a[],int n) /*输出排序后的数组*/ SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行结果为 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); for(i=0;i<n;i++) printf("%5d",bb[i]); printf("\n"); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); break; } case 7: { printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行*sort_d(int a[],int n) 降序的选择法 ┃\n"); printf(" ┗━━━┳━━━━━━━━━━━━━━━┳━━━┛\n"); printf(" ┃ 输入 形参 n 的值 ┃ \n"); printf(" ┗━━━━━━━━━━━━━━━┛ \n"); do { printf(" "); printf("请输入n的值:"); scanf("%d",&n); //检测n是否合法 getchar(); if(n>NUM ||n<1) { printf("请输入1~%d的一个数\n",NUM); } }while(n>NUM ||n<1); bb=sort_d(a,n);//运行*sort_d(int a[],int n) /*输出排序后的数组*/ SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 运行结果为 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); for(i=0;i<n;i++) printf("%5d",bb[i]); printf("\n"); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); break; } case 8: { //直接输出当前数组 SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 直接输出当前数组运行 ┃\n"); printf(" ┗━━━┳━━━━━━━━━━━━━━━┳━━━┛\n"); printf(" ┃ 运行结果为 ┃ \n"); printf(" ┗━━━━━━━━━━━━━━━┛ \n"); for(i=0;i<NUM;i++) printf("%5d",bb[i]); printf("\n"); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); break; } default:break; } for(i=0;i<NUM;i++) a[i]=b[i];//为了在次演示,把a还原为最初输入的数组 printf("\n"); printf("\n"); printf("\n"); }while(choose>0 && choose<9); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY); printf("结束\n"); printf("程序来自13计算机2黄耿霖\n"); return 0; }
相关文章推荐
- 压缩文件处理(第三方解压缩框架——SSZipArchive)
- mini2440驱动奇谭——ADC驱动与測试(动态挂载驱动)
- 一起来用Kaldi
- ubuntu15.04 opencv3.1.0 qt creator环境配置
- Python标准库13 循环器 (itertools)
- Windows7下配置MinGW+CodeBlocks+OpenCV2.3.1
- 运维的基本思想
- POJ 2486 树形DP
- 电脑爱好者GHOSTWIN7纯净版v2.0
- C# HEX字符串转HEX值的方法
- centos7搭建LAMP平台环境
- SVM学习笔记(二)----手写数字识别
- 关于C++的const
- c#小结(4)---面向对象
- W5500EVB TCP Client模式设置说明
- Spring 学习笔记 2. 尚硅谷_佟刚_Spring_IOC&DI概述
- VS2015代码自动对齐
- 获取手机上已安装应用信息
- 如何获取Java层的函数在Dalvik中对应的Method?
- Android登陆界面实现-支持输入框清楚和震动效果功能