《c语言课程设计学生成绩管理系统设计.doc》由会员分享,可在线阅读,更多相关《c语言课程设计学生成绩管理系统设计.doc(52页珍藏版)》请在三一办公上搜索。
1、C语言课程设计说明书4第一章:设计任务分析51.1 课程设计意义:51.2 课程设计目的:51.3 课程设计所培养的能力51.4 学生成绩管理系统设计要求61.5 学生成绩管理系统实现的功能6第二章:技术文档72.1 程序的总体设计72.2 主要数据72.2.1 库文件72.2.2 调用函数及函数文件82.2.3 结构体数组及宏定义82.3模块设计及具体的算法分析92.3.1输入模块92.3.2 删除多余数据模块112.3.3 搜索模块122.3.4 插入成绩152.3.5显示函数162.3.6 数据保存函数162.3.7 成绩排序162.3.8统计分数172.3.9 主函数17第三章:用户文
2、档18第四章:源程序代码清单19Main.c文件19Common.c文件21Deleteitem.c文件21Find.c文件22Input.c文件26Insert.c文件28Output.c文件29Paint.c文件31Save.c文件32Sort.c文件33Stat.c文件38Common.h文件44Deleteitem.h文件45Find.h文件46Input.h文件46Inset.h文件47Output.h文件47Paint.h文件48Save.h文件48Sort.h文件49Stat.h文件49第五章:测试数据和测试过程记录。50第六章:遇到的问题及解决方法分析。52C语言课程设计说明书
3、专业:电子科学与技术班级:学生姓名:指导教师:设计题目:学生成绩管理系统设计条件:自主设计设计内容:学生成绩管理下达日期:完成日期:第一章:设计任务分析1.1 课程设计意义: C语言是电子科学与技术专业的重要专业基础课。在很多后续课程中,都要使用到C语言。学生通过对C语言的学习,已经具备了使用C语言编写简单的应用程序的能力。为了加强程序设计基础,开设课程设计课,使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,同时,为后续课程的学习夯实基础。1.2 课程设计目的:掌握和利用C语言进行程序设计的能力。用C语言合理地开发简洁有效的程序代码来实现该设计。提高用程序设计解决实际
4、问题的能力。理解和运用结构化程序设计的思想和方法。通过提出算法、指定输入输出来设计一个解决方案。掌握开发一个小型实用系统的基本方法。学会调试一个较长程序的基本方法。测试程序是否工作且满足设计指标并评价其效率。掌握书写程序设计开发文档的能力(书写课程设计报告)。1.3 课程设计所培养的能力A、分析问题。各种简单的与计算机有关的案例中所需要的输出结果,把大问题分解成小问题,使用自顶向下或类似设计方法给出模块化或计划。B、提出算法执行特定任务。模块表示为算法,使用自顶向下或伪代码等设计手段将模块细化成更详细的成分,清楚地表明顺序、选择和重复等到控制结构。C、把一个算法变为用C语言编写的结构化程序。D
5、、用合适的测试方法检查程序是否符合最初的要求,为不合适数据设计错误陷阱,并提供错误信息来帮助用户。E、写出清晰的用户文档,确保用户或者通过遵循程序中的指示或者使用程序设计者编写的文档能成功地运行程序。F、写出技术文档,对程序中主要标示符的含义或作用加以说明,并提供一个完整的程序流程图。G、调试程序、测试数据过程成功。1.4 学生成绩管理系统设计要求用C语言实现系统。利用结构体数组实现学生成绩的数据结构设计。系统具有增加、查询、排序等基本功能。系统的各个功能模块要求用函数的形式实现。将学生成绩信息存在文件中。完成设计任务并书写课程设计报告。1.5 学生成绩管理系统实现的功能(1)每一条记录包括一
6、个学生的学号、姓名、3门课成绩、平均成绩。(2)添加功能:可以一次完成若干条记录的输入。(3)显示功能:完成全部学生记录的显示。(4)查找功能:完成按姓名、学号查找学生记录,并显示。(5)排序功能:按学生学号或平均成绩进行排序。(6)保存功能:将学生记录存在自定义文件名的文件中。(7)退出功能:退出系统(8)应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!第二章:技术文档学生管理系统2.1 程序的总体设计输入成绩插入成绩删除成绩查询成绩成绩排序统计输出保存文件退出系统2.2 主要数据2.2.1 库文件#include #include #include 2.2.2
7、调用函数及函数文件#include common.h#include input.h#include output.h#include sort.h#include find.h#include insert.h#include deleteitem.h#include stat.h#include save.h#include paint.hvoid delete_item(STUDENT *data, int *len) /用以删除错误或多余成绩void find(STUDENT *data, int len) /用于以姓名或学号搜索成绩void input(STUDENT *data,
8、int *len) /输出函数void insert(STUDENT *data, int *len) /插入新的成绩void output(STUDENT *data, int len) /输出成绩void paint() /显示界面函数void save(STUDENT *data, int len) /保存文件函数void sort(STUDENT *data, int len) /成绩排序总函数void sort_number(STUDENT *data, int len) /以下为成绩排序的子函数void sort_chinese(STUDENT *data, int len) /包
9、括各科成绩、平均分及总分void sort_math(STUDENT *data, int len)void sort_english(STUDENT *data, int len)void sort_average(STUDENT *data, int len)void sort_total(STUDENT *data, int len)void stat(STUDENT *data, int len) /统计输出2.2.3 结构体数组及宏定义#define MAXN 35#define MAX_NAME 256typedef struct student /学生信息int no; /定义学
10、生学号char nameMAX_NAME; /学生姓名数组double Chinese; /以下分别定义语文、数学、英语、平均分、总分double math;double English;double mark_ave;double mark_tot; STUDENT; /定义结构体类型名2.3模块设计及具体的算法分析2.3.1输入模块用于成绩首次输入,需按固定格式输入但输入各科成绩中有超过100或小于0的的即为错误返回,无需再次输入学号,从课程姓名处开始输入在储存各科成绩的同时,计算总分于平均分但输入结束时,输入-1可返回主界面 主界面 输入1 按格式输入成绩 判断是否有打渔100或小于0的
11、数有则返回重新输入无则数据输入成功,接着输入下组数据输入完成后,输入-1返回主界面【程序代码】int no;putchar(n);printf(%sn, 请输入新的记录,成绩输入完成请输入-1.);printf(%sn, 格式:n学号n);printf(%sn, 姓名 语文 数学 英语);putchar(n);printf(如:n);printf(1n);printf(黄纬宏 99 99 99n);scanf(%d, &no);while(no != -1)data*len.no = no;scanf(%s %lf %lf %lf, data*len.name, &data*len.Chine
12、se, &data*len.math,&data*len.English);if(data*len.Chinese100|data*len.math100|data*len.English100|data*len.Chinese0|data*len.math0|data*len.English0) /判断成绩是否有大于100或小于0的,有则说明数据有误,需重新输入printf(输入错误,按回车重新输入,不用输入学号!);getchar(); getchar();continue;data*len.mark_ave=(data*len.Chinese+data*len.math+data*len
13、.English)/3.0;/计算平均值和总分data*len.mark_tot=data*len.Chinese+data*len.math+data*len.English;(*len)+;scanf(%d, &no);2.3.2 删除多余数据模块直接输入-1可返回主界面从头开始顺序查找学号,若未找到则返回输出未找到需要删除的学生删除数据后将后面的数据依次重新排序 输入3输入-1?主界面 是未找到需要删除的学生是否有这个学号? 输入学号否对学号所对应成绩进行替换否没有任何记录是否还有数据?是否是【程序代码】 int no, i, pos; /定义临时学号变量、计数变量 lab: pos=0
14、; /lab用来作为goto语句的返回点 printf(%sn, 输入需要删除的学生的学号,退出当前菜单请输入-1.); scanf(%d, &no); if (no = -1) return; /输入为-1是返回主界面 while( (datapos.no != no) & (pos = *len) /如果计数值大于学生数,则说明未找到需要删除的学生,返回重新输入学号 printf(%sn, 未找到需要删除的学生); goto lab; /goto语句,跳到之前所做的节点 else for (i = pos+1;i *len; i+) /用目标学号后面的数据向前进行替换,以达到删除的效果 d
15、atai-1 = datai; *len = *len -1; if (*len = 0) /如果学生数为0.则说明没有数据可删除了,按回车返回主界面 printf(%sn, 没有任何记录,请按回车键返回.); getchar(); getchar(); return; goto lab; 2.3.3 搜索模块选择进行姓名或学号的搜索,在此输入-1时返回主界面找到目标学号时输出学生的各项数据,如各科成绩,平均分,总分如果查询的信息不存在,输出提示信息;主界面没有可被查找的记录学生数为0?输入4是检索学号?按学号的查询方式?否检索姓名?是否输出成绩输出成绩未查询到相关信息否否是是【程序代码】in
16、t find_no,result ; /定义临时学号和指针int i;char str256; /用来做输入值临时存放空间lab: result=0;if(len=0) /学生个数为0时,输出没有可被查找的记录 printf(没有可被查找的记录n); return ; else printf(请选择查找的方式:1.姓名 2.学号n);gets(str);if(str0=2) /如果输入值为2,即是要使用学号搜索 printf(%sn, 请输入需要查找的学生的学号,退出当前菜单请输入 -1.); scanf(%d, &find_no); if (find_no = -1 ) return; /输
17、入-1时返回主界面 while( dataresult.no != find_no & result = len ) /如果检索次数大于学生数,说明没有这个学生 printf(%sn, 未查询到相关信息); goto lab; else system(cls); /清屏指令 printf(%sn, 查询信息如下:); for (i =0; i 80; i+) /输出找到的成绩 putchar(*); putchar(n); printf(%8s, 学号); printf(%8s, 姓名); printf(%8s, 语文); printf(%8s, 数学); printf(%10s, 英语);
18、printf(%12s, 平均分); printf(%10s, 总分); putchar(n); printf(%8d, dataresult.no); printf(%8s, dataresult.name); printf(%8.1lf, dataresult.Chinese); printf(%8.1lf, dataresult.math); printf(%10.1lf, dataresult.English); printf(%12.1lf, dataresult.mark_ave); printf(%10.1lf, dataresult.mark_tot); putchar(n);
19、for (i =0; i 79; i+) putchar(*); putchar(n); goto lab; else /如果不是学号搜索,就是要进行姓名检索,步骤与学号类似 printf(%sn, 请输入需要查找的学生的姓名,退出当前菜单请输入 -1.); gets(str); if (str = -1) return; /*exit the fine sub program*/ for(result=0;result=len;result+) if(strcmp(str,dataresult.name)=0) system(cls); printf(%sn, 查询信息如下:); for (
20、i =0; i 80; i+) putchar(*); putchar(n); printf(%8s, 学号); printf(%8s, 姓名); printf(%8s, 语文); printf(%8s, 数学); printf(%10s, 英语); printf(%12s, 平均分); printf(%10s, 总分); putchar(n); printf(%8d, dataresult.no); printf(%8s, dataresult.name); printf(%8.1lf, dataresult.Chinese); printf(%8.1lf, dataresult.math)
21、; printf(%10.1lf, dataresult.English); printf(%12.1lf, dataresult.mark_ave); printf(%10.1lf, dataresult.mark_tot); putchar(n); for (i =0; i 79; i+) putchar(*); putchar(n); goto lab; else printf(%sn, 未查询到相关信息); goto lab; 2.3.4 插入成绩按格式输入成绩,并按平均分由高到低的顺序插到成绩单里面输入-1时返回主界面2.3.5显示函数用以显示软件信息及制作者信息显示主界面,主要用在
22、main函数中2.3.6 数据保存函数将输入的成绩保存到TXT文件中并输出文件已保存到成绩统计表.txt的信息使用fopen和fprintf函数2.3.7 成绩排序将成绩按平均分或各科成绩或总分进行排序,可挑选出各方面的状元郎根据所输入的序号进行选择,用SWITCH实现功能利用输出函数,把得到的排序后的结果进行输出 主界面 排序界面按英语成绩排序按语文成绩排序按数学成绩排序输入5按学号排序按平均分排序按总分排序输入1-6或0进行选择直接输出2.3.8统计分数假设每个分数段开始都为0,对每个分数段的边界数进行比较,处于那个范围内就计算,超出则进行下个分数段分别对各科成绩及平均分和总分进行统计,方
23、法一样,在开始时进行选择,选择使用哪种统计方式,并且在最后阶段输出结果以其中一个为例进行演示:80-90范围内的数+160-70范围内的数+170-80范围内的数+160范围内的数+190-100范围内的数+1小于90?小于80?小于70?小于60?进行下一个数判断是否是否是否是否2.3.9 主函数将各个分文件里面的函数整合到一起实现软件的真正功能进行选择输入,按输入的序号选择功能操作,如果输入错误则重新输入【程序代码】 STUDENT dataMAXN; int len = 0; char ctrl_ch1; paint(); scanf(%c, &ctrl_ch1); while (ctr
24、l_ch1 != 8) switch(ctrl_ch1) case 1:input(data, &len); /输入函数output(data, len);/输出函数break;case 2:insert(data, &len); /插入成绩break;case 3:delete_item(data, &len); /删除无用成绩break;case 4:find(data, len); /搜索成绩break;case 5:sort(data, len); /排序函数output(data, len);break;case 6:stat(data, len);/统计函数break;case 7
25、:save(data, len); /保存文件break;default:if (ctrl_ch1 != n) printf(%sn, 输入错误!);break;if (ctrl_ch1 != n) paint();scanf(%c, &ctrl_ch1); 第三章:用户文档方式一:直接打开C语言.exe文件,按界面提示进行操作方式二:在电脑中安装VC6.0,用打开工作空间的方式打开C语言.dsw,让程序运行后还是按照界面提示进行操作第四章:源程序代码清单Main.c文件#include #include #include #include common.h#include input.h#i
26、nclude output.h#include sort.h#include find.h#include insert.h#include deleteitem.h#include stat.h#include save.h#include paint.hvoid main() STUDENT dataMAXN; int len = 0; char ctrl_ch1; paint(); scanf(%c, &ctrl_ch1); while (ctrl_ch1 != 8) switch(ctrl_ch1) case 1:input(data, &len); /输入函数output(data,
27、 len);/输出函数break;case 2:insert(data, &len); /插入成绩break;case 3:delete_item(data, &len); /删除无用成绩break;case 4:find(data, len); /搜索成绩break;case 5:sort(data, len); /排序函数output(data, len);break;case 6:stat(data, len);/统计函数break;case 7:save(data, len); /保存文件break;default:if (ctrl_ch1 != n) printf(%sn, 输入错误
28、!);break;if (ctrl_ch1 != n) paint();scanf(%c, &ctrl_ch1); Common.c文件#include #include #include #include common.h#define MAXN 35#define MAX_NAME 256Deleteitem.c文件#include #include #include #include common.h#include deleteitem.h/*-删除子程序-*/void delete_item(STUDENT *data, int *len) int no, i, pos; /定义临时
29、学号变量、计数变量 lab: pos=0; /lab用来作为goto语句的返回点 printf(%sn, 输入需要删除的学生的学号,退出当前菜单请输入-1.); scanf(%d, &no); if (no = -1) return; /输入为-1是返回主界面 while( (datapos.no != no) & (pos = *len) /如果计数值大于学生数,则说明未找到需要删除的学生,返回重新输入学号 printf(%sn, 未找到需要删除的学生); goto lab; /goto语句,跳到之前所做的节点 else for (i = pos+1;i *len; i+) /用目标学号后面
30、的数据向前进行替换,以达到删除的效果 datai-1 = datai; *len = *len -1; if (*len = 0) /如果学生数为0.则说明没有数据可删除了,按回车返回主界面 printf(%sn, 没有任何记录,请按回车键返回.); getchar(); getchar(); return; goto lab; Find.c文件#include #include #include #include common.h#include find.h/*-搜索子程序-*/void find(STUDENT *data, int len)int find_no,result ; /定
31、义临时学号和指针int i;char str256; /用来做输入值临时存放空间lab: result=0;if(len=0) /学生个数为0时,输出没有可被查找的记录 printf(没有可被查找的记录n); return ; else printf(请选择查找的方式:1.姓名 2.学号n);gets(str);if(str0=2) /如果输入值为2,即是要使用学号搜索 printf(%sn, 请输入需要查找的学生的学号,退出当前菜单请输入 -1.); scanf(%d, &find_no); if (find_no = -1 ) return; /输入-1时返回主界面 while( data
32、result.no != find_no & result = len ) /如果检索次数大于学生数,说明没有这个学生 printf(%sn, 未查询到相关信息); goto lab; else system(cls); /清屏指令 printf(%sn, 查询信息如下:); for (i =0; i 80; i+) /输出找到的成绩 putchar(*); putchar(n); printf(%8s, 学号); printf(%8s, 姓名); printf(%8s, 语文); printf(%8s, 数学); printf(%10s, 英语); printf(%12s, 平均分); pr
33、intf(%10s, 总分); putchar(n); printf(%8d, dataresult.no); printf(%8s, dataresult.name); printf(%8.1lf, dataresult.Chinese); printf(%8.1lf, dataresult.math); printf(%10.1lf, dataresult.English); printf(%12.1lf, dataresult.mark_ave); printf(%10.1lf, dataresult.mark_tot); putchar(n);for (i =0; i 79; i+)
34、putchar(*); putchar(n); goto lab; if(str0=1) /如果不是学号搜索,就是要进行姓名检索,步骤与学号类似 printf(%sn, 请输入需要查找的学生的姓名.); gets(str);/ if (str0 =0)/ return; /*exit the fine sub program*/ for(result=0;result=len;result+) if(strcmp(str,dataresult.name)=0) system(cls); printf(%sn, 查询信息如下:); for (i =0; i 80; i+) putchar(*); putchar(n); printf(%8s, 学号); printf(%8s, 姓名); printf(%8s, 语文); printf(%8s, 数学); printf(%10s, 英语); printf(%12s, 平均分); printf(%10s, 总分); putchar(n); printf(%8d, dataresult.no); printf(%8s, dataresult.name); printf(%8.1lf, dataresult.Chinese);