中国地质大学(武汉)C语言课程设计报告书姓名:班级:班级学号:指导老师:2一课设题目高考招生录取成绩已知文本文件f1.txt中存放了某个省当年参加高考的1000个考生的数据(考号、姓名、性别和考试成绩),存放格式是每行存放一个考生的数据,每个数据之间用空格隔开。假定当年该省的招生计划是:一类本科招生计划为10%;二类本科招生计划为15%;三类本科招生计划为20%;四类高职高专招生计划为25%。请编写程序,实现以下功能:1.划定各批次录取分数线,结果可屏幕显示,也可存入文件;2.能够统计各批次中男生,女生的录取比例。统计结果可屏幕显示,也可存入文件;3.确定每名学生的录取情况及录取批次;4.考生可以根据考号或姓名(支持重名)查询自己的成绩及录取情况;5.系统程序要有界面;6.存入文件的数据,每行存一种数据,每行之间的不同信息用空格分隔。)3二题目分析该程序题目已经很清楚的表达出要求编好的程序能够简单的实行高考招生功能,首先需要在导入含有一千个考生信息的txt文本,以能达到录取功能。根据该题目我们还可以知道完成数据输入后,不仅要有比较整洁的界面,还要能根据用户要求界面显示出个批次中男女的比例以及录取线、可供用户查询(根据考生姓名或考号)某考生成绩及录取情况。那么我们最好设置一个大循环,使得考生能实现只要不关闭程序或者按指定输入而结束程序就能一直查询下去,并且能用txt文本将个批次中录取的人的一系列信息从程序中生成出来。但作为艺术生,我的能力有限,只能从网络上寻找已经编好的程序进行理解,降低理解题目的难度。4三设计思路要编题目中要求的程序,就必须先将已经写好的一千个学生的信息的文本文件输入程序。第一步为定义:#includestdio.h#includemalloc.h用结构体的形式将学生的一切信息表达出来:structDATA{intID;charname[4];charsex[3];intscore;};定义各个函数:voidpaixu(int*,DATA*,int);intsishewuru(double);voidfunc1(int*,int*,DATA*,int*,int,int,int,int);//统计男女比例intfunc2(int*,int,DATA*);//查找考生序号voidprint();voidmain()再应该从f1.txt中向程序导入将每一个人的学号、姓名、性别、分数,并自动计算考生数量:FILE*file=fopen(f1.txt,r),*file1;if(file==NULL){printf(Nosuchfile!\n);return;}while(EOF!=fscanf(file,%*[^\n]\n))length++;//自动计算考生数量然后比较大小,将原来一千个人按成绩高低排好顺序:DATA*data=(DATA*)malloc(length*sizeof(DATA));int*pai=(int*)malloc(length*sizeof(int));rewind(file);for(i=0;ilength;i++){fscanf(file,%d%s%s%d,&data[i].ID,&data[i].name,&data[i].sex,&data[i].score);5pai[i]=i;}paixu(pai,data,length);//将1-1000的学生按成绩排序对1000名学生的成绩分别按比例进行计算并四舍五入为整数,可得出各批次最低成绩,即各批次的录取成绩。要划出各批次的录取成绩,就要将压线的那个分数计算出来。在这里,特别考虑的是:压线分数上人数有多个,所以,我们不能单纯的将N乘以各个批次的百分点。编写程序如下:yiben=sishewuru(length*0.1)-1;//分别按比例进行计算并四舍五入为整数erben=yiben+sishewuru(length*0.15);sanben=erben+sishewuru(length*0.2);dazhuan=sanben+sishewuru(length*0.25);yi=data[pai[yiben]].score;er=data[pai[erben]].score;san=data[pai[sanben]].score;si=data[pai[dazhuan]].score;设置界面:将“各类招生分数线”、“各批次男女比例”、“单个学生录取情况”、“退出系统输入”、“重新打印初试界面”输入指令分别设置为数字“0”~“4”:while(1){print();printf(\n请输入查询码:);for(input=getchar();;input=getchar()){if(!(input='0'&&input='4')){printf(非法输入,请重新输入\n请输入:);fflush(stdin);}elsebreak;}实现“各类招生分数线”即“0”指令:getchar();switch(input){case'0':printf(\n一类本科招生线:%d\n二类本科招生线:%d\n三类本科招生线:%d\\n高职高专招生线:%d\n,yi,er,san,si);printf(是否打印为文件?(y/n):);if(getchar()=='y'){file1=fopen(各批次录取分数线.txt,w);fprintf(file1,一类本科招生线:%d\n二类本科招生线:%d\6\n三类本科招生线:%d\n高职高专招生线:%d\n,yi,er,san,si);fclose(file1);}fflush(stdin);break;实现“各批次男女比例”即“1”指令:case'1':func1(male,female,data,pai,yiben,erben,sanben,dazhuan);printf(一本类本科招生线男女比例:%d:%d\n,male[0],female[0]);printf(二类本科招生线男女比例:%d:%d\n,male[1],female[1]);printf(三类本科招生线男女比例:%d:%d\n,male[2],female[2]);printf(高职高专招生线招生线男女比例:%d:%d\n,male[3],female[3]);printf(是否打印为文件?(y/n):);if(getchar()=='y'){file1=fopen(各批次录取男女比例.txt,w);fprintf(file1,一类本科招生线男女比例:%d:%d\n,male[0],female[0]);fprintf(file1,二类本科招生线男女比例:%d:%d\n,male[1],female[1]);fprintf(file1,三类本科招生线男女比例:%d:%d\n,male[2],female[2]);fprintf(file1,高职高专招生线招生线男女比例:%d:%d\n,male[3],female[3]);fclose(file1);}fflush(stdin);break;实现“单个学生录取情况”即“2”指令:case'2':printf(按考号查询输入0按姓名查询输入1\n请输入查询码:);for(input=getchar();;input=getchar()){if(input!='0'&&input!='1'){printf(非法输入,请重新输入\n请输入:);7fflush(stdin);}elsebreak;}getchar();intshuru,j,ss[10];//假设最多10个重名的for(j=0;j10;j++)ss[i]=0;if(input=='0'){start1:printf(请输入考号:);for(j=scanf(%d,&shuru);j!=1||shuru/10000!=4211;j=scanf(%d,&shuru)){//假设考号开头为4211printf(非法输入,请重新输入\n请输入:);fflush(stdin);}getchar();j=shuru%10000;//假设考号和序号的关系printf(该生考号:%d姓名:%s性别:%s分数:%d录取情况:,shuru,data[j].name,data[j].sex,data[j].score);if(data[j].score=yi)printf(一本\n);elseif(data[j].score=er)printf(二本\n);elseif(data[j].score=san)printf(三本\n);elseif(data[j].score=si)printf(高职高专\n);elseprintf(未过线,请继续努力!\n);printf(是否继续查询?(y/n):);if(getchar()=='y'){fflush(stdin);gotostart1;}}else{start2:printf(请输入姓名:);j=func2(ss,length,data);//查找考生序号if(j==0)printf(查无此人!\n);elseif(j==1){printf(该生考号:%d姓名:%s性别:%s分数:%d录取情况:,8data[ss[0]].ID,data[ss[0]].name,data[ss[0]].sex,data[ss[0]].score);if(data[ss[0]].score=yi)printf(一本\n);elseif(data[ss[0]].score=er)printf(二本\n);elseif(data[ss[0]].score=san)printf(三本\n);elseif(data[ss[0]].score=si)printf(高职高专\n);elseprintf(未过线,请继续努力!\n);}else{printf(有多个考生姓名为%s,数据如下:\n,data[ss[0]].name);for(j=j-1;j=0;j--){printf(该生考号:%d姓名:%s性别:%s分数:%d录取情况:,data[ss[j]].ID,data[ss[j]].name,data[ss[j]].sex,data[ss[j]].score);if(data[ss[j]].score=yi)printf(一本\n);elseif(data[ss[j]].score=er)printf(二本\n);elseif(data[ss[j]].score=san)printf(三本\n);elseif(data[ss[j]].score=si)printf(高职高专\n);elseprintf(未过线,请继续努力!\n);}}printf(是否继续查询?(y/n):);if(getchar()=='y'){fflush(stdin);gotostart2;}}break;实现“退出系统”即“3”指令:case'3':fclose(file);free(data);return;实现“重新打印初始界面”即“4”指令:case'4':print();9break;}}fclose(file);free(data);}下面,则开始对开始定义的函数进行填充:根据1000名学生的成绩进行从高到底的排序:voidpaixu(int*pai,DATA*data,intlength){inti,j,temp;for(i=0;ilength;i++)for(j=i+1;jlength;j++)if(data[pai[i]].scoredata[pai[j]].score){temp=pai[i];pai[i]=pai[j];pai[j]=temp;}}计算各批次比例的四舍五入:intsishewuru(doublel){if(l1){if((l-(int)l)0.5)return(int)l;elsereturn(int)l+1;}elsereturn1;}各批次男女比例:v