需求分析
编写目的:
学生成绩管理是学校管理的一个重要方面,数据量巨大,人工管理方式以及人为处理方式 工作繁复、负担重。为方便学校管理,在此研发一个基于网络的综合学生基本成绩管理系统以及作为系统分析员进行系统分析和测试人员进行测试时的手册。 需求概述:
1、增加学生成绩记录; 2、显示学生成绩; 3、学生成绩排行; 4、查找学生成绩; 5、删除学生成绩; 6、插入学生成绩; 7、清空所有数据; 8、安全退出系统;
需求说明:
学生成绩包括:学号,姓名,语文,数学,英语,总分; 录入的学生成绩要求用文件形式保存,并可以对其进行输入、浏览、查询、修改、删除等基本操作;
学生成绩的显式要求有一定的规范格式;
对学生成绩应能够分别按姓名和学号两种方式进行,要求能返回所有符合条件的学生的成绩;
对学生成绩的修改应逐个地进行,一个学生成绩的更改不应影响其他的学生记录;
所设计的系统应以菜单方式工作,应为用户提供清晰的使用提示,依据用户的选择来进行各种处理,并要求在此过程中能够尽可能的兼容用户使用过程中的异常情况
总体设计
编写目的:
根据需求分析文档,初步提出问题的解决方案,以及软件系统的体系结构和数据结构的设计方案并写出书面文档总体设计说明书,为下一步进行详细设计做准备。
总体设计:
1. 该系统可以按功能进行模块划分,其模块图如下:
帐号 管理员 密码 学生成绩管理系统 学生基本成绩查询 学生成绩管理 系统模块图
其中:
成绩输入模块完成学生成绩的输入功能,输入成绩包括学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等;成绩浏览模块完成已录入学生成绩的显示; 成绩查询模块完成学生成绩的查询,查询时对应有按姓名查询和按学号查询两种方式;
成绩修改模块完成学生成绩的修改功能; 成绩删除模块完成学生成绩的删除功能;
菜单选择模块完成用户命令的接收,此模块也是学生成绩管理系统的入口,用户所要进行的各种操作均需在此模块中进行选择并进而调用其他模块实现相应的功能;
2. 数据结构
本系统中主要的数据结构就是学生的成绩,学生成绩包括:学号,姓名,语文,数学,英语,总分;在处理过程中各项可以作为一个学生的不同属性来进行处理 3.程序流程
系统的执行应从功能菜单的选择开始,依据用户的选择来进行后续的处理,直到用户选择退出系统为止,其间应对用户的选择做出判断及异常处理。系统的流程图如下:
程序流程图
开始 菜单选择 否 输入 否 输入 是 是 按姓名 按学号 输入 是 是 输入 成绩输入 成绩浏览 成绩修改是 成绩删除 输入 否 否 结束
详细设计
编写目的:
根据项目概要设计说明书,在项目概要设计的基础之上,对系统进行详细设计,以便下一步进行程序编码工作。
详细设计:
对应于总体设计时的系统功能模块图,各个功能模块的处理逻辑如下: ① ① 成绩输入模块:
打开学生成绩文件; while ( 继续输入 ) {
读入学生成绩;
将读入成绩添加到学生成绩文件中;
提示是否继续输入; }
关闭学生成绩文件;
② ② 成绩浏览模块:
打开学生成绩文件;
while ( 不到文件结束 ) {
从文件中顺序读出一个学生的成绩; 按指定格式输出该学生的成绩; }
关闭学生成绩文件;
③ ③ 成绩查询模块:
while ( 仍继续查询 )
{
if( 按姓名查询 )
{
读入查询的学生姓名; 打开学生成绩文件; while( 不到文件结束 ) {
顺序读出一个学生的成绩;
if( 该学生成绩的姓名正确 ) 输出该学生的成绩; }
关闭学生成绩文件;
提示共有几条符合条件的记录; } else
if ( 按学号查询 ) {
读入学号查询的条件; 打开学生成绩文件; while( 不到文件结束 ) {
顺序读出一个学生的成绩;
if( 该学生成绩的学号符合条件 ) 输出该学生的成绩;
}
关闭学生成绩文件;
提示符合条件的记录数; }
else 提示输入不合适; 提示是否继续查询; }
④ ④ 成绩修改模块:
while( 继续修改 ) {
从给出成绩文件中所有的记录情况;
提示并读入待修改的记录的学生的学生号; 打开学生成绩文件;
查找并读出该学生的成绩到一个中间变量中; 提示并读入要针对该学生的哪个属性进行修改; 根据用户的选择提示并读入所要修改属性的新值; 在该学生的中间变量中修改刚刚读入的属性值; 提示是否确定要进行修改;
如果用户确定则将中间变量重新写回到原学生成绩文件中; 关闭学生成绩文件;
} ⑤ ⑤ 成绩删除模块:
while( 继续删除 ) {
显示所有学生的成绩;
提示并读入待删除的学生的学生号; 打开学生成绩文件;
查找是否有符合条件的学生记录; if( 有符合条件的记录) {
提示是否确认该删除操作; if (用户确认此操作) {
创建一个新的临时文件; 打开原成绩文件;
while( 原成绩文件中记录未读完 ) {
读出原成绩文件中的下一条记录;
if( 此条记录不是待删除记录) 写入临时文件中去; }
关闭原成绩文件; 关闭临时文件;
读方式打开临时文件;
写方式重建与原成绩文件同名的新成绩文件; 将临时文件中的内容写入到新成绩文件中去; 关闭新成绩文件; 关闭临时文件; 删除临时文件; } }
else 提示没有符合条件的记录存在;
} ⑥ ⑥ 菜单选择模块:
给出成绩提示; 清屏;
绘制菜单(包含输入、显示、查询、修改、删除、退出); 提示菜单选择并读入到变量;
根据读入变量的值调用不同的模块函数;
数据结构:
性别: enum Sex{ male, female }; 姓名 :enum name; 日期 :struct Date
{ int year;
int month;
int day;
};
学生成绩:struct Info
{
char num[5]; /* 学生号 */
char name[8]; /* 姓名 */
enum Sex sex; /* 性别 */
struct Date birthday; /* 出生年月*/
enum adderss; /* 地址 */ char phone[8]; /* 电话 */ };
#include 具体程序 #include struct student { char name[10]; /// 姓名 char id[10]; /// 学号 float Ynum; /// 语文分数 float Snum; /// 数学分数 float Enum; /// 英语分数 float number; /// 总分 student *next; }; ///////////-------定义类-----------------------//////////// class stud { student *p1,*p2,*head; public: ~stud() /////----析构函数------------------------ { while(head) { p1=head->next; delete head; head=p1; } } ///------------成员函数------------ void output(student *head); // 输出学生成绩 student * input(student *head); // 增加学生记录 student* del(student *head, char*p); // 删除记录 student* find(student *head,char *p,int &n); // 查找学生记录(可查找多个同名数据) student* stat(student *head); //排序统计学生总分 friend void total(student*head); //统计学生总分 student* insert(student *head); //按学生总分插入记录 student* clear(student *head); // 删除当前表 void Inputs(student *p); //用于添加数据的子函数 };//---------------------------------------------------- ////---------用于添加数据的子函数-------/////// void stud::Inputs(student*p) { cout< { cerr<<\"您的输入有误,请重新输入\"< cin>>p->Snum; while(cin.fail()) { cerr<<\"您的输入有误,请重新输入\"< cin>>p->Enum; while(cin.fail()) { cerr<<\"您的输入有误,请重新输入\"< } total(p); //计算出总分 } ////////-----输出学生成绩-----------------///////////////////// void stud::output (student *head) { p1=head; while(p1!=NULL) { cout< /////////------------插入学生成绩记录--------//////////////// student* stud::insert(student *head) { p1=new student; Inputs(p1); //调用子函数 增加数据 p2=head; student* p3=NULL; while((p2->number < p1->number ) && p2->next !=NULL) { p3=p2; p2=p2->next; } if(p2->number > p1->number) { p1->next=p2; if(p3==NULL) // 若当前值是最小的 return p1; p3->next =p1; return head; } else { p2->next=p1; p1->next=NULL; return head; } } //////----------清空数据------------///////////// student* stud::clear(student*head) { while(head) { p1=head->next ; delete head; head=p1; } return head; } //////////-----------排序统计函数-----------///////////////// student *stud::stat(student *head) { p2=head; p1=p2->next; while(p2->next) //冒泡泡法, 呵呵`~~~ { if(p2->number > p1->number) { // 把头指针指向当前比较小的节点 p2->next=p1->next; p1->next=head; head=p1; // 把用于比较的两个指针复位 //p2=head; p1=p2->next ; } else { // 指向下一个节点 p2=p2->next ; p1=p2->next ; }//------------------------------------------- } cout<<\"当前表以按学生总分排序成功\"< while(strcmp(p1->name ,p)&& p1->next !=NULL)//strcmp是字符串对比函数前大于后输出正数,后大于前输出负数 { p2=p1; p1=p1->next ; } if(!strcmp(p1->name ,p)) { if(p1==head) head=p1->next; else p2->next=p1->next ; cout<<\"删除成功,OK\"< return head ; } ///////----------统计总分---------------/////////////// void total(student *p) { p->number = p->Ynum + p->Snum + p->Enum; } ///////-------------查找函数----------/////////////////// student* stud::find (student *head,char *p,int& n) { p2=head; while(strcmp(p2->name ,p) !=0 && p2->next !=NULL) p2=p2->next ; if(0==strcmp(p2->name,p)) { cout< cout<<\"对不起,没有您要查找的学生数据\"< ///////----------------增加学生记录 -----------//////////////////////////// student *stud::input (student *head) { p1=new student; p2=head; Inputs(p1); //调用子函数 增加数据 if(head ==NULL) { head=p1; p1->next =NULL; return head; } while(p2->next !=NULL) p2=p2->next; p2->next=p1; p1->next=NULL; return head; } //----------- 输出错误 -----------////////// void error() { cout<<\"错误,这还是一张空表,请输入数据\"< //回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才 //开始从stdio流中每次读入一个字符. //getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输 //入的字符回显到屏幕.如用户在按回车之前输入 //了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也 //就是说,后续的getchar调用不会等待用 //户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键. } ///////////////////------------main函数--------//////////////////----------- int main(void) { stud stus; student *head=NULL; student *pd; //临时指针, 用于查找函数 char choice; //用于存放用户的选择项 char name[10]; //查找,删除记录的 key while(1) { system(\"cls\");//轻屏程序 cout<<\"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\"; cout<<\"┃**************** ☆ 学 生 成 绩 管 理 系 统 ☆ ****************** ┃\\n\"; cout<<\"┃********** ★★★★★ ★★★★★★★ ★★★★★ *********** ┃\\n\"; cout<<\"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\"; cout<<\"┃****************★ ☆ 1.增加学生成绩 ☆ ★****************┃\\n\"; cout<<\"┃****************★ ☆ 2.显示学生成绩 ☆ ★****************┃\\n\"; cout<<\"┃****************★ ☆ 3.排序统计成绩 ☆ ★****************┃\\n\"; cout<<\"┃****************★ ☆ 4.查找学生成绩 ☆ ★****************┃\\n\"; cout<<\"┃****************★ ☆ 5.删除学生成绩 ☆ ★****************┃\\n\"; cout<<\"┃****************★ ☆ 6.插入学生成绩 ☆ ★****************┃\\n\"; cout<<\"┃****************★ ☆ 7.清空所有数据 ☆ ★****************┃\\n\"; cout<<\"┃****************★ ☆ 8.安全退出系统 ☆ ★****************┃\\n\"; cout<<\"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\"; cout<<\" 请输入您的选择(0--8):\";cout< if(choice=='8') //安全退出 { cout<<\"谢谢使用,再见\"< }//------------------------------------------------ switch(choice) { case '1': head=stus.input (head); break;//------------------------------------------------ case '2': if(head==NULL) { error(); break; } cout< } head=stus.stat(head); getch(); break;//------------------------------------------------ case '4': if(head ==NULL) { error(); //调用函数输出错误信息 break; } cout<<\"请输入想要查找的学生姓名\"<<\" ,\"<<\"本系统可以查找重复姓名学生\"< cout< pd=stus.find (pd,name,n); if(pd==NULL) break; pd=pd->next ; //指针指向当前以找到的下一个节点,用于查找多个同名学生 } getch(); break;//------------------------------------------------ case '5': if(head==NULL) { error(); break; } cout<<\"请输入想要删除学生姓名\"< head=stus.del(head,name); getch(); break;//------------------------------------------------ case '6': if(head==NULL) { error(); break; } head=stus.stat (head); head=stus.insert(head); break;//----------------------------------------------- case '7': if(head==NULL) { error(); break; } head=stus.clear(head); cout<<\"删除表成功~\"< cout<<\" 对不起,您的输入有误,请重新输入。\\n\"; getch(); break; }//------------------------------------------------------ } getch(); return 0; } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务