C语言课程设计报告保研名额查询.docx
《C语言课程设计报告保研名额查询.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告保研名额查询.docx(38页珍藏版)》请在冰点文库上搜索。
C语言课程设计报告保研名额查询
中国地质大学(武汉)
C语言课程设计报告书
姓名:
专业:
电子信息工程
班级学号:
指导老师:
目录
一、课设题目**************************************************1
二、题目分析**************************************************2
三、设计思路**************************************************2
3.1、设计思想*********************************************2
3.2、总思路***********************************************2
3.3、图示分析********************************************3
四、各功能模块及其运行结果*******************************3
4.1、菜单和主函数****************************************3
4.2、基础模块*******************************************4
4.3、功能函数**********************************************7
五.课设总结*************************************************12
六.附录(源代码)**********************************************14
一、课设题目
◆题目:
研究生推免(保研)排名统计程序
◆具体内容:
已知文本文件f1.txt中存放了某校应届大四学生的相关信息(不超过5000人),具体数据及存放格式为:
每行存放一个学生的数据,共有7项,依次为:
学号、姓名、专业必修课平均成绩、科技活动奖励加分、社会活动奖励加分、是否有专业必修课挂科记录、是否通过大学英语四级。
其中,学号为8位数字字符,其中前2位数字表示学生所在的学院,第3位数字表示学生的专业,第4-5位数字表示学生的年级,统一为09,第6位数字表示学生所在年级同专业内的编号,即所称的班号,第7-8位数字表示学生班级内的序号,如学号07509123表示,机电学院(07)通信工程专业(5)09级(09)1班
(1)第23号(23)学生;姓名为长度不超过10个的字符;专业必修课平均成果、科技活动奖励加分、社会活动奖励加分均为0-100以内的整数(含0和100);是否有专业必修课挂科记录、是否通过大学英语四级均为0或1两个整型数字,为1分别表示有专业必修课挂科记录或通过大学英语四级,为0分别表示没有专业必修课挂科记录或没有通过大学英语四级。
该校的保研政策是:
必须没有专业必修课挂科记录且通过大学英语四级考试,在此前提下,划分推免研究生指标。
外推指标按专业排名,给予2%的指标,小数部分四舍五入。
内推指标按班级排名,给予15%的指标,小数部分四舍五入。
如果某班有外推指标,外推指标不占内推指标。
排名计算方法:
专业必修课成绩占60%,科技活动奖励占30%,社会活动奖励占10%。
请编写程序,读出文件f1.txt中的内容,再按保研政策确定每个人的保研状况(0表示没有获得推免资格,1表示获得内推资格,2表示获得外推资格)并存入f2.txt中,并实现以下功能:
(1)能够统计某个班所有获得保研资格的学生信息。
(2)能够统计某个专业所有获得保研资格的学生信息。
(3)能够统计哪个班获得的保研资格的学生人数最多。
(4)能够统计全校所有获得外推资格的学生名单,其结果即可屏幕显示,也可存入文件。
(5)学生可以根据姓名和学号查询自己是否获得保研资格。
◆说明:
系统程序要有界面
存入文件f2.txt中的数据,每行存一个学生的数据,每行之间的不同信息用空格分隔。
二、题目分析
该题目要求设计一个研究生推免(保研)排名统计查询系统,导入含有5000个考生信息的txt文本后,能实现统计某个班所有获得保研资格的学生信息;能够统计某个专业所有获得保研资格的学生信息;能够统计哪个班获得的保研资格的学生人数最多;能够统计全校所有获得外推资格的学生名单,其结果即可屏幕显示,也可存入文件;学生根据姓名和学号查询自己是否获得保研资格的功能。
要实现这么多功能,就需要一个可供选择的主菜单功能表,每个菜单都要链接到相应的程序实现相应功能,所以,整体就需要建立一个多分支选择结构。
除此之外,为了方便用户查询,还要设计一个使考生只要不关闭程序或者按指定输入而结束程序就能一直查询下去的功能。
三.设计思路
3.1、设计思想
(1)将全局变量和局部变量结合使用,灵活运用。
(2)巧用指针,简化数据处理难度。
(3)以全局结构来随时定义结构数组。
(4)以结构化各个功能模块,函数间的调用精简整个函数。
(7)设置循环,实现多次查询。
(6)以冒泡方式比较大小排列出学生成绩成绩。
(7)以读一个打印一个的思想,实现显示全部信息。
(8)以先判断再打印的思想,来实现查找推免状况。
3.2、总思路
文本读取+排序+统计+查询
可分为这样几个模块:
读入文件模块、剔除挂科或四级未过者模块、全校成绩排序模块、识别院系模块、外推模块、识别班级(不包括外推者)模块、内推模块、保存文件模块。
通过调用这些模块来实现题目要求的五大功能。
3.3、图示分析
四、各功能模块及其运行结果
4.1、菜单和主函数
将各个功能模块设计成菜单的选项模式,先输出在屏幕上,再获取用户的键盘输入“v”,由“v”的值进行一个多分枝选择结构,调用相应的功能程序模块。
【源代码】
voidmain()
{【函数申明】
charINPUT_sub[4],INPUT_cla[7];//要输入的专业号、班号
charrec_sub[4],rec_cla[7];//用于识别专业号、班号
charcInputString[10];
charv;
load(a);//读取
sort(a);//剔除
sort_1(b);//全校排名
do
{
printf("\n\n");
printf("/*********欢迎使用保研信息查询系统******/\n\n");
printf("请选择服务----》》1.按班级查询保研资格信息****/\n\n");
printf("/******************2.按专业查询保研信息*****/\n\n");
printf("/******************3.统计保研资格名额最多班级/\n\n");
printf("/******************4.统计全校获得外推资格名额/\n\n");
printf("/******************5.根据学号查询个人保研信息/\n\n");
printf("/******************6.根据姓名查询个人保研信息/\n\n");
printf("/******************7.退出程序*****************/\n\n");
scanf("%d",&v);【获取键盘输入值v】
getchar();【消除scanf对getchar的影响】
switch(v)【switch多分支选择结构】
{【输出功能菜单】
case1:
{printf("请输入要查询班级的院系编号,如072*\n");
gets(INPUT_sub);
printf("请输入要查询班级的班级编号,如072091\n");
gets(INPUT_cla);
function_1(INPUT_sub,INPUT_cla,b);break;}【调用功能01函数】
case2:
······【调用功能02函数】
·······
default:
break;}
}while(v<7);
}
4.2、基础模块
4.2.1、读入文件函数
这个函数是整个程序更的根本条件,由于一个学生的信息包含多种不同类型的信息且是一个整体,所以要将学生的信息建立一个结构体,每个成员对应相应的变量类型,由于部分学生的学号第一位为0,所以将学号定义为字符串,名字为字符串,成绩是整型,其他都可以用字符型的数组,开始判定文件f1是否存在,存在则执行while循环,从i=0读入文件。
【源代码】
inti=0;
intload(structstudent*a)
{FILE*fp1;
if((fp1=fopen("f1.txt","r"))==NULL)【判断f1是否存在】
{printf("cannotopenthisfile\n");【不存在的情况】
return0;}
while(!
feof(fp1))【存在就直接执行while循环】
{fscaf······
i++;
}【依次读入文件】
return(i);【返回最后一名学生的位置】
}
4.2.2、剔除挂科或四级未过者
这个函数是将全校挂科或者四级未过者(即无资格推免的学生)从总名单中提剔除,进而方便接下来的成绩排名工作,原理是将工作组a[5000]中所有学生资料依次提取,通过判断其中Fclass和CET4对应的数字0/1,来进行剔除,并将有资格保研的学生资料存入工作组b[5000]中。
【源代码】
intsort(structstudent*a)
{
intj,k=0;
for(j=0;j
{if((a[j].Fclass==0)&&(a[j].CET4==1))【判断是否挂科或CET4未通过】
{strcpy(b[k].num,a[j].num);【将筛选后的学生放入b[5000]】
········}
}
i=k;return(i)}
【返回最后一名学生的位置】
4.2.3、全校排名函数
这个函数是将工作组b[5000]中的所有学生按成绩排名,其原理为“冒泡法”排序,通过for循环将学生按成绩由高到低的顺序排号好。
【源代码】
voidsort_1(structstudent_1*b)
{
intj,k=0;
floatscore_j,score_k;
structstudent_1temp;
for(j=0;j{
score_j=(float)((b[j].score_avr)*0.6+(b[j].bonus_sci)*0.3+(b[j].bonus_soc)*0.1);【计算综合成绩】
for(k=j+1;k
{score_k=(float)((b[k].score_avr)*0.6+(b[k].bonus_sci)*0.3+(b[k].bonus_soc)*0.1);
if(score_j{temp=b[j];b[j]=b[k];b[k]=temp;}
}
}
}
4.2.4、识别院系
这个函数是在已按成绩完成排序的学生中找到所需学院的学生,其原理为;首先利用strncpy语句将学生学号的前三位拷贝到一个临时定义的字符串数组中,并用strcmp语句将其与所需学院的编号对比,符合条件者存入工作组sub[2000]中,通过for循环逐个挑选。
【源代码】
intdevide_1(structstudent_1*b,structstudent_1*sub,charINPUT_sub[])
{
intj,r=0;intv;
for(j=0;j
{strncpy(rec_sub,b[j].num,3);【学生学号的前三位拷贝到rec_sub】
if((strcmp(rec_sub,INPUT_sub))==0)【将rec_sub与所需学院编号比较】
{sub[r++]=b[j];}【符合条件者存入工作组sub[500]中】
}
returnr;}
【返回最后一名学生的位置】
4.2.5、外推模块
这个函数是在已经识别出的学院的学生中按2%的比例确定外推名额,并将外推者资料除存入工作组structstudent_1suc_out[800]中,其原理为将“学院总人数”*2%四舍五入后得到该学院外推总人数j,然后再将sub[2000]中的前j名学生选出即为外推者,并存入工作组suc_out[800]。
【源代码】
intsuccess_out(structstudent_1*sub,intnum)
{
intj,k=0;
j=(int)(((num)*0.2+5)/10);【四舍五入】
if(0==j)【如果某学院人数太少则无外推者】
{return0;}
for(k=0;k{suc_out[k]=sub[k];【选出外推者】
suc_out[k].status=2;}
returnk;【返回最后一名学生是位置】
}
4.2.6、识别班级(不包括外推)
这个函数是在同院系除去外推者的学生中找出所需班级的学生,其原理与上述2.4识别院系相似,再次不赘述。
【源代码】
{intj,k=0;
for(j=numout;j{strncpy(rec_cla,sub[j].num,6);【学生学号的前6位拷贝到rec_cla】
if((strcmp(rec_cla,INPUT_cla))==0)【将rec_cla与所需班级编号比较】
{cla[k++]=sub[j];}【将符合条件者存入cla[1000]】
}
returnk;}【返回最后一名学生的位置】
4.2.7、内推模块
这个函数是在已经识别班级中除去外推者按15%的名额实施内推,其原理与上述2.5外推模块相似,再次不赘述。
【源代码】
intsuccess_in(structstudent_1*cla,intnumcla)
{intj,k;
j=(int)((numcla)*1.5+5)/10;【四舍五入】
for(k=0;k{suc_in[k]=cla[k];}
returnk;}
4.3.功能函数
4.3.1按班级查询保研资格信息
原理:
根据输入的学院、班级编号利用上述基础模块实现题目要求功能,依次输出所查班级的外推者和内推者名单。
【源代码】
voidfunction_1(charINPUTsub[],charINPUT_cla[],structstudent_1*b)
{intj=0,k=0,m;
intCountSub;//学院总数
intCountClass;//班级总数
intCountOut;//学院外推总数
intCountIn;//班级内推总数
CountSub=devide_1(b,sub,INPUTsub);//识别院系
CountOut=success_out(sub,CountSub);//确定外推名额
CountClass=devide_2(sub,CountSub,CountOut,INPUT_cla);//识别班级
CountIn=success_in(cla,CountClass);//确定内推名额
j=CountOut;//外推总数
k=CountIn;//班级内推总数
printf········//输出本班外推者
for(m=0;m{strncpy(rec_cla,suc_out[m].num,6);
if((strcmp(rec_cla,INPUT_cla))==0)
printf·······
}
printf("输出本班内推者\n");
for(m=0;mprintf·······
}
4.3.2按专业查询保研信息
原理:
根据输入的学院、专业编号利用上述基础模块实现题目要求功能,通过for循环找出要查专业所有班级的保研情况。
【源代码】
voidfunction_2(charINPUTsub[],structstudent_1*b)
{charAllClass[7];
inti;
intj=0,k=0,m;
intCountSub;//学院总数
intCountClass;//班级总数
intCountOut;//学院外推总数
intCountIn;//班级内推总数
CountSub=devide_1(b,sub,INPUTsub);//识别院系
CountOut=success_out(sub,CountSub);//确定外推名额
j=CountOut;//外推总数
printf("/***************输出专业保研名单************/\n");for(m=0;mprintf·······
printf("输出专业内推者\n");//输出专业内推者
for(i=0;i<10;i++)//按班级循环依次输出
{········
for(m=0;m}
4.3.3统计保研资格名额最多班级
原理:
通过for循环找出要查专业所有班级的保研情况存入工作组中,利用冒泡法按保研人数排名并找出人数最多的班级。
【源代码】
voidfunction_3()
{
charAllClass[7];
charAllSub[4];
intj=0,k=0,m;
inti=0;
intl;
intCountSub;//学院总数
intCountClass;//班级总数
intCountOut;//学院外推总数
intCountIn;//班级内推总数
intCountClassout=0;//班级外推总数
intCountClassAll;//班级保研总数
intSchoolNO;
intClassNO;
intmax=0;
intnumber=0;
AllClass[6]=0;
for(SchoolNO=0;SchoolNO<999;SchoolNO++)
{AllSub[0]=AllClass[0]=(SchoolNO/100)+48;
AllSub[1]=AllClass[1]=((SchoolNO/10)%10)+48;
AllSub[2]=AllClass[2]=(SchoolNO%10)+48;
AllSub[3]=0;
AllClass[3]=0+48;
AllClass[4]=9+48;
for(ClassNO=0;ClassNO<9;ClassNO++)
{
AllClass[5]=ClassNO+48;
CountSub=devide_1(b,sub,AllSub);//识别院系
CountOut=success_out(sub,CountSub);//确定外推名额
CountClass=devide_2(sub,CountSub,CountOut,AllClass);//识别班级
CountIn=success_in(cla,CountClass);//确定内推名额
j=CountOut;//外推总数
for(m=0;m{
strncpy(rec_cla,suc_out[m].num,6);
if((strcmp(rec_cla,INPUT_cla))==0)
{CountClassout++;}
}
l=i++;
CountClassAll=CountClassout+CountIn;
strcpy(classNOAll[l].classname,AllClass);
classNOAll[l].AllNO=CountClassAll;
if(CountClassAll>max)
{max=CountClassAll;number=l;}
}
}
Printf······}
4.3.4统计全校获得外推资格名额(含存储文件的程序)
原理:
与原理3.3相似
【源代码】
voidfunction_4()
{charAllClass[7];
charAllSub[4];
intj=0,k=0,m;
inti=0;
intl;
intCountSub;//学院总数
intCountClass;//班级总数
intCountOut;//学院外推总数
intCountIn;//班级内推总数
intCountClassout=0;//班级外推总数
intCountClassAll;//班级保研总数
intSchoolNO;
intClassNO;
intmax=0;
intnumber=0;
FILE*fp;
FILE*fp3;
if((fp=fopen("f2.txt","w"))==NULL)
{printf("Fileopenerror.\n");
exit(0);}
if((fp3=fopen("f3.txt","w"))==NULL)
{printf("Fil