华中科技大学电子科学与技术系.DOC

上传人:天*** 文档编号:920701 上传时间:2018-11-07 格式:DOC 页数:25 大小:105.50KB
下载 相关 举报
华中科技大学电子科学与技术系.DOC_第1页
第1页 / 共25页
华中科技大学电子科学与技术系.DOC_第2页
第2页 / 共25页
华中科技大学电子科学与技术系.DOC_第3页
第3页 / 共25页
华中科技大学电子科学与技术系.DOC_第4页
第4页 / 共25页
华中科技大学电子科学与技术系.DOC_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、华中科技大学电子科学与技术系课程设计报告名 称: 软件课程设计 题 目: 学生成绩管理系统 院 系: 电子科学与技术系 班 级: 电子科学与技术 0606日期: 2008 年 6 月 30 日目 录一、 程序功能说明页码1. 主功能说明2. 辅助功能说明3. 程序模块说明4. 界面说明二、 总体算法设计页码1. 数据存储文件结构2. 源代码文件结构三、 详细设计页码函数说明及程序流程四、 源程序清单.页码(由于源代码有 1700 多行,不便在报告中全部列出,因此只列出了核心功能函数的源代码)五、测试结果 .页码六、实践体会 .页码一程序功能说明本程序可以实现以下功能1.主功能:1.登录认证和密

2、码修改2. 自动读取和存储数据3. 添加,删除,修改学生信息4. 添加,删除,修改科目信息5. 添加,删除,修改分数信息6. 多重搜索(学生姓名,学号)7. 按升序或降序显示所有学生任一科目的成绩(包括加权成绩)注:程序中可以存储同名的学生,但是不允许学号相同,因此做了部分处理应对这种情况。当搜索某个同名学生时,倘若通过姓名搜索,则会显示所有该姓名的学生,然后再通过学号确定。2.辅助功能1. 全自动生成数据。为便于程序测试,由系统自动随机生成所有数据(包括学生姓名,学科的相关信息,学生的各科成绩等).(本来想写一个程序自动测试脚本的,算法已经成熟了,然而精力有限未能完成)3.模块说明本程序分四

3、个模块: 数据库核心功能模块 ,数据库辅助功能模块, 数据库界面功能模块,自动数据库生成模块。我认为数据库核心功能模块应负责最底层的文件操作,其他的模块都是基于核心模块的应用型模块。模块间相对独立,以核心功能模块为主,自动数据库生成模块和数据库界面模块都需要频繁调用核心功能模块,如此便实现了功能间的剥离,便于日后的功能扩展和程序升级.保证核心功能的健壮性和容错能力相当重要。对此,我采取了一系列措施:对于每个传入的参数进行严格的检查,包括变量的范围,指针是否为空,变量是否合法等。如果发现异常,就设置错误 myerr 并终止程序。我的想法是核心功能模块不应该出现参数异常的问题,所有的不合法参数应该

4、在上层模块如界面模块中就进行过滤了,在与用户交互的过程中,所有输入的非法参数都应该被过滤,以防非法参数传入底层模块,甚至写入数据库,造成数据库异常。因此倘若如果经过种种措施后,仍然有非法参数传入核心模块,我就认为程序异常并发出终止程序的命令。而倘若是上层模块出现异常的话,可以返回 false 标志,而不致于立即终止程序。另外为了更方便地分析程序中的功能异常情况,我又采取了一些措施,包括将二进制数据库文件重写入文本文件,从而可以随时查看数据库中各变量值,从而迅速地对错误进行定位。另外我还写了个别测试程序,如 showsubinfo(),showlink()等,这些函数都是在程序莫名其妙地出现异常

5、的情况下为调试而写出来的,目的是查看某类型结构体中的各变量的值。程序出现功能异常,大多数都是变量异常。而结构体中的变量值异常相对来说比较难查出来,因此我写了一系列小测试函数,根据需要插入代码中,每当执行到该处时,就会将该结构体中各变量显示出来,错误一目了然。4.界面说明进入程序后首先是登录界面,初次使用本程序时,会提示初始密码,用户可以在登录后修改密码。初次使用时,由于数据库为空,因此系统会提示添加学生,其中有一个选项是系统自动生成学生,该功能是为测试程序之用。若系统检测到数据库中没有学科就会提示用户添加学科。之后用户就可以进入完整的功能界面了。在界面方面做了小设计。比如当数据库中无学生信息时

6、,界面就只有选项提示用户添加学生,之后若系统检测到数据库中无科目信息时再提示用户添加科目,如果数据库中的科目数已经达到最大允许值(本程序设置的最大科目数为 200,可在宏中设置) ,则界面中就会屏蔽掉添加科目这一选项,即界面会随着数据库中数据的情况进行适当的调整。我认为在界面方面尚未将核心功能开发完全,通过界面的扩展,可以实现更多的功能,从而充分利用核心函数的功能。为了增加功能的通用性,我尽量将核心功能函数进行部分抽象化,对不同功能以宏进行区分,这样可以精简代码,避免代码重复和冗余。二.总体算法设计1.数据存储文件结构a)本程序的二进制存储文件为 stuinfo.dat,文件包含两个部分,文件

