软件验收报告学生管理系统软件验收报告目录第一章项目概述 (4)1.1项目背景 (5)1.2相关文档 (6)1.3参考资料 (6)1.4部分系统截图 (7)1.5系统结构图 (8)第二章验收定义 (9)2.1验收策略 (9)2.2验收依据 (9)2.3验收环境 (9)2.4验收标准 (9)2.4.1项目验收原则 (9)2.4.2验收流程 (10)2.4.3系统功能标准 (10)2.5验收范围 (11)2.6验收人员 (11)第三章项目验收内容 (12)3.1实施工作验收 (12)3.2软件平台验收单 (12)3.3功能模块验收单 (12)3.4项目文档验收单 (13)3.5运行结果验收 (13)第四章验收结论 (13)第五章交付物清单 (14)文档提交清单 (14)源码提交清单 (14)附件: (34)程序流程图 (34)第一章项目概述学生信息管理系统(Student Information Management System),以下简称SIMS,是针对学校人事处的大量业务处理工作而开发的管理软件,是典型的管理信息系统(Management Information System)。
它是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,它能够为用户提供充足的信息和快捷的查询手段。
能有效的帮助学校和老师掌握学生的情况,为学生提供成绩跟课程方面的查询。
在传统模式下利用人工进行学生信息管理,存在着较多的缺点,如:效率底,保密性差,时间一长将产生大量的文件和数据,更不便于查找,更新,维护等。
诸如这些情况,令学校管理者对学生的信息管理带来了很大困难,严重影响了教育工作者的工作效率。
随着科学技术的不断提高,计算机科学日渐成熟, 使用日趋成熟的计算机技术来代替传统的人工模式,来实现学生信息的现代化管理,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
作为计算机应用的一部分,使用计算机对学生信息进行管理,具有着手工管理所无法比拟的优点。
这些优点能够极大地提高学生信息管理的效率,也是学校的科学化、正规化管理的重要条件。
用计算机制作的学校信息管理系统还可以通过功能强大的互联网及时的向学生的家长传递该生在校的最新成绩,有助于学校与家长的信息互动,为更好地把握学校的教育方针一定的促进作用。
因此,开发这样一套管理软件成为很有必要的事情。
1.1项目背景随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。
管理信息系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的管理信息系统。
目前信息处理技术的飞速发展,基于计算机网络的信息处理已成为人们日常工作,学习和生活必备系统。在Internet飞速发展的今天,互联网已成为人们快速获取,发布和传递信息的重要渠道,它已成为社会生活的一部分。学生信息处理的电脑化、网络化,是实现学校管理现代化和信息化的重要内容,也是方便用户快捷查询相关充足信息的重要工具。与传统学生信息处理模式相比,基于网络的学生管理系统具有无可比拟的优越性。因此开发一套有关学校的信息管理系统不仅能大大提高工作效率而且还能给师生的工作学习带来极大的便利。
1.2相关文档1《学生管理系统软件测试方案》2《学生管理系统软件测试用例》1.3参考资料《软件测试从入门到精通》《软测之魂:核心测试设计精解》《软件测试与测试技术》1.4部分系统截图1.5系统结构图第二章验收定义2.1验收策略由开发方提供被验收内容、验收文档,由监理公司与用户进行评审,在评审无误的情况下,确认通过验收。
2.2验收依据《软件测试验收准则》2.3验收环境学生管理系统软件实际运行的生产环境为验收环境。
⏹硬件平台计算机⏹软件平台Window操作系统:window xp、window7、window82.4验收标准2.4.1项目验收原则1、审查提供验收的各类文档的正确性、完整性和统一性,审查文档是否齐全、合理;2、审查项目功能是否达到了合同规定的要求;3、审查项目有关服务指标是否达到了合同的要求;4、审查项目投资以及实施进度的情况;对项目的技术水平做出评价,并得出项目的验收结论。
2.4.2验收流程本项目的验收采取项目验收流程的方式进行验收。
具体流程如下图所示。
项目验收流程2.4.3系统功能标准如果各模块验收测试结果如下表所述则视为验收合格,否则将进行修改,以进行再次验收评审。
2.5验收范围用户以及监理方进行验收确认。
验收确认包括以下两方面确认内容:1.参照《验收标准》确认合同所涉及的功能以及项目组的实施工作是否完成;2.抽取客户端进行测试,确定系统能够稳定运行。
2.6验收人员第三章项目验收内容3.1实施工作验收3.2软件平台验收单验收人:张紫娜验收时间:3.3功能模块验收单3.4项目文档验收单3.5运行结果验收第四章验收结论经过严格的测试本软件达到要求标准,符合验收要求。
第五章交付物清单文档提交清单1《学生管理系统软件测试方案》2《学生管理系统软件测试用例》源码提交清单源程序清单(仅给出核心代码部分)typedef char bool;#define FILEPATH "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#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 //以升序排列#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 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);return FALSE;} //显示出错信息并返回#define NEW(I) (I*)malloc(sizeof(I)) //开辟新的内存空间typedef struct _submarkinfo{bool flag; //flag=0表该块无效int sub_id; //科目的id号double sub_mark; //该科目的成绩}submark,*psubmark;//科目成绩信息typedef struct _stu{char stu_name[20]; //学生姓名char stu_schid[20]; //学生学号int stu_sex; //学生性别0=man 1=womanchar stu_major[20]; //学生专业和班级(电子0606)}mystu,*pmystu;//学生个人信息typedef struct _stuinfo{bool flag; //flag=0表该生作废int stu_sysid; //学生id号//系统将为每个学生产生唯一的ID号mystu stu_privacy; //学生个人信息long stu_seek; //在文件中的地址int stu_markcount; //已有的成绩数double stu_avemark; //学生加权平均分submark stu_mark[MAXSUBCOUNT];//学生成绩数组}stuinfo,*pstuinfo;//学生信息(包括个人信息和系统信息)typedef struct _subinfo{bool flag; //flag=0表该块无效int sub_id; //科目的id号int sub_term; //科目开课的学期double sub_rate; //科目所占的学分char sub_name[20]; //科目名称}subinfo,*psubinfo;//科目信息typedef struct _fileinfo{int stucount; //已注册的学生人数int countmax; //最大学生数,用于产生idint spacecount; //文件冗余块数long seek[MAXSPACECOUNT];//文件冗余块在文件中的地址int subcount; //已注册的科目的个数subinfo sub[MAXSUBCOUNT];//科目信息数组}fileinfo,*pfileinfo;//学生信息文件头typedef struct _link{double mark;long stuseek;struct _link* next;}link,*plink;//该结构体用于产生链表//链表用于对成绩排序之用核心功能函数://本函数设置系统错误,并终止程序void seterr(char*err){memset((void*)myerr,0,errnosize);int n=strlen(err);if(n>errnosize-1)n=errnosize;memcpy(myerr,err,n);printf("\n\n%s\n\n",err);exit(0);}/*本函数用于清理所有全局变量包括文件指针和全局结构体指针*/void freeparam(){if(fp)fclose(fp);fp=NULL;if(myfileinfo)free(myfileinfo);myfileinfo=NULL;if(mystuinfo)free(mystuinfo);mystuinfo=NULL;}//本函数用于对文件进行操作,将常用的文件操作集于一身void fcntl(long seek,int cntlmode,void *pdata,int size){if(!fp)fp=fopen(FILEPATH,"rb+");if(!fp)initfile();rewind(fp);fseek(fp,seek,SEEK_SET);if(!pdata)return;if(!size)seterr("fcntl:parameter not matched");switch(cntlmode){case READ:fread(pdata,size,1,fp);break;case WRITE:fwrite(pdata,size,1,fp);break;default:seterr("fcntl:cntlmode invalid");}}//初始化数据库void initfile(){if(!fp)fp=fopen(FILEPATH,"wb+");if(!myfileinfo)myfileinfo=NEW(fileinfo);memset(myfileinfo,0,FILEINFOSIZE);myfileinfo->seek[0]=DATASEEK;int i=0;for(;i<MAXSUBCOUNT;i++)myfileinfo->sub[i].sub_id=i+1;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);}//添加学生的核心函数void addstu(pmystu newstuinfo){if(!newstuinfo)seterr("addstu:newstuinfo null");if(search(newstuinfo->stu_schid,SEARCH_SCHID)) seterr("addstu:database schid collision");if(!myfileinfo){myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);}int spacecount=myfileinfo->spacecount;if(spacecount>=MAXSPACECOUNT)seterr("addstu:parameter invalid");long seek=myfileinfo->seek[spacecount];if(spacecount){myfileinfo->seek[spacecount]=0;myfileinfo->spacecount--;}else myfileinfo->seek[spacecount]+=DATATRANS;if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);memcpy(&(mystuinfo->stu_privacy),newstuinfo,MYSTUSIZE);mystuinfo->stu_seek=seek;mystuinfo->flag=1;int i;mystuinfo->stu_sysid=myfileinfo->countmax+1;for(i=0;i<MAXSUBCOUNT;i++)mystuinfo->stu_mark[i].sub_id=i+1;fcntl(seek,WRITE,mystuinfo,STUINFOSIZE);myfileinfo->stucount++;myfileinfo->countmax++;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);}//删除学生的核心函数void delstu(long delstuseek){if(!delstuseek)seterr("delstu:parameter zero");if(!myfileinfo){myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);}if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);fcntl(delstuseek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo->flag)seterr("delstu:parameter invalid");mystuinfo->flag=0;fcntl(delstuseek,WRITE,mystuinfo,STUINFOSIZE);myfileinfo->stucount--;myfileinfo->spacecount++;int count=myfileinfo->spacecount;if(count<MAXSPACECOUNT)myfileinfo->seek[count]=delstuseek;else myfileinfo->spacecount--;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);}//编辑一个已存在学生的核心函数void editstu(long editstuseek,pmystu tempstu){if(!tempstu)seterr("editstu:parameter null");if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);fcntl(editstuseek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo->flag)seterr("editstu:editstu invalid");plink linkhead=search(tempstu->stu_schid,SEARCH_SCHID);if(linkhead&&linkhead->data-editstuseek)seterr("editstu:database schid collision");memcpy(&mystuinfo->stu_privacy,tempstu,MYSTUSIZE);fcntl(editstuseek,WRITE,mystuinfo,STUINFOSIZE);}//添加新的学科的核心函数void addsub(psubinfo newsub){if(!newsub)seterr("addsub:parameter null");if(newsub->sub_term<1||newsub->sub_term>8) seterr("addsub:parameter invalid");if(newsub->sub_rate<0.5||newsub->sub_rate>6) seterr("addsub:parameter invalid");if(search(newsub->sub_name,SEARCH_SUB)) seterr("addsub:database sub collision");if(!myfileinfo){myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);}int subcount=myfileinfo->subcount;if(subcount>=MAXSUBCOUNT)seterr("addsub:subject full");psubinfo psubtemp=myfileinfo->sub;newsub->flag=1;int i;for(i=0;i<MAXSUBCOUNT;i++,psubtemp++)if(!psubtemp->flag){newsub->sub_id=psubtemp->sub_id;memcpy(psubtemp,newsub,SUBINFOSIZE);break;}if(i>=MAXSUBCOUNT)seterr("addsub:subject all in use");myfileinfo->subcount++;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);}//删除一个已经存在学科的核心函数void delsub(int subid){if(subid<1||subid>MAXSUBCOUNT)seterr("delsub:subid invalid");if(!myfileinfo){myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);}if(myfileinfo->subcount<=0)seterr("delsub:subcount zero");psubinfo subtemp=myfileinfo->sub+subid-1;if(!subtemp->flag)seterr("delsub:flag invalid");subtemp->flag=0;myfileinfo->subcount--;fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);if(!mystuinfo)mystuinfo=NEW(stuinfo);long seek=DATASEEK;int i;psubmark marktemp=NULL;for(i=0;i<myfileinfo->stucount;i++,seek+=DATATRANS) {fcntl(seek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo->flag){i--;continue;}marktemp=mystuinfo->stu_mark+subid-1;if(marktemp->flag){memset(marktemp,0,SUBMARKSIZE);mystuinfo->stu_markcount--;}else continue;fcntl(seek,WRITE,mystuinfo,STUINFOSIZE);makeavemark(seek);}}//编辑一个已经存在的学科的核心函数void editsub(psubinfo newsub){if(!newsub)seterr("editsub:newsub null");if(!newsub->flag)seterr("editsub:newsub invalid");int subid=newsub->sub_id;if(subid<1||subid>MAXSUBCOUNT)seterr("editsub:subid invalid");int term=newsub->sub_term;if(term<1||term>8)seterr("editsub:subterm invalid");double rate=newsub->sub_rate;if(rate<0.5||rate>6)seterr("editsub:subrate invalid");int size=strlen(newsub->sub_name);if(size>=20)newsub->sub_name[19]=0;if(!myfileinfo){myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);}plink linkhead=search(newsub->sub_name,SEARCH_SUB);if(linkhead&&linkhead->next)seterr("editsub:search invalid");if(linkhead&&linkhead->data-subid)seterr("editsub:database sub collision");newsub->flag=1;psubinfo subtemp=myfileinfo->sub+subid-1;memcpy(subtemp,newsub,SUBINFOSIZE);fcntl(0,WRITE,myfileinfo,FILEINFOSIZE);if(!mystuinfo)mystuinfo=NEW(stuinfo);int count=myfileinfo->stucount;int i;long seek=DATASEEK;for(i=0;i<count;i++,seek+=DATATRANS){fcntl(seek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo->flag){i--;continue;}makeavemark(seek);}}//编辑某学生某科目的核心函数void editmark(psubmark newmark,long stuseek){if(!newmark||!stuseek)seterr("addmark:parameter null");int subid=newmark->sub_id;if(subid<-1||subid>MAXSUBCOUNT||!subid)seterr("editmark:subid invalid");double mark=newmark->sub_mark;if(mark<0||mark>100)seterr("editmark:submark invalid");if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);fcntl(stuseek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo->flag)seterr("editmark:student invalid");psubmark marktemp=mystuinfo->stu_mark+subid-1;int flag1=marktemp->flag,flag2=newmark->flag;if(!flag1&&!flag2)seterr("editmark:markflag invalid");memcpy(marktemp,newmark,SUBMARKSIZE);if(!flag1&&flag2)mystuinfo->stu_markcount++;if(flag1&&!flag2)mystuinfo->stu_markcount--;fcntl(stuseek,WRITE,mystuinfo,STUINFOSIZE);makeavemark(stuseek);}//计算某学生的加权分数的核心函数void makeavemark(long stuseek){if(!stuseek)seterr("makeavemark:parameter null");if(!mystuinfo)mystuinfo=NEW(stuinfo);memset(mystuinfo,0,STUINFOSIZE);fcntl(stuseek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo->flag)seterr("makeavemark:parameter invalid");if(!myfileinfo){myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE);}int subcount=myfileinfo->subcount;if(!subcount||!mystuinfo->stu_markcount){mystuinfo->stu_avemark=0;fcntl(mystuinfo->stu_seek,WRITE,mystuinfo,STUINFOSIZE);return;}psubinfo subtemp=myfileinfo->sub;psubmark marktemp=mystuinfo->stu_mark;int i;double marksum=0.0,rate,ratesum=0.0;for(i=0;i<subcount;i++,subtemp++,marktemp++){if(!subtemp->flag){i--;continue;}if(!marktemp->flag)continue;rate=subtemp->sub_rate;ratesum+=rate;marksum+=marktemp->sub_mark*rate;}if(ratesum<0.1||marksum<0.1)mystuinfo->stu_avemark=0;else mystuinfo->stu_avemark=marksum/ratesum;fcntl(mystuinfo->stu_seek,WRITE,mystuinfo,STUINFOSIZE);}/*本函数承担着数据库的所有搜索任务包括由组名搜索组的ID,由学生的姓名和学号搜索学生,并返回该生在文件中的偏移地址*/plink search(char *pdata,int searchtype){if(!myfileinfo){myfileinfo=NEW(fileinfo);fcntl(0,READ,myfileinfo,FILEINFOSIZE); }plink linkhead=NULL,linktemp=NULL;if(searchtype==SEARCH_SUB){psubinfo subtemp=myfileinfo->sub;int i; for(i=0;i<MAXSUBCOUNT;i++,subtemp++)if(subtemp->flag&&!strcmp(subtemp->sub_n ame,pdata)){linkhead=NEW(link);memset(linkhead,0,LIN KSIZE);linkhead->data=subtemp->sub_id;linkhead->next=NULL;}return linkhead;}if(strlen(pdata)>=19)pdata[19]=0;if(!mystuinfo)mystuinfo=NEW(stuinfo); long seek=DATASEEK;int count=myfileinfo->stucount,i;for(i=0;i<count;i++,seek+=DATATRANS) {memset(mystuinfo,0,STUINFOSIZE);fcntl(seek,READ,mystuinfo,STUINFOSIZE);if(!mystuinfo->flag){i--;continue;}pmystustutemp=&mystuinfo->stu_privacy;switch(searchtype){case SEARCH_SCHID:{if(!strcmp(stutemp->stu_schid,pdata)){linkhead=NEW(link);linkhead->data=mystuinfo->stu_seek;linkhead->next=NULL;return linkhead;}break;}case SEARCH_NAME:{if(!strcmp(stutemp->stu_name,pdata)){linktemp=NEW(link);linktemp->data=mystuinfo->stu_seek;linktemp->next=linkhead;linkhead=linktemp;}break;}default:return NULL; }}return linkhead;}附件:程序流程图。