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