1、攀枝花学院 C语言课程设计论文学生成绩管理攀枝花学院学生课程设计(论文)题 目: 学 生 成 绩 管 理 系 统 学生姓名: 文理 学 号: 201010801068 所在院(系): 计 算 机 学 院 专 业: 计算机科学与技术 班 级: 2010级计本2班 指 导 教 师: 陈三清 职称: 讲师 2011年 06 月 26 日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书题目学生成绩管理1、课程设计的目的利用单链表实现学生成绩管理,了解数据库的管理的基本功能,使学生掌握C语言中的结构体、指针、函数(系统函数,自定义函数)、文件操作等知识,是一个C语言的综合应用。应注意指针变量做为函数参
2、数,函数返回值为指向结构体的指针及单链表结构的应用等知识。2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)一、用C中的单链表存储结构完成对学生成绩的动态管理,其基本内容和要求包括:(1) 菜单设计(2) 输入成绩(3) 查询(4) 修改成绩(5) 删除成绩(6) 成绩排序(7) 将成绩保存在文件中二、撰写课程设计报告或课程设计总结课程设计报告要求:总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。3、主要参考文献1 潭浩强,C程序设计,清华大学出版社2 王声决,C语言程序设计,中
3、国铁道出版社3 潭浩强,C程序设计题解与上机指导,清华大学出版社4 刘玲等,C语言程序设计应用教程,西南师范大学出版社4、课程设计工作进度计划第1天 完成方案设计与程序框图 第2、3天 编写程序代码第4天 程序调试分析和结果第5天 课程设计报告和总结指导教师(签字)日期年 月 日教研室意见:年 月 日学生(签字): 文理接受任务时间: 2010 年 06 月 20 日注:任务书由指导教师填写。目 录1 问题描述41.1 设计目的4 1.2 课程设计的预备知识 4 1.3 课程设计要求42 概要设计4 2.1设计内容4 2.2系统流程图5 2.3函数主要功能说明53 详细设计(程序代码)74调试
4、方法以及测试过程中的问题及解决方法12 4.1调试方法12 4.2测试过程中遇到的问题及解决方法12 4.2.1删除学生信息功能不能实现12 4.2.2显示结果时候出错12 4.2.3在查询信息的时候出错12 4.2.4打开文件出错12 4.2.5在排序后没有保存文件135测试结果13 5.1菜单屏幕13 5.2输入学生信息14 5.3查看学生信息14 5.4按姓名查询145.5按学号查询14 5.6按平均成绩排序15 5.7删除学生信息15 5.8保存文件16 5.9打开文件16 5.10 我的个人信息166 结论17 参考文献及网址17题目 学生成绩管理1问题描述1.1设计目的(1)通过课
5、程设计全面掌握C语言程序设计关键知识点,掌握C语言中数组、指针、结构体、文件等方面的基本知识。(2)通过课程设计了解并掌握C语言程序设计的方法,熟悉C程序设计的开发环境及C程序的调试过程。(3)培养学生查阅参考资料、手册的自学能力,通过独立思考深入钻研有关问题,学会自己分析、解决问题的方法。1.2课程设计的预备知识熟悉C语言及C语言开发工具 1.3课程设计要求(1)分析课程设计题目的要求 (2)写出详细设计说明(3)编写程序代码,调试程序使其能正确运行(4)设计完成的软件要便于操作和使用 (5)设计完成后提交课程设计报告2概要设计2.1设计内容设计一个学生成绩管理系统,对上学期的本班的学习成绩
6、进行管理,具有查询和检索功能,并且能够对指定文件操作,也可将多个文件组成一个文件。主要功能:(1)键入学生信息 (2)查看录入的信息 (3)按姓名查看信息(4)按学号查看信息(5)按平均成绩排序 (6)删除信息(7)保存信息 (8)读取文件 (9)我的个人信息 (0)退出2.2系统流程图输出结果调用save函数调用save函数调用save函数调用openl函数调用Look函数调用save函数调用search_number函数调用search_name函数调用del函数调用order函数调用see函数调用welcome函数Main函数退出程序调用Type 函数 2.3函数主要功能说明:(1)输入
7、学生的信息函数功能:type函数通过循环向结构体中输入学生的学号、姓名、性别、英语成、数学成绩、语文成绩。Type函数流程图判断i是否小于n在主界面选择录入学生信息确定要录入的学生人数n用scanf()函数输入信息开始循环for (i=0;in;i+)结束录入结束调用save()保存录入记录到文件i=n(2)查看输入的信息功能:通过look函数以一个循环的形式输出所要查看的信息。(3) 查询功能:通查询信息,过search_name函数和search_number函数来进行比较查找,找到后输出该学生信息查找函数的流程图在主界面选择查找学生信息从文件中读入数据循环查找指定学生的姓名for(i=0
8、;in;i+)输入查找的学生姓名是否查找到要查找的记录输出查找到的记录结束没有找到查找找到(4) 排序功能:对数据进行排序,通过order函数对数据按平均分进行排序,排序结束后调用save函数保存。(5) 删除功能:删除信息,通过del函数实现,删除后调用save函数对数据保存。(6) 保存功能:对数据进行保存,用save函数向文件中写入数据实现该功能。(7) 退出程序3详细设计(程序代码)#includestdio.h #includeconio.h#includestring.h #includestdlib.hvoid look(); /*声明查看函数*/ void save(); /*
9、声明保存函数*/void search_name(); /*声明按姓名查看函数*/void search_number(); /*声明按学号查看函数*/void order(); /*声明排序函数*/ void del(); /*声明删除函数*/int openl(); /*声明打开函数*/ void type(); /*声明输入函数*/void welcome(); /*声明我的个人信息函数*/void see(); /*声明打开并查看文件函数*/struct student /*定义学生信息的结构体类型*/ char num15; /*学号*/ char name20; /*姓名*/cha
10、r sex4; /*性别*/ int english; /*英语成绩*/int math; /*数学成绩*/ int chinese; /*语文成绩*/float aver; /*平均成绩*/ float sum; /*总成绩*/stu100; int n; /*声明一个全局变量*/void main() /*主函数即用户的操作界面*/system(color 1E); /*设计文本颜色*/int b,flag=0; /*声明局部变量*/while(1) /*循环输出以下信息*/ printf(nttt欢迎来到学生成绩管理系统!n);printf(nttt 郗绿阳制作n); printf(tt
11、t-n); printf(ttt1.键入学生的信息nn); /*键入学生的信息*/printf(ttt2.查看录入的学生信息nn); /*查看录入的学生信息*/printf(ttt3.按姓名查看学生的信息nn); /*按姓名查看学生的信息*/printf(ttt4.按学号查看学生的信息nn); /*按学号查看学生的信息*/printf(ttt5.按平均成绩排序nn); /*排序*/printf(ttt6.删除学生信息nn); /*删除学生信息*/printf(ttt7.保存学生信息nn); /*保存*/printf(ttt8.打开文件nn); /*打开文件*/printf(ttt9.我的个人信
12、息nn); /*我的个人信息*/printf(ttt0.退出nn); /*退出*/printf(ttt请输入你的选择:); scanf(%d,&b);switch(b) case 1:type();break; /*调用键入学生信息函数*/case 2:look();break; /*调用查看函数*/case 3:search_name();break; /*调用姓名查看函数*/case 4:search_number();break; /*调用学号查看函数*/case 5:order();break; /*调用排序函数*/case 6:del();break;/*调用删除函数*/case 7
13、:save();break;/*调用保存函数*/case 8:see();break;/*调用打开文件函数*/case 9:welcome();break;/*调用我的个人信息函数*/case 0:flag=1;break;/*退出SWITCH语句*/default :printf(错误!); if(flag) break; /*如果选择0就退出循环*/ void welcome() /*我的个人信息函数*/system(CLS);printf(nntt-个人信息-); /*在屏幕上输出一下信息*/printf(nnnntt姓名:郗绿阳); printf(tttSex:男n);printf(t
14、t年龄:20n) printf(nttt-学习经历-nnn); printf(tt小学:北大小学nn);printf(tt初中:禹州市神垕一中nn); printf(ttS高中:禹州五高nn);printf(tt大学:洛阳理工学院nn); printf(nntt按任意键返回欢迎屏幕!); getch(); /*按任意键返回主函数*/ void type() /*定义键入学生信息函数*/system(CLS); int i; /*定义局部变量*/printf(tt输出你想输入的学生信息个数:); scanf(%d,&n);for(i=0;in;i+) /*输入每个学生的信息*/printf(nt
15、tt-n); printf(ttt学号:);scanf(%s,&stui.num); /*输入学号*/ printf(ttt姓名:);scanf(%s,&stui.name); /*输入姓名*/ printf(ttt性别:);scanf(%S,&stui.sex); /*输入性别*/ printf(ttt英语:);scanf(%d,&stui.engl/*输入英语成绩*/printf(ttt数学:);scanf(%d,&stui.math); /*输入数学成绩*/printf(ttt语文:);scanf(%d,&stui.chinese); /*输入语文成绩*/stui.aver=(float
16、)stui.english+(float)stui.math+(float)stui.chinese)/3;/*计算平均成绩*/stui.sum=(float)stui.english+(float)stui.math+(float)stui.chinese;/*计算总成绩*/printf(ttt平均成绩=%4.1fn,stui.aver); /*输出平均成绩*/printf(ttt总成绩=%4.1fn,stui.sum); /*输出总成绩*/ printf(nnttt按任意键返回菜单!); getch(); save(); void save() /*建立保存文件函数*/system(CLS
17、); FILE *fp; /*定义文件型指针*/ int i;if(fp=fopen(student.txt,wb)=NULL) /*打开输出文件*/printf(不能打开文件!n); retur /*终止程序*/ for(i=0;in;i+) /*向student文件中写入信息*/if(fwrite(&stui,sizeof(struct student),1,fp)!=1)printf(文件写入错误n); fclose(fp); /*关闭文件*/printf(nnnnttt学生信息保存成功!n);printf(nnnnttt按任意键返回菜单!); getch(); void look()
18、/*定义查看函数*/system(CLS); int i; /n=openl(); /*调用openl函数*/printf(t学号t姓名t性别t英语t数学t语文t平均成绩t总成绩n);for(i=0;in;i+)/*出所有的学生信息*/printf(%10st%st%2st%dt%dt%dt%3.1ftt%6.1fn,stui.num,stui.name,stui.sex,stui.english,stui.math,stui.chinese,stui.aver,stui.sum); printf(nnnttt按任意键返回菜单); getch(); void search_name() /*按
19、姓名查看函数*/system(CLS); int i; char name20; /*声明字符数组*/printf(ttt请输入学生姓名:n); scanf(%s,name);printf(t学号t姓名t性别t英语t数学t语文t平均成绩t总成绩n);for(i=0;in;i+) if(strcmp(stui.name,name)=0) /*将输入的姓名与结构体中的姓名进行比较*/ printf(%10st%st%2st%dt%dt%dt%3.1ftt%6.1fn,stui.num,stui.name,stui.sex,stui.english,stui.math,stui.chinese,st
20、ui.aver,stui.sum); printf(nnnttt按任意键返回菜单); getch(); void search_number() /*定义按学号查看函数*/system(CLS); int i; char number15; /*声明字符数组*/printf(ttt请输入学号:n); scanf(%s,number);printf(t学号t姓名t性别t英语t数学t语文t平均成绩t总成绩n);for(i=0;in;i+) if(strcmp(stui.num,number)=0) /*将输入的学号与结构体中的学号进行比较*/printf(%10st%st%2st%dt%dt%dt
21、%3.1ftt%6.1fn,stui.num,stui.name,stui.sex,stui.english,stui.math,stui.chinese,stui.aver,stui.sum);printf(nnnttt按任意键返回菜单);getch(); void order() /*定义排序函数*/system(CLS); int i,j; char a;struct student temp; /*声明结构体变量*/printf(t学号t姓名t性别t英语t数学t语文t平均成绩t总成绩n);for(i=0;in;i+) /*对数据进行排序*/for(j=i+1;jn;j+)if(stui
22、.sumstuj.sum)temp=stui; stui= stuj; stuj=temp; printf(%10st%st%2st%dt%dt%dt%3.1ftt%6.1fn,stui.num,stui.name,stui.sex,stui.english,stui.math,stui.chinese,stui.aver,stui.sum); getch(); printf(是否保存?(y or n);getchar(); scanf(%c,&a);if(a=y) /*是否保存排序后的文件*/ save();else printf(退出); getch(); void del() /*定义删
23、除学生信息函数*/int i; char a; char name20; system(CLS);printf(ttt输入学生名字:n); scanf(%s,name); system(CLS);printf(t学号t姓名t性别t英语t数学t语文t平均成绩t总成绩n);for(i=0;in;i+) if(strcmp(stui.name,name)=0) printf(%10st%st%2st%dt%dt%dt%3.1ftt%6.1fn,stui.num,stui.name,stui.sex,stui.english,stui.math,stui.chinese,stui.aver,stui.
24、sum);getch(); printf(真的删除?(y or n);getchar(); scanf(%c,&a);if(a=y) /*是否删除该信息*/for(;in;i+) stui=stui+1; n=n-1;printf(你已经删除信息);else printf(退出); getch(); save(); int openl() /*定义打开文件函数*/system(CLS); int i; FILE *fp;if(fp=fopen(student.txt,rb)=NULL)printf(Cannot open file.n); exit(0); for(i=0;!feof(fp);
25、i+) fread(&stui,sizeof(struct student),1,fp);fclose(fp); return(i-1); void see() /*打开并查看文件*/system(CLS); int i; n=openl(); printf(文件打开成功!n);printf(按任意键查看!n); getch();printf(t学号t姓名t性别t英语t数学t语文t平均成绩t总成绩n);for(i=0;in;i+) /*输出所有的学生信息*/printf(%10st%st%2st%dt%dt%dt%3.1ftt%6.1fn,stui.num,stui.name,stui.sex
26、,stui.english,stui.math,stui.chinese,stui.aver,stui.sum); printf(nnnttt按任意键返回菜单); getch(); 4调试方法以及测试过程中的问题及解决方法4.1调试方法:逐条的对程序中的错误进行修改;修改程序中的变量、声明新函数以及声明头文件对函数进行调试。4.2测试过程中遇到的问题及解决方法:4.2.1删除学生信息功能不能实现。 问题描述:在选择删除功能后不能把选择的学生信息删除,而总是删除其他学生的信息。 解决办法:出现这个问题肯定是数据覆盖的时候出现了错误,也就是循环出现了错误。检查循环程序后发现,循环体内数据交换出现了
27、错误,没有定义结构体变量。重新定义结构体变量后问题解决了。4.2.2显示结果时候出错 问题描述:每一个功能在现实结果现实的信息部完整,部分信息部能现实或被覆盖。 解决办法:现实出错也就是printf语句中的结构没有排列好所导致的。检查所有的Printf语句后发现所有的printf语句中少输出了以个语文成绩,且它们不能完全对齐。在增加了“语文”,修改了转义字符以及空格后,问题解决了。4.2.3在查询信息的时候出错 问题描述:在输入不在文件中保存的姓名、学号时,没有信息提示。 解决办法:出现此问题说明if语句后少了一条else语句,加上该语句后,显示的结果正确了。4.2.4打开文件出错 问题描述:
28、当显示保存成功后关闭程序。重新打开程序选择打开文件后,文件不能正常打开,或打开文件后没有显示结果。 解决办法:查看文件文件中有数据,说明文件在保存的是后没有出错。再仔细观察运行结果后,发现该函数在执行到循环输出的时候把该循环跳了过去没有执行。出现此问题是因为循环的终止条件改变了。将openl函数该为有返回值函数之后,重新定义了一个see函数来调用openl函数,并在see函数中用循环输出已经打开的文件中的数据。重新定义一个函数后保存的文件可以成功的打开。4.2.5在排序后没有保存文件 解决办法:在order函数后边加上了printf(是否保存?(y or n); getchar(); scan
29、f(%c,&a); if(a=y) save(); else printf(退出);语句后可以选择是否保存排序后的文件。5测试结果5.1菜单屏幕5.2输入学生信息5.3查看学生信息5.4按姓名查询5.5按学号查询5.6按平均成绩排序5.7删除学生信息5.8保存文件5.9打开文件5.10我的个人信息6总结 通过一个星期的课程设计,我更深刻的了解了C语言中每个函数的含义,领会了算法是C语言的灵魂这句话的真谛。一个好的算法可以使程序简洁,运行速度更快。同时也对C语言中的循环,函数的调用有了更深的理解。虽然这次的课程设计,老师已经给出了程序让我们改错。看起来比较容易,但是要让程序实现要求的几个功能却不
30、是很容易。而且要看懂每一个函数也不是十分的容易。在修改程序的过程中也收获了很多以前忽略的东西。在修改的过程中巩固了基础,认识了自已以前常犯得错误,也发现了自己的不足之处。在程序编写中,我认识编写一个系统不仅仅要有良好的用户界面,良好的程序编写风格也是相当重要的。只有良好的种程序编写风格,程序代码的可读性才会好,开发的复杂度才能大大减少,检查错误、修改代码时才会更加容易下手。通过实际操作,学会 C语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。深刻体会到了团队协作的重要性。参考文献1 潭浩强,C程序设计,清华大学出版社2 王声决,C语言程序设计,中国铁道出版社3 潭浩强,C程序设计题解与上机指导,清华大学出版社4 刘玲等,C语言程序设计应用教程,西南师范大学出版社5 蔡明志.数据结构:使用C语言.北京.希望电脑公司C语言技术丛书.2005:38-466 张贤德.常用C语言用法速查手册.科学出版社,龙门.龙门书局.2003:105-111 7 严桂兰.Turbo C语言程序设计.北京:电子工业出版社.1991:99-107 参考网址: http:/92.168.13.200/cgi-bin/2la.swebBib 第17页 共17页