7、头和数据区,类似于bmp 文件结构.文件头中存储了文件信息,包括学生数,科目数,冗余块数,冗余块的位移地址数组,以及学科信息数组及用户的登录密码.当文件进行数据的操作时首先要读入文件头,当数据操作完后会自动修改头文件,头文件的存在使文件能高效的操作.当数据块删除时,不采取文件大块数据整体移动的物理删除方法,而是采用将数据块的 flag 标志位置零的逻辑删除方法,同时将该数据块的起始偏移地址写入冗余块数组中,当有新数据写入文件时,则由文件头中的冗余块数组得到某个冗余块的偏移地址,然后新数据即可写入该处,而不是简单地追加到文件末,此法可以有效地利用文件空间,减少冗余度.b)由于数据存储文件为二进制

8、形式,因此当对该文件进行数据写入或删除等操作后,无法掌握是否正确地完成了相关功能,文件结构是否保持正常.当程序出现异常时,无法及时定位导致异常的数据块,因此另外生成了一个辅助文件 test.txt,将 stuinfo.dat 文件中的所有变量以文本形式一一写入 test.txt,此法便于调试程序及对异常数据的准确定位c)为便于测试程序,需要首先建立一个数据文件,同时输入大量数据 ,人工输入未免过于麻烦,因此我专门写了个模块用于随机产生数据文件,随机产生学生的姓名,学号,性别,所有科目的成绩,所有学科的学分,开课时间等.随机产生字符串时,需要抽取字符进行组合,对于随机产生姓名,其长度及字符都是随

9、机的,而学号由十二位数字组成,学生的分数,学科的学分都为double 型,因此产生随机整数乘以 0.5,随机数产生时要严格控制其范围,如分数不能超过 100,学分不超过 6 等.(本想使随机产生的成绩成正态分布,且学生间分数拉开,由于时间有限,算法研究未成熟,因此只能采用简单的随机数生成获得成绩).2.源代码结构本程序包含 4 个头文件和五个 C 文件,每个文件功能明确Mydb.h 总头文件,包含程序所涉及的所有头文件及全局变量Macro.h 宏头文件,包含程序所涉及的所有宏,如文件路径等Struct.h 包含所有结构体的定义Func.h 包含所有函数的声明Main.c 程序主函数Filefu

10、nc.c 关于文件数据操作(添加,删除) 的核心函数 (12 个函数)Extrafunc.c 关于附加功能操作的函数,如搜索,排序等(9 个函数)System_gui.c 关于与用户交互的文本界面函数(13 个函数)Randrecord.c 关于随机产生数据的函数(7 个函数)三. 详细算法设计及函数说明a)void seterr(char*);该函数用于设置程序中的异常,在代码关键处出错时,该函数会返回错误原因,便于调试. void freeparam();该函数用于文件结束时释放所有全局变量及关闭所有文件void initfile();该函数用于初始化数据文件,即初始化数据文件头void

11、fcntl(long,int,void*,int);用于对文件进行读写操作,将 fseek,fread,fwrite 集为一体bool addstu(pmystu);用于添加学生信息( 姓名,专业班级,性别,学号)bool delstu(long);用于删除学生,参数 long 为该学生在文件中的偏移地址bool editstu(long,pmystu);用于编辑已有学生的信息bool addsub(psubinfo);用于添加学科信息(学分,名称,开课时间)bool delsub(int);用于删除学科信息,参数为学科的 ID 号bool editsub(psubinfo);用于编辑已有学科

12、信息bool editmark(psubmark,long);用于编辑学生某科目的成绩,包括(添加,删除,修改)bool makeavemark(pstuinfo);用于计算学生的加权成绩b) long search(char*,int);用于搜索记录( 通过姓名或学号搜索学生,通过学科名称搜索学科),集数项搜索功能于一身void showfile();用于将 stuinfo.dat 二进制信息以文本方式写入 test.txt,plink sortlink(plink,int);用于对单链表进行排序,int 参数用于表示排序方式plink makelink(plink,double,long)

13、;用于将新数据接入链表 ,double 为学生的成绩,long为学生的偏移地址plink marklink(int);用于产生链表,int 用于表示将 ID 为该参数的科目成绩产生链表void freelink(plink);用于释放链表所有节点的空间c)void login_gui();用户登录界面void changekey_gui();用户修改密码界面bool system_gui();总界面,用于调度所有分界面bool addstu_gui();用于交互添加学生信息bool editstu_gui();用于交互编辑学生( 包括删除学生)bool inputsub_gui();用于交互编

