《软件工程与开发实践》班级管理系统.doc
软件工程与开发实践1软件设计报告题 目班级管理系统学 院计算机学院专 业计算机科学与技术班 级08052311学 号08052442 08052443学生姓名王晶晶 杨文斌其他成员组 长王晶晶指导教师张建海完成日期2011年7月正文一、软件设计概述(目的、任务、开发环境、参考资料)目的:通过对这个简单的学生信息管理系统的代码编写,熟悉并且运用模块划分的方法来组织一个工程,学习真正的项目工程的编辑方法,学习相互合作,共同完成一个任务任务:用c语言编写一个控制台学生信息管理系统,要求由各个独立功能的模块组成,小组成员分工完成各自的功能模块开发环境:microsoft visual studio 6.0参考资料:教材,网络二、模块划分及分工班级系统管理基本信息录入查询和修改,及删除统计功能其他功能扩展。任务分工情况组长姓名:王晶晶学号:08052442组员1姓名:杨文斌学号:08052443组员2姓名:学号:组员3姓名:学号:组员4姓名:学号:基本信息录入统计功能查询和修改,及删除其他功能扩展(分工内容说明)(分工内容说明)(分工内容说明)三、软件设计的基本原理和采用的主要方法与技术软件设计的基本原理:把每个学生的信息看成一条记录,教学管理软件就是对这些记录的操作和管理。主要方法与技术:一个教学管理系统需要很多个学生,所有学生人数是不能限制的,我们视实际需要而定,当要加入一个学生时,就动态的分配内存空间给他,相反,删除一个学生时,就释放这个学生所占有的内存空间,各个学生记录之间用链表的方式组织,对学生的所有操作都是基于对这个链表的遍历和访问。每个学生记录都是自定义的一个结构体的一个实例。四、实现的过程与步骤 (1):小组讨论对选题的理解,要使用的数据结构,和实现的算法(2):小组讨论我们这个软件要实现哪些功能,怎么去实现人机交互,即程序运行起来后,在屏幕上是怎么表现出来的,既要考虑程序的可行性,也要让用户在提示信息的帮助下,容易真确的使用这个系统。(3):确定当用户输入正确的指令后,程序要实现哪些功能,这些不同的功能组成不同功能快,组员分工,分别来实现这些功能快,同时定好调用这些功能快的接口。(4):当所有组员完成自己的任务时,新建工程项目,导入所有的功能模块,一起调试,修改,知道程序达到计划的效果。五、遇到的困难与获得的主要成果困难1:当我们组员完成自己的工作,每一个功能模块都是一个.c为后缀的文件,如何把这些文件组织起来,组成一个工程时,main函数可以调用每一个功能模块里定义的函数。获得的主要成果就是学会了一个工程包涵多个c文件的编程方法,这种编程方法不仅结构清楚,而且适合团队合作来完成一个任务。困难2:我们给每个模块定义一个同名的头文件,在这个头文件里声明这个模块里的函数和变量,然后通过文件包涵的方法实现各个模块知道彼此的存在,但是在编译时出现了,重复定义的错误。在解决这个问题的时候,我们的收获就是学会了一个避免多次定义的方法,即在头文件加入预编译命令#ifndef xxxx #define xxxx <头文件内容> #endif困难3:编译查错困难,我们在写代码的时候总会有这样那样的不小心,少个“;”,多个“”的,又或者变量名少个字母,编译器就会提示没有定义的量,一头雾水,明明前面定义了的,说实话这些错很难发现又很难避免,而且同伴之间用的变量名可能是一样的,这就使得程序混乱了。收获就是感觉队员一起讨论,寻找错误,要比一个人容易多了,特别是逻辑错的时候困难4:我们这个系统是可以把学生信息保存到磁盘里的,但是学生是以链表的形式串连起来的,如何保存一个链表,以及在读出文件时可以重新生成这个链表使我们遇到的困难,其中我们还遇到了写到文件里的内容,在读出来时会不一样,比如写进去3个学生,但是读出来时会有4个学生,最后一个是没有意义的乱码,我们没有从根本上解决这个问题,只是在读文件的函数末尾加了一段代码,把多余的部分删除六、测试与运行记录程序的初始界面,等待用户输入命令;创建一个学生记录显示学生记录功能展示:查询及修改功能显示;修改学生的学号信息:显示了扩展和统计功能:七、 结果分析与小结 在开发这个软件系统的过程中,因为有多个功能需要实现,我们采用循环测试法,即每个功能的测试过去,最终的结果的是实现了以上的7个功能。加载信息是把在硬盘上存的学生信息文件加载到内存;创建一个学生记录是通过链表生成一个新的学生信息;查看所有学生是把内存中已经存在的学生信息显示给用户看;保存信息是把内存中学生信息保存到硬盘中;查询及修改是通过学号查看某个学生信息并可以对他的信息进行修改;统计信息是统计这个班80后的学生有位以及占的百分比;退出是结束这个系统。 通过这次的软件设计与开发,我们对用c语言来设计程序有了进一步的了解,对于c程序语言的使用也进一步熟悉了。更重要的是,我们从一个人孤军奋战,通过模块划分和进一步的组织整合,到合作互助。一个小软件的开发也许看不出它的重要性,但对大工程和大项目来说,这一点的重要性可见一斑。同时,由于时间有限,虽然没有达到最好的要求,但是这对于我们来说仍然是一个极大的进步。因为我们通过这次设计认识到了自己的不足,通过队友间的交流,还有老师的帮助,学习到了很多新的知识,最终完成了设计,对我们来说是个极大的鼓励。八、附录(软件配置、含注释的的程序模块核心代码)基本信息录入模块 Input_inf.c#include"Input_inf.h" PStudent Create()PStudent sp;sp=(PStudent)malloc(sizeof(Student);if(sp=NULL)printf("创建新记录时内存分配失败n");free(sp);exit(1);printf("输入学号n");fflush(stdin); gets(sp->number);printf("输入名字n"); gets(sp->name);printf("输入性别n");gets(sp->sex);printf("输入新生日(格式:1988 10 12):n");scanf("%d %d %d",&sp->birthday.year,&sp->birthday.month,&sp->birthday.day);printf("输入专业n"); gets(sp->professional);gets(sp->professional);printf("输入家庭住址n");gets(sp->homeaddr);sp->ptr=0;return sp;PStudent Find_inpoint(PStudent h) /找到学生链表的最后一个,返回指向他的指针PStudent p;p=h;while(p->ptr!=0)p=p->ptr;return p;void Add_record(PStudent h) /添加新纪录 PStudent p,q; p=Create(); q=Find_inpoint(h); q->ptr=p; printf("创建新记录成功n");void Save(PStudent h)FILE *fp;PStudent p;p=h->ptr;if(!(fp=fopen("d:text.dat","wb")printf("error");exit(1);while(p!=0) fwrite(p,sizeof(Student),1,fp); p=p->ptr;fclose(fp);printf("Save Completedn");void Load(PStudent h) /把文件的学生信息读入到内存,h为链表头PStudent p,q;FILE *fp;if(!(fp=fopen("d:text.dat","rb")printf("error");exit(1);p=h;while(!feof(fp) q=(PStudent)malloc(sizeof(Student); fread(q,sizeof(Student),1,fp); p->ptr=q;q->ptr=0;p=q;p=h;while(p->ptr!=q)p=p->ptr;p->ptr=0;free(q);fclose(fp);printf("Load Completedn");查询修改及删除模块 Show.c#include "Show.h"#include "string.h"void Showone(PStudent p)/显示某个学生情况printf("=n");printf("学号:%sn",p->number);printf("姓名:%sn",p->name);printf("性别:%sn",p->sex);printf("生日%d %d %dn",p->birthday.year,p->birthday.month,p->birthday.day);printf("专业:%sn",p->professional);printf("家庭住址:%sn",p->homeaddr);printf("=n");void Shows(PStudent h)/显示所有学生的信息,通过调用Showone来完成 PStudent p;p=h->ptr;while(p!=0)Showone(p);p=p->ptr;PStudent Serch(PStudent h)/通过一个学号查找记录,并打印到屏幕上返回此记录的指针char ch10;int i=0;PStudent p;p=h->ptr;printf("输入您要查找的学生学号n:");fflush(stdin);gets(ch);while(p!=0) /通过循环,遍历整个链表if(!strcmp(ch,p->number)Showone(p);i+;return p;p=p->ptr;if(i=0)printf("查无此人n");return 0;void Tip() /提示信息,把一些提示信息打印到屏幕上printf("选择要修改的内容:n");printf("1:学号:n");printf("2:姓名n");printf("3:性别n");printf("4:专业n");printf("5:家庭住址n");printf("6:生日n");printf("7:删除n");printf("8取消n");void Modify(PStudent h) /这个函数通过调用别的函数,来完成对学生记录的修改char ch=0;PStudent p;p=Serch(h);if(p=0) /如果找不到记录,就退出,不执行while语句ch='8'while(ch!='8')Tip(); ch=getchar(); switch(ch) case '1':Setnumber(p); fflush(stdin); break; case '2':Setname(p); fflush(stdin); break; case '3':Setsex(p); fflush(stdin); break; case '4':Setprofessional(p); fflush(stdin); break; case '5':Sethomeaddr(p); fflush(stdin); break; case '6':Setbirthday(p); fflush(stdin); break; case '7':delet(h,p); fflush(stdin); break; case '8':fflush(stdin); break; default: printf("输入语法错误n"); fflush(stdin); void Setnumber(PStudent p) /设置学生学号,由Modify函数调用printf("旧学号:%sn",p->number);printf("输入新学号:n");gets(p->number);gets(p->number);printf("n新学号:%sn",p->number);/还有Setname,Setsex,Setprofessional,Sethomeaddr这些函数,与Setnumber函数结构类似,这里不在重复void Setbirthday(PStudent p) /设置学生生日,由Modify函数调用printf("旧生日%d %d %dn",p->birthday.year,p->birthday.month,p->birthday.day);printf("输入新生日(格式:1988 10 12):n");scanf("%d %d %d",&p->birthday.year,&p->birthday.month,&p->birthday.day);printf("n新生日%d %d %dn",p->birthday.year,p->birthday.month,p->birthday.day);void delet(PStudent h,PStudent p) /删除p指向节点 PStudent q=0; q=h; while(q->ptr!=p&&q->ptr!=0) q=q->ptr; if(q->ptr=0) printf("删除不成功,学生记录中没有对应记录"); printf("n=n"); else q->ptr=p->ptr; free(p); printf("成功删除"); printf("n*n"); 统计功能模块 Statistics.c#include "Statistics.h"void statistics(PStudent h) /统计80后学生的情况,如人数,所占的比例,并把结果输出到屏幕上 int birthday_num=0,sum=0;float proport=0;PStudent p1;p1= h->ptr; while(p1 != NULL)if(p1->birthday.year >= 1980&&p1->birthday.year <= 1989) birthday_num+; p1=p1->ptr; sum+;proport=(float)birthday_num*100/sum;printf("n80后学生共有%d 位,后学生占学生总数的比率是:%4.2f n",birthday_num,proport);