C语言课程设计排名分档优秀之类的程序和流程图.docx
- 文档编号:12710411
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:21
- 大小:234.27KB
C语言课程设计排名分档优秀之类的程序和流程图.docx
《C语言课程设计排名分档优秀之类的程序和流程图.docx》由会员分享,可在线阅读,更多相关《C语言课程设计排名分档优秀之类的程序和流程图.docx(21页珍藏版)》请在冰豆网上搜索。
C语言课程设计排名分档优秀之类的程序和流程图
一、程序分析与设计
1、先用记事本编辑文件datafile存储一个班学习成绩。
然后在C++环境下,建立一个学生信息的结构体,用r方式打开上述文件,再用fscanf读入、用printf在屏幕上显示文件内容。
2、在写主函数时运用了while以及switch函数,来做一个菜单。
3、利用循环使每个学生的三门功课的成绩相加,然后再把和除以三就得到了平均成绩。
接着利用平均分的高低排出名次。
最后用fprintf将每个学生的信息写入grpjfjmc文件。
4利用循环把十名学生的每门课的成绩相加,然后再把和除以十就得到了每门课的平均成绩。
接着使用for循环和if语句以及switch语句统计出个分数段的学生人数。
5用printf函数按格式在屏幕上打印每名学生的成绩。
6使用for循环和if语句找出不及格的学生课程和成绩,用printf函数打印到屏幕上。
7使用for循环和if语句找出符合条件的优等生及学号,课程,平均成绩,用printf函数打印到屏幕上。
层次图:
图1层次图
二、流程图
showFail();menu();
从文件中读取数据:
计算平均分及排名:
图4计算平均分及排名
计算每门平均分:
N
Y
Y
N
Y
Y
图5计算每门平均分
打印学生分数条:
图6学生分数条
打印不及格学生信息
图7不及格学生信息
打印优秀学生信息
图8打印优秀学生信息
三、源程序清单
#include
#include
#include
#defineN20
structstudent
{
intnum;
charname[10];
intscore[3];
floataverage;
intranking;
}stu[N];
//从文件读取数据
voidread();
//计算个人平均分及名次
voidgrpjfjmc();
//计算全班平均分及分数段
voidall();
//打印每名学生成绩条
voidshowall();
//打印不及格学生名单
voidshowFail();
//打印优等生名单
voidshowGood();
voidmenu()
{
printf("学生成绩管理功能说明\n");
printf("***************************************\n");
printf("0:
退出\n");
printf("1:
计算个人平均分及名次\n");
printf("2:
计算全班平均分及分数段\n");
printf("3:
打印每名学生成绩条\n");
printf("4:
打印打印不及格学生名单\n");
printf("5:
打印优等生名单\n");
printf("***************************************\n");
}
voidmain()
{
read();
menu();
while
(1)//如果判定为真
{
charc=getchar();//输入字符c
switch(c)
{
case'0':
exit
(1);break;
case'1':
grpjfjmc();menu();break;
case'2':
all();menu();break;
case'3':
showall();menu();break;
case'4':
showFail();menu();break;
case'5':
showGood();menu();break;
}
}
}
//从文件读取数据
voidread()
{
inti;
FILE*fp;
if((fp=fopen("c:
//datafile.txt","r"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
for(i=0;i { fscanf(fp,"%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); } fclose(fp); } //计算个人平均分、排名并写入文件 voidgrpjfjmc() { inti; intj; for(i=0;i { stu[i].average=(float)(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0; } for(i=0;i { stu[i].ranking=1; for(j=0;j if(stu[i].average stu[i].ranking+=1; } FILE*fp; if((fp=fopen("c: //datafile.txt","r"))==NULL) { printf("cannotopenfile\n"); exit(0); } if((fp=fopen("c: //datafile1.txt","w"))==NULL) { printf("cannotopenfile\n"); return; } fprintf(fp,"学号\t姓名\t数学\t英语\t物理\t平均分\t名次\n"); puts("学号\t姓名\t数学\t英语\t物理\t平均分\t名次\n"); for(i=0;i { fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%5.2f\t%10d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average,stu[i].ranking); printf("%d\t%s\t%d\t%d\t%d\t%15.2f\t%10d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average,stu[i].ranking); } fclose(fp); } //计算全班每门课程平均分及各分数段认识,并写入文件 voidall() { inti,j,count[5][3]={0}; floatsum; floatavr[3]; for(j=0;j<3;j++) { sum=0; for(i=0;i { sum+=stu[i].score[j]; } avr[j]=sum/N; } for(j=0;j<3;j++) { for(i=0;i { intflag; flag=(stu[i].score[j])/10; switch(flag) { case0: case1: case2: case3: case4: case5: count[0][j]+=1;break; case6: count[1][j]+=1;break; case7: count[2][j]+=1;break; case8: count[3][j]+=1;break; case9: case10: count[4][j]+=1;break; default: printf("error\n"); } } } FILE*fp; if((fp=fopen("c: //datafile.txt","r"))==NULL) { printf("cannotopenfile\n"); exit(0); } if((fp=fopen("c: //datafile2.txt","w"))==NULL) { printf("cannotopenfile\n"); return; } fprintf(fp,"%s\t%s\t%s\t%s\n","分数段","数学","英语","物理"); printf("%s\t%s\t%s\t%s\n","分数段","数学","英语","物理"); fprintf(fp,"<60\t%d\t%d\t%d\n",count[0][0],count[0][1],count[0][2]); printf("<60\t%d\t%d\t%d\n",count[0][0],count[0][1],count[0][2]); fprintf(fp,"60~69\t%d\t%d\t%d\n",count[1][0],count[1][1],count[1][2]); printf("60~69\t%d\t%d\t%d\n",count[1][0],count[1][1],count[1][2]); fprintf(fp,"70~79\t%d\t%d\t%d\n",count[2][0],count[2][1],count[2][2]); printf("70~79\t%d\t%d\t%d\n",count[2][0],count[2][1],count[2][2]); fprintf(fp,"80~89\t%d\t%d\t%d\n",count[3][0],count[3][1],count[3][2]); printf("80~89\t%d\t%d\t%d\n",count[3][0],count[3][1],count[3][2]); fprintf(fp,">=90\t%d\t%d\t%d\n",count[4][0],count[4][1],count[4][2]); printf(">=90\t%d\t%d\t%d\n",count[4][0],count[4][1],count[4][2]); fprintf(fp,"%s%.2f\t%.2f\t%.2f\n\t","平均分",avr[0],avr[1],avr[2]); printf("%s%.2f\t%.2f\t%.2f\n\t","平均分",avr[0],avr[1],avr[2]); fclose(fp); } //打印每名学生成绩条 voidshowall() { inti,j; for(i=0;i { stu[i].average=(float)(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0; } for(i=0;i { stu[i].ranking=1; for(j=0;j if(stu[i].average stu[i].ranking+=1; } printf("%s\n","显示成绩条"); printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n","序号","姓名","数学","英语","物理","平均分","名次"); for(i=0;i { printf("%d\t%s\t%d\t%d\t%d\t%15.2f\t%10d\n", stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average,stu[i].ranking); } } //打印不及格学生信息 voidshowFail() { inti,j; char*name[3]={"数学","英语","物理"}; printf("%s\n","显示不及格学生名单"); for(i=0;i { for(j=0;j<3;j++) { if(stu[i].score[j]<60) printf("%d\t%s\t%s\t%d\n",stu[i].num,stu[i].name,name[j],stu[i].score[j]); } } } //打印优等生名单 voidshowGood() { inti,j; for(i=0;i { stu[i].average=(float)(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0; } for(i=0;i { stu[i].ranking=1; for(j=0;j if(stu[i].average stu[i].ranking+=1; } printf("%s\n","显示优等生学生名单"); printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n","序号","姓名","数学","英语","物理","平均分","名次"); for(i=0;i { if(stu[i].ranking<=3) { if(stu[i].average>90) printf("%d\t%s\t%d\t%d\t%d\t%15.2f\t%10d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average,stu[i].ranking); elseif(stu[i].average>85&&stu[i].score[j]==100) printf("%d\t%s\t%d\t%d\t%d\t%15.2f\t%10d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average,stu[i].ranking); elseif((stu[i].average>=85)&&((stu[i].score[0]>=95&&stu[i].score[1]>=95)||(stu[i].score[1]>=95&&stu[i].score[2]>=95)||(stu[i].score[0]>=95&&stu[i].score[2]>=95))) printf("%d\t%s\t%d\t%d\t%d\t%15.2f\t%10d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average,stu[i].ranking); } } } 四、调试过程 在程序运行过程中,有一个求平均值的函数,然后排出名次。 平均值函数很快写出来了,之后是要排名。 再简单的运行学生成绩单的表头时,发现不出现表头,后来发现是忘打puts函数了。 然后是要计算学生的每门平均分和统计分数段。 计算每门平均分和计算每个学生平均分用到的思想一样,这个步骤也很快完成了。 在统计分数段时,我运用的是用switch语句。 最后是打印每个学生的成绩、不及格同学的学号,课程,成绩和优秀学生的学号,课程,平均成绩。 这三个部分思路很容易想到,但是,要正确使用for和if语句和关系表达式。 在一次运行结果时,发现统计人数中,写入的文件显示各分数段的人数均为零。 分析了一下,原来我在主函数中忘记调用打印printf()这个函数了,然后各分数段的人数均为零是由于个分数段的初值是零,而且还没有统计人数就写入文件,这样运行的结果当然只能是零了。 再次运行后,程序除表头外全为0,分析原因是应为在程序中已经将表头输入,而后又将表头在原始数据中写出,是错误的,所以就将原始数据中的表头去除后,程序出来了。 在观察数据时发现填写的优秀名单出现错误,后来改用if,ifelse语句来编写程序,这样更方便逻辑。 在调试程序的过程中发现分布写程序的优点,查找错误时比较容易,而且能让程序看起来更有条理。 五、程序有待改进的地方 从程序的功能来看,并不能实现删除,插入的功能,但是可以通过编写相应的函数来实现,并且也把它加入到上述的菜单中。 这样可以循环使用这个程序,而不需要重新写一个函数。 从编写的程序代码来看,由于自己知识能力限制,所以不是最简洁简便。 所以还有很多需要改进的地方. 六、本次实习的收获和建议 在接近两个星期的时间里,在老师的带领下我们学习了c语言程序实践学习。 在这之前,我们已经学了一学期的c语言,对其也有一定的了解,但是也仅仅停留了了解的范围,对里面的好多东西还是很陌生,更多的在运用的时候还是感动到很棘手。 由于时间的关系老师没有给我们详细介绍,而是给我们简单的介绍了几个比较重要的实际操作。 例如我们这次的实习要求,老师都会将每一模块进行详细的讲解。 老师的讲解对我们的上机实习有很大的指导作用,坦率地说,在做程序中,老师都会就我的程序所出现的问题做出详细的演示,如果不是老师给我一些指导和启发,这次实习任务我可能不能按规定的时间和要求完成。 所以,我非常得感谢老师不辞劳苦和耐心的讲解。 实习加深了我对课堂知识的理解,对一些语法知识有了感性的认识。 对于一些自己认为在课堂上已经听懂的内容,在上机实习中发现还是有理解的偏差。 其次,实习让我再次熟悉了计算机系统的操作方法,和程序编写环境。 通过这次为数不多的几天上机实习,我了解了一些关于c语言的知识,理解巩固了我的c语言理论知识,对以后的学习有很大的帮助。 同时它让我知道,只要你努力,任何东西都不会太难。 对于今后的学习,我也希望老师,能布置像实习这类的题,让我们在不断思考同一个题的同时,加深对知识的理解。 或者布置一些趣味性的题目,能激发我们的兴趣。 当然,我觉得自己的能力还不够,还要继续努力,多花时间学习c语言。 附录 1、原始数据 2,显示结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 排名 分档 优秀 之类 程序 流程图