/*4. 定义一个结构体数组,存放10个学生的学号,姓名,三门课的成绩,编写一程序。应用简单菜单和子函数调用方式实现下面的功能:
(1)从键盘输入10个学生的以上内容,存入文件stud.txt
(2)浏览显示成绩表(要求显示格式成绩时,格式较规范)
(3)将10个学生按照平均分数从高到低进行排序,结果存入文件stud1.txt (4)输入任意的一个课程名,分数从高到低进行排序,结果存入文件stud2.txt (5)向文件stud1.txt中插入一个记录,成绩排序不变,结果存入文件stud1.txt */
#include "stdio.h" /*头文件名*/
#include "stdlib.h" /*头文件名,因为程序中用到了exit(结束程序)和函数*/ #include "string.h" /*头文件名,因为程序中用到了字符串函数*/
#define N 1000
/******************************************************************** *****************************/
/*****************************************定义结构体模块******************************************/
struct student {
long num; /*定义学生学号为长整型*/
char name[20]; /*定义姓名为字符型,占12个字符*/
float math,English,physics,total,average;
float TOT_math,TOT_English,TOT_physics,TOT_total,TOT_aver;
float aver_math,aver_English,aver_physics,aver_total,aver_average;
}student; /*定义结构体名称为student*/
/******************************************************************** *****************************/
/****************************************输入初始值模块*******************************************/
void input(struct student *p,int size){
int i;
for(i=0;i printf("请输入学号:"); while(1){scanf("%ld",&p[i].num); if(long(p[i].num)!=p[i].num||long(p[i].num)<=0){ /*输入判断*/ printf("输入错误,学号必须为整数,请重新输入: "); fflush(stdin);} else{break;}} printf("请输入姓名:");scanf("%s",p[i].name); printf("请输入数学成绩:"); while(1){scanf("%f",&p[i].math); if(float(p[i].math)!=p[i].math||float(p[i].math)<=0||p[i].math>100||p[i].math <0){ printf("输入错误,数学成绩必须为0~100之间的数,请重新输入: "); fflush(stdin);} else{break;}} printf("请输入英语成绩:"); while(1){scanf("%f",&p[i].English); if(float(p[i].English)!=p[i].English||float(p[i].English)<=0||p[i].English>100||p[i ].English<0){ printf("输入错误,英语成绩必须为0~100之间的数,请重新输入: "); fflush(stdin); } else{break;}} printf("请输入物理成绩:"); while(1){scanf("%f",&p[i].physics); if(float(p[i].physics)!=p[i].physics||float(p[i].physics)<=0||p[i].physics>100||p[ i].physics<0){ printf("输入错误,英语成绩必须为0~100之间的数,请重新输入: "); fflush(stdin);} else{break;}} printf("\n"); } printf("信息录入成功!\n\n"); } /******************************************************************** ****************************************/ /*************************************保存初始值到"初始二进制值.txt"模块*************************************/ void save(struct student *p,int size){ /*保存模块*/ FILE *fp;int i; if((fp=fopen("初始值二进制值.txt","wb+"))==NULL){ /*建立文件*/ printf("cannot open the file\n"); } for(i=0;i fwrite(&p[i],sizeof(student),1,fp);} /*快写函数,写到磁盘中为二进制数*/ fclose(fp); /*关闭文件*/ } /******************************************************************** ****************************************/ /*************************************保存初始值到"初始二进制值.txt"模块*************************************/ void save0(struct student *p,int size){ /*保存模块*/ FILE *fp;int i; if((fp=fopen("初始值二进制值1.txt","ab+"))==NULL){ /*建立文件*/ printf("cannot open the file\n"); } for(i=0;i fwrite(&p[i],sizeof(student),1,fp);} /*快写函数,写到磁盘中为二进制数*/ fclose(fp); /*关闭文件*/ } /******************************************************************** ****************************************/ /******************************************保存初始值到可浏览文件模块****************************************/ void SAVE(struct student *p,int size){ FILE *fp; int i,b=0; char name[20]; printf("请输入保存初始值的可浏览文件名: "); scanf("%s",name); if((fp=fopen(name,"w+"))==NULL){ printf("文件名输入错误!!\n"); } fprintf(fp,"\n\t\t----------------------------------------------------------\n"); fprintf(fp,"\t\t序号学号姓名数学英语物理\n"); fprintf(fp,"\t\t----------------------------------------------------------"); fprintf(fp,"\n" ); for(i=0;i fprintf(fp,"\t\t %-6d%-12d%-12s%-8.2f%-8.2f%-8.2f\n",b,p[i].num,p[i].name,p[ i].math,p[i].English,p[i].physics); fprintf(fp,"\t\t----------------------------------------------------------\n"); } fclose(fp); printf("\n文件保存成功!\n\n"); } /******************************************************************** ****************************************/ /******************************************读取初始值模块****************************************************/ int read(struct student *p,int size){ FILE *fp;int i,n=0; if((fp=fopen("初始值二进制值.txt","rb+"))==NULL){ printf("文件名输入错误!!\n");} for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0){n++;}} fclose(fp); return n; } /******************************************************************** ****************************************/ /******************************************读取输出初始值模块************************************************/ void read_print(struct student *p,int size){ FILE *fp;int i,n=0,b=0; if((fp=fopen("初始值二进制值.txt","rb+"))==NULL){ printf("文件名输入错误!!\n"); } printf("\n\t\t----------------------------------------------------------\n"); printf("\t\t序号学号姓名数学英语物理\n"); printf("\t\t----------------------------------------------------------\n"); for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0){n++;}} for(i=0;i printf("\t\t %-6d%-12d%-12s%-8.2f%-8.2f",b,p[i].num,p[i].name,p[i].math,p[i]. English); printf("%-8.2f\n",p[i].physics); printf("\t\t----------------------------------------------------------\n"); } printf("\n\n"); fclose(fp); } /******************************************************************** ****************************************/ /*********************************************计算总分和平均分模块 *******************************************/ void total_average(struct student *p,int size){ /*求每位同学的总分和平均分模块*/ int i; for(i=0;i p[i].total=p[i].math+p[i].English+p[i].physics; /*每个同学的总分等于三科成绩之和*/ p[i].average=p[i].total/3; /*每个同学的平均分等于总分的1/3*/ } } /******************************************************************** ****************************************/ /**************************************输出初始值总分和平均分模块*******************************************/ void read_print1(struct student *p,int size){ void total_average(struct student *p,int size); FILE *fp;int i,n=0,b=0; if((fp=fopen("初始值二进制值.txt","rb+"))==NULL){ printf("文件名输入错误!!\n"); } printf("\n\t---------------------------------------------------------------------------\n"); printf("\t序号学号姓名数学英语物理总分平均分\n"); printf("\t---------------------------------------------------------------------------\n"); for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0){n++;}} total_average(p,n); for(i=0;i printf("\t %-6d%-12d%-12s%-8.2f%-8.2f",b,p[i].num,p[i].name,p[i].math,p[i].E nglish); printf("%-8.2f%-10.2f%-8.2f\n",p[i].physics,p[i].total,p[i].average); printf("\t---------------------------------------------------------------------------\n"); } printf("\n\n"); fclose(fp); } /******************************************************************** ****************************************/ /***************************************将初始值按平均分排序模块*********************************************/ void range(struct student *p,int size){ /*所有同学的成绩按平均分由高到低排序模块*/ int i,j,k; struct student temp; /*定义一个student类型的变量备用*/ for(i=0;i k=i; for(j=i+1;j if(p[k].average temp=p[k]; p[k]=p[j]; p[j]=temp;} } } /******************************************************************** ****************************************/ /************************************输出初始值按平均分排序的结果模块****************************************/ int read_print2(struct student *p,int size){ void total_average(struct student *p,int size); void range(struct student *p,int size); FILE *fp;int i,n=0,b=0; if((fp=fopen("初始值二进制值.txt","rb+"))==NULL){ printf("文件名输入错误!!\n"); } printf("\n\t---------------------------------------------------------------------------\n"); printf("\t学号姓名数学英语物理总分平均分名次\n"); printf("\t---------------------------------------------------------------------------\n"); for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0){n++;}} total_average(p,n); range(p,n); for(i=0;i printf("\t%-12d%-12s%-8.2f%-8.2f",p[i].num,p[i].name,p[i].math,p[i].English); printf("%-8.2f%-10.2f%-8.2f %d\n",p[i].physics,p[i].total,p[i].average,b); printf("\t---------------------------------------------------------------------------\n"); } printf("\n\n"); fclose(fp); return n; } /******************************************************************** ****************************************/ /********************保存初始值按平均分排序后结果到"初始值按平均分排序二进制值.txt"模块**********************************/ void save1(struct student *p,int size){ /*保存模块*/ FILE *fp;int i; if((fp=fopen("按平均分排序二进制值.txt","wb+"))==NULL){ /*建立文件*/ printf("cannot open the file\n"); } for(i=0;i fwrite(&p[i],sizeof(student),1,fp);} /*快写函数,写到磁盘中为二进制数*/ fclose(fp); /*关闭文件*/ } /******************************************************************** ****************************************/ /******************************************读取排序后结果模块************************************************ int read1(struct student *p,int size){ FILE *fp;int i,n=0; if((fp=fopen("按平均分排序二进制值.txt","r+"))==NULL){ printf("文件名输入错误!!\n");} for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0){n++;}} fclose(fp); return n; } /******************************************************************** ****************************************/ /*******************************保存初始值按平均分排序后结果到可浏览文件模块*********************************/ void SAVE1(struct student *p,int size){ FILE *fp; int i,b=0; char name[20]; printf("请输入保存排序结果的文件名: "); scanf("%s",name); if((fp=fopen(name,"w+"))==NULL){ printf("文件名输入错误!!\n"); } fprintf(fp,"\n\t---------------------------------------------------------------------------\n"); fprintf(fp,"\t学号姓名数学英语物理总分平均分名次\n"); fprintf(fp,"\t---------------------------------------------------------------------------\n"); fprintf(fp,"\n" ); for(i=0;i fprintf(fp,"\t%-12d%-12s%-8.2f%-8.2f",p[i].num,p[i].name,p[i].math,p[i].Englis h); fprintf(fp,"%-8.2f%-10.2f%-8.2f %d\n",p[i].physics,p[i].total,p[i].average,b); fprintf(fp,"\t---------------------------------------------------------------------------\n"); } fclose(fp); printf("\n文件保存成功!\n\n"); } /******************************************************************** ****************************************/ /***********************************************科目选择模块*************************************************/ int choose(){ system("color B1 "); system("cls"); printf("\n\t************请选择按成绩从高到低排序的科目******************\n\n"); printf("\t\t\t查看数学成绩排序请输入(数学)\n\n"); printf("\t\t\t查看英语成绩排序请输入(英语)\n\n"); printf("\t\t\t查看物理成绩排序请输入(物理)\n\n"); printf("\t=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t请输入科目名称: "); int a; char str1[]="数学",str2[]="英语",str3[]="物理"; char str[20]; scanf("%s",str); if(strcmp(str1,str)==0){a=1;} else{if(strcmp(str2,str)==0){a=2;} else{if(strcmp(str3,str)==0){a=3;} else{printf("\n输入错误,请重新输入!!\n\n"); system("pause");}} } return(a); } /******************************************************************** ****************************************/ /*******************************所有同学的成绩按数学成绩由高到低排序模块*************************************/ void range1(struct student *p,int size){ int i,j,k; struct student temp; for(i=0;i k=i; for(j=i+1;j if(p[k].math temp=p[k]; p[k]=p[j]; p[j]=temp;} } } /******************************************************************** ****************************************/ /*******************************所有同学的成绩按英语成绩由高到低排序模块*************************************/ void range2(struct student *p,int size){ int i,j,k; struct student temp; for(i=0;i k=i; for(j=i+1;j if(p[k].English temp=p[k]; p[k]=p[j]; p[j]=temp;} } } /******************************************************************** ****************************************/ /*******************************所有同学的成绩按物理成绩由高到低排序模块*************************************/ void range3(struct student *p,int size){ int i,j,k; struct student temp; for(i=0;i k=i; for(j=i+1;j if(p[k].physics temp=p[k]; p[k]=p[j]; p[j]=temp;} } } /******************************************************************** ****************************************/ /****************************************输出按数学科目排序结果模块*****************************************/ int read_print31(struct student *p,int size){ void total_average(struct student *p,int size); void range1(struct student *p,int size); FILE *fp;int i,n=0,b=0; if((fp=fopen("按平均分排序二进制值.txt","rb+"))==NULL){ printf("文件名输入错误!!\n"); } printf("\n\t---------------------------------------------------------------------------\n"); printf("\t学号姓名数学英语物理总分平均分名次\n"); printf("\t---------------------------------------------------------------------------\n"); for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0){n++;}} total_average(p,n); range1(p,n); for(i=0;i printf("\t%-12d%-12s%-8.2f%-8.2f",p[i].num,p[i].name,p[i].math,p[i].English); printf("%-8.2f%-10.2f%-8.2f %d\n",p[i].physics,p[i].total,p[i].average,b); printf("\t---------------------------------------------------------------------------\n"); } printf("\n\n"); fclose(fp); return n; } /******************************************************************** ****************************************/ /****************************************输出按英语科目排序结果模块*****************************************/ int read_print32(struct student *p,int size){ void total_average(struct student *p,int size); void range2(struct student *p,int size); FILE *fp;int i,n=0,b=0; if((fp=fopen("按平均分排序二进制值.txt","rb+"))==NULL){ printf("文件名输入错误!!\n"); } printf("\n\t---------------------------------------------------------------------------\n"); printf("\t学号姓名数学英语物理总分平均分名次\n"); printf("\t---------------------------------------------------------------------------\n"); for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0){n++;}} total_average(p,n); range2(p,n); for(i=0;i printf("\t%-12d%-12s%-8.2f%-8.2f",p[i].num,p[i].name,p[i].math,p[i].English); printf("%-8.2f%-10.2f%-8.2f %d\n",p[i].physics,p[i].total,p[i].average,b); printf("\t---------------------------------------------------------------------------\n"); } printf("\n\n"); fclose(fp); return n; } /******************************************************************** ****************************************/ /****************************************输出按物理科目排序结果模块*****************************************/ int read_print33(struct student *p,int size){ void total_average(struct student *p,int size); void range3(struct student *p,int size); FILE *fp;int i,n=0,b=0; if((fp=fopen("按平均分排序二进制值.txt","rb+"))==NULL){ printf("文件名输入错误!!\n"); } printf("\n\t---------------------------------------------------------------------------\n"); printf("\t学号姓名数学英语物理总分平均分名次\n"); printf("\t---------------------------------------------------------------------------\n"); for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0){n++;}} total_average(p,n); range3(p,n); for(i=0;i printf("\t%-12d%-12s%-8.2f%-8.2f",p[i].num,p[i].name,p[i].math,p[i].English); printf("%-8.2f%-10.2f%-8.2f %d\n",p[i].physics,p[i].total,p[i].average,b); printf("\t---------------------------------------------------------------------------\n"); } printf("\n\n"); fclose(fp); return n; } /******************************************************************** ****************************************/ /*******************************************保存按科目排序结果模块*******************************************/ void SAVE2(struct student *p,int size){ FILE *fp; int i,b=0; char name[20]; printf("请输入保存科目排序后的文件名: "); scanf("%s",name); if((fp=fopen(name,"w+"))==NULL){ printf("文件名输入错误!!\n"); } fprintf(fp,"\n\t---------------------------------------------------------------------------\n"); fprintf(fp,"\t学号姓名数学英语物理总分平均分名次\n"); fprintf(fp,"\t---------------------------------------------------------------------------\n"); fprintf(fp,"\n" ); for(i=0;i fprintf(fp,"\t%-12d%-12s%-8.2f%-8.2f",p[i].num,p[i].name,p[i].math,p[i].Englis h); fprintf(fp,"%-8.2f%-10.2f%-8.2f %d\n",p[i].physics,p[i].total,p[i].average,b); fprintf(fp,"\t---------------------------------------------------------------------------\n"); } fclose(fp); printf("\n文件保存成功!\n\n"); } /******************************************************************** ****************************************/ /************************************输出所有值按平均分排序的结果模块****************************************/ /******************************************************************** ****************************************/ /************************************输出所有值按平均分排序的结果模块****************************************/ int read_print3(struct student *p,int size){ void total_average(struct student *p,int size); void range(struct student *p,int size); FILE *fp;int i,n=0,b=0; if((fp=fopen("初始值二进制值1.txt","rb+"))==NULL){ printf("文件名输入错误!!\n"); } printf("\n\t---------------------------------------------------------------------------\n"); printf("\t学号姓名数学英语物理总分平均分名次\n"); printf("\t---------------------------------------------------------------------------\n"); for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0){n++;}} total_average(p,n); range(p,n); for(i=0;i printf("\t%-12d%-12s%-8.2f%-8.2f",p[i].num,p[i].name,p[i].math,p[i].English); printf("%-8.2f%-10.2f%-8.2f %d\n",p[i].physics,p[i].total,p[i].average,b); printf("\t---------------------------------------------------------------------------\n"); } printf("\n\n"); fclose(fp); return n; } /******************************************************************** ****************************************/ /***************************************查找模块************************************************************/ void search(struct student *p,int size){ void total_average(struct student *p,int size); char str[20]; long c; int i,a,flag=0,n=0; printf("\n\t********************查找某位同学的成绩*********************\n\n"); printf("\t\t\t按学号查找请输入(学号)\n\n"); printf("\t\t\t按姓名查找请输入(姓名)\n\n"); printf("\t=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); char str1[]="学号",str2[]="姓名"; char str3[20]; while(1){ printf("\t\t请输入查找方式: "); scanf("%s",str3); if(strcmp(str1,str3)==0){a=1;break;} else{if(strcmp(str2,str3)==0){a=2;break;} else{printf("\n输入错误,请重新输入!!\n\n");} } } switch(a){ case 1: printf("\n\t请输入学号: "); scanf("%s",str); c=strtol(str,NULL,0); FILE *fp; if((fp=fopen("初始值二进制值1.txt","rb+"))==NULL){ printf("文件名输入错误!!\n"); } for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0)n++;} total_average(p,n); for(i=0;i if(p[i].num==c){ flag=1; printf("\n\t---------------------------------------------------------------------------\n"); printf("\t学号姓名数学英语物理总分平均分\n"); printf("\t---------------------------------------------------------------------------\n"); printf("\t%-12d%-12s%-8.2f%-8.2f",p[i].num,p[i].name,p[i].math,p[i].English); printf("%-8.2f%-10.2f%-8.2f\n",p[i].physics,p[i].total,p[i].average); printf("\t---------------------------------------------------------------------------\n\n"); break;} if(flag==0){printf("输入学号错误!!\n");}break; case 2: printf("\n\t请输入姓名: "); scanf("%s",str); if((fp=fopen("初始值二进制值1.txt","rb+"))==NULL){ printf("文件名输入错误!!\n"); } for(i=0;i if(fread(&p[i],sizeof(struct student),1,fp)!=0)n++;} total_average(p,n); for(i=0;i if(strcmp(str,p[i].name)==0){ flag=1; printf("\n\t---------------------------------------------------------------------------\n"); printf("\t学号姓名数学英语物理总分平均分\n"); printf("\t---------------------------------------------------------------------------\n"); printf("\t%-12d%-12s%-8.2f%-8.2f",p[i].num,p[i].name,p[i].math,p[i].English); printf("%-8.2f%-10.2f%-8.2f\n",p[i].physics,p[i].total,p[i].average); printf("\t---------------------------------------------------------------------------\n\n"); break;} if(flag==0){printf("输入姓名错误!!\n");}break; } } /******************************************************************** ****************************/ /*************************************。。。修改。。。*******************************************/ void correct(struct student *p,int size){ void input(struct student *p,int size); int i,a=0,flag=0; FILE *fp; if((fp=fopen("初始值二进制值1.txt","r+"))==NULL){ printf("不能打开文件\n");} printf("请输入需要修改人的学号进行修改,修改后将自动计算总分和平均分并排序!!\n"); printf("\n\t请输入需要修改学生的学号: "); scanf("%ld",&p[N].num); for(i=0;fread(&p[i],sizeof(struct student),1,fp)!=0;i++){a++;} for(i=0;i if(p[i].num==p[N].num){flag=1; printf("请输入新的信息!!\n\n"); printf("请输入学号:"); while(1){scanf("%ld",&p[i].num); if(long(p[i].num)!=p[i].num||long(p[i].num)<=0){ /*输入判断*/ printf("输入错误,学号必须为整数,请重新输入: "); fflush(stdin);} else{break;}} printf("请输入姓名:");scanf("%s",p[i].name); printf("请输入数学成绩:"); while(1){scanf("%f",&p[i].math); if(float(p[i].math)!=p[i].math||float(p[i].math)<=0||p[i].math>100||p[i].math <0){ printf("输入错误,数学成绩必须为0~100之间的数,请重新输入: "); fflush(stdin);} else{break;}} printf("请输入英语成绩:"); while(1){scanf("%f",&p[i].English); if(float(p[i].English)!=p[i].English||float(p[i].English)<=0||p[i].English>100||p[i ].English<0){ printf("输入错误,英语成绩必须为0~100之间的数,请重新输入: "); fflush(stdin); } else{break;}} printf("请输入物理成绩:"); while(1){scanf("%f",&p[i].physics); if(float(p[i].physics)!=p[i].physics||float(p[i].physics)<=0||p[i].physics>100||p[ i].physics<0){ printf("输入错误,英语成绩必须为0~100之间的数,请重新输入: "); fflush(stdin);} else{break;}}} if((fp=fopen("初始值二进制值1.txt","w+"))==NULL){ printf("不能打开文件\n"); exit(0); } for(i=0;i fwrite(&p[i],sizeof(struct student),1,fp);} fclose(fp); if(flag==0){printf("对不起!!没有查找到您所输的学号!!\n");} } /******************************************************************** ****************************/ /*************************************。。。删除。。。*****************************************/ void delite (struct student *p,int size){ int i,a=0,flag=0; FILE *fp; printf("请输入需要删除的学号进行查找后,该项将自动删除并自动计算总分和平均分及排序!!\n"); if((fp=fopen("初始值二进制值1.txt","rb+"))==NULL){ printf("不能打开文件\n");} printf("\n\t请输入需要删除学生的学号: "); scanf("%ld",&p[N].num); for(i=0;fread(&p[i],sizeof(struct student),1,fp)!=0;i++){a++;} for(i=0;i if(p[i].num==p[N].num){