1、学生成绩信息管理系统 课程设计2 软件设计报告题 目: 学生成绩信息管理系统 院系名称:电子信息工程学院专业名称:电子信息工程班 级:电子0902班内序号: 学生姓名 : 指导教师: 时间:2010年6月7日 至2010年6月18日 一、课程设计目的1.熟悉C语言程序的编辑、编译链接和运行的过程,至少能够用一种编译器较熟练地编辑、编译及调试程序。 2.掌握C语言数据类型,如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。 3.熟练运用if语句和switch语句以及嵌套应用。涉及循环调用的,了解并掌握三种控制语句while、do-while和for语句。 4.学习并掌握C语言定义函数的
2、基本方法、声明函数及调用函数的方法和过程。 5. 掌握文件和文件指针的概念以及文件的定义方法,认识文件打开、关闭、读、写等文件基本操作函数。 6.掌握结构体类型变量、数组的定义和使用。 7.了解指针和链表的概念,掌握指针的定义和使用指针变量的方法以及链表的正确用法。灵活使用链表来储存学生信息。 8. 掌握数组的定义、引用以及输入输出的方法、通过字符数组存储字符串,进一步使用字符串二、课程设计内容简介学生成绩管理主要功能:(1)能按学期、按班级完成对学生成绩的录入、修改(2)能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序(3)能查询学生成绩,不及格科目及学生名单(4
3、)能按班级输出学生的成绩单开发工具Visual C+ 6.0运行平台Windows XP三、需求分析系统功能:(1)能按学期、按班级完成对学生成绩的录入、修改(2)能按班级统计学生的成绩,求学生的总分及平均分。(3)能根据学生的平均成绩进行排序(4)能查询学生总成绩,平均分(5)能按学号,姓名输出学生的成绩单(6)可以保存到文件(附加功能)(7)可以从文件读入已有的文件(附加功能)(8)以菜单方式工作性能描述:各种功能都可以满足;程序相对较小,因而运行时反应比较迅速,不存在响应不及时地问题。四、概要设计1.学生成绩管理系统模块图:2.程序可以满足以下功能:1.各模块间通过菜单切换和调用2.主函
4、数通过调用菜单函数实现对各功能模块的调用,各功能模块间根据需要可相互调用。3.程序能够保证各模块功能的独立和数据共享。4.相近功能以级联菜单的形式集成。五、详细设计1.主要功能模块的流程图如下:主函数定义变量 输入 正确 输入密码 错误进入界面重新输入sum=read_message();Do循环(choice!=0)输入数字(05)进行选择Case1input_message();break;Case2output_message(); break;Case3insert_message(); break;Case4del_message();break;Case5sort_message(
5、);break;Case6revise_message();break;Case7read_message();break;Case8inqure_message();break;Case9save_messsage();break;Case10Count_message();break;Case0Break;Clrscr();save_message(sum);添加信息:定义变量Clrscr();Do循环(flag=1)输入信息 choice= Y|ygetch();elseFlag=1;Flag=0;查询模块:定义变量Clrscr();循环(choice!=0)请选择要查询的序号:1姓名;
6、2学号Case 1按姓名查询Case 2按学号查询输入Choice=1|2数字Choice=0继续循环退出循环输出模块:定义变量clrscr();Do循环(si.num!=0)输出信息i+;修改模块:定义变量Do循环(flag=1)clrscr();输入数字(08)进行Case1:姓名 Case2:英语 Case3:数学 Case4:计算机Case0:返回主菜单重新求总成绩和平均分 choice= Y|y getch(); elseflag=1;flag=0;排序模块:定义变量Do循环(choice!=0)clrscr();输入数字(06)进行Case 1: sort_math();break
7、;case 2: sort_english();break;Case3:_computer();break;Case 0: break; 保存模块定义变量(fp=fopen(“student_list.txt” 是 ,“wb”)=NULL 否输出文件错误;return 0;For循环if(fwrite(&si,sizeof是(struct s_type),1,fp)!=1) 否写文件错误读取模块定义变量 if(fp=fopen(student_list.txt是rb)=NULL) 否输出文件错误;returnwhile循环while(feof(fp)!=1)if(si.num=0) 是 否 b
8、reak;else i+;fclose(fp);2. 主要函数说明:mangercode_message ()类型 void密码模块 只有密码正确才可打开,以便使用者保护所存储的信息。read_message()类型 void读取模块 可以将所处出的信息读取出来,方便使用。save_message()类型 void保存模块 可将所输入的信息以文件形式保存起来,具体输入信息会以txt格式保存。input_message()类型 void录入模块 以键盘形式输入学生的成绩信息。output_message()类型 void浏览模块 将所输入的学生信息打印输出,出现在显示器上。inqure_mess
9、age()类型 void查询模块 可按学生学号和学生姓名查询学生成绩 insert_message()类型 void添加模块 可随时添加一名学生信息。del_message()类型 void删除模块 可按学号删除其中一名学生的所有成绩信息。sort_message()类型 void排序模块 可将录入的学生成绩信息按平均分由大到小排序。revise_message()类型 void修改模块 可读学生的姓名学号及各科成绩进行修改。count_message()类型 void统计模块 将学生的所有成绩相加,并按总成绩排名。manger_message()类型 void管理模块 显示该程序的主菜单。六
10、、调试与测试1总体过程编译和调试工具:选择Visual C+6.0,该工具稳定,其中有一个强大的调试工具,我比较熟悉。2遇到的问题在两周的时间里,不断地对程序及各模块进行修改、编译、调试,其间遇到很多问题,这里只选几个有代表性的具体讨论。(1)调试“创建”模块时,遇到如下的一段程序:运行中,当输入错误的成绩时,程序可能会进入死循环。据分析,程序本身并没有错误,但由于涉及指针的操作,所以在运行中出现了未知的错误。开始时怀疑是程序代码的缺陷,但经过反反复复的分析和调试后确定了原因,。通过这一问题的深入研究,使我对C语言的特性有了进一步的了解。(2) 借用了老师所给例子中的一个创建链表函数,与习惯不
11、同的是,该函数是从尾到头来建立的。与顺序建立的链表相比,在实际运行中并没有多大区别,但不失为一种创新的思路,值得我们学习。(3)测试用例具有一定的广泛性。创建链表时输入了不同班级、学期的成绩,而且及格与不及格交叉输入,经过多番调试,运行结果也符合预期。说明程序具有一定的可靠性和稳定性。七、出现错误C:Documents and SettingsXY桌面myprj3.c(24) : error C2065: student : undeclared identifierError executing cl.exe. 未声明的标志 c:documents and settingsxy桌面myprj
12、15.c(36) : warning C4013: getch undefined; assuming extern returning int getch未定义 ,假定一个虚伪指令返回整型c:documents and settingsxy桌面myprj15.c(50) : fatal error C1004: unexpected end of file found 期待的结尾未建立c:documents and settingsxy桌面myprj2.c(32) : error C2143: syntax error : missing ; before error C2447: miss
13、ing function header (old-style formal list?) 前缺少;warning C4060: switch statement contains no case or default labels switch指令没有包含case和default符号error C2043: illegal break 非法的breakexpected constant expression 预期的常量表达式cannot allocate an array of constant size 0 不能分配一个数组的常量0的大小八、参考文献:1. 王曙燕主编,C语言程序设计,科学出
14、版社,2005年2. 谭浩强,C程序设计,清华大学出版社 2002年#include#include#include#include#define N 10#define CODE 321int sum;void mangercode_message() /*密码模块*/ int m; void manger_message(); printf(n *请输入一个密码*n); scanf(%d,&m); switch(m) case 321: printf(n 进入下一菜单nn); manger_message(); default: printf(n 你不能进入n); break; print
15、f(n 按任意键返回主菜单n); struct stu_type int number; char name20; int math; int english; int computer; int score; int average;stuN;int read_message() FILE *fp; int i; fp=fopen(d:studentscore.txt,rt); if(fp=NULL) printf( 无学生信息,不能读n); else i=0; for(;) if(fread(&stui,sizeof(struct stu_type),1,fp)!=1) break; i+
16、; return i; fclose(fp); void save_message() /*保存模块*/ FILE *fp;int i;fp=fopen(d:studentscore.txt,wt+);if(fp=NULL) printf( 不能读n);for(i=0;i=sum;i+) fwrite(&stui,sizeof(struct stu_type),1,fp);fclose(fp);int input_message() /*录入模块*/ int i=0,choice; do printf(nn第%d个学生,i+1); printf(nn 学号:); scanf(%d,&stui.
17、number); printf(nn 姓名:); getchar(); scanf(%s,stui.name); printf(nn 数学); scanf(%d,&stui.math); printf(nn 英语); scanf(%d,&stui.english); printf(nn 计算机); scanf(%d,&puter); stui.score=stui.math+stui.english+puter; stui.average=stui.score/3; printf(nn 总成绩为:%d,stui.score); printf(nn 平均分为:%d,stui.average);
18、i+; sum=i; printf(nn 是否继续?(1.是 2.否); scanf(%d,&choice); if(choice=1) printf(n 继续!); else break; while(choice=1); printf(n 学生成绩完毕); printf(nn 按任意键返回主菜单!); getch(); return (-i); system(cls);void output_message(int i) /*浏览模块*/ int j; printf(nn 学生成绩表n); printf(n*); printf(nn 学号 姓名 数学 英语 计算机 总成绩 平均分); pr
19、intf(nn-); for(j=0;j=i;j+) printf(nn%d %s %d %d %d %d %d,stuj.number,stuj.name,stuj.math,stuj.english,puter,stuj.score,stuj.average); printf(nn); printf(n*n); printf( 按任意键返回主菜单!); getch(); system(cls);void inqure_num() /*查询模块*/ int i,j=0,inqure_num; printf(n输入学生学号:); scanf(%d,&inqure_num); for(i=0;i
20、N;i+) if(stui.number=inqure_num) printf(n 该学生信息n); printf(nn-n); printf(nn学号-姓名-数学-英语-计算机-总成绩-平均分nn); printf(%3d%8s%5d%7d%8d%10d%14d,stui.number,stui.name,stui.math,stui.english,puter,stui.score,stui.average); printf(nn-n); else j+; if(j=N) printf(n 这个学生不存在!); printf(nn 按任意键返回主菜单!); getch(); system(
21、cls);void inqure_name() int i,j=0; char inqure_name20; printf(n输入学生姓名:); scanf(%s,inqure_name); for(i=0;iN;i+) if (strcmp(stui.name,inqure_name)=0) printf(n 该学生信息n); printf(nn-n); printf(nn学号-姓名-数学-英语-计算机-总成绩-平均分nn); printf(%3d%8s%5d%7d%8d%10d%14d,stui.number,stui.name,stui.math,stui.english,puter,s
22、tui.score,stui.average); printf(nn-n); else j+; if(j=N) printf(n 这个学生不存在!); printf(nn 按任意键返回主菜单!); getch(); system(cls);void inqure_message() int choice; do printf( 1.按学号查询nn); printf( 2.按姓名查询nn); printf( 0.退出nn); scanf(%d,&choice); switch(choice) case 1:inqure_num();break; case 2:inqure_name();brea
23、k; case 0:break; while(choice!=0);int insert_message(int i) /*添加模块*/ int choice; char flag; printf(nn 增加一个学生信息!); printf(n*); do i+; stui.number=sum+1; printf(nn 新学生的学号); scanf(%d,&stui.number); printf(nn 新学生的姓名); getchar(); scanf(%s,&stui.name); printf(nn 数学成绩); scanf(%d,&stui.math); printf(nn 英语成绩
24、); scanf(%d,&stui.english); printf(nn 计算机成绩); scanf(%d,&puter); stui.score=stui.math+puter+stui.english; stui.average=stui.score/3; printf(nn 总成绩%d,stui.score); printf(nn 平均分%d,stui.average); sum=i; printf(nn 是否继续?(1.是 2.否); scanf(%d,&choice); if(choice=1) printf(n 继续); flag=1; else flag=0; while(flag=1); printf(n 按任意键返回主菜单!); return i; system(cls);void del_message() /*删除模块*/ int i=0,j,choice,del_num; do printf(n 输入要删除的学号); scanf(%d,&del_num); for(i=0;iN;i+) if(stui.number=del_num) printf(nn 删除他的信息); for(j=i;jN;j+) stuj=stuj+1; printf(nn 删除他的信息:n); printf(nn 学号 姓名 数学 英语 计算机 总成绩 平均分);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1