您的位置:首页 > 其它

(二)根据条件进行学生成绩排名

2016-01-02 13:04 246 查看
题目:在函数中进行 10个学生成绩从高到低排名, 再改进函数, 进行 n个学生成绩从高到低排名, 排名方式根据函数的style参数进行,如style为‘a'按升序排,style为 ' d ' 按降序排。 ( a:ascending 升,d:descending 降)


编写多个不同函数,使之能实现不同的排序算法(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: