以前写过一个类似的,今天修改了一下给你参考参考,应该能满足你的要求吧,支持一次运行重复选择排序关键字、重写数据、导出排序结果到文本文件等功能,不过算法可能不是很好,可以自己再修改修改,希望对你能有些帮助,另外请使用win-tc或者turbo c等纯c语言编辑器编译,c++的编译器会不支持里面的一些c语言的函数,代码如下
/*请使用win-tc或turbo c等纯c语言环境编译*/
/*dev c++或vc++不能识别程序中所用的某些c语言的函数*/
#include
#include
#include
main()
{
int i,j,key,n,tem0,tem1,a[100][2];
char b[5][10]={"chinese","English","chemistry","physics","total"}; /*名称数组*/
struct stu /*定义结构体,包含学生姓名!成绩等星信息*/
{
char name[20]; /*姓名*/
int course[5]; /*储存成绩*/
};
struct stu num[100]; /*预先定义100人,看具体情况*/
time_t timep; /*此处是为了获取当前时间*/
struct tm *p;
textbackground(2); /*修改背景色*/
textcolor(15); /*修改文本颜色,使界面美观*/
Y: /*标记跳转位置*/
clrscr(); /*清屏,使颜色设置生效*/
printf("How many students? ");
scanf("%d",&n); /*n来记录总共的记录条数*/
printf("----------------------------------------------------------------------"); /*打印一条分割线,使信息层次清晰*/
printf("\nInput the infomation\n");
printf("example:Jerry 85 78 92 81\n");
printf("----------------------------------------------------------------------");
printf("\nname chinese English chemistry physics\n"); /*此处为输入样例,姓名+四门成绩,中间空格隔开*/
for(i=0;i { scanf("%s%d%d%d%d",&num[i].name,&num[i].course[0],&num[i].course[1],&num[i].course[2],&num[i].course[3]); /*存储数据*/ num[i].course[4]=num[i].course[0]+num[i].course[1]+num[i].course[2]+num[i].course[3]; } printf("----------------------------------------------------------------------\n"); /*标记跳转位置*/ X: printf("What do you want to sort by?\n1:chinese 2:English 3:chemistry 4:physics 5:total "); /*选择排序关键字*/ scanf("%d",&key); for(i=0;i { a[i][0]=num[i].course[key-1]; /*引入中间二维数组a来实现排序,a[i][0]临时存储要排序的成绩,a[i][1]记录编号与之对应*/ a[i][1]=i; } for(i=0;i { for(j=n-1;j>=i;j--) { if(a[j][0]>a[j-1][0]) /*最基本的冒泡法*/ { tem0=a[j][0]; tem1=a[j][1]; a[j][0]=a[j-1][0]; a[j][1]=a[j-1][1]; a[j-1][0]=tem0; a[j-1][1]=tem1; } } } printf("----------------------------------------------------------------------"); printf("\nYou chose to sort by %s:\n",b[key-1]); /*打印结果*/ printf("----------------------------------------------------------------------"); printf("\nranking name chinese English chemistry physics total\n"); for(i=0;i { printf("%3d %5s %3d %3d %3d %3d %4d\n",i+1,num[a[i][1]].name,num[a[i][1]].course[0],num[a[i][1]].course[1],num[a[i][1]].course[2],num[a[i][1]].course[3],num[a[i][1]].course[4]); } printf("----------------------------------------------------------------------\n"); Z: /*标记跳转位置*/ /*经过冒泡之后a[i][1]存入的就是排序后的顺序了*/ printf("What do want't to do now?\n1.Continue 2.Clear and continue 3.Export 4.New 5.Quit "); scanf("%d",&tem0); /*选择接下来要做什么1:继续选择其他关键字排序2:清屏之后继续排序3:导出当前数据到文本文件4:覆盖当前数据,输入一组新的数据5:退出*/ printf("----------------------------------------------------------------------\n"); if(tem0==1) goto X; /*跳转到标记位置继续运行程序*/ if(tem0==2) { clrscr(); goto X; } /*清屏之后跳转到标记位置继续运行程序*/ if(tem0==3) { FILE *fp = fopen("result.txt", "a"); /*以追加方式打开result.txt文件,如果不存在则创建*/ if(!fp) { printf("\ncreate and open file failed\n"); getch(); return; } time(&timep); p=localtime(&timep); fprintf(fp,"----------------------------------------------------------------------\n"); fprintf(fp,"%d-%02d-%02d ",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday); /*向文件内写入当前系统时间,格式如同2011-01-09 18:28:03*/ fprintf(fp,"%02d:%02d:%02d ",p->tm_hour,p->tm_min,p->tm_sec); fprintf(fp,"sort by %s:\n",b[key-1]); /*向文件内写入当前排序数据*/ fprintf(fp,"ranking name chinese English chemistry physics total\n"); for(i=0;i { fprintf(fp,"%3d %5s %3d %3d %3d %3d %4d\n",i+1,num[a[i][1]].name,num[a[i][1]].course[0],num[a[i][1]].course[1],num[a[i][1]].course[2],num[a[i][1]].course[3],num[a[i][1]].course[4]); } fprintf(fp,"----------------------------------------------------------------------\n"); fprintf(fp,"\n"); fclose(fp); printf("The data has been exported to RESULT.TXT Successfully!\n"); printf("----------------------------------------------------------------------\n"); goto Z; } if(tem0==4) { clrscr(); goto Y; } /*清屏之后跳转到标记位置继续运行程序*/ }