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;jif(stu[i].averagestu[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;jif(stu[i].averagestu[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;jif(stu[i].averagestu[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,显示结果: