一、设计目的:
高级语言综合设计是学习“高级语言程序设计”课程后进行的一次全面的综合练习。其目的在于加深对高级语言程序设计基础理论和基本知识的理解,进一步了解和应用丰富的C语言函数,锻炼学生分析、解决复杂问题的能力,提高学生编写程序的能力,为开发软件打下坚实的基础。
二、设计要求:
要求学生利用学到的编程知识和编程技巧,学会如何运用前修知识与查阅、收集、归纳相关资料解决具体问题的方法;
按班级建立学生文件,对应增删改功能;建立学生成绩文件(每个学生至少三门课),对应增删改功能;学生成绩可以按学生、按课程求平均;提供必要的查询功能;找出有两门课以上不及格的学生,输出他们的学号和全部成绩,要求用指针函数实现:float *Search(float (*p)[5])
综合运用结构体、指针、数组、文件知识开发应用程序。
三、题目分析:
用C语言编写程序完成以下任务:
(1)能完成对学生成绩的录入、修改
(2)能按班级统计学生的成绩,求学生的总分及平均分
(3)能查询学生成绩,有两门以上不及格科目的学生名单
(4)输出学生的成绩单
(5)计算不同分段学生的人数
四、设计需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为十个模块,每一个模块对应一个函数。在这些函数当中,按学期对学生信息查询函数、按班级对学生信息查询函数、按平均成绩排序函数、按班级显示学生成绩单函数、统计全部学生总分及平均分函数、按总成绩排序函数、统计成绩不及格学生信息函数、显示全部学生信息并统计人数函数的实现严格按照题目的要求。读取文件函数对其它函数的实现起辅助作用,主函数及菜单函数控制程序的整体运行。
1.显示全部学生信息并统计人数 这里要用到文件打开函数和文件读取数据函数,再加入人数的统计语句.
2.统计全部学生总分及平均分 这一步在第一项功能的基础上稍加改动,添加求学生总分和平均分的函数就可以实现预期的功能。
3.按对学生信息查询 实现的功能是按照学期对学生的成绩和数据进行查询,要求输入正确学期实现该功能。
4.对学生信息查询 实现的功能是按照班级对学生的成绩和数据进行查询,要求输入正确班级实现该功能。
5.显示学生成绩单 该项即显示所有学生的基本信息及在总体中成绩排序信息。
除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序,这使整个程序更加完善。
每一个学生记录都包含学期、班级、学号、姓名,以及数学、语文、英语三门成绩,在程序当中将学生记录类型定义为结构体类型,用函数每次对学生记录的访问。
五、功能模块介绍
根据要求设计7个函数:Menu()、inputScore()、 Search()、.Insert()、Delete( )、 Count()、Show()。
1. Menu()模块
该模块执行后,给出6个菜单项的内容和输人提示。
1.学生成绩输入
2.学生成绩查询
3.学生成绩插入
4.学生成绩删除
5.学生成绩统计
- 退出
2. inputScore()模块
本模块实现的功能是对学生的信息进行录人,每输人一条学生记录,将其写人文件,并询问是否继续录人,根据需求输人若干条记录。
3. Search()模块
本模块实现的功能是查询学生的相关信息,首先输人学生学号,在文件中查找与输人的学号相同的记录,并在屏幕上显示出来。当文件中不存在该学生的信息时,系统将做出相关提示。
4.Insert()模块
本模块实现的功能是要求用户输人某一学生 的相关信息,并将该学生插人文件末尾。
5. Delete( )模块
本模块实现的功能是要求用户输人某- -学生的学号,从文件中查找该学生的信息,如果存在,删除该学生的信息;反之提供相关提示。
6. Count()模块
本模块实现的功能是对学生的信息进行统计,主要实现三方面的功能:按照数学成绩对学生进行分段统计,按照语文成绩对学生进行分段统计,按照英语成绩对学生进行分段统计,按照平均成绩对学生进行分段统计。
7. Show()模块
本模块实现的功能是将文件中的所有信息在屏幕上显示出来。
六、测试情况
附图
七、源程序代码
#include#include #include #define maxnub 100 typedef struct stud { int number; char name[20]; float math; float chinese; float english; float average; }StudentInfor; //函数声明 void Menu();//主菜单模块 void inputScore();//输入 void Search();//查找 void Insert();//插入 void Delete();//删除 void Select(); void Find(); void Count();//统计 void Show();//查看 int main() { int choice; while(1) { Menu(); scanf("%d",&choice); switch(choice) { case 1:inputScore();Show();break; case 2:Search();break; case 3:Insert();Show();break; case 4:Delete();Show();break; case 5:Count();break; case 0:return 0; default:printf("nt输入错误,请重新选择!n"); } } return 0; } void Menu() { printf("t学生成绩管理系统n"); printf("t*1.学生成绩输入n"); printf("t*2学生成绩查询n" ); printf("t*3学生成绩插入n" ); printf("t*4学生成绩删除 n" ); printf("t*5学生成绩统计n" ); printf("t*6学生成绩查找不及格n"); printf("t*0.退出n" ); printf("请输入您要进行的操作:"); } void inputScore()//用来控制是否输入 { char ch='y'; FILE *fp; StudentInfor varStu; if((fp=fopen("studentScore.dat","wb"))==NULL) { printf("文件无法打开n"); return; } printf("请输入学生的学号,姓名,数学成绩,语文成绩,英语成绩n"); while(ch=='y') { scanf("%d",&varStu.number); getchar(); scanf("%s",varStu.name); scanf("%f%f%f",&varStu.math,&varStu.chinese,&varStu.english); varStu.average=(varStu.math+varStu.chinese+varStu.english)/3; fwrite(&varStu,sizeof(StudentInfor),1,fp); printf("是否需要继续输入?(y/n)"); getchar(); scanf("%c",&ch); ch=(ch=='Y')?ch+32:ch; } fclose(fp); } void Search() { int number,flag; FILE *fp; StudentInfor varStu; char ch='y'; if((fp=fopen("studentScore.dat","rb"))==NULL) { printf("文件无法打开!n"); return; } while(ch=='y') { flag=0; printf("请输入您要查找的学生符号:"); scanf("%d",&number); getchar(); rewind(fp); while(!feof(fp)) { fread(&varStu,sizeof(StudentInfor),1,fp); if(number==varStu.number){ flag=1; printf("%d%s%.2f",varStu.number,varStu.name,varStu.math); printf("%.2f%.2f%.2fn",varStu.chinese,varStu.english,varStu.average); } } if(!flag) printf("您要查找的学生信息不存在!n"); printf("你是否继续查询?(y/n)"); scanf("%c",&ch); ch=(ch=='Y')?ch+32:ch; } fclose(fp); } void Insert() { FILE *fp; StudentInfor varStu; printf("请输入学生的学号,姓名,数学成绩,语文成绩,英语成绩n"); scanf("%d",&varStu.number); getchar(); scanf("%s",varStu.name); getchar(); scanf("%f%f%f",&varStu.math,&varStu.chinese,&varStu.english); varStu.average=(varStu.math+varStu.chinese+varStu.english)/3; if((fp=fopen("studentScore.dat","ab"))==NULL) { printf("文件无法打开!"); return; } fwrite(&varStu,sizeof(StudentInfor),1,fp); fclose(fp); } void Delete() { StudentInfor varStu; int number,exists,i; FILE *fp,*fp1; exists=0; if((fp=fopen("studentScore.dat","rb"))==NULL) { printf("文件无法打开!n"); return; } if((fp1=fopen("studentScore1.dat","wb"))==NULL) { printf("文件无法打开!n"); return; } printf("请输入要删除的学生号:"); scanf("%d",&number); //将文件中的未被删除的学生信息存储到文件studentInfor.dat中 fread(&varStu,sizeof(StudentInfor),1,fp1); while(!number) { if(varStu.number!=number) fwrite(&varStu,sizeof(StudentInfor),1,fp1); else exists=1; fread(&varStu,sizeof(varStu),1,fp); } fclose(fp);fclose(fp); //将删除相关学生信息后的其他信息文件copy到文件studentScore.dat中 system("copy studentScore1.dat studentScore.dat"); if(exists) printf("学号为%d的学生已删除!n",number); else printf("您要删除的学生信息不存在!"); } void Select(float score,int Num[]) {//判断一门课的成绩 int level; level=(int)(score)/10; switch(level) { case 0: case 1: case 2: case 3: case 4: case 5:Num[0]++;break; case 6:Num[1]++;break; case 7:Num[2]++;break; case 8:Num[3]++;break; case 9: case 10:Num[4]++;break; } } void Count()//统计 { FILE *fp; int mathNum[5],chineseNum[5],englishNum[5],averageNum[5];//五分制 int i,level; StudentInfor varStu; { mathNum[i]=0; chineseNum[i]=0; averageNum[i]=0; } if((fp=fopen("studentScore.dat","rb"))==NULL) { printf("文件无法打开!"); return; } while(!feof(fp)) { fread(&varStu,sizeof(varStu),1,fp); Select(varStu.math,mathNum) ; Select(varStu.chinese,chineseNum); Select(varStu.english,englishNum); Select(varStu.average,averageNum); } fclose(fp); printf("t 60分以下的人数:%dn",mathNum[0]); printf("t 60到70:%dn",mathNum[1]); printf("t 70到80:%dn",mathNum[2]); printf("t 80到90:%dn",mathNum[3]); printf("t 90分以上:%dn",mathNum[4]); printf("===============n"); printf("语文成绩:n"); printf("t 60分以下的人数:%dn",chineseNum[0]); printf("t 60到70:%dn",chineseNum[1]); printf("t 70到80:%dn",chineseNum[2]); printf("t 80到90:%dn",chineseNum[3]); printf("t 90分以上:%dn",chineseNum[4]); printf("===============n"); printf("英语成绩:n"); printf("t 60分以下的人数:%dn",englishNum[0]); printf("t 60到70:%dn",englishNum[1]); printf("t 70到80:%dn",englishNum[2]); printf("t 80到90:%dn",englishNum[3]); printf("t 90分以上:%dn",englishNum[4]); printf("===============n"); printf("平均成绩:n"); printf("t 60分以下的人数:%dn",averageNum[0]); printf("t 60到70:%dn",averageNum[1]); printf("t 70到80:%dn",averageNum[2]); printf("t 80到90:%dn",averageNum[3]); printf("t 90分以上:%dn",averageNum[4]); } void Show() { FILE *fp; StudentInfor varStu; if((fp=fopen("studentScore.dat","rb"))==NULL) { printf("文件无法打开n"); return; } printf("输出学生的所有信息n"); printf("学号 姓名 数学 语文 英语 平均分n"); fread(&varStu,sizeof(varStu),1,fp); while(!feof(fp)) { printf("%6d%8s%7.1f",varStu.number,varStu.name,varStu.math); printf("%8.1f%8.2f%8.3fn",varStu.chinese,varStu.english,varStu.average); fread(&varStu,sizeof(varStu),1,fp); } fclose(fp); }
八、课程设计总结及其感悟
通过这次C语言的课程设计,我明白了很多也知道了很多,更收获了很多。在课程设计的过程中出现过困难,三周的课程设计已经结束了。回想学习C语言的过程中,既有快乐又有烦恼,回顾这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力。在设计的过程中遇到的问题,这毕竟独立做的,难免会遇到各种各样的问题,同时在设计的过程中发现自己的不足之处,对以前所学的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识从新温故。
这次课程设计不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,才能提高自己的实际动手能力和独立思考能力。同时,我也感受到了编程是一项非常烦琐周密的活动,他不但需要一个人周密的思考问题的能力,处理问题的能力,还需要有足够的耐心和严谨治学的作风,来不得半点马虎。
通过本次课程设计,我也初步,学会了怎样去借鉴别人的方法和经验,知道如何去查找资料和整合处理这些资料的能力,它使我更加地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题。最后一点,就是编程时思路一定要清楚。因为编程本身就是一个严密的逻辑过程,实现每一步的操作需要那些命令,哪些条件都是清清楚楚,明明了了的,来不得半点遗漏。总的来说,编程是件复杂的脑力劳动,要有科学严谨的科学态度,细心的习惯和耐心才能作好,要做到以上的要求我们还要做许多许多。
我对C语言的兴趣日益升温,对C语言进行更深探索的想法愈加浓烈,我相信,虽然C语言结课了,但对C语言更高的追求方面而言,这次课程设计的完结只是一个新的开始,我坚信我可以把对高级语言的兴趣坚持下去,学以致用,有所突破。



