《学生信息管理系统开发课程设计论文本科论文.doc》由会员分享,可在线阅读,更多相关《学生信息管理系统开发课程设计论文本科论文.doc(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 JISHOUUNIVERSITY本科生课程设计计算机语言程序设计基础I题 目:学生信息管理系统开发作 者:学 号:所属学院: 班 级: 44 / 44完成时间:评分表序号评分项分数1出勤及表现2功能完善3文档格式与文字表达4代码风格5测试调试6图表7功能设计8目录结构设计9界面与流程10加分合计课程设计工作组长签字: 年 月 日目 录一、问题分析5二、总体设计71.界面设计72.数据结构设计83.文件结构设计94.系统功能结构设计95.工程目录结构设计10三、模块实现、测试与调试101.主控模块10函数原型10函数定义10函数测试122.界面模块131)打印菜单功能132)打印学生卡片163
2、)打印添加学生提示184)打印删除学生提示195)打印修改学生提示203.数据处理模块211)添加学生功能212)删除学生功能243)修改学生功能264)查询功能275)浏览功能276)列表判空功能287)列表判满功能294.存储模块291)读入数据302)保存数据31四、系统集成测试321.主控模块+添加学生322. 主控模块+添加学生+存储模块36五、总结40一、 问题分析课程设计的题目为学生信息管理系统开发,要求实现添加学生、删除学生、修改学生信息、浏览所有学生和查询学生等操作。为了能够把学生信息永久保存下来需要使用文件。需要保存的数据结构简单,数据文件采用纯文本文件,扩展名为txt。学
3、生信息包括以下几个数据:学号、姓名、性别、班级、宿舍。这些数据都是字符串类型,学号的长度为12,姓名的最大长度为50,性别的最大长度为2,班级的最大长度为30,宿舍的最大长度为10。性别必须是男或者女。所有数据均不能为空。添加学生操作要求用户输入学生的所有信息。删除学生操作要求用户首先输入要删除的学生的学号,然后系统根据学号删除相应数据。修改学生信息要求用户输入学生的所有信息,然后系统用输入的数据替代现有的数据。浏览所有学生信息操作把所有学生的信息按照添加的先后顺序显示出来。查询学生操作要求用户首先输入要删除的学生的学号,然后系统根据学号找到相应数据,并且显示出来。上述所有操作正常完成后,不给
4、出任何报告,如果不能正常完成,则给出错误报告。在系统启动时,从数据文件中读入数据,操作过程中数据更新保存在内存,在系统退出或者用户要求保存时才把内存中的数据保存到文件中。系统为控制台应用程序,采用控制台菜单作为用户界面。系统总体业务流程见下图。启动从文件读入数据输入菜单命令cmd打印菜单cmd其他操作保存退出完成相应功能把数据保存到文件把数据保存到文件结束二、 总体设计1. 界面设计系统菜单提供与系统需要完成的添加学生、删除学生、修改学生信息、浏览所有学生和查询学生功能相对应的菜单命令,以及保存文件和退出系统的菜单命令。从数据文件中读入数据是在系统启动时自动完成的,不需要提供相应的菜单命令。下
5、图为命令菜单。*学生信息管理系统1。添加学生2。删除学生3。修改学生4。查询学生5。学生列表6。保存文件0。退出系统* 浏览所有学生操作的打印结果采用列表方式显示,列表包括三个部分:表格标题、表头和表格数据。下图为学生列表的一个例子。=学生名册=学号姓名性别班级宿舍20144055001冯午阳男14通信17#101= 添加学生给出的提示信息如下图所示,包括操作提示和信息提示两个部分。-添加学生-学号 姓名 性别 班级 宿舍修改学生给出的提示信息如下图所示,包括操作提示和信息提示两个部分。-修改学生-学号 姓名 性别 班级 宿舍查询学生的结果是学生信息卡,如下图所示,在开始标识和结束标识之间,以
6、每行一条数据的方式显示各项信息。=学生卡片=学号:20144055003姓名:冯午阳性别:男班级:14通信1宿舍:7#101=2. 数据结构设计用结构体存放学生信息,结构体类型Student定义如下图所示。其中使用常量存放各项数据的最大长度。struct Student char sidSID_SIZE+1;/学号 char nameNAME_SIZE+1;/姓名 char sexSEX_SIZE+1; /性别 char sClassSCLASS_SIZE+1;/班级 char dormDORM_SIZE+1;/宿舍;用数组sList存放学生信息表,用SIZE存放数组的最大长度,用整型变量le
7、n保存数组中存放的学生个数,并初始化为0。相关的定义代码如下图所示。Student sListLIST_SIZE;int len=0;3. 文件结构设计存放学生信息的文件名为studentData.txt,文件中每行保存一个学生的数据。每行为5个字符串,中间用一个空格隔开。每个字符串为一项数据,依次为学号、姓名、性别、班级、宿舍。每项数据为一个没有空格的字符串。4. 系统功能结构设计除主控模块外,整个系统的主要功能分为三大模块:界面、存储、数据处理。界面模块包括打印菜单、打印学生卡片、打印添加学生提示、打印删除学生提示、打印修改学生提示、打印查询学生提示、打印学生列表、报告表空、报告学生不存在
8、、报告文件错误。存储模块包括读入数据和保存数据。数据处理模块包括添加学生、删除学生、修改学生、查询、浏览和列表判空。系统功能结构如下图所示。总控模块保存数据读入数据存储模块数据处理模块界面模块判满打印菜单报告文件错误报告学生不存在打印添加提示卡片打印学生卡片判空浏览查询修改学生删除学生添加学生报告表空打印学生列表卡片打印修改提示卡片打印查询提示卡片打印删除提示卡片5. 工程目录结构设计系统工程名称StudentMan,main.cpp中定义main函数,实现总体业务流程的控制,ui.h、ui.cpp中声明、定义界面模块中的各个功能函数,store.h、store.cpp中声明、定义存储模块中的
9、各个功能函数,data.h、data.cpp中声明、定义数据处理模块中的各个功能函数。三、 模块实现、测试与调试1. 主控模块函数原型int main();函数定义#include #include #include using namespace std;int main()char cmd;/1. 读入数据/cout读入数据.endl;printf(读入数据.n);/循环执行步骤2、3、4while(true)/2. 打印菜单/cout菜单endl;printf(菜单n);/3. 输入命令cmd/cout请输入命令(1,2,3,4,5,6,0):cmd;/scanf(%c,&cmd);cm
10、d=getch();switch(cmd)/4. 根据cmd,分支case 0:/4.1 如果cmd是退出,/4.1.1 保存数据/cout保存数据endl;printf(保存数据n);/4.1.2 退出系统exit(-1);break;case 6:/4.2 如果cmd是保存/4.2.1 保存数据/cout保存数据endl;printf(保存数据n);break;case 1:/4.3 如果cmd是添加/4.3.1 添加学生/cout添加学生endl;printf(添加学生n);break;case 2:/4.4 如果cmd是删除/4.4.1 删除学生/cout删除学生endl;printf
11、(删除学生n);break;case 3:/4.5 如果cmd是修改/4.5.1 修改学生/cout修改学生endl;printf(修改学生n);break;case 4:/4.6 如果cmd是查询/4.6.1 查询学生/cout查询学生endl;printf(查询学生n);break;case 5:/4.7 如果cmd是浏览/4.7.1 打印学生列表/cout学生列表endl;printf(学生列表n);break;default:printf(错误命令!n);break;return 0;函数测试测试记录 1. 当使用scanf(%c,&cmd);输入命令时出现问题。更正办法是:使用cmd
12、=getch();输入命令。需要包含conio.h头文件。2. 界面模块界面模块包括打印菜单、打印学生卡片、打印添加学生提示、打印删除学生提示、打印修改学生提示、打印查询学生提示、打印学生列表、报告表空、报告学生不存在、报告文件错误。1)打印菜单功能函数原型void printMenu();函数定义void printMenu()printf(*n);printf( 学生信息管理系统 n);printf( 1。添加学生 n);printf( 2。删除学生 n);printf( 3。修改学生 n);printf( 4。查询学生 n);printf( 5。学生列表 n);printf( 6。保存文
13、件 n);printf( 0。退出系统 n);printf(*n);函数测试#include #include #include #include ui.husing namespace std;int main()char cmd;/1. 读入数据/cout读入数据.endl;printf(读入数据.n);/循环执行步骤2、3、4while(true)/2. 打印菜单/cout菜单endl;/printf(菜单n);printMenu();/3. 输入命令cmd/cout请输入命令(1,2,3,4,5,6,0):cmd;/scanf(%c,&cmd);cmd=getch();switch(c
14、md)/4. 根据cmd,分支case 0:/4.1 如果cmd是退出,/4.1.1 保存数据/cout保存数据endl;printf(保存数据n);/4.1.2 退出系统exit(-1);break;case 6:/4.2 如果cmd是保存/4.2.1 保存数据/cout保存数据endl;printf(保存数据n);break;case 1:/4.3 如果cmd是添加/4.3.1 添加学生/cout添加学生endl;printf(添加学生n);break;case 2:/4.4 如果cmd是删除/4.4.1 删除学生/cout删除学生endl;printf(删除学生n);break;case
15、 3:/4.5 如果cmd是修改/4.5.1 修改学生/cout修改学生endl;printf(修改学生n);break;case 4:/4.6 如果cmd是查询/4.6.1 查询学生/cout查询学生endl;printf(查询学生n);break;case 5:/4.7 如果cmd是浏览/4.7.1 打印学生列表/cout学生列表endl;printf(学生列表n);break;default:printf(错误命令!n);break;return 0;2)浏览功能函数原型 void printStudentList(Student sList, int len);函数定义单元测试3)打印
16、学生卡片函数原型 void printStudent(Student s);函数定义void printStudent(Student s)printf(=学生卡片=n);printf(学号:%sn,s.sid);printf(姓名:%sn,s.name);printf(性别:%sn,s.sex);printf(班级:%sn,s.sClass);printf(宿舍:%sn,s.dorm);printf(=n);单元测试测试代码void test_printStudent()Student s =20144055003,冯午阳,男,14通信1,7#101;printStudent(s);测试代码
17、void test_printStudent()Student s =20144055003,韩宇枫,男,14通信1,7#101;printStudent(s);3)打印添加学生提示函数原型 void printAddStudentTips();函数定义void printAddStudentTips()printf(-添加学生-n);printf(学号 姓名 性别 班级 宿舍 n);单元测试int main()printAddStudentTips();return 0;4)打印删除学生提示函数原型 void printDeleteTips();函数定义void printDeleteTip
18、s()printf(-修改学生-n);printf(学号 姓名 性别 班级 宿舍 n);单元测试#include #include ui.hint main()printDeleteTips();return 0;5)打印修改学生提示函数原型 函数定义单元测试打印查询学生提示函数原型 函数定义单元测试打印学生列表函数原型 函数定义单元测试报告表空函数原型 函数定义单元测试报告学生不存在函数原型 函数定义单元测试报告文件错误函数原型 函数定义单元测试3. 数据处理模块数据处理模块包括添加学生、删除学生、修改学生、查询、浏览和列表判空。1)添加学生功能函数原型 void addStudent(St
19、udent sList,int len,Student s);函数定义void addStudent(Student sList,int *len,Student s)strcpy(sList*len.sid ,s.sid);strcpy(sList*len.name , s.name);strcpy(sList*len.sex , s.sex);strcpy(sList*len.sClass , s.sClass);strcpy(sList*len.dorm , s.dorm);(*len)+;单元测试void addStudent(Student sList,int *len,Studen
20、t s)strcpy(sList*len.sid ,s.sid);strcpy(sList*len.name , s.name);strcpy(sList*len.sex , s.sex);strcpy(sList*len.sClass , s.sClass);strcpy(sList*len.dorm , s.dorm);(*len)+;void test_addStudent()Student sList10;int len=0;Student s =20144055003,冯午阳,男,14通信1,7#101;addStudent(sList,&len,s);printStudent(sL
21、ist0);printf(学生数目:%dn,len);测试记录1. 第一次的代码void addStudent(Student sList,int len,Student s)strcpy(sListlen.sid ,s.sid);strcpy(sListlen.name , s.name);strcpy(sListlen.sex , s.sex);strcpy(sListlen.sClass , s.sClass);strcpy(sListlen.dorm , s.dorm);len+;void test_addStudent()Student sList10;int len=0;Stude
22、nt s =20144055003,冯午阳,男,14通信1,7#101;addStudent(sList,len,s);printStudent(sList0);printf(学生数目:%dn,len);问题:学生数目应该为1,输出结果是0.分析:说明记录学生数目的变量len的值没有变化。原因是单向值传递。修改:传递len的地址修改后的代码:void addStudent(Student sList,int *len,Student s)strcpy(sList*len.sid ,s.sid);strcpy(sList*len.name , s.name);strcpy(sList*len.s
23、ex , s.sex);strcpy(sList*len.sClass , s.sClass);strcpy(sList*len.dorm , s.dorm);(*len)+;void test_addStudent()Student sList10;int len=0;Student s =20144055003,冯午阳,男,14通信1,7#101;addStudent(sList,&len,s);printStudent(sList0);printf(学生数目:%dn,len);测试结果2)删除学生功能从学生列表sList中删除编号为i的学生,要求i大于等于0小于学生数目len。函数原型
24、void deleteStudent(Student sList,int *len,int i);函数定义void deleteStudent(Student sList,int *len,int i)/把编号i+1到len-1的学生的数据 前移一位for(;i = *len-2; i+)sListi = sListi+1;/学生数目减1(*len)-;单元测试void test_deleteStudent()Student sList10;int len=0;char fileName=studentData.txt;char fileName2=studentData2.txt;int f
25、lag = readData(fileName, sList, &len);deleteStudent(sList,&len,len/2);saveData(fileName2, sList, len);studentData.txt文件的内容20144055001 冯午阳 男 14通信1 7#10120144055001 冯午阳 男 14通信1 7#10220144055001 冯午阳 男 14通信1 7#10320144055001 冯午阳 男 14通信1 7#104111 www 男 14tong1 1702运行test_deleteStudent()后studentData2.txt文
26、件的内容20144055001 冯午阳 男 14通信1 7#10120144055001 冯午阳 男 14通信1 7#10220144055001 冯午阳 男 14通信1 7#103111 www 男 14tong1 1702111 www 男 14tong1 1702调试代码void test_deleteStudent()Student sList10;int len=0;char fileName=studentData.txt;char fileName2=studentData2.txt;int flag = readData(fileName, sList, &len);print
27、f(%dn,len);deleteStudent(sList,&len,len/2);printf(%dn,len);saveData(fileName2, sList, len);根据调试结果,我们发现在数据文件studentData.txt中如果最后一行有换行符,则readData函数会多读入一条数据。修改readData函数,用fgetc(fp);fgetc(fp);吸收掉每行末尾的rn。int readData(char fileName, Student sList, int *len)FILE* fp = fopen(fileName,r);Student s; if(fp = N
28、ULL)return 0;while(!feof(fp)fscanf(fp,%s %s %s %s %s,s.sid,s.name,s.sex,s.sClass,s.dorm);fgetc(fp);fgetc(fp);addStudent(sList,len,s);fclose(fp);return 1;3)修改学生功能函数原型 int updateStudent(Student sList, int len, Student s);函数定义int updateStudent(Student sList, int len, Student s)int p = find(sList,len,s.
29、sid);if(p = -1)return 0;else/strcpy(sListp.sid ,s.sid);strcpy(sListp.name , s.name);strcpy(sListp.sex , s.sex);strcpy(sListp.sClass , s.sClass);strcpy(sListp.dorm , s.dorm);return 1;单元测试void test_updateStudent()Student sList10;int len=0;int status;Student s=20144055003,pppp,0,1414,7501;char fileName
30、=studentData.txt;int flag = readData(fileName, sList, &len);status = updateStudent(sList, len, s);printf(%dn,status);saveData(fileName, sList, len);数据文件studentData.txt原来的内容:20144055001 fwy 男 14通信1 7#10320144055002 fwy 男 14通信1 7#10420144055003 tttt男14通信1 7#104执行函数test_updateStudent()后,数据文件studentData
31、.txt的内容:20144055001 fwy 男 14通信1 7#10320144055002 fwy 男 14通信1 7#10420144055003 pppp 0 1414 75014)查询功能函数原型 函数定义单元测试6)列表判空功能函数原型 int emptySList(int len);函数定义int emptySList(int len)if(len = 0)return 1;elsereturn 0;单元测试void test_emptySList()int len = LIST_SIZE-1;int flag = emptySList(len);printf(%dn,flag
32、);len = LIST_SIZE;flag = emptySList(len);printf(%dn,flag);len = 0;flag = emptySList(len);printf(%dn,flag);7)列表判满功能函数原型 int fullSList(int len);函数定义int fullSList(int len)if(len = LIST_SIZE)return 1;elsereturn 0;单元测试void test_fullSList()int len = LIST_SIZE-1;int flag = fullSList(len);printf(%dn,flag);l
33、en = LIST_SIZE;flag = fullSList(len);printf(%dn,flag);4. 存储模块存储模块包括读入数据和保存数据。存放学生信息的文件名为studentData.txt,文件中每行保存一个学生的数据。每行为5个字符串,中间用一个空格隔开。每个字符串为一项数据,依次为学号、姓名、性别、班级、宿舍。每项数据为一个没有空格的字符串。1)读入数据函数原型 int readData(char filename, Student sList, int *len);函数定义int readData(char fileName, Student sList, int *l
34、en)FILE* fp = fopen(fileName,r);Student s; if(fp = NULL)return 0;while(!feof(fp)fscanf(fp,%s %s %s %s %s,s.sid,s.name,s.sex,s.sClass, s.dorm);addStudent(sList,len,s);fclose(fp);return 1;单元测试void test_readData()Student sList10;int len=0;char fileName=studentData.txt;int flag = readData(fileName, sLis
35、t, &len);int i;if(flag=1)for(i=0; ilen; i+)printStudent(sListi);elseprintf(文件访问出错!);studentData.txt文件的内容:20144055001 冯午阳 男 14通信1 7#10120144055001 冯午阳 男 14通信1 7#10220144055001 冯午阳 男 14通信1 7#10320144055001 冯午阳 男 14通信1 7#1042)保存数据函数原型 int saveData(char fileName, Student sList, int len);函数定义int saveData
36、(char fileName, Student sList, int len)int i;FILE* fp = fopen(fileName,w); if(fp=NULL)return 0;for(i=0; ilen; i+)fprintf(fp,%s %s %s %s %sn,sListi.sid,sListi.name, sListi.sex,sListi.sClass,sListi.dorm);fclose(fp);return 1;单元测试void test_saveData()Student sList10;int len=0;char fileName=studentData.txt;char fileName2=studentData2.txt;int flag = readData(fileName, sList, &len);int i;if(flag=1)for(i=0; ilen; i+)printStudent(sListi);elseprintf(文件访问出错!);strcpy(sList0.name,fwy);saveData(fileName2, sList, len);studentData2.txt文件中的内容:20144055001 fwy 男 14通信1 7#