学生成绩统计系统
学生成绩统计系统
集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)
目录
一、问题描述 (1)
二、基本要求 (1)
三、系统分析和设计 (2)
四、结构图 (2)
五、流程图 (2)
六、源程序代码 (6)
七、测试数据 (8)
八、软件说明 (11)
九、小结与体会 (11)
十、参考资料 (11)
C语言课程设计实验报告
一、问题描述
编辑一个学生成绩统计软件
二、基本要求
1)每条记录由学号、姓名、若干门课程的成绩组成;
2)能计算每个学生的总分和平均分并显示;
3)能按平均分统计各分数段的人数,并以分布图显示,如右图所
示。
4)在此基础上,可进行文件操作。
三、系统分析和设计
函数的设计,其最终目的是要实现所需要的功能。本例中,是用main函数调用两个子函数来实现的!
1)文件的建立:
要想实现对学生成绩的统计,首先要建立一个文件用来存放学生信息,要用到FILE文件指针fp1=fopen("file1","w+")
2)程序的设计:
学生的信息放在结构体数组struct student_score s[N]中。
通过for循环,调用子函数getdata,从键盘接收学生信息(num,name,score[0],score[1],score[2],score[3]),并计算总分与平均分,返回学生信息return st到调用处。用fprintf函数向文件中逐一写入学生的信息,通过rewend(fp1)函数使文件指针回到文件头,用fscanf读学生信息,并显示在屏幕上。同时根据所读学生信息,统计各分数段的人数s1++,s2++,s3++,s4++,s5++,然后调用一个子函数putsgraph用来输出图表!
四、结构图
主函数
五、流程图
六、源程序代码
#define N 8
#include
#include
struct student_score
{
long num;
char name[20];
float score[4];
float total;
float aver;
}s[N];
void main()
{
FILE *fp1;
struct student_score getdata(struct student_score st,int x); int putsgraph(int sa, int sb,int sc,int sd,int se);
int i,s1=0,s2=0,s3=0,s4=0,s5=0;
if((fp1=fopen("file1","w+"))==NULL)
{printf("cannot open file %s\n",fp1);
exit(0);}
for(i=0;i s[i]=getdata(s[i],i); for(i=0;i fprintf(fp1,"%-9ld%- 10s%10.1f%10.1f%10.1f%10.1f%10.1f%10.1f\n",s[i].num,s[i].name,s [i].score[0],s[i].score[1],s[i].score[2],s[i].score[3],s[i].tot al,s[i].aver); rewind(fp1); { long num; char name[20]; float e,f,g,h,total,aver; for(i=0;i { fscanf(fp1,"%ld%s%f%f%f%f%f%f\n",&num,name,&e,&f,&g,&h,&total,& aver); printf("%-9ld%-20s%10.1f%10.1f\n",num,name,total,aver); if(aver<60) s1++; else if(aver<70) s2++; else if(aver<80) s3++; else if(aver<90) s4++; else if(aver<=100) s5++; } } fclose(fp1); putsgraph(s1,s2,s3,s4,s5); } struct student_score getdata(struct student_score st,int x) { int y; printf("\nEnter student%d\'s num:\n",x+1); scanf("%ld",&st.num); getchar(); printf("\nEnter name:\n"); gets(https://www.360docs.net/doc/9b9060230.html,); st.total=0; printf("\nEnter 4 scores:\n"); for(y=0;y<4;y++) { scanf("%f",&st.score[y]); getchar(); st.total+=st.score[y]; } st.aver=st.total/4; return st; } int putsgraph(int sa, int sb,int sc,int sd,int se) { int i,j; char graph[16][80]; for(i=0;i<16;i++) { for(j=0;j<79;j++) graph[i][j]=' '; graph[i][79]='\0'; } for(j=0;j<79;j++) { graph[11][j]='-'; graph[0][j]='-'; graph[15][j]='-'; } for(j=3;j<=15;j+=4) { graph[12][j]='<'; graph[12][j+2]='0'; } graph[12][4]='6'; graph[12][8]='7'; graph[12][12]='8'; graph[12][16]='9'; graph[12][19]='<'; graph[12][20]='='; graph[12][21]='1'; graph[12][22]='0'; graph[12][23]='0'; for(i=10;i>(10-sa);i--) graph[i][4]='I'; for(i=10;i>(10-sb);i--) graph[i][8]='I'; for(i=10;i>(10-sc);i--) graph[i][12]='I'; for(i=10;i>(10-sd);i--) graph[i][16]='I'; for(i=10;i>(10-se);i--) graph[i][22]='I'; for(i=0;i<16;i++) puts(graph[i]); } 七、测试数据 七软件说明 本程序采用宏定义方式定义学生人数,增加程序的通用性,文件的路径为fp1=fopen("file1","w+"),当运行结束后,可在dos状态下,本程序基本实现了要求的内容: 能计算每个学生的总分和平均成绩,能按 平均分统计各分数段的学生人数,并以分布图显示,在此基础上可以进行文件操作。 八小结与体会 此次课程设计,初步锻炼了我运用所学基础知识解决实际问题的能力,掌握软件开发的基本过程和基本方法,培养在软件开发中相互合作的团队意识。 通过此次课程设计,我对C语言有了更深入的了解,同时也促进了我对书本知识的深入学习,在设计的过程中遇到了这样那样的问题。这些问题促进了我对于知识点的深入挖掘。也让我懂得了程序设计要:细心,耐心,恒心并用。否则,一个小小的字符,也可能让程序功亏一篑。其实,不仅是做程序,做任何事情都要有强烈的责任心,和良好的态度。 九参考资料 谭浩强,《C程序设计教程》,清华大学出版社,2007年