14、辑输入学科信息bool editsub_gui();用于编辑学科信息(包括删除)bool editmark_gui();用于编辑成绩信息(包括添加,删除,修改)bool showstu(long,int,int*,int);用于显示学生信息(分三种显示模式 ,SHOW_PRIV:单人信息显示模式,只显示个人信息,不含成绩信息SHOW_PERMARK:单人成绩显示模式SHOW_ALLMARK:多人成绩显示模式bool search_gui();用于交互搜索记录bool isschid(char*);用于判断学号是否合法bool showmark_gui();用于交互显示成绩plink finds

15、tu_gui(char*);用于处理重名的学生d)void makestu();用于随机产生所有学生信息void makesub();用于随机产生学科信息void makemark();用于随机产生成绩信息long myrand(long,long);用于产生所设范围的任意大随机数void makeword(char*,char);用于产生随机字符串void MakeDataBase();用于产生随机数据文件bool makemajor(char*);用于随机产生专业四.源程序清单(仅给出核心代码部分,源代码在一起提交的文件夹中)typedef char bool;#define FILEPA

16、TH “c:stuinfo.dat“#define INFOPATH “c:test.txt“#define MAXSPACECOUNT 10 /系统所记录的最大冗余块数#define MAXSUBCOUNT 20 /系统所允许存储的最多科目数#define RANDSTUCOUNT 100 /系统将自动产生的学生个数#define RANDSUBCOUNT 20 /系统将自动产生的科目个数#define BUFSIZE 20 /字符缓冲区大小#define SHOWMAX 6 /屏幕最大显示的科目数#define TRUE 1#define FALSE 0#define READ 0x81#

17、define WRITE 0x82#define SEARCH_SCHID 0x83 /通过学生的学号进行搜索#define SEARCH_NAME 0x85 /通过学生的姓名进行搜索#define SEARCH_SUB 0x86 /通过学科的名称进行搜索#define SHOW_PRIV 0x87 /显示单个学生的个人信息#define SHOW_PERMARK 0x89 /显示单个学生的个人成绩#define SHOW_ALLMARK 0x90 /显示所有学生的某科成绩#define SORT_DECLINE 0x92 /以降序排列#define SORT_INCLINE 0x93 /以升

18、序排列#define ALPHAWORD 0x94 /以字母构成的字符串( 用于随机产生学生的姓名#define NUMBERWORD 0x95 /以数字构成的字符串 (用于随机产生学号#define ADDSUB 0x96 /科目编辑模式为添加#define EDITSUB 0x97 /科目编辑模式为修改#define BIGNUMBER 0x0ffffff /系统延迟采用的循环中的大数#define LONGSIZE sizeof(long)#define INTSIZE sizeof(int)#define LINKSIZE sizeof(link)#define STUINFOSIZE

19、 sizeof(stuinfo)#define SUBINFOSIZE sizeof(subinfo)#define TCHINFOSIZE sizeof(tchinfo)#define SUBMARKSIZE sizeof(submark)#define FILEINFOSIZE sizeof(fileinfo)#define MYSTUSIZE sizeof(mystu)#define DATASEEK (FILEINFOSIZE+LONGSIZE)#define DATATRANS (STUINFOSIZE+LONGSIZE)#define SETERR(S) printf(S);ret

20、urn FALSE; /显示出错信息并返回#define NEW(I) (I*)malloc(sizeof(I) /开辟新的内存空间typedef struct _submarkinfobool flag; /flag=0 表该块无效int sub_id; /科目的 id 号double sub_mark; /该科目的成绩submark,*psubmark;/科目成绩信息typedef struct _stuchar stu_name20; /学生姓名char stu_schid20; /学生学号int stu_sex; /学生性别 0=man 1=womanchar stu_major20;

21、 /学生专业和班级(电子 0606)mystu,*pmystu;/学生个人信息typedef struct _stuinfobool flag; /flag=0 表该生作废int stu_sysid; /学生 id 号/系统将为每个学生产生唯一的 ID 号mystu stu_privacy; /学生个人信息long stu_seek; /在文件中的地址int stu_markcount; /已有的成绩数double stu_avemark; /学生加权平均分submark stu_markMAXSUBCOUNT;/学生成绩数组stuinfo,*pstuinfo;/学生信息(包括个人信息和系统信

22、息)typedef struct _subinfobool flag; /flag=0 表该块无效int sub_id; /科目的 id 号int sub_term; /科目开课的学期double sub_rate; /科目所占的学分char sub_name20; /科目名称subinfo,*psubinfo;/科目信息typedef struct _fileinfoint stucount; /已注册的学生人数int countmax; /最大学生数,用于产生 idint spacecount; /文件冗余块数long seekMAXSPACECOUNT;/文件冗余块在文件中的地址int

23、subcount; /已注册的科目的个数subinfo subMAXSUBCOUNT;/科目信息数组fileinfo,*pfileinfo;/学生信息文件头typedef struct _linkdouble mark;long stuseek;struct _link* next;link,*plink;/该结构体用于产生链表/链表用于对成绩排序之用核心功能函数/本函数设置系统错误,并终止程序void seterr(char*err)memset(void*)myerr,0,errnosize);int n=strlen(err);if(nerrnosize-1)n=errnosize;memcpy(myerr,err,n);printf(“nn%snn“,err);exit(0);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 1

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。