1、C语言程序设计报告 学生成绩管理系统*大学物联网工程学院课程设计报告课程名称: 计算机综合实践 设计题目: 学生成绩管理系统 班 级: 自动化1001班 姓 名: 学 号: 指导教师: 评 分: 2011 年 11 月15日目 录一、设计目的和任务 3二、总体设计 3三、详细设计 5四、调试与测试 5五、源程序清单和执行结果 6六、体会与心得 17七、参考文献 17一、 设计目的和任务设计目的:(1)基本掌握面向过程程序设计的基本思路和方法; (2)达到熟练掌握C语言的基本知识和技能; (3)能够利用所学的基本知识和技能,解决简单的程序设计问题。程序功能:(1) 计算各个学生的总分及平均分,并
2、按平均分排出名次。(2) 统计全班学生平均分成绩,输出60分以下、6079、8089、90分以上各分数人数。(3) 能按学号、姓名查询学生成绩,并能输出学生的成绩单。(4) 输出不及格科目及学生名单。(5) 在屏幕打印优等生名单(学号,三门课程成绩,平均成绩,名次),优等生必须满足下列条件:1平均成绩大于90分;或平均分大于85分且至少有一门功课为100分;或者平均分大于85分且至少两门课程成绩为95分以上;2名次在前三名; 3每门功课及格以上。二、总体设计(1)程序设计组成框图:(2)程序设计流程图:54321三、 详细设计1) 初始化结构体数组:初始化学生的学号、姓名,数学、英语、计算机三
3、科的成绩,暂定学生的排名、总分、平均分为0。2) 建立文本文件:可用函数void wenjian1()和void wenjian2()来实现,将系统查询的结果全部写入文本文件中。3) 求总分和平均分:可用函数void modify(struct Student stuN)来实现,将计算的结果赋给结构体数组中的学生的总分和平均分。4) 按平均分排名:先调用函数void modify(struct Student stuN),再用函数void rank(struct Student stuN)来实现,将计算的结果赋给结构体数组中的学生的排名。调用函数void print(struct Studen
4、t stuN)按表格形式输出学生所有信息,调用函数void wenjian1()将其写入文本文件。5) 统计各个分数段的人数:在第(4)步基础上用函数void grade(struct Student stuN) 来实现,将统计的结果输出并调用函数void wenjian2()写入文本文件中。6) 查找学生的信息:在第(4)步基础上用函数void search(struct Student stuN)来实现,用switch语句读入用户的选择,若读入1,则按学号查找;若读入2,则按姓名查找。调用函数void wenjian2()将查找结果写入文本文件。7) 查找不及格科目及学生:在第(4)步基础
5、上用函数void insert(struct Student stuN)来实现,依次输出数学、英语、计算机不及格的学生姓名和该科不及格成绩并调用函数void wenjian2()写入文本文件中。8) 查找优等生:在第(4)步基础上用函数void excellent(struct Student stuN)来实现,找出同时满足优等生三个条件的学生即为优等生,输出他们的所有信息并调用函数void wenjian2()写入文本文件。9) 系统的欢迎界面:可用函数void system(struct Student stuN)来实现。10) 菜单选择:可用函数void menu(struct Stud
6、ent stuN)来实现,一共有5个功能,用switch语句读入用户的选择。四、 调试与测试1) 文件模块问题:这个系统总共有5个功能,也就是有5个结果,可是运行完了之后发现后一次的结果会覆盖前一次的结果,打开文本文件查看的时候发现里面的内容混乱。解决办法:设置两个子函数,一个是读入第一个结果的子函数void wenjian1(),文件类型设置为“wb”型,另一个是读入后四个结果的子函数void wenjian2(),文件类型设置为“ab+”型,实现为刚刚建立的文本文件续写的功能。这样在下面的程序中只需要调用自己需要的子函数就可以将结果正确无误的保存到文本文件中。2) 排名模块 问题:可用vo
7、id rank(struct Student stuN)来实现。可是在设计“若平均分相同则并列名次”这个算法的时候遇到了困难,试验了好几次都不成功。解决办法:1、最开始只是简单的以为用选择法对结构体里每名学生的平均分stui.aver从大到小排好序,然后再从一到十的赋给排名stui.rank就行,后来发现这解决不了名次并列的问题。于是想到了用for循环将结构体里学生的成绩stui.aver与已排好名的数组averagem从大到小一个一个比较,若遇到几个学生的分数与averagek相同,则给stui.rank赋相同的值。2、可是再次调试的时候问题又来了,因为当初排名的时候数组里averagem也
8、有相同的值,结果导致给stui.rank赋值出现了重复,后一次的排名会覆盖上一次的排名。于是,我又想了一个办法,那就是在用选择法对averagem进行排名的时候,若遇到几个值相同的元素,则只保留一个元素,这样在给stui.rank赋值的时候就不会出现重复了。于是这个问题顺利解决。五、 源程序清单和执行结果(1)源程序清单如下:/*头文件*/#include#include/*宏定义*/#define N 10/*全局指针变量*/FILE *fp;/*定义结构体数组*/struct Student int ranking; int num; char name20; float score3;
9、float aver; float total;/*初始化结构体数组*/struct Student stuN=0,1001,Yang Shengqian,99,80,85,0,0,0,1002,Xiang Jing,80,90,78,0,0,0,1003,Wang Minghui,60,70,59,0,0,0,1004,Dong Qiang,91,90,90,0,0,0,1005,Zheng Kai,85,76,90,0,0,0,1006,He Yunling,90,91,90,0,0,0,1007,Wang Yao,69,47,67,0,0,0,1008,Gou Huan,45,76,56
10、,0,0,0,1009,Ma Yuling,89,78,67,0,0,0,1010,Ran Dongdu,100,100,98,0,0;/*子函数功能:建立文本文件*/void wenjian1() if(fp=fopen(xscjglxt.txt,wb)=NULL)/*用“wb”建立一个二进制文件*/ printf(cannot open filen); return; /*子函数功能:续写文本文件*/void wenjian2() if(fp=fopen(xscjglxt.txt,ab+)=NULL)/*用“ab+”为刚刚建立的文件实现续写*/ printf(cannot open fil
11、en); return; /*子函数功能:求总分和平均分*/void modify(struct Student stuN) int i; for(i=0;iN;i+) stui.total=stui.score0+stui.score1+stui.score2; /*求总分*/ stui.aver=stui.total/3.0;/*求平均分*/ /*子函数功能:根据平均分排名*/void rank(struct Student stuN) int i,j,k,m,n; float averageN,t; modify(stu);/*调用子函数modify()*/ for(i=0;iN;i+)
12、 averagei=stui.aver; for(i=0;iN-1;i+)/*用选择法对平均分排名*/ k=i; for(j=i+1;javeragek) k=j; t=averagek; averagek=averagei; averagei=t; for(m=0,n=1;mN;m+,n+)/*把排好的名次赋给结构体里的元素*/ for(i=0;iN;i+) if(stui.aver=averagem) stui.ranking=n;/*子函数功能:统计各个分数段人数*/void grade(struct Student stuN) int A,B,C,D,E,i; wenjian2();/
13、*打开文件*/ A=B=C=D=E=0; for(i=0;iN;i+) if(stui.aver=60&stui.aver=70&stui.aver=80&stui.aver=90) /*平均分大于89的人数*/ A+; printf(90t80-89t70-79t60-69t90t80-89t70-79t60-69t60rn);/*在文件中输出各分数段人数*/ printf(%dt%dt%dt%dt%dn,E,D,C,B,A); fprintf(fp,%dt%dt%dt%dt%drn,E,D,C,B,A); fclose(fp);/*关闭文件*/ /*子函数功能:用姓名或者学号查找学生信息*
14、/void search(struct Student stuN) int num1,i,n; char name120; wenjian2();/*打开文件*/ /*说明若是按学号查找,则输入1;若是按姓名查找,则输入2*/ printf(if you want to search by number,please input 1.nif you want to search by name,please input 2.nn); printf(please input your choice:);/ *提示用户输入自己的选择*/ scanf(%d,&n);/*读入用户的选择*/ print
15、f(n); switch(n) /*用学号查找*/ case 1:printf(please input the number:); scanf(%d,&num1); printf(n); for(i=0;iN;i+)/*一个一个比较学号是否相符*/ if(stui.num=num1) printf(RanktNumbertNamettMathtEnglishtComputertTotaltAveragen); fprintf(fp,rnRanktNumbertNamettMathtEnglishtComputertTotaltAveragern); printf(%-4dt%-5dt%st%
16、5.2ft%5.2ft%5.2ft%14.2ft%5.2fn, stui.ranking,stui.num,stui.name,stui.score0,stui.score1,stui.score2,stui.total,stui.aver); fprintf(fp,%-4dt%-5dt%st%5.2ft%5.2ft%5.2ft%14.2ft%5.2frn, stui.ranking,stui.num,stui.name,stui.score0,stui.score1,stui.score2,stui.total,stui.aver); if(num11010)/*如果用户输入不正确则提示出错
17、*/ printf(ERROR!n); break; /*用姓名查找*/ case 2:printf(please input the name:); gets(name1); gets(name1); printf(n); for(i=0;iN;i+)/*一个一个比较名字是否相符*/ if(strcmp(stui.name,name1)=0) printf(RanktNumbertNamettMathtEnglishtComputertTotaltAveragen); fprintf(fp,rnRanktNumbertNamettMathtEnglishtComputertTotaltAve
18、ragern); printf(%-4dt%-5dt%st%5.2ft%5.2ft%5.2ft%14.2ft%5.2fn, stui.ranking,stui.num,stui.name,stui.score0,stui.score1,stui.score2,stui.total,stui.aver); fprintf(fp,%-4dt%-5dt%st%5.2ft%5.2ft%5.2ft%14.2ft%5.2frn, stui.ranking,stui.num,stui.name,stui.score0,stui.score1,stui.score2,stui.total,stui.aver)
19、; if(strcmp(stui.name,name1)=0) break; if(i=N&strcmp(stui.name,name1)!=0)/ *如果用户输入不正确则提示出错*/ printf(ERROR!); break; default:printf(ERROR!n);/*如果用户输入选择键错误则提示出错*/ fclose(fp);/*关闭文件*/ /*子函数功能:输出不及格科目和学生及其不及格分数*/void insert(struct Student stuN) int i,j=0; wenjian2();/*打开文件*/ printf(Math:); fprintf(fp,rn
20、Math:);/* *查找数学不及格的学生*/ for(i=0;iN;i+) if(stui.score060) printf(tt%st%5.2ft,stui.name,stui.score0); fprintf(fp,tt%st%5.2ft,stui.name,stui.score0); printf(nEnglish:);/*查找英语不及格的学生*/ fprintf(fp,rnEnglish:); for(i=0;iN;i+) if(stui.score160) printf(t%st%5.2ft,stui.name,stui.score1); fprintf(fp,t%st%5.2fr
21、,stui.name,stui.score1); printf(nComputer:);/*查找计算机不及格的学生*/ fprintf(fp,rnComputer:); for(i=0;iN;i+) if(stui.score260) printf(t%st%5.2fnt,stui.name,stui.score2); fprintf(fp,t%st%5.2ft,stui.name,stui.score2); printf(n); fclose(fp);/*关闭文件*/*输出优等生的信息*/void excellent(struct Student stuN) int i,j,k,t,m,a,
22、b,c; j=k=t=m=a=b=c=0; wenjian2();/*打开文件*/ modify(stu); rank(stu); printf(RanktNumbertNamettMathtEnglishtComputertTotaltAveragen); fprintf(fp,rn); fprintf(fp,rnRanktNumbertNamettMathtEnglishtComputertTotaltAveragern); for(i=0;i90) j=1; if(stui.aver85&(stui.score0=100|stui.score1=100|stui.score2=100)
23、k=1; if(stui.score095&stui.score195)|(stui.score095&stui.score295)|(stui.score195&stui.score295) t=1; if(stui.aver85&t) m=1; if(j|k|m)/*优等生平均成绩大于90分;或平均分大于85分且至少有一门功课为100分;或平均分大于85分且至少两门课程成绩为95分以上*/ a=1; if(stui.ranking60&stui.score160&stui.score260) c=1; if(a&b&c)/*必须同时满足三个条件*/ printf(%-4dt%-5dt%st%5.2ft%5.2ft%5.2ft%14.2ft%5.2fn, stui.ranking,stui.num,stui.name,stui.score0,stui.score1,stui.score2,stui.total,stui.ave
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1