North China Institute of Water Conservancy and Hydroelectric
Power
课 程 设 计
题 目: 学生成绩管理系统 姓 名: 王漫漫
学 院: 信息工程学院 专 业: 计算机科学与技术 班 级: 208班 学 号: 201320804 指导教师: 郑作勇
2014年11月16日
目 录
一 设计目的…………………………………………………………….1
二 课程设计的内容........................................2
三 课程设计的要求与数据..................................3
四 课程设计应完成的工作..................................4
五 总体设计(包含几大功能模块)...........................5
六 详细设计(各功能模块的具体实现算法——流程图)………….6
七 调试分析(包含各模块的测试用例,及测试结果)…………….7
八 总结………………………………………………………………...8
十 参考资料…………………………………………………………….9
1
一 设计目的
进一步加深、巩固所学专业课程(《C语言程序设计》)的基本理论知识,理论联系实际,进一步培养自己综合分析问题和解决问题的能力。掌握运用C语言独立地编写、调试应用程序和进行其它相关设计的技能。 二 课程设计的内容
对学生信息(包括学号、语文、数学、英语、平均分)进行管理,包括学生成
绩的信息输入、输出、查询、删除、排序、统计、退出.将学生的成绩信息进行记录,信息内容包含:(1)学生的学号(2)学生的姓名(3)学生的成绩。假设,现收集到了一个班学生的所有成绩信息,要求用C语言编写一个简单的成绩管理系统,可进行录入、查询、修改和浏览等功能。学习相关开发工具和应用软件,熟悉系统建设过程。 三 课程设计的要求与数据
1、用C语言实现系统;
2、对学生信息(包括学号、姓名、语文、数学、英语、平均分)进行管理,包括学生成绩的信息输入、输出、查询、删除、排序、统计、退出.
3、学生信息包括:其内容较多,为了简化讨论,要求设计的管理系统能够完成以下功能:
(1) 每一条记录包括一个学生的学号、姓名、3门课成绩
(2)、成绩信息录入功能:(成绩信息用文件保存,可以一次完成若干条记录的输入。)
(3)、成绩信息显示浏览功能:完成全部学生记录的显示。 (4)、查询功能:完成按姓名查找学生记录,并显示。 (5)成绩信息的删除:按学号进行删除某学生的成绩. (6)、排序功能:按学生平均成绩进行排序。
(7)、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
2
四 课程设计应完成的工作 (1)编写算法;
(2)算法测试,并有具体的测试结果和结果分析; (3)撰写课程设计报告。内容包括:
1) 封面扉页 2) 设计任务书 3) 目录
4) 总体设计方案(包括流程图) 5) 使用说明及运行实例(包括界面) 6) 成员设计内容简介
7) 项目源程序代码(注意注释的使用) 8) 指导教师评语
五 总体设计(包含几大功能模块)
1、成绩录入功能 2、成绩输出功能 3、成绩查询功能 4、删除模块 5、排序功能 6、统计功能 7、退出系统
六 详细设计(各功能模块的具体实现算法——流程图)
6.1各函数的功能和实现
1、输入初始的学生信息:输入信息包括学生的姓名、学号以及学生的成绩等相关信息;可用函数void input(STUDENT *data, int *len)来实现此操作。
3
2、成绩输出模块:输出学生的信息以及成绩void output(STUDENT *data, int len):通过学生的姓名来查看学生的相关成绩,同时也可以分别通过
caverage() 、maverage() 、eaverage() 和comaverage() 来输出成绩的平均分数、最高和最低分数。
3、成绩查询模块:可用void find(STUDENT *data, int len) 来实现。找到就输出此学生全部信息。
4、删除模块:用函数void delete_item(STUDENT *data, int *len)来实现 5、排序模块:用函数void sort(STUDENT *data, int len)来实现 6、统计功能能:用函数void stat(STUDENT *data, int len) 来实现 7、退出系统:可用一个函数exit()来实现,首先将信息保存到文件中,释放动态创建的内存空间,再退出此程序。 如图6.1
开始 输出菜单 根据菜单输入n的值选择程序 输入 输出 排序 查找 插入 删除 统计 保存 退出 结束
图 6.1
4
七 调试分析(包含各模块的测试用例,及测试结果)
7.1源程序
#include #define MAX_NAME 256 typedef struct student //学生信息 { int no; char name[MAX_NAME]; char sex[10]; char address[50]; double xianxingdaishu; double math; double wuli; double c; double mark_ave; double mark_tot; } STUDENT; /*-----------输入信息子程序---------*/ void input(STUDENT *data, int *len) { int no; putchar('\\n'); printf(\"%s\\n\请输入新的记录,如果需要退出当前菜单请输入-1.\"); printf(\"%s\格式:\\n学号 \\n\\n\"); printf(\"%s\\n\姓名 性别 籍贯 线性代数 高等数学 大学物理 C语言\"); putchar('\\n'); printf(\"如:\\n\"); printf(\"1\\n\"); printf(\"王漫漫 女 河南 93 95 70 75\\n\"); scanf(\"%d\ while(no != -1) { data[*len].no = no; scanf(\"%s %lf %lf %lf %lf\data[*len].name, &data[*len].xianxingdaishu, &data[*len].math,&data[*len].wuli,&data[*len].c ); data[*len].mark_ave=(data[*len].xianxingdaishu+data[*len].math+data[*len].wuli+data[*len].c)/4.0; 5 data[*len].mark_tot=data[*len].xianxingdaishu+data[*len].math+data[*len].wuli+data[*len].c; (*len)++; scanf(\"%d\ } } /*---------------输出信息子程序---------------*/ void output(STUDENT *data, int len) { int i; system(\"cls\"); printf(\"%8s\学号\"); printf(\"%8s\姓名\"); printf(\"%8s\性别\"); printf(\"%8s\籍贯\"); printf(\"%10s\线性代数\"); printf(\"%10s\高等数学\"); printf(\"%10s\大学物理\"); printf(\"%10s\语言\"); printf(\"%12s\平均分\"); printf(\"%10s\总分\"); putchar('\\n'); for (i =0; i < 80; i++) putchar('='); putchar('\\n'); for (i = 0; i< len; i++) { printf(\"%8d\ printf(\"%8s\ printf(\"%8s\ printf(\"%8s\ printf(\"%8.1lf\ printf(\"%8.1lf\ printf(\"%10.1lf\ printf(\"%10.1lf\ printf(\"%12.1lf\ printf(\"%10.1lf\ putchar('\\n'); } for (i =0; i < 80; i++) putchar('='); putchar('\\n'); 6 printf(\"按回车键继续.\"); getchar(); getchar(); } /*--------------排序子程序------------*/ void sort(STUDENT *data, int len) { int i,j,k; STUDENT temp; for (i=0; i temp = data[i]; data[i] = data[k]; data[k] = temp; } } } /*--------------------搜索子程序-----------------------*/ void find(STUDENT *data, int len) { int find_no, result ; int i; lab: result=0; printf(\"%s\\n\\"请输入需要查找的学生的学号,退出当前菜单请输入 -1.\"); scanf(\"%d\ if (find_no == -1) return; /*exit the fine sub program*/ while( data[result].no != find_no && result < len) result ++; if (result >= len ) { printf(\"%s\\n\未查询到相关信息\"); goto lab; } else { system(\"cls\"); printf(\"%s\\n\查询信息如下:\"); for (i =0; i < 80; i++) putchar('='); putchar('\\n'); printf(\"%8s\学号\"); printf(\"%8s\姓名\"); printf(\"%8s\性别\"); 7 printf(\"%8s\籍贯\"); printf(\"%10s\线性代数\"); printf(\"%10s\高等数学\"); printf(\"%10s\大学物理\"); printf(\"%10s\语言\"); printf(\"%12s\平均分\"); printf(\"%10s\总分\"); putchar('\\n'); printf(\"%8d\ printf(\"%8s\ printf(\"%8s\ printf(\"%8s\ printf(\"%8.1lf\ printf(\"%8.1lf\ printf(\"%10.1lf\ printf(\"%10.1lf\ printf(\"%12.1lf\ printf(\"%10.1lf\ putchar('\\n'); for (i =0; i < 80; i++) putchar('='); putchar('\\n'); goto lab; } } /*-----------------插入子程序-------------*/ void insert(STUDENT *data, int *len) { int no, pos; double xianxingdaishu, math, wuli,c, mark_ave, mark_tot; int i; char name[MAX_NAME],sex[10], address[50]; lab: printf(\"%s\\n\输入新的记录,退出当前菜单请输入-1.\"); printf(\"%s\格式:\\n\"); printf(\"%s\\n\学号 姓名 性别 籍贯 线性代数 高等数学 大学物理 C语言\"); scanf(\"%d\ if (no == -1) return; data[*len].no = no; scanf(\"%s %s %s %lf %lf %lf %lf\name, sex, address, &xianxingdaishu, &math, &wuli, &c); mark_ave=(xianxingdaishu+math+wuli+c)/4.0; mark_tot=xianxingdaishu+math+wuli+c; 8 pos = 0; while ((data[pos].mark_ave < mark_ave) && (pos < *len) ) pos ++; for (i = *len-1; i >= pos; i--) data[i+1] = data[i]; data[pos].no = no; strcpy(data[pos].name, name); data[pos].xianxingdaishu = xianxingdaishu; data[pos].math = math; data[pos].wuli = wuli; data[pos].c = c; data[pos].mark_ave = mark_ave; data[pos].mark_tot = mark_tot; (*len)++; goto lab; } /*-------------删除子程序--------------*/ void delete_item(STUDENT *data, int *len) { int no, i, pos; lab: pos=0; printf(\"%s\\n\\"输入需要删除的学生的学号,退出当前菜单请输入-1.\"); scanf(\"%d\ if (no == -1) return; while( (data[pos].no != no) && (pos < *len) ) pos = pos +1; if (pos >= *len) { printf(\"%s\\n\未找到需要删除的学生\"); goto lab; } else { for (i = pos+1;i < *len; i++) data[i-1] = data[i]; *len = *len -1; if (*len == 0) { printf(\"%s\\n\没有任何记录,请按回车键返回.\"); getchar(); getchar(); return; } goto lab; } } 9 /*---------------统计子程序------------*/ void stat(STUDENT *data, int len) { int no_59=0, no_69=0, no_79=0, no_89=0, no_100=0; int i; for (i = 0;i < len; i++) { if (data[i].mark_ave <=59) no_59++; else if (data[i].mark_ave <=69) no_69++; else if (data[i].mark_ave <=79) no_79++; else if (data[i].mark_ave <= 89) no_89++; else no_100++; } system(\"cls\"); for (i =0; i < 80; i++) putchar('='); putchar('\\n'); printf(\"%10s\分数\"); printf(\"%10s\ printf(\"%10s\ printf(\"%10s\ printf(\"%10s\ printf(\"%10s\ putchar('\\n'); putchar('\\n'); printf(\"%10s\学生\"); printf(\"%10d\ printf(\"%10d\ printf(\"%10d\ printf(\"%10d\ printf(\"%10d\ putchar('\\n'); for (i =0; i < 80; i++) putchar('='); putchar('\\n'); printf(\"按回车键返回\"); getchar(); getchar(); } /*---------------显示信息子程序------------*/ void paint() { int i; 10 system(\"cls\"); printf(\"%55s\\n\华北水利水电大学学生成绩管理系统\\n\"); printf(\" 制作者: 信息工程学院 王漫漫 \\n\"); for (i = 0; i < 80; i++) putchar('='); putchar('\\n'); printf(\" 1 输入信息 2 输出信息\\n\"); printf(\" 3 按平均分排序 4 按学号查找\\n\"); printf(\" 5 插入 6 按学号删除\\n\"); printf(\" 7 按平均分输出统计信息 8 保存到文件\\n\"); printf(\" 0 退出\\n\"); for (i = 0; i<= 79; i++) putchar('='); putchar('\\n'); printf(\"%s\\n\请输入各操作对应的序号:\"); } void save(STUDENT *data, int len)//将数据保存到文件 { int i; FILE *fp; fp=fopen(\"成绩统计表.txt\ fprintf(fp,\"%8s\学号\"); fprintf(fp,\"%8s\姓名\"); fprintf(fp,\"%8s\性别\"); fprintf(fp,\"%8s\籍贯\"); fprintf(fp,\"%8s\线性代数\"); fprintf(fp,\"%8s\高等数学\"); fprintf(fp,\"%10s\大学物理\"); fprintf(fp,\"%10s\语言\"); fprintf(fp,\"%12s\平均分\"); fprintf(fp,\"%10s\\n\总分\"); fprintf(fp,\"========================================================================\\n\"); putchar('\\n'); for (i = 0; i< len; i++) { fprintf(fp,\"%8d\ 11 fprintf(fp,\"%8s\ fprintf(fp,\"%8s\ fprintf(fp,\"%8s\ fprintf(fp,\"%8.1lf\ fprintf(fp,\"%8.1lf\ fprintf(fp,\"%10.1lf\ fprintf(fp,\"%10.1lf\ fprintf(fp,\"%12.1lf\ fprintf(fp,\"%10.1lf\\n\ } fprintf(fp,\"========================================================================\\n\"); fclose(fp); printf(\"文件已保存到\\\"成绩统计表.txt\\\"\"); getchar();getchar(); } /*-----------主程序--------------*/ void main() { STUDENT data[MAXN]; int len = 0; char ctrl_ch; paint(); scanf(\"%c\ while (ctrl_ch != '0') { switch(ctrl_ch) { case '1': input(data, &len); break; case '2': output(data, len); break; case '3': sort(data, len); break; case '4': find(data, len); break; case '5': insert(data, &len); break; case '6': 12 delete_item(data, &len); break; case '7': stat(data, len); break; case '8': save(data, len); break; default: if (ctrl_ch != '\\n') printf(\"%s\\n\输入错误!\"); break; } if (ctrl_ch != '\\n') paint(); scanf(\"%c\ } } 7.2调试与测试 7.2.1算法调试过程中出现的问题及解决方法(以下为其中一例) --------------------Configuration: Cpp1 - Win32 Debug-------------------- Compiling... Cpp1.cpp C:\\Documents and Settings\\Administrator\\桌面\\Cpp1.cpp(9) : error C2065: 'MAX_MAME' : undeclared identifier C:\\Documents and Settings\\Administrator\\桌面\\Cpp1.cpp(9) : error C2057: expected constant expression C:\\Documents and Settings\\Administrator\\桌面\\Cpp1.cpp(10) : error C2229: struct 'student' has an illegal zero-sized array 执行 cl.exe 时出错. Cpp1.obj - 1 error(s), 0 warning(s) 解决方法:把“MANE”改成“NAME”---拼写错误。 7.2.2主要程序运行结果 运行开始(如图7.1) 图7.1 13 选择1输入成绩(7.2) 图7.2 选择7按平均分输出统计信息(图7.7) 图7.7 选择8保存(图7.8.1) 图7.8.1 选择0退出(如图7.9) 图7.9 14 八 总结 由于本课题中的许多知识点都没有学过都要靠自己到课外的资料中去查找。在用的时候难免出现这样那样的错误。如开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。解决的这个问题的办法是调整。一个系统的菜单和提示信息非常重要。如果没有这些用户根本不知道怎么用你设计的这个系统。在设计的调试过程中也无法顺利的完成调试工作。 回顾起此次课程设计,我感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。通过这次课程设计之后,一定把以前所学过的知识熟悉了,这次实践学到了许多知识。学到了设计一个简单的系统。要注意哪些方面。也使我们知道自己哪些方面做得还不够。这不仅是程序设计,更是锻炼我们处理问题的能力,同时也使我们了解到团队合作的可贵.但我们总结出了一点点的经验如下: 1、要对系统的功能和要求做出详细的分析,并合理分解任务。 2、把分解出来的子任务,做给一个相对独立的模块。 3、在设计一个模块之前,要简单构想一下总界面的显视情况。 4、针对构想出来的界面进行程序的编写。 九 参考资料 [1]谭浩强. C程序设计(第三版) . 北京:清华大学出版社, 2005 [2]谭浩强. C程序设计题解与上机指导(第三版) . 北京:清华大学出版社, 2005 [3]李春葆,张植民,肖忠付.C语言设计题典[M].北京:清华大学出版社,2002 [4]网上相关资料 15 因篇幅问题不能全部显示,请点此查看更多更全内容