问题描述:
按成绩输出名次:
给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法:
- 按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次;
- 按名次列出每个学生的姓名与分数。
设计要求:
首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。
主控菜单设计要求:
程序运行后,显示一个标题“学生成绩排序”,给出6个菜单项的内容和输入提示:
- 输入学生数、学生姓名及成绩
- 用直接插入排序输出名次
- 用快速排序输出名次
- 用选择排序输出名次
- 用希尔排序输出名次
- 退出
请选择菜单1--6:
功能要求:
完成各菜单的功能,并能正确显示编码内容
- 初始化:从终端输入学生人数 n ,以及 n 个学生的姓名和 成绩,存入一个结构数组中。
- 排序:利用已输入n个成绩,用所要求的排序算法排序,保存排序结果。
- 输出:按名次输出学生的姓名及成绩。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 //学生信息结构定义 typedef struct{ char name[20]; int score; }Student; //顺序表的结构定义 typedef struct{ Student r[MAXSIZE+1]; int length; }SqList; //直接插入排序 void InsertSort(SqList &L) { int i,j; for(i=2;i<L.length;++i){ if(L.r[i].score>L.r[i-1].score){ L.r[0]=L.r[i]; for(j=i-1;L.r[j].score<L.r[0].score;--j) L.r[j+1]=L.r[j]; L.r[j+1]=L.r[0]; } } } //快速排序 int Partition(SqList &L,int low,int high) { int pivotkey=L.r[low].score; L.r[0]=L.r[low]; while(low<high) { while(low<high && L.r[high].score<=pivotkey) --high; L.r[low]=L.r[high]; while(low<high&&L.r[low].score>=pivotkey) ++low; L.r[high]=L.r[low]; } L.r[low]=L.r[0]; return low; } void QSort(SqList &L,int low,int high) { if(low<high) { int pivotloc; pivotloc=Partition(L,low,high); QSort(L,high,pivotloc-1); QSort(L,pivotloc+1,low); } } void QuickSort(SqList &L) { QSort(L,1,L.length); } //选择排序 void SelectSort(SqList &L) { int k,i,j; for (i=1;i<L.length;++i){ k=i; for(j=i+1;j<=L.length;++j) { if(L.r[k].score<L.r[j].score) k=j; } if (k != i) { Student temp = L.r[i]; L.r[i] = L.r[k]; L.r[k] = temp; } } } //希尔排序 void ShellInsert(SqList &L,int dk) { int i,j; for(i=dk+1;i<=L.length;++i) if(L.r[i].score>L.r[i-dk].score) { L.r[0]=L.r[i]; for(j=i-dk;j>0&&L.r[0].score>L.r[j].score;j-=dk) L.r[j+dk]=L.r[j]; L.r[j+dk]=L.r[0]; } } void ShellSort(SqList &L,int dlta[],int t) { int k; for(k=0;k<t;++k) ShellInsert(L,dlta[k]); } //输出 void Print(SqList *L) { int temp=1,index=0,i; printf("成绩排名如下:\n"); printf("名次\t姓名\t成绩\n"); for(i=1;i<=L->length;i++) { printf("%d\t%s\t%d\n",temp,L->r[i].name,L->r[i].score); if(i<L->length && L->r[i].score==L->r[i+1].score) index++; else{ temp=temp+index+1; index=0; } } } //主函数 int main() { int choice,i; SqList *L = (SqList*)malloc(sizeof(SqList)); printf("**********学生成绩排序**********\n"); printf("1.输入学生数、学生姓名及成绩:\n"); printf("2.用直接插入排序输出名次:\n"); printf("3.用快速排序输出名次:\n"); printf("4.用选择排序输出名次:\n"); printf("5.用希尔排序输出名次:\n"); printf("6.退出\n"); printf("********************************\n"); while(choice) { printf("请选择菜单1--6:\n"); scanf("%d",&choice); if(choice>6||choice<=0) { printf("您输入的数据有误!\n"); return 0; } while(choice<=6) { if(choice==1) { printf("请输入学生数:\n"); scanf("%d",&L->length); printf("请输入学生姓名及成绩:\n"); for(i=1;i<=L->length;i++){ getchar(); scanf("%s %d",L->r[i].name,&L->r[i].score); } getchar(); break; } if(choice==2) { printf("用直接插入排序输出名次:\n"); InsertSort(*L); Print(L); break; } if(choice==3) { printf("用快速排序输出名次:\n"); QuickSort(*L); Print(L); break; } if(choice==4) { printf("用选择排序输出名次:\n"); SelectSort(*L); Print(L); break; } if(choice==5) { printf("用希尔排序输出名次:\n"); int dt[]={5,3,1}; ShellSort(*L,dt,3); Print(L); break; } if(choice==6) { printf("退出\n"); return 0; } } } }
运行结果: