1、目 录1 实验目的和意义21.1 目的21.2 意义22 系统功能描述及设计32.1系统化功能描述32.2系统功能设计33 系统存储结构设计与描述64 系统功能实现及算法描述74.1查询函数 void chaxun();74.2删除函数 void shanchu();84.3修改功能 void xiugai();85 系统性能测试105.1菜单功能测试105.2录入、添加功能测试105.3浏览功能测试115.4学生信息查询功能测试125.5学生成绩排序功能测试125.6学生信息统计功能测试125.7学生信息修改功能测试135.8学生信息删除功能测试136 设计小结15致谢16参考文献17附录:
2、源代码清单181 实验目的和意义1.1 目的在全面掌握C语言程序设计课程的知识点的前提下,培养学生分析实际问题的能力,并能够自己编写程序实现对际问题的处理,掌握程序项目开发的一般步骤。1.2 意义(1)在写程序的过程中要养成良好的习惯为自己省掉很多麻烦。(2)总体上复习了这一学期学到的大部分程序并把它们系统的连串起来。(3)学会调试一个程序,知道错在哪里,为什么错。(4)了解报告的写法,写一个程序的步骤。(5)能够检查出别人的程序,从别人的程序了解到别人的想法。2 系统功能描述及设计2.1系统化功能描述学生成绩管理学生信息至少包括学号(系统随机生成,范围在2009111120099999内,且
3、学号不得相等),姓名,性别,计算机分数,数学分数,英语分数等。该系统需要能够提供下列功能: (1)系统以菜单方式工作(2)学生信息录入功能(学生信息用文件保存)(3)学生信息浏览功能 (能查看所有同学的记录)(4)学生信息查询功能,查询方式:1)按学号查询 2)按姓名查询(5)成绩排序统计功能:1)按照指定的要求对学生记录进行排序 2)按照指定的学科对成绩进行统计,需要提供该门成绩的:最高分、最低分、平均分、及格率及在五个分数段的学生人数比率(0,59,60,69,70,79,80,89,90,100)(6)学生信息删除,修改功能。(7)退出系统。 2.2系统功能设计程序运行以后就会显示菜单界
4、面: 1.学生信息录入, 2.学生信息浏览, 3.学生信息查询,4.学生信息排序,5. 学生信息统计, 6.学生信息修改,7.学生信息删除,0.退出系统(图21)。图21 系统功能模块图学生信息录入功能:进入主菜单,选择录入功能所对应的数字,选择你所要录入的学生信息人数,显示出随机学号,顺次依照提示录入学生姓名、性别、数学成绩、英语成绩、计算机成绩。录入完毕后,会有个提示返回主菜单。学生信息浏览功能:主菜单中选择学生信息显示功能,如果你没先录入学生信息,那么则提示出错,打不开文件。如果有,则会把你所录入的学生成绩一表格形式展示出来.最后提示返回主菜单。学生信息查询功能:在主菜单中选择该功能,根
5、据提示选择按学号查询或按姓名查询,根据提示输入你所要查询的学生学号(或姓名),若学号(或姓名)错误,则会提示没有该学生,同时产生继续按学号查找或按姓名查找,根据提示继续输入。否,则继续输入,当学号或姓名正确时,会把该生的信息展示出来。学生成绩排序功能:在主菜单中选择该功能,根据提示选择排序方式学号、英语、数学、计算机、总分,再根据提示选择升序或降序,显示排序的信息接下来按提示选择是返回上级菜单还是返回主菜单。学生信息统计功能::在主菜单中选择该功能,选择统计的科目英语、数学、计算机或总分,根据你所录入的学生信息,会显示所输入学生的最高分、最低分、平均分、及格率及各分数段的统计,接下来按提示选择
6、是返回上级菜单还是返回主菜单。学生信息修改功能:在主菜单中选择该功能,输入需要修改的学生号,若不存在该学号则根据提示继续输入,以至输入正确,显示出该学生的信息,确定是否为该生,确定是否修改,再根据提示输入该学生的信息,接下来系统提示结束或返回主菜单。学生信息删除功能:再主菜单中选择该功能,输入需要删除的学生的学号,若不存在该学号则根据提示继续输入,以至输入正确,显示出该学生的信息,确定是否为该生,确定是否删除,若是则提示该学生的信息已删除,接下来系统提示结束或返回主菜单。结束程序:根据主菜单界面的提示,输入对应的数字,则结束整个程序。3 系统存储结构设计与描述子函数如下:void list()
7、; /显示出菜单void daoru(); /把数据从磁盘导入内存void save(); /把数据从内存导入磁盘void luru(); /录入、添加学生信息void suiji(int n); /生成随机数 void liulan(); /浏览已存学生的信息void paixu(); /排列学生的信息void paixu_num(); /按学号排序void paixu_eng(); /按英语成绩排序void paixu_math(); /按数学成绩排序void paixu_com(); /按计算机成绩排序void paixu_sum(); /按总分排序void chaxun(); /查询学
8、生的信息void chaxun_num(); /按学号查询void chaxun_name(); /按姓名查询 void shanchu(); /删除学生信息void xiugai(); /修改学生的信息void end(); /结束 程序void tongji(); /统计学生的各科成绩void tongji_eng(); /统计学生的英语成绩void tongji_math(); /统计学生的数学成绩void tongji_com(); /统计学生的计算机成绩void tongji_sum(); /统计学生的总分void print(); /只输入一位学生信息void print_pai_
9、sheng(); /按升序输出学生的信息void print_pai_jiang(); /按降序输入学生的信息void print_tong(float min,float max,float average,float pass,float point1,float point2,float point3,float point4,float point5); /输出统计后学生的信息结构体如下:static struct student /定义结构体的类型名long num; /学号char name10; /姓名char sex; /性别float score_eng; /英语float
10、score_math; /数学成绩float score_com; /计算机成绩float sum; /总分stuM; /结构体的个数4 系统功能实现及算法描述4.1查询函数 void chaxun()学生信息查询:根据提示进入查询功能,选择所需的功能(图41)。图 41 查询函数流程图程序运行以后就会出现主菜单界面,然后你输入查询函数功能对应的数字“3”,然后主函数会调用查询函数。进入查询函数后输入查询方式按学号查询或按姓名查询,然后查询函数会调用查询方式的函数,输入查找的学号(或姓名),函数运用for()循环找出该学生的信息,系统提示“是否继续查询”根据提示输入,继续查找或返回主菜单。若没
11、有该学生则提示“不存在这个学号(或姓名)”,根据系统提示,继续按本方法查找或换个方法查找,若输入“1”,则继续按该函数查找,若输入“2”则按另一方式查找。直到找出该学生为止。4.2删除函数 void shanchu()学生信息删除:根据提示进入删除功能(图42)。图42 删除函数流程图程序运行以后就会出现主菜单界面,然后你输入查询函数功能对应的数字“7”,然后主函数会调用删除函数。进入删除函数后输入需删除的学生的学号,然后查询并显示出该学生的信息,否则继续输入。确认是否为该学生、是否删除,若是,则系统提示“该学生已删除。”。否则,重新输入需删除的学生的学号。根据提示输入,选择继续删除或返回主菜
12、单。4.3修改功能 void xiugai()学生信息修改:根据提示进入修改功能(图43)。图43 修改程序流程图程序运行以后就会出现主菜单界面,然后你输入修改函数功能对应的数字“6”,然后主函数会调用修改函数。进入修改函数后输入需修改的学生的学号,然后查询并显示出该学生的信息,否则继续输入。确认是否为该学生、是否修改,若是,则根据体统提示输入新的信息。若否,则重新输入需修改的学生的学号。再根据提示输入,选择继续修改或返回主菜单。5 系统性能测试5.1菜单功能测试调试好程序以后,系统自动会显示出以下界面(图5-1)。然后根据界面上的提示输入系统功能多对应的数字,就会显示出你所需运行的子函数,在
13、按界面提示出入信息。图51主菜单5.2录入、添加功能测试选则录入函数功能以后会显示出信息提示如,请选择录入的人数,然后系统自动生成学号并显示出,请输入学生姓名、性别、英语分数、数学分数以及计算机的分数,如下所显示的界面,然后根据系统提示依次输入信息(图5-2)。图52 录入学生的信息5.3浏览功能测试调用daoru()函数以后,将磁盘中的信息读取到内存,清屏之后显示所有学生的信息(图53)。图53学生信息浏览5.4学生信息查询功能测试调用daoru()函数以后,将磁盘中的信息读取到内存,清屏之后输入查询方式和查询的信息之后显示查询出的信息(图54)。图54 查询出的信息5.5学生成绩排序功能测
14、试在主菜单中输入操作序号,清屏之后输入排序科目和排序方式之后显示出排序后的信息(图55)。图55 排序之后显示出的信息5.6学生信息统计功能测试在主菜单中输入操作序号,输入统计科目之后显示出统计后的信息(图56)。图56 统计之后显示出的信息5.7学生信息修改功能测试在主菜单中输入操作序号,输入要修改的学生的学号,屏幕输出该学生的信息确定是否修改,输入修改的信息并确定是否返回主菜单(图57)。图57 修改功能显示5.8学生信息删除功能测试在主菜单中输入操作序号,清屏后输入要删除的学生的学号,屏幕输出该学生的信息确定是否删除,删除后确定是否返回主菜单(图58)。图 58 删除功能显示6 设计小结
15、(1)指针是C语言的升级版,会用的话绝对会减少好多麻烦还可以节约纸张。(2)在输入字符串时要记得回车键时要被接收的。(3)逻辑错误是麻烦的,它会让你把程序重新写一遍。(4)要学会调试能帮你找到逻辑错误。(5)耐心和细心是些C的必要条件,也许好长时间你就纠结一个简单的问题,纠结出来了才发现原来如此简单。(6)提示输入很重要,平常还感觉不到特别是在循环的时候,没有提示输入就不知道是到了要输入的时候还以为是那些错了呢,现在养成良好的习惯以后就会省掉很多麻烦。(7)耐心的修改程序,时间长了,修改的多了,就知道错在哪里。显示的只有一个错误,但是翻上去一看发现有一打的错误,其实不用怕,也许只是犯了个很小白
16、的错误。致谢对帮助我完成课程设计的本本很感谢,是你一直不眠不休的让我工作,从不罢工,从不闹小脾气,无论有多艰辛都从不喊累。在我无助的时候,从不放弃我。深深的感谢你,是在你帮助下我才完成了课程设计。参考文献1谭浩强.C语言课程设计(第三版).北京:清华大学出版社, 1996.52谭浩强.C程序设计解题及上级指南.北京:清华大学出版社,20053鲍有文等.C程序设计试题汇编.北京:清华大学出版社,1998附录:源代码清单#include stdio.h#include stdlib.h#include time.h#include string.h#define M 50void list();v
17、oid daoru(); /把数据从磁盘导入内存void save(); /把数据从内存导入磁盘void luru(); void suiji(int n);void liulan();void paixu();void paixu_num();void paixu_eng();void paixu_math();void paixu_com();void paixu_sum();void chaxun();void chaxun_num();void chaxun_name();void shanchu();void xiugai();void end();void tongji();voi
18、d tongji_eng();void tongji_math();void tongji_com();void tongji_sum();void print();void print_pai_sheng();void print_pai_jiang();void print_tong(float min,float max,float average,float pass,float point1,float point2,float point3,float point4,float point5);int i,j,N=0;static struct studentlong num;ch
19、ar name10;char sex;float score_eng;float score_math;float score_com;float sum;stuM;void main()int n;char a;loop:list(); scanf(%d,&n); while (n7) printf(选择错误请重新输入:); scanf(%d,&n); if (n=0) end(); else switch (n) case 1:luru();break; case 2:liulan();break; case 3:chaxun();break; case 4:paixu();break;
20、case 5:tongji();break; case 6:xiugai();break; case 7:shanchu();break; printf(n是否返回主菜单(Y/其它):); getchar(); a=getchar(); system(cls); if (a=Y|a=y) goto loop; else end(); void end()system(cls);printf(ntn);printf(ntt谢谢您的光临!);printf(ntt( _ )/拜拜!n);printf(ntn);void daoru() /将文件从磁盘导入内存FILE *fp;int length;
21、if(fp=fopen(stu_list.txt,rb)=NULL)printf(cannot open the filen);return;fseek(fp,0L,SEEK_END); /使文件指针移向末尾length=ftell(fp); /求出该文件的字节数长度rewind(fp); /是文件指针移向文件开头N=length/sizeof(struct student); /求出文件中以保存学生的个数 for(i=0;iN;i+)fread(&stui,sizeof(struct student),1,fp);fclose(fp);void save() /把数据从内存导入磁盘FILE
22、*fp;if (fp=fopen(stu_list.txt,wb)=NULL)printf(cannot open filen);return;for (i=0;iN;i+)if (fwrite(&stui,sizeof(struct student),1,fp)!=1)printf(file write errorn);fclose(fp);void list()printf(n学生成绩管理系统n);printf(n1.学生信息录入tt2.学生信息浏览);printf(n3.学生信息查询tt4.学生成绩排序);printf(n5.学生信息统计tt6.学生信息修改);printf(n7.学生信
23、息删除tt0.退出n);printf(nn);printf(nt请输入您需操作的功能的序号:);void luru()int n,flag=0;printf(需要输入学生信息的个数:);scanf(%d,&n);daoru();suiji(n);for (i=0;in;i+)printf(n第%d个学生的学号:%ldn,i+1,stuN+i.num);stuN+i.sum=0;printf(n请输入第%d个学生的姓名:,i+1);scanf(%s,stuN+i.name);printf(n请输入第%d个学生的性别(W/M):,i+1);getchar(); scanf(%c,&stuN+i.s
24、ex);printf(n请输入第%d个学生的英语成绩:,i+1);scanf(%f,&stuN+i.score_eng);printf(n请输入第%d个学生的数学成绩:,i+1);scanf(%f,&stuN+i.score_math);printf(n请输入第%d个学生的计算机成绩:,i+1);scanf(%f,&stuN+i.score_com);stuN+i.sum=stuN+i.score_eng+stuN+i.score_math+stuN+i.score_com;N+=n;save();void suiji(int n)long id;system(cls);srand(time(
25、NULL);for (i=0;in;i+)id=(rand()%8889+20091111);stuN+i.num=id;for (j=0;j2|n1)printf(请选择正确的序号:);scanf(%d,&n);daoru();switch(n)case 1:chaxun_num();break;case 2:chaxun_name();break;void print()printf(学号 姓名 性别 英语 数学 计算机 总分n);printf(-n);printf(%5ld%9s %5c %5.1f %5.1f %5.1f %6.1fn,stui.num,stui.name,stui.s
26、ex,stui.score_eng,stui.score_math,stui.score_com,stui.sum);printf(-n);void chaxun_num()long num,flag;int a;char ch;save();loop:printf(n请输入被查找人的学号:);scanf(%ld,&num);for (i=0;i3|a1)printf(请选择正确的序号:);scanf(%d,&a);if (a=1)goto loop;if (a=2)chaxun_name();void chaxun_name()int flag=1,a;char name10,ch;save
27、();printf(请输入被查找人的姓名:); scanf(%s,name); for (i=0;iN;i+) flag=strcmp(name,stui.name); if (flag=0) break; if (flag=0) print(); printf(是否继续查询(Y/其它):); getchar(); ch=getchar(); if (ch=Y|ch=y) chaxun_name(); else printf(不存在这个姓名n); printf(1.继续按姓名查找t2.按学号查找n); printf(请选择:); scanf(%d,&a); do if (a=1) chaxun
28、_name(); if (a=2) chaxun_num(); else printf(请选择正确的序号:); scanf(%d,&a); while (a!=1&a!=2); void paixu()int n;system(cls);printf(排列科目:1.学号 2.英语 3.数学 4.计算机 5.总分n);printf(n);printf(请选择:);scanf(%d,&n);while(n5)printf(n请选择正确的序号:);scanf(%d,&n);switch (n)case 1:paixu_num();break;case 2:paixu_eng();break;case
29、 3:paixu_math();break;case 4:paixu_com();break;case 5:paixu_sum();break;void print_pai_sheng()printf(学号 姓名 性别 英语 数学 计算机 总分n);printf(-n);for (i=0;i=0;i-)printf(%5ld%9s %5c %5.1f %5.1f %5.1f %6.1fn,stui.num,stui.name,stui.sex,stui.score_eng,stui.score_math,stui.score_com,stui.sum);printf(-n);void paix
30、u_num()daoru();int n;struct student temp;char ch;printf(排序方式: 1.升序 2.降序n);printf(n);printf(请选择:);scanf(%d,&n);while(n2)printf(n请选择正确的序号:);scanf(%d,&n);for (i=0;iN;i+)for (j=i+1;jstuj.num)temp=stui;stui=stuj;stuj=temp;switch (n)case 1:print_pai_sheng();break;case 2:print_pai_jiang();break;putchar(n);
31、printf(是否继续(Y/其它):);getchar();ch=getchar();if (ch=Y|ch=y)system(cls);paixu();void paixu_eng()daoru();int n;struct student temp;char ch;printf(排序方式: 1.升序 2.降序n);printf(n);printf(请选择:);scanf(%d,&n);while(n2)printf(n请选择正确的序号:);scanf(%d,&n);for (i=0;iN-1;i+)for (j=i+1;jstuj.score_eng)temp=stui;stui=stuj
32、;stuj=temp;switch (n)case 1:print_pai_sheng();break;case 2:print_pai_jiang();break;putchar(n);printf(是否继续(Y/其它):);getchar();ch=getchar();if (ch=Y|ch=y)paixu();void paixu_math()daoru();int n;struct student temp;char ch;printf(排序方式: 1.升序 2.降序n);printf(n);printf(请选择:);scanf(%d,&n);while(n2)printf(n请选择正
33、确的序号:);scanf(%d,&n);for (i=0;iN;i+)for (j=i+1;jstuj.score_math)temp=stui;stui=stuj;stuj=temp;switch (n)case 1:print_pai_sheng();break;case 2:print_pai_jiang();break;putchar(n);printf(是否继续(Y/其它):);getchar();ch=getchar();if (ch=Y|ch=y)paixu();void paixu_com()daoru();int n;struct student temp;char ch;printf(排序方式: 1.升序 2.降序n);printf(n);printf(请选择:);scanf(%d,&n);while(2n|n1)printf(n请选择正确的序号:);scanf(%d,&n);for (i=0;iN;i+)for (j=i+1;jstuj.score_com)temp=stui;stui=stuj;stuj=temp;switch (n)case 1:print_pai_sheng();break;case 2:print_pai_jiang