软件工程课程实验报告系统名称学生信息管理系统学院_计算机学院信息_学生信息管理系统设计文档1.可行性研究1.1技术可行性已经有人开发过,并且我们也都使用过相类似系统,对其一般性的软件和操作环境、编译环境都比较熟悉,所以说在技术上来说是可行的。
1.2经济可行性当前系统只对服务器有关的要求,在服务费用方面,支出在你那个承担的范围,以后的维护及其他设备的总共费用在可以承担的范围。
用当前系统可以节约出能够支付当前系统的直接支出,以后维护费用更是比以前的机制节约很多钱。
1.3操作可行性系统的操作方式在这个用户组织内能行得通。
2.需求分析2.1输入让学生在纸面上填写相关内容,然后等待辅导员或管理员的审批确认后,再输入数据库中保存。
2.2输出学生选择用户选项进入系统后,系统可经有算法程序输出学生基本信息表,学习成绩表等。
2.2.1打印输出可打印基本信息、学习成绩等各种表格以及在对相应信息进行统计操作后的表格。
2.2.2文件输出可将所有打印表格输出到EXCEL文件中,以便用户使用其它的EXCE软件改变表格的大小及字体。
2.3故障处理2.3.1内部故障处理在开发阶段可以随即修改数据库里的相应内容。
2.3.2外部故障处理对编辑的程序进行重装载时,第一次装载认为错,修改。
第二次运行,在需求调用时出错,有错误提示,重试。
2.4性能要求分析2.4.1系统易操作性所开发的系统应做到操作简单,尽量使系统操作不受用户对电脑知识水平的限制。
242系统具有可维护性由于系统涉及的信息比较广,数据库中的数据需定期修改,系统可利用的空间及性能也随之下降,为了使系统更好地运转,学院可以对系统数据及一些简单的功能进行独立的维护及调整。
243系统具有开放性该系统能够在开放的硬件体系结构中运行,并且能与其他系统顺利连接,不会因外部系统的不同面要做在量的修改工作。
3.概要设计3.1基本设计概念和处理流程管理员通过密码认证,进入信息管理页面对学生相关信息的录入、更新、修改、添加等操作,也可以通过查询界面对学生信息进行完全的查询,而学生和相关人员只能通过公共的查询界面对学生信息进行查询,如要对学生信息进行完全查询就需要得到管理员的同意。
3.2接口设计本系统采用快速原型开发工具ViSUal BaSiC 6.0 进行开发,所提供的不同层次的接口,都具有高度的集成性,本系统没有采用低级语言设计和完成自定义接口,因此接口设计部分已经由不同方式的组件来完成了,以下只做简单说明。
3.2.1用户接口说明将向用户提供的命令和它们的语法结构,以及软件的回答信息。
说明本系统同外界的所有接口的安排包括软件与硬件之间的接口、本系统与323内部接口说明本系统之内的各个系统元素之间的接口的安排。
数据库接口设计采用4.详细设计4.1控制流程图4.1.1主模块软件结构4.1.2管理员登陆软件结构4.1.3用户查询软件结构打印出结果返回重新输入条件返回重新输入条件4.2源程序流程图5、项目测试功能截图:5.1 登陆界面嶂C∖U⅛er^∖ADM]NI-≡* ' - ^ l □回ES」∖∖5.2 学生用户功能界面5.4管理员管理界面5.5 管理员输入功能翌CΛUs≠fl∖ADMTNT- ■ ■» ∙to VMM*■I 口]回I 塚r5.6 管理员删除功能AS C:\Uwrs\ADMiN[^l\DE7ktap\STLl MAN 亠175.7 管理员查询功能導CΛUwrΛ⅛DW[MI^l1∖C⅛⅞ktop∖STUMAN-I.t x rSIUoENT number name CoInP Mr⅞⅞hjEng j UBn [ ave IniCi5.8 管理员修改功能5.7 管理员查询功能5.9 管理员插入功能5.10 统计功能5.11 分类功能5.12 显示功能5.13管理员保存功能文件保存名为:STUDENT路径为:C:\6、项目管理6、1人员管理团队负责人:陶修赟小组成员:万富,洪鑫,汪贤惠,项鑫 6、2产品管理本产品工作于W in-TC 工作环境,用于对学生成绩的管理。
学生用户,可进行查询课 程成绩;管理员可对学生及其成绩进行录入、 修改。
6、3进程管理可行性分析:5月23日一5月24日 项目开发计划:5月25日—5月 26日 需求分析:5月27 日— 5月27日软件设计:5月30 日— 6月1日 编程实现:6月2 日 — 6月10日 软件测试:6月STUDENT2011/6/17 20;26 哀样修改、查询、排列等功能。
本系统可进行维护,标志:提交可行性分析报告 标志:提交项目开发计划 标志:完成需求分析报告 标志:完成软件分析与设计文档 标志:代码编写全部完成 标志:完成软件测试,可投入使用tt ⅜若瑞2UI1¾^ESaH ∣2∣≡ n 】∏Ili⅛⅛⅛ 2朋开⅛H⅛J 話⅛≡t耕设计5驟訥 6 針WQU 0 ξQ Cn C□ AM 琲琲琲琲琲琲琲HL A..L 11 HJ H-30L 年躯H 30】L 年覇阴2D 】阵5月笳日 30LL 年5脚日20L SflLl 年减日20l2DLl⅞fi ∣nB 30】L 申月 14 日234 5 630::申月22日 M L 耶月刘日 20LlWR5θ~~13日—6月14日6、4项目计划甘特图------------------------------------------ S TUDENT \n"| number |name IComPlMathlEng | SUm || %-10s ∣%-15s ∣%4d ∣%4d ∣%4d ∣ %4d∣ %.2f ∣%4d |\n"DATAp->data .nu m,p->data .name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.a ve,p->data. min gci #defi ne END"------------------------------------------------------------------- \n"int SaVefIag=0; /*是否需要存盘的标志变量 */typedef StrUCt StUdent /* 标记为 StUdent*/ {Char num[10]; /*学号*/ Char n ame[15]; /*姓名*/ int Cgrade; /*C 语言成绩' int mgrade; /*数学成绩*/ int egrade; /*英语成绩*/int total; /*总分*/ float ave; /*平均分*/ int min gci; /*名次*/};typedef StrUCt n Ode /*定义每条记录或结点的数据结构,标记为 node*/ {StrUCt StUde nt data; StrUCt node *n ext; }Node,*Li nk; void menu ChOiCe() {SyStem("cls");/*清屏与 CIrSCr()功能相同 */7、编码#i nclude VStdio.h> #in elude <stdlib.h>#i nclude "stri ng.h" #defi ne HEADER1 " #define HEADER2 " ave |mici | ∖n" #defi ne HEADER3 " #defi ne FoRMA T " #defi netextcolor(10); /*在文本模式中选择新的字符颜色*/gotoxy(7,5);CPri ntf(" The StUde nts' Grade Man ageme nt SyStem ∖n"); gotoxy(7,8);Prin tf("\nPlease En ter your choice; 0 en ter StUde nts' SyStem\n∖t∖t∖t"); Printf(" ");Prin tf("1 en ter teachers' SyStem∖ n");}格式化输出至文本窗口屏幕中 */格式化输出至文本窗口屏幕中 */gotoxy(7,9);CPrin tf(" * 1 in PUt record 2 delete record*∖n");gotoxy(7,10);CPrin tf(" * 3 SearCh record 4 modify record *∖n"); gotoxy(7,11); CPrin tf(" * gotoxy(7,12); 5 in Sert record 6 count record *∖n"); CPrin tf(" * gotoxy(7,13); 7 sort reord 8 SaVe record*∖ n"); CPrin tf(" * 9 display record 0 quit SyStem *∖n");gotoxy(7,14); CPri ntf("∕*cprintf()送void menu() /* 菜单函数 */{SyStem("cls");textcolor(10); gotoxy(7,5); CPri ntf(" gotoxy(7,8); CPri ntf("*************************Me nu ********************************∖n")・ ∕*清屏与CIrSCr()功能相同*/ /*在文本模式中选择新的字符颜色 /*在文本窗口中设置光标,下同 */ */ The StUde nts' Grade Man ageme nt SyStem ∖n"); *************************************************************∖n");void menu StUde nt() {SyStem("cls"); textcolor(10); gotoxy(7,5); CPri ntf(" gotoxy(7,8);CPri ntf("*************************Me nu********************************∖n")・/*清屏与CIrSCr()功能相同*/ /*在文本模式中选择新的字符颜色 /*在文本窗口中设置光标,下同*/ */The StUde nts' Grade Man ageme nt SyStem ∖n");gotoxy(7,9);CPri ntf(" *3 SearCh recordgotoxy(7,10);CPri ntf("*************************************************************∖n ");0 quitsystem*' n");∕*cprintf()送Void Printheader() /*格式化输出表头*/{Prin tf(HEADER1);Prin tf(HEADER2);Prin tf(HEADER3);}void Printdata(Node *pp) /*格式化输出表中数据*/{Node* P;P=PP;Printf(FORMA T,DATA);}void Wron g() /*输出按键错误信息*/{Prin tf("∖ n∖n∖n∖n∖n ***********Error:i nput has wrong! PreSS any key toContin ue**********∖ n");getchar();}void Nofin d() /*输出未查找此学生的信息*/{Prin tf("∖ n=====>Not find this StUde nt!∖ n");}void DiSP(Link l) /*显示单链表I中存储的学生记录,内容为StUdent结构中定义的数据项*/{Node *p;p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/if(!p){Prin tf("∖ n=====>Not StUde nt record!∖ n");getchar();return;}Prin tf("∖n∖n");Printheader(); /*输出表格头部*/WhiIe(P) /*逐条输出链表中存储的学生信息*/{Prin tdata(p);p=p-> next; /*移动至下一个结点*/Prin tf(HEADER3);}getchar();}Node* LOCate(Link l,char findmess[],char nameornum[]) /* 用于定位链表中符合要求的节点,并返回指向该节点的指针,findmess[]保存要查找的具体内容;nameornum[]保存按什么查找;在单链表I中查找;*/{Node *r;if(strcmp(nameornum,"num")==0) /* 按学号查询*/{r=l->n ext;while(r){if(strcmp(r->data.num,findmess)==O) /* 若找至U findmess 值的学号*/return r;r=r->n ext;}}else if(strcmp(nameornum,"name")==O) /* 按姓名查询*/{r=l->n ext;while(r){if(strcmp(r->,findmess)==O) /* 若找到findmess 值的学生姓名*/return r;r=r->n ext;}}return 0;}void Stringinput(char *t,int Iens,char *nOtiCe) /* 输入字符串,并进行长度验证(长度<lens)*/ {Char n[255];do{Printf(notice); /* 显示提示信息*/SCanf("%s",n); /*输入字符串*/if(strlen(n)>lens)printf("∖n EXCeed the required Iength! ∖n"); /* 进行长度校验,超过IenS值重新输入*/}while(strle n(n )>le ns);StrCPy(t,n); /*将输入的字符串拷贝到字符串t中*/int numberinput(char *nOtiCe) /* 输入分数,0< =分数< =100)*/{int t=0;do{Printf(notice); /* 显示提示信息*/SCanf("%d",&t); /* 输入分数*/if(t>100 Il t<0) Printf("∖n Score must in [0,100]! \n"); /* 进行分数校验*/ }while(t>100 || t<0);return t;}void Add(Link l) /*增加学生记录*/{Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/Char ch,flag=0,nu m[10];r=l;s=l->n ext;SyStem("cls");DiSP(l); /*先打印出已有的学生信息*/while(r-> next!=NULL)r=r->next; /*将指针移至于链表最末尾,准备添加记录*/ while(1) /* 一次可输入多条记录,直至输入学号为0的记录结点添加操作*/{while(1) /*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/{Stringinput(num,10,"lnput number(press '0'return menu):"); /* 格式化输入学号并检验*/flag=0;if(strcmp(num,"0")==0)/*输入为0 ,则退出添加操作,返回主界面*/{return;}s=l->n ext;WhiIe(S) /*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/{if(strcmp(s->data. nu m, nu m)==0){flag=1;break;}S=S->n ext;}getchar();Prin tf("=====>The nu mber %s is not exist in g,try aga in?(y/n):", nu m);SCan f("%c", &ch);if(ch=='y'∣∣ch=='Y')Con ti nue;elsereturn;}else{break;}}P=(NOde *)malloc(sizeof(Node));if(!p){Prin tf("\n Allocate memory failure "); /* 如没有申请到,打印提示信息*/ return ;}StrCPy(P->data.num,num); /* 将字符串num 拷贝至U p->data.num 中*/Stri ngin PUt(P->data .n ame,15,"Name:");p->data.cgrade=nUmberinput("C Ianguage SCore[0-100]:"); /* 输入并检验分数,分数必须在0 —100之间*/p->data.mgrade=n Umberi nput("Math Score[0-100]:");p->data.egrade=nu mberi nput("E nglish Score[0-100]:");p->data.total=p->data.egrade + p->data.cgrade + p->data.mgrade; /*计算总分*/p->data.ave=(float)(p->data.total∕3);/* 计算平均分*/p->data. min gci=0;p->next=NULL; /*表明这是链表的尾部结点*/r->n ext=p; /*将新建的结点加入链表尾部中*/r=p;SaVefIag=1; /*在main()有对该全局变量的判断,若为1,则进行存盘操作*/}return ;}void QUr(Link l) /*按学号或姓名,查询学生记录*/{int select; /*1:按学号查,2:按姓名查,其他:返回主界面(菜单) */Char SearChinput[20]; /*保存用户输入的查询内容*/Node *p;if(!l->next)/* 若链表为空*/{SyStem("cls");Prin tf("∖ n=====>No StUde nt record!∖n");getchar();return;}SyStem("cls");Prin tf("∖ n =====>1 SearCh by nu mber =====>2 SearCh by n ame∖ n");Prin tf(" PIeaSe ChoiCe[1,2]:");SCan f("%d", &select);if(select==1) /* 按学号查询*/{Stri ngin PUt(SearCh in put,10,"I nput the existi ng StUde nt nu mber:");P=LOCate(l,searchinput,"num");/*在I中查找学号为SearChinput值的节点,并返回节点的指针*/if(p) /* 若p!=NULL*/{Prin theader();Prin tdata(p);Prin tf(END);Prin tf("press any key to retur n");getchar();}elseNofi nd();getchar();}else if(select==2) /* 按姓名查询*/{Stri ngin PUt(SearCh in put,15,"i nput the existi ng StUde nt n ame:");P=LOCate(l,search in put," name");if(p){Prin theader();Prin tdata(p);Prin tf(END);Prin tf("press any key to retur n");getchar();}elseNofi nd(); getchar();}elseWron g();getchar();}void DeI(Li nk l) /*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/Node *p,*r;Char fin dmess[20];if(!l-> next){SyStem("cls");Prin tf("∖ n=====>No StUde nt record!' n"); getchar();return;}SyStem("cls");DiSP(l);Prin tf("∖ n =====>1 Deiete by nu mber =====>2 Deiete by n ame∖ n"); Printf(" PieaSe ChoiCe[1,2]:");SCan f("%d", &sel);if(sel==1){Stri ngin put(fi ndmess,10,"i nput the exist ing StUde nt nu mber:");P=LOCate(l,fi ndmess," nu m");if(P) /*p!=NULL*/{r=l;while(r- >n ext!=p)r=r->n ext;r->next=p->next;/*将P所指节点从链表中去除*/free(p); /*释放内存空间*/Prin tf("∖ n=====>Delete success!' n");getchar();SaVefiag=1;}elseNofi nd();getchar();}else if(sel==2){Stri ngin put(fi ndmess,15,"i nput the existi ng StUde nt n ame");P=LOCate(l,fi ndmess," name"); /*先按姓名查询到该记录所在的节点*/if(p){r=l;while(r- >n ext!=p)r=r->n ext;r->n ext=p->n ext;free(p);Prin tf("∖ n=====>Delete success!' n");SaVefIag=1;}elseNofi nd();getchar();}elseWron g();getchar();}void MOdify(Li nk l) /*修改学生记录。