1、1课程设计报告书学生成绩记录簿设计班 级: 0953-1学 号: 20097268姓 名: 赵文龙指导老师: 杨 子 光石家庄铁道大学四方学院2010年 7月 11日2课程设计报告内容1. 选择题目题目:学生成绩记录薄设计2. 内容摘要摘要:本系统实现学生成绩信息的管理与查询,程序具有包括学生信息查询,如姓名,C 语言成绩,成绩分段查看等;同时可以 C 语言成绩信息以及学生情况进行修改,删除和添加。另外还要做到可以对学生成绩信息以及成绩信息查询和维护。程序应具有以下编程思想:1.各模块间通过菜单切换和调用2.主函数通过调用菜单函数实现对各功能模块的调用,各功能模块间根据需要可相互调用。3.程序
2、能够保证各模块功能的独立和数据共享。/*不使用全局变量则能保证函数之间的独立性,利用形参与实参之间的数值传递来实现数据共享*/4.相近功能以级联菜单的形式集成。5.本模块由创建文件以磁盘文件的形式保存。3. 索引关键词关键词:管理与查询,信息链表,信息维护。3目 录1.题目要求 042.设计思想 043.系统完成功能及框图 044.界面设计 055.核心算法及说明 176.结论 197.参考资料 198.后记 2049.附录 205.正文第一部分:题目要求编制一个 C语言成绩记录簿,每个学生信息包括:学号、姓名、C 语言成绩。具体功能:(1)创建信息链表并以磁盘文件保存;(2)读取磁盘文件并显
3、示输出所有学生的成绩;(3)按学号或姓名查询成绩;(4)添加成绩记录;(5)修改指定姓名或学号的学生的成绩并可存盘;(6)显示输出 60分以下、6079、8089、90 分以上各分数段的学生信息(可选)第二部分:设计思想1分析程序的功能要求,划分程序功能模块。 2. 画出系统流程图。 3. 代码的编写。定义数据结构和各个功能子函数。 4. 程序的功能调试。 5. 完成系统总结报告以及使用说明书 第三部分:系统完成功能及框图1.学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息2.信息查询时可实现按姓名查询、按学号查询3.输入任
4、意的一个学生名字(如花花)或一个学号(如 20097268),统计出在此学生的成绩情况。框图:学生成绩记录簿*1. 成绩录入52. 查询3. 修改4. 增加5. 显示6. 统计7. 删除0. 退出*第四部分:界面设计#include #include #include #include #define N 20typedef struct char name10;int num;float c;stu;主模块学生成绩录入学生成绩添加添加学生信息删除学生信息学生信息查询学生成绩显示学生成绩删除学生信息统计修改学生信息按学号删除按成绩删除学生优秀人数退出程序不及格的人数及格的人数按姓名查询按学号查
5、询6/菜单void menu() /*便于操作员使用*/ /*清屏*/ system(“cls“);printf(“nnnnttt 学生平时成绩管理n“ );printf(“ttt=n“);printf(“ttt 1.成绩录入n“);printf(“ttt 2.查询n“);printf(“ttt 3.修改n“);printf(“ttt 4.插入n“);printf(“ttt 5.显示n“);printf(“ttt 6.统计n“);printf(“ttt 7.删除n“);printf(“ttt 0.退出n“);printf(“ttt=n“);printf(“ttt请选择相应的功能:“);/成绩录
6、入void input()FILE *fp;stu xs; /*定义 一个结构体 变量来装从文件中读出来的数据 */if(fp=fopen(“student.dat“,“ab“)=NULL) printf(“cant open file!n“);exit(0);7printf(“n录入格式: 姓名 学号 C语言 当输入姓名为ps 结束录入n“);while(1) /*中间加油break,可使循环中断*/ scanf(“%s“,xs.name);if(strcmp(xs.name,“ps“)=0) break;/*判断姓名是否为ps,用字符串判断*/scanf(“%d%f“,fwrite( /将
7、成绩信息写入文件fclose(fp);/姓名定义void xingming()FILE *fp;stu xs;char name10;printf(“n输入要查学生的姓名: “);scanf(“%s“,name);if(fp=fopen(“student.dat“,“rb“)=NULL) printf(“cant open file!n“);exit(0);while(!feof(fp)fread(if(strcmp(xs.name,name)=0)/*按姓名查询时判断输入的姓名是否存在,会循环从数据中找取*/8printf(“ 学生的信息如下:n“);printf(“n%10s %6s %6
8、s n“,“姓名“,“学号“ ,“C语言“);printf(“%10s %6d %6.2f n“,xs.name,xs.num,xs.c);break;if(feof(fp) printf(“查找失败!“ ); /*学生不存在*/fclose(fp);/学号定义void xuehao()FILE *fp;stu xs;int num;printf(“n输入要查学生的学号: “);scanf(“%d“,if(fp=fopen(“student.dat“,“rb“)=NULL) printf(“cant open file!n“);exit(0);while(!feof(fp)fread(if(x
9、s.num=num)/*按学号 查询时判断输入的学号是否存在,会循 环从数据中找取*/printf(“ 学生的信息如下:n“);printf(“n%10s %6s %6s n“,“姓名“,“学号“ ,“C语言“);printf(“%10s %6d %6.2f n“,xs.name,xs.num,xs.c);break;9if(feof(fp) printf(“查找失败!“ ); fclose(fp);/查询void search()char ch1;system(“cls“);printf(“请输入按何种方式查询:n“);printf(“1-姓名,2-学号:“);ch1=getchar();/
10、*用字符接收*/switch(ch1)/*判断*/case 1:xingming();break;case 2:xuehao();break;getch();/*让 屏幕停留同时按任意键返回*/修改:输入学生的姓名,查找该学生,若找到 则修改该生的成绩信息,并显示修改前后的结果;void modi1()stu xs;FILE *fp;char name10;system(“cls“);printf(“n输入要查学生的姓名: “);scanf(“%s“,name);if(fp=fopen(“student.dat“,“rb+“)=NULL) printf(“cant open file!n“);
11、exit(0);10while(!feof(fp)fread(if(strcmp(xs.name,name)=0)/*判断输入要修改的姓名是否存在*/ printf(“ 修改前学生的信息如下:n“);printf(“n%10s %6s %6s n“,“姓名“,“学号“ ,“C语言“);printf(“%10s %6d %6.2f n“,xs.name,xs.num,xs.c);printf(“n请输入该生的C语言成绩:“);scanf(“%f“ ,break;if(!feof(fp) printf(“ n 修改后的学生的信息如下:n“);printf(“n%10s %6s %6s n“,“姓名
12、“,“学号“ ,“C语言“);printf(“%10s %6d %6.2f n“,xs.name,xs.num,xs.c);fseek(fp,-sizeof(stu),1);/*负号表示后退, 1表示文件当前位置*/fwrite(/*再写入,同 时把要修改的那个覆盖掉 */elseprintf(“n学生不存在,修改失败!“); fclose(fp);getch();/修改:输入学生的学号,查找该学生,若找到 则修改该生的成绩信息,并显示修11改前后的结果;void modi2()stu xs;FILE *fp;int num;system(“cls“);printf(“n输入要查学生的学号:
13、“);scanf(“%d“,if(fp=fopen(“student.dat“,“rb+“)=NULL) printf(“cant open file!n“);exit(0);while(!feof(fp)fread(if(xs.num=num)/*判断 输入要修改的姓名是否存在*/ printf(“ 修改前学生的信息如下:n“);printf(“n%10s %6s %6s n“,“姓名“,“学号“ ,“C语言“);printf(“%10s %6d %6.2f n“,xs.name,xs.num,xs.c);printf(“n请输入该生的C语言成绩:“);scanf(“%f“ ,break;i
14、f(!feof(fp) printf(“ n 修改后的学生的信息如下:n“);printf(“n%10s %6s %6s n“,“姓名“,“学号“ ,“C语言“);printf(“%10s %6d %6.2f n“,xs.name,xs.num,xs.c);fseek(fp,-sizeof(stu),1);/*负号表示后退, 1表示文件当前位置*/fwrite(/*再写入,同 时把要修改的那个覆盖掉 */12elseprintf(“n学生不存在,修改失败!“); fclose(fp);getch();/修改void search1()char ch1;system(“cls“);printf(
15、“请输入按何种方式修改:n“);printf(“1-姓名,2-学号:“);ch1=getchar();/*用字符接收*/switch(ch1)/*判断*/case 1:modi1();break;case 2:modi2();break;getch();/*让 屏幕停留同时按任意键返回*/插入:输入学生的平时的各项成绩,插入到指定位置;当指定的位置超出范围时,将其插入到全班的最后,并显示插入成功后的结果。void insert() int i=0,j,k,lenth;FILE *fp;stu s,xsN;system(“cls“);13printf(“n请输入插入的学生的姓名:“);scanf
16、(“%s“,printf(“n学生的学号:“);scanf(“%d“,printf(“n学生的C成绩:“);scanf(“%f“,printf(“n插入位置:“);scanf(“%d“,/ i=0;if(fp=fopen(“student.dat“,“rb“)=NULL) printf(“cant open file!n“);exit(0);while(!feof(fp)fread(/*把数据读入到结构体数组中*/if(feof(fp) break;i+;fclose(fp);lenth=i;if(k=0)/*k的位置要位于数组范围之内*/插入for(j=lenth-1;j=k;j-)xsj+
17、1=xsj;/*一开始j是最大的,往后移一个这样移动避免数据被覆盖*/*循环是只循环这一句的*/xsk=s;/*将 输入的学生信息加入这个k位置*/ lenth+;/*长度+1*/写回if(fp=fopen(“student.dat“,“wb“)=NULL) printf(“不能建立文件!n“);exit(0);for(i=0;i=60continue;printf(“不及格:姓名 学号 C语言n“);for(n=0;nname,p1n-num,p1n-c);printf(“ 60-79:姓名 学号 C语言n“);for(p=0;pname,p2p-num,p2p-c);printf(“ 80
18、-89:姓名 学号 C语言n“);for(q=0;qname,p3q-num,p3q-c);printf(“90以上:姓名 学号 C语言n“);for(r=0;rname,p4r-num,p4r-c);fclose(fp);getch();/删除:输入学生姓名,若该 学生存在,则删除,并显示删除后余下的学生成绩信息void dele1()stu xsN;FILE *fp;char name10;int i=0,len,k=-1/*k=0)/*k0说明找到删除学生位置*/if(fp=fopen(“student.dat“,“wb+“)=NULL) printf(“cant open file!n
19、“);exit(0);for(i=0;i=0)/*k0说明找到删除学生位置*/if(fp=fopen(“student.dat“,“wb+“)=NULL) printf(“cant open file!n“);exit(0);for(i=0;ilen;i+)if(i=k) continue;/*从这个位置开始写入*/fwrite(fclose(fp);else printf(“删除失败!n“ );getch(); /*失败后重新返回菜 单*/print();/删除void search11()char ch1;system(“cls“);printf(“请输入按何种方式删除:n“);print
20、f(“1-姓名,2-学号:“);19ch1=getchar();/*用字符接收*/switch(ch1)/*判断*/case 1:dele1();break;case 2:dele2();break;getch();/*让 屏幕停留同时按任意键返回*/菜单选择void main() char ch;while(1)menu();/ 显示菜单ch=getch();/选择菜单if(ch=0) break;switch(ch)/判断功能项case 1:input();break;case 2:search();break;case 3:search1();break;case 4:insert();
21、break;case 5:print( );break;case 6:tongji();break;case 7:search11();break;20printf(“n欢迎使用!n“);第五部分:核心算法及说明1.忽略了“=”与“=”的区别。 在许多高级语言中,用“=”符号作为关系运算符“等于”。如在 BASIC程序中可以写 if (a=3) then 但 C语言中,“=”是赋值运算符,“=”是关系运算符。如: if (a=3) a=b; 前者是进行比较,a 是否和 3相等,后者表示如果 a和 3相等,把 b值赋给 a。2.忘记加分号。 分号是 C语句中不可缺少的一部分,语句末尾必须有分号。
22、 a=1 b=2 编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。 如:int i=0,n;stu xsN;FILE *fp;if(fp=fopen(“student.dat“,“rb+“)=NULL) printf(“cant open file!n“);exit(0);对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和 PASCAL不同的)。3.多加分号。 对于一个复合语句,如: z=x+y; t=z/100; printf(“%f“,t)
23、; ; 复合语句的花括号后不应再加分号,否则将会画蛇添足。4. 输入变量时忘记加地址运算符“这是不合法的。Scanf 函数的作用是:按照 xs.num,xs.yuwen,xs.math,xs.english在内存的地址将 xs.num,xs.yuwen,xs.math,xs.english的值存进去。“ 输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法: 3,4 输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键 tab。 scanf(“%d,%d“, C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是
24、合法的: 3,4 此时不用逗号而用空格或其它字符是不对的。 3 4 3:4 又如: scanf(“a=%d,b=%d“, 输入应如以下形式: a=3,b=4 7. .输入输出的数据类型与所用格式说明符不一致。 例如,a 已定义为整型,b 定义为实型 a=3;b=4.5; printf(“%f%dn“,a,b); 编译时不给出出错信息,但运行结果将与原意不符。第六部分:结论通过这次实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从 C语言这门课程开始,已发现程序设计的乐趣,在学习 C语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。 这次实训
25、是老师给了范例程序,经过自己的改写,实现要求。先做简单的输出,一步步的再做其它图案,在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。在具体操作中对这学期所学的 C语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到 C语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。 22通过实际操作,学会 C 语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。计时在此希望以后应多进行这样的实训,加长设间,培养学生独立思考问题的能力,提高实际操作水
26、平。6后记.通过这次的 c语言的辅导,对程序设计有了很深的认识以及掌握,我会谨记老师对我们的谆谆教导和他负责的工作态度7.参考文献1.c 语言成语设计教程2.王萍. C+面向对象程序设计. 北京:清华大学出版社,2002 3.徐孝凯. 面向对象程序设计实验. 北京:中央广播电视大学出版社,2003 4.谭浩强. C 程序设计(第二版). 北京:清华大学出版社,1999 5.谭浩强. C 语言程序设计教程(第二版). 北京:高等教育出版社,1997 6.杨路明等. C/C+程序设计教程. 湖南:湖南科技出版社,2001 7.赵建强. 利用微机计算梳片法长度指标. 苎麻纺织科技,1994.4 8.附录