《软件工程》实验设计报告
题 目:学生籍贯信息记录簿系统 院 (系):计算机与软件学院 年 级:2010级 专 业:软件工程 姓 名: 学 号: 教 师: 学 期:
学生籍贯信息记录簿
第一章 课程设计内容和要求
1.1 课程设计的目的:
通过软件开发的实践训练,进一步掌握软件工程的方法和技术,提高软件开发的实际能力,培养工程设计能力和综合分析、解决问题的能力。 具体如下:
1. 学习和实践在分析和设计计算机应用系统所需要的知识,包括面向对象的系统分析与设计,编码和测试方面的知识; 2. 进一步加强和提高软件文档编写能力;
3. 加强大家的自学能力,为毕业设计做很好的铺垫; 4. 培养写作和团队精神。
1.2 课程设计实现的要求:
在程序设计中,既可以用传统的结构化程序设计方法,也可以用先进的面向对象程序设计方法。学生籍贯信息记录簿是一个基于学生籍贯信息的查询、添加、删除、修改、显示功能为一体的程序,本程序需要把记录簿中四川籍贯和非四川籍贯的学生信息分别存储。
1.4进度安排:
需求分析:1周 概要设计:1到2周 详细设计:2周 前台编码:3到4周
1.5开发环境:
编写语言:c 语言
开发工具:Visual C++ 6.0
第二章 需求分析
2.1 学生籍贯信息记录簿
编制一个学生籍贯信息记录簿,每个学生信息包括:学号、姓名、籍贯。具体功能:1. 创建信息链表并以磁盘文件保存2. 读取磁盘文件并显示输出所有学生的籍贯信息3. 按学号或姓名查询其籍贯4. 按籍贯查询并输出该籍贯的所有学生;能添加、删除和修改学生的籍贯信息5. 显示输出四川籍和非四川籍学生的信息并可分别存盘。
2.2可行性分析
从技术方面,是通过C++来做系统的前台,来实现整个系统的功能;从操作方面,
基本的录入、查询、修改等都能满足用户的需求;从经济方面,学生籍贯信息记录簿系统本身是不会直接产生经济效益的,是其应用能够节省人力资源的消耗和浪费,从而节约成本,提高效率,能够起到的作用也是十分可观的。整个系统不需要特殊设备的支持,只要有计算机即可。所以可以说系统的开发成本不是很高。 第三章 概要设计
3.1功能模块设计
本程序包括5个模块,分别是添加模块、删除模块、修改模块、查询模块和显示信息模块。如图3-1所示。添加模块:用于实现学生籍贯信息的添加;删除模块:实现对学生籍贯信息的删除;修改模块:用于对学生籍贯信息的修改和完善;查询系统:此系统为对个别学生信息的查询,包括对姓名,学号,籍贯地址的查询;显示信息模块:该模块是对所有学生籍贯信息的一个检索,便于所有及部分学生信息的对比、分析和统计工作。
图3-1 功能模块图
第四章 详细设计
4.1 学生籍贯信息查询流程图
4.1.1 主函数流程图
学生籍贯信息查询系统流程图如4-1所示:从程序开始,系统显示菜单,输入菜单所对应的序号(1-8)进行相应的操作,而输入非1-8序号的参数则系统返回进行重新输入选项,选择对应的1-7选项进行不同的功能进行学生信息添加、删除、修改、查询、显示等操作,选择8,软件退出。
图4-1 学生信息记录簿主流程图
4.1.2 添加模块流程图
程序开始后,选择1,进行学生籍贯信息添加操作,如图4-2所示。输入相关信息后,系统进行籍贯识别流程,当该学生为四川籍贯时,该学生的信息将会存储到被标记的四川文本中进行存储,而该生若为非四川籍贯时,该生信息存储到非四川文本中进行存储。存储完毕,返回主菜单。
图4-2 添加模块
4.1.3 删除模块流程图
程序开始后,选择2,进行学生籍贯信息删除操作,如图4-3所示。输入学生学号,程序查询到该生信息后,进行询问是否删除。选择删除,则删除在文本中存储的该生所有信息。
图4-3删除模块
4.1.4 修改模块流程图
程序开始后,选择3,进行学生籍贯信息修改操作,如图4-4所示。用户先输入需要修改的学号,系统查询是否有该生信息,如果是的话,进行修改,替换原有信息,如果没有该生信息系统返回上层主菜单,用户可以重新选择需要的操作。
图4-4 修改模块
4.1.5 学号查询模块流程图
程序开始后,选择4,进行学生籍贯信息按学号查询操作,如图4-5所示。输入需要查询的学生学号,系统自动在所存储的文档中进行查找并显示出该生的籍贯信息。
图4-5 学号查询模块
4.1.6 姓名查询模块流程图
程序开始后,选择5,进行学生籍贯信息按姓名查询操作,如图4-6所示。输入需要查询的学生姓名,系统自动在所存储的文档中进行查找并显示出该生的籍贯信息。
图4-6 姓名查询模块
4.1.7 籍贯查询模块流程图
程序开始后,选择6,进行学生籍贯信息按姓名查询操作,如图4-7所示。输入需要查询的学生籍贯,系统自动在所存储的文档中进行查找并显示出该生的籍贯信息。
图4-7 籍贯查询模块
4.1.8 显示模块流程图
程序开始后,选择7,进行学生籍贯信息按姓名查询操作,如图4-8所示。系统将把储存在文档中的所有学生籍贯信息陈列出来,方便查找,统计和对比。
图4-8 显示模块
4.2 数据结构设计
1. struct info 系统结构体,用于储存学生籍贯信息。该结构体有三个成员studentID 、name 、 province 。分别表示学生的学号、姓名和籍贯。
结构体定义:
struct info
{
char * studentID; /* 定义学生学号信息 */
char * name;/* 定义学生姓名信息 */
char * province;/* 定义学生籍贯信息 */
friend comnirecord;
};
2. 全局变量
int mu 表示程序菜单的序号:1-8选项,为添加、删除、修改、显示等操作。 int k1 表示定义学生的学号。
int k2 表示定义学生的姓名。
int k3 表示定义学生的籍贯。
4.3 函数功能描述
1. menu( )
函数原型:void menu( )
menu 函数用于输出菜单所对应的功能选项。
2.Display( )
函数原型:void Display(info x)
Display 函数用于显示学生ID ,学生姓名,学生籍贯参数。
3.Insert( )
函数原型:Insert(int i,char * stuID,char * nam,char * prov)
Insert 函数用于存储用户信息的学号,姓名,籍贯。作为一个新的结点,然后将这个新的结点插入到规定位置的后面。
4.Delete( )
函数原型:Delete(char * stuID)
Delete( )函数用于删除用户该学号下的所有信息。
5.SearchID( )
函数原型:SearchID(char * stuID,info & x)
搜索记录簿中的学生学号。用于学号查询功能。
6.SearchNam( )
函数原型:SearchNam(char * nam,info & x)
搜索记录簿中的学生姓名。用于姓名查询功能。
7.SearchPro( )
函数原型:SearchPro(char * prov,Node * &x)
搜索记录簿中的学生籍贯。用于籍贯查询功能。
4.4限制条件
在输入值时必须按照程序所规定的输入,否则将运行错误或无法运行。在输入选项序号时必须在1-8之间,否则程序返回主菜单重新选择。在输入所要查询的学生信息时,要输入相关学号、姓名、籍贯。
第五章 系统测试和实现
5.1 欢迎菜单:
程序运行后出现欢迎菜单,下设添加、删除、修改、按学号查询、按姓名查询、按籍贯查询、显示信息、退出等选项。如图5-1所示:
图5-1 欢迎菜单
5.2 显示操作:
输入7,回车,系统首先显示原先存储在程序中的学生籍贯信息,如图5-2所示:
图5-2 显示操作
5.3 添加操作:
程序运行后,输入1,回车。程序进行学生籍贯信息添加操作,如图5-3所示。依次输入需要添加用户的学号,姓名,籍贯。系统进行信息收录。
图5-3 添加操作
5.4 删除操作:
程序运行后,输入2,回车。程序进行学生籍贯信息删除操作,如图5-4所示。输入需要删除用户的学号,系统进行该生的信息删除操作。
图5-4 删除操作
5.5 修改操作:
程序运行后,输入3,回车。程序进行学生籍贯信息修改操作,如图5-5所示。依次输入需要修改的用户学号,姓名,籍贯。系统进行信息修改操作。
图5-5 修改操作
5.6 按学号查询:
程序运行后,输入4,回车。程序进行学生籍贯信息按学号查询操作,如图5-6所示。输入需要查询的学生学号。系统进行该学号的查询并显示该生籍贯信息。
图5-6 按学号查询
5.7 按姓名查询:
程序运行后,输入5,回车。程序进行学生籍贯信息按姓名查询操作,如图5-7所示。输入需要查询的学生姓名。系统进行该生姓名的查询并显示该生籍贯信息。
图5-7 按姓名查询
5.8 按籍贯查询:
程序运行后,输入6,回车。程序进行学生籍贯信息按籍贯查询操作,如图5-8所示。输入需要查询的学生籍贯。系统进行所有籍贯查询并显示该籍贯下的学生信息。
图5-8 按籍贯查询
第六章 课程设计心得与体会
小组总结
为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识再创造,我们小组4个人进行了此次的课程设计,在本次课程设计中,我们利用到了本学期学到的大部分知识,在老师同学的帮助下,我们在规范化,严谨化,实用化上面有了很大进展。
在此次的学生籍贯信息记录簿程序开发过程中,有很多东西值得我们思考并总结。
开发过程大体可分为以下几个步骤:
(1)思考总体设计方案:总体结构和模块外部设计,功能分配。思考要实现整个程序大体需要的几个模块和其中用到的Visual C++语言基本操作符、语句等。
(2)画出总体设计方案流程图:用流程图的形式展现你的基本编程思想。
(3)流程图具体化:即将流程图中的几大模块的具体实现思考清楚,可以用流程图的形式展现.并想好实现的关键代码。
(4)编辑程序代码:这是一个至关重要复杂而且需要反复修改的环节,在此环
节中你将发现总体设计和模块思想会存在很多问题,需不断改进.如何实现各函数功能,达到预期效果也将是一项繁复的工作。
(5)代码的调试:在Visual C++6.0环境下输入代码并进行调试和正确运行。在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。
(6)最后修饰:程序可以正确运行之后,再不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。
通过这次课程设计,使我们更加熟悉的掌握了Visual C++语言的运用。帮助我们熟悉了更多Visual C++语言的功能,也让我们更加了解了软件工程的思想与运用,对于软件工程开发的5个重要组成部分:需求分析,设计,编码,调试,维护,我们有了更深刻的掌握和认识,也使我认识到了我们以前的错误,软件其实不仅仅是程序,软件开发其实也不仅仅是编程序,软件是思想在硬件上的再提和体现,处理的是逻辑和信息。
此外,我们的动手能力有了很大的提高,小组成员之间配合的也很默契,学到了许多解决实际问题的宝贵经验.同时也挖掘出了我们潜在的能力,使我们对自己更有自信,对编程也更有兴趣。我相信,只要努力、勤奋、坚持不懈,就没有什么做不到的事,不能还没开始就退缩,要勇于拼搏,敢于创新。
个人总结(一)
课程设计是培养学生综合运用所学知识,发展,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际能力的具体训练和考察过程。随着科学技术的发展,当今计算机存货在世界的每一个角落,因此,作为二十一世纪的大学生来说,掌握计算机开发技术是非常重要的。
对于此次的课程设计,感慨颇多。从确定题目到完成整个编程,从理论到实践,在一个多月的时间里可以学到很多很多东西,同时不仅可以巩固以前学过的知识,还学到了许多书本上没有的知识。通过此次课程设计,我懂得了理论与实践结合是很重要的,只有理论知识是完全不够的,只有把自己所学的理论知识和时间相结合起来,从理论中得出结论,才能真正的提高自己的实际动手能力和独立思考能力,才能真正为社会服务。
在设计过程中,我们遇到了很多的困难,各式各样,但是经过我们的努力和老师同学的帮助,能够很好地解决,我们的实践能力因此得到很大的提高。
我还意识到,自己掌握的只是还是很缺陷,在以后的课程学习中,我要更加认真仔细,全面地了解相关知识。
个人总结(二)
一个多月的的软件工程课程设计结束了,这也就意味着这学期的软件工程学习结束了,在这将近半年的学习中,虽然我不能说我将软件工程学习的有那么的好,但是通过学习,我还是受益良多。
通过这次的课程设计,我认识到了我以前对软件工程的错误的认识,认为软件就
是程序,软件的开发及时编写程序,只要编完了程序,一切也就OK 了。但其实不是这样的,软件不仅仅只是程序,软件开发也不仅仅是编程,软件是思想在硬件上的载体和实现,处理的是逻辑和信息,唯有对软件和软件的开发过程,有充分的认识,在能更好地开发出,过程受控制、质量受控制的软件产品。
此次的课程设计一共是小组四个人完成的,这也就有一个分配与配合的过程,从一开始的确定题目,到分配个人任务,再到大家都完成任务,中间的配合都很融洽,都能按时完成自己的任务。
过程中,也遇到了很多困难,但是通过请教老师同学,这些问题都得到了解决,更主要的是,通过课程设计的锻炼,对C++语言运用的更加灵活,了解了更多C++语言的功能,能很好的把软件工程的思想与C++语言结合起来,实践能力有了很大的提高,也提高了自己独立思考的能力,让我对变成更加感兴趣。以后,我要更加努力学习,将这门课程学的更好,能向一位真正的软件工程师更进一步!
个人总结(三)
本次的课程设计终于渐近尾声了,从起初的小组成立,再到确定课程设计的题目,分配任务,各自着手开始做各自的任务,算起来也有一段时间了。期间也难以避免地出现过好多或者复杂或者简单的问题,在小组成员的不断讨论与磨合下终于得以一一解决。
详细设计是一个至关重要的环节,需要不断地寻找更好的方法,反复地修改,尽最大的力量去完成整个设计。在这个过程中我发现总体的设计和模块部分都存在很多问题,还有很大的空间去改进,更难掌控的是如何函数功能的实现和预期效果的最终达成,在不断地调试和运行后,终于有了点起色。在程序可以正确运行后,又通过各种资料的查阅,运用了一些辅助性符号,使系统更加人性化,更方便操作。
通过这次的课程设计,我进一步提高了自己的动手能力,学到了许多课本上学不到的宝贵经验。同时使我对自己有了更好的信心,对编程也有了更浓厚的兴趣,我们还需要更加努力的学习,在合作中加强成员之间协调性,以做到更好。
我相信,只要坚持不懈,不断地学习,我就能不断成长,作出更好的设计!
个人总结(四)
伴随着我们的课程设计的结束,我们也即将和软件工程的课程学习说再见了,但是课程的结束并不意味着我们对软件工程的学习到此就结束了,通过本次的软件工程课程设计,我对软件工程产生了更多的兴趣,也对其有了更深刻的认识。
我主要的任务是起初的编写课程设计内容和要求以及代码的最终实现与检测,前者在查阅各种资料和书籍,借鉴前人的经验后,基本上能够轻松的完成。而后者却是个很艰巨的任务,在编译过程中出现了很多从没预料到的问题,在自己和其他小组成员的不断尝试和改进下,终于都得以解决。虽然最后的设计并不能说完美,但毕竟是我们小组辛苦地从无到有地一个字一个图地做出来的,我们对它算是很满意了。 回想起来,更能感受到其中的苦与乐,苦于不断地遇到各种棘手的问题,乐于在小组成员的共同努力下,解决问题之后的那种成就感,苦使我们成长,乐让我们对软件工程产生更大的兴趣,有了兴趣就有继续学习她的动力。相信在以后的学习中,我
们也能拿出百分百的热情,不断地提高自己的动手能力,做出更好的设计! 附录1:参考文献
[1]、田淑清, C语言程序设计, 北京:高等教育出版社,2006年1月
[2]、谭浩强.C 程序设计题解与上机指导. 第二版. 北京:清华大学出版社,2000年9月
附录2:程序清单
主程序:
#include
#include
#include
#include
#define FILENAME1 "sichuan.txt"
#define FILENAME2 "feisichuan.txt"
void menu()
{
cout
cout
cout
cout
cout
cout
cout
cout
cout
}
void main()
{
int mu;
cout
cout
cout
menu();
cin>>mu;
info inform;
inform.studentID=new char[10];
inform.name=new char[10];
inform.province=new char[10];
FILE* fh=fopen(FILENAME1,"r+");
FILE* fh2=fopen(FILENAME2,"r+");
if (fh==NULL||fh2==NULL)
{
perror(FILENAME1);
return;
}
comnirecord a(fh);//a是从四川籍的用户的链表
comnirecord b(fh2);//b是从非四川籍的用户的链表
while (mu!=8)
{
switch (mu)
{
case 1:
cout
cout
cin>>inform.studentID;
cout
cin>>inform.name;
cout
cin>>inform.province;
if (strcmp(inform.province,"四川")==0)
{
a.Insert(a.Getn()-1,inform.studentID,inform.name,inform.province); }
else
b.Insert(b.Getn()-1,inform.studentID,inform.name,inform.province); break;
case 2:
cout
cin>>inform.studentID;
if(!(a.Delete(inform.studentID)||b.Delete(inform.studentID)))
{
cout
}
break;
case 3:
cout
cin>>inform.studentID;
if(!(a.Delete(inform.studentID)||b.Delete(inform.studentID)))
{ cout>inform.studentID; cout>inform.name; cout>inform.province; if (strcmp(inform.province,"四川")==0) { a.Insert(a.Getn()-1,inform.studentID,inform.name,inform.province);
}
else
b.Insert(b.Getn()-1,inform.studentID,inform.name,inform.province);
}
break;
case 4:
cout
cin>>inform.studentID;
if (!(a.SearchID(inform.studentID)||b.SearchID(inform.studentID))) {
cout
}
break;
case 5:
cout
cin>>inform.name;
if (!(a.SearchNam(inform.name)||b.SearchNam(inform.name)))
{
cout
}
break;
case 6:
cout
cin>>inform.province;
if (!(a.SearchPro(inform.province)||b.SearchPro(inform.province))) {
cout
}
break;
}
} case 7: a.Display(); b.Display(); break; default: cout>mu; delete[]inform.studentID; delete[]inform.name; delete[]inform.province; fclose(fh); FILE* fg=fopen(FILENAME1,"w+"); FILE* fg2=fopen(FILENAME2,"w+"); a.WriteInFile(fg); b.WriteInFile(fg2);
comnirecord 头文件:
#include
#include
#include
class comnirecord;
struct info
{
char * studentID;
char * name;
char * province;
friend comnirecord;
};
class Node
{
info element;
Node * link;
friend comnirecord;
};
class comnirecord
{
public:
comnirecord(FILE * fp);
~comnirecord();
bool Insert(int i,char * stuID,char * nam,char * prov);//存取
void Display(info x);//显示
void Display();
bool Delete(char * stuID);// 按学号删除
bool SearchID(char * stuID);//按学号查询
bool SearchNam(char * nam);//按姓名查询
bool SearchPro(char * prov);//按籍贯查询
bool WriteInFile(FILE * fp);
int Getn();
private:
bool SearchID(char * stuID,info & x)const;
bool SearchNam(char * nam,info & x)const;
bool SearchPro(char * prov,Node * &x)const;
Node * first;
int n;
};
int comnirecord::Getn()
{
return n;
}
comnirecord::comnirecord(FILE * fp)
{
n=0;first=NULL;
int count=-1;
int q[3];
int k1,k2,k3;
char * s=new char[30];
while (fgets(s,30,fp)!=NULL)
{
Node * p=new Node;
int j=0;
for (int i=0;s[i]!='\0';i++)//可以考虑中间是用“,”隔开的情况
{
if (s[i]==' '&&j
{
q[j]=i;
j++;
}
}
p->element.studentID=new char[q[0]+1];
p->element.name=new char[q[1]-q[0]];
p->element.province=new char[q[2]-q[1]];
k1=sprintf(p->element.studentID,"%c",s[0]);
for (i=1;i
{
k1+=sprintf(p->element.studentID+k1,"%c",s[i]);
}
k2=sprintf(p->element.name,"%c",s[q[0]+1]);
for (i=q[0]+2;i
{
k2+=sprintf(p->element.name+k2,"%c",s[i]);
}
k3=sprintf(p->element.province,"%c",s[q[1]+1]);
for (i=q[1]+2;i
{
k3+=sprintf(p->element.province+k3,"%c",s[i]);
}
Insert(count,p->element.studentID,p->element.name,p->element.province); count++;
delete[]s;s=new char[30];
}
delete [] s;
}
comnirecord::~comnirecord()
{
Node *p;
while (first)
{
p=first->link;
delete first->element.studentID;// 是否需要??
delete first->element.name;
delete first->element.province;
delete first;
first=p;
}
}
bool comnirecord::Insert(int i,char * stuID,char * nam,char * prov)
{
if(in-1)
{
cout
cout
return false;
}
Node * q=new Node;
q->element.studentID=new char[strlen(stuID)+1];strcpy(q->element.studentID,stuID); q->element.name=new char[strlen(nam)+1];strcpy(q->element.name,nam);
q->element.province=new char[strlen(prov)+1];strcpy(q->element.province,prov); Node * p=first;
for (int j=0;jlink;
if (i>-1)
{
q->link=p->link;
p->link=q;
}
else{
q->link=first;
first=q;
}
n++;return true;
}
bool comnirecord::Delete(char * stuID)
{
if(!n)
{
cout
}
Node * p=first;
Node * q=first;
for (int j=0;jelement.studentID,stuID)!=0;j++)
{
q=p;
p=p->link;
}
if (!p)
{
//cout
return false;
}
if (p==first)
{
first=first->link;
}
else
{
p=q->link;
q->link=p->link;
}
delete []p->element.studentID;
delete []p->element.name;
delete []p->element.province;
delete []p;
n--; return true;
}
bool comnirecord::SearchID(char * stuID)
{
info x;
bool a=SearchID(stuID,x);
if (a)
{
Display(x);
}
return a;
}
bool comnirecord::SearchID(char * stuID,info & x)const
{
Node * p=first;
for (int j=0;jelement.studentID,stuID)!=0;j++) p=p->link; if (!p)
{
//cout
return false;
}
x.studentID=new
char[strlen(p->element.studentID)+1];strcpy(x.studentID,p->element.studentID);
x.name=new char[strlen(p->element.name)+1];strcpy(x.name,p->element.name); x.province=new
char[strlen(p->element.province)+1];strcpy(x.province,p->element.province);
return true;
}
bool comnirecord::SearchNam(char * nam)
{
info x;
bool a=SearchNam(nam,x);
if (a)
{
Display(x);
}
return a;
}
bool comnirecord::SearchNam(char * nam,info & x)const
{
Node * p=first;
for (int j=0;jelement.name,nam)!=0;j++) p=p->link;
if (!p)
{
//cout
return false;
}
x.studentID=new
char[strlen(p->element.studentID)+1];strcpy(x.studentID,p->element.studentID);
x.name=new char[strlen(p->element.name)+1];strcpy(x.name,p->element.name); x.province=new
char[strlen(p->element.province)+1];strcpy(x.province,p->element.province);
return true;
}
bool comnirecord::SearchPro(char * prov)
{
Node * x=NULL;
bool a=SearchPro(prov,x);
if (a)
{
Node * pq=x;
while (pq)
{ Display(pq->element);
pq=pq->link;
}
while (x)
{
pq=x->link;
delete x->element.studentID;// 是否需要??
delete x->element.name;
delete x->element.province;
delete x;
x=pq;
}
}
return a;
}
bool comnirecord::SearchPro(char * prov,Node * &x)const
{
Node * p=first;
/*x=NULL;*/
int count=0;
for (int j=0;j
{
if(strcmp(p->element.province,prov)==0)
{
Node * hp=new Node;
hp->element.studentID=new
char[strlen(p->element.studentID)+1];strcpy(hp->element.studentID,p->element.studentID);
hp->element.name=new
char[strlen(p->element.name)+1];strcpy(hp->element.name,p->element.name);
hp->element.province=new
char[strlen(p->element.province)+1];strcpy(hp->element.province,p->element.province); hp->link=x;
x=hp;
count++;
}
p=p->link;
}
if (count==0)
{ //cout
return false;}
return true;
}
void comnirecord::Display(info x)
{
cout
cout
}
void comnirecord::Display()
{Node *p=first;
while (p)
{
coutelement.studentIDelement.nameelement.province
p=p->link;
}
cout
bool comnirecord::WriteInFile(FILE * fp)
{
Node * p=first;
int k;
for (int i=0;i
{
char * s;
s=new
char[strlen(p->element.studentID)+strlen(p->element.name)+strlen(p->element.province)+
1];
k=sprintf(s,"%s",p->element.studentID); k+=sprintf(s+k,"%c",' '); k+=sprintf(s+k,"%s",p->element.name); k+=sprintf(s+k,"%c",' '); k+=sprintf(s+k,"%s",p->element.province); k+=sprintf(s+k,"%c",' '); k+=sprintf(s+k,"%s","\n"); fputs(s,fp);
p=p->link;
}
return true;
}
《软件工程》实验设计报告
题 目:学生籍贯信息记录簿系统 院 (系):计算机与软件学院 年 级:2010级 专 业:软件工程 姓 名: 学 号: 教 师: 学 期:
学生籍贯信息记录簿
第一章 课程设计内容和要求
1.1 课程设计的目的:
通过软件开发的实践训练,进一步掌握软件工程的方法和技术,提高软件开发的实际能力,培养工程设计能力和综合分析、解决问题的能力。 具体如下:
1. 学习和实践在分析和设计计算机应用系统所需要的知识,包括面向对象的系统分析与设计,编码和测试方面的知识; 2. 进一步加强和提高软件文档编写能力;
3. 加强大家的自学能力,为毕业设计做很好的铺垫; 4. 培养写作和团队精神。
1.2 课程设计实现的要求:
在程序设计中,既可以用传统的结构化程序设计方法,也可以用先进的面向对象程序设计方法。学生籍贯信息记录簿是一个基于学生籍贯信息的查询、添加、删除、修改、显示功能为一体的程序,本程序需要把记录簿中四川籍贯和非四川籍贯的学生信息分别存储。
1.4进度安排:
需求分析:1周 概要设计:1到2周 详细设计:2周 前台编码:3到4周
1.5开发环境:
编写语言:c 语言
开发工具:Visual C++ 6.0
第二章 需求分析
2.1 学生籍贯信息记录簿
编制一个学生籍贯信息记录簿,每个学生信息包括:学号、姓名、籍贯。具体功能:1. 创建信息链表并以磁盘文件保存2. 读取磁盘文件并显示输出所有学生的籍贯信息3. 按学号或姓名查询其籍贯4. 按籍贯查询并输出该籍贯的所有学生;能添加、删除和修改学生的籍贯信息5. 显示输出四川籍和非四川籍学生的信息并可分别存盘。
2.2可行性分析
从技术方面,是通过C++来做系统的前台,来实现整个系统的功能;从操作方面,
基本的录入、查询、修改等都能满足用户的需求;从经济方面,学生籍贯信息记录簿系统本身是不会直接产生经济效益的,是其应用能够节省人力资源的消耗和浪费,从而节约成本,提高效率,能够起到的作用也是十分可观的。整个系统不需要特殊设备的支持,只要有计算机即可。所以可以说系统的开发成本不是很高。 第三章 概要设计
3.1功能模块设计
本程序包括5个模块,分别是添加模块、删除模块、修改模块、查询模块和显示信息模块。如图3-1所示。添加模块:用于实现学生籍贯信息的添加;删除模块:实现对学生籍贯信息的删除;修改模块:用于对学生籍贯信息的修改和完善;查询系统:此系统为对个别学生信息的查询,包括对姓名,学号,籍贯地址的查询;显示信息模块:该模块是对所有学生籍贯信息的一个检索,便于所有及部分学生信息的对比、分析和统计工作。
图3-1 功能模块图
第四章 详细设计
4.1 学生籍贯信息查询流程图
4.1.1 主函数流程图
学生籍贯信息查询系统流程图如4-1所示:从程序开始,系统显示菜单,输入菜单所对应的序号(1-8)进行相应的操作,而输入非1-8序号的参数则系统返回进行重新输入选项,选择对应的1-7选项进行不同的功能进行学生信息添加、删除、修改、查询、显示等操作,选择8,软件退出。
图4-1 学生信息记录簿主流程图
4.1.2 添加模块流程图
程序开始后,选择1,进行学生籍贯信息添加操作,如图4-2所示。输入相关信息后,系统进行籍贯识别流程,当该学生为四川籍贯时,该学生的信息将会存储到被标记的四川文本中进行存储,而该生若为非四川籍贯时,该生信息存储到非四川文本中进行存储。存储完毕,返回主菜单。
图4-2 添加模块
4.1.3 删除模块流程图
程序开始后,选择2,进行学生籍贯信息删除操作,如图4-3所示。输入学生学号,程序查询到该生信息后,进行询问是否删除。选择删除,则删除在文本中存储的该生所有信息。
图4-3删除模块
4.1.4 修改模块流程图
程序开始后,选择3,进行学生籍贯信息修改操作,如图4-4所示。用户先输入需要修改的学号,系统查询是否有该生信息,如果是的话,进行修改,替换原有信息,如果没有该生信息系统返回上层主菜单,用户可以重新选择需要的操作。
图4-4 修改模块
4.1.5 学号查询模块流程图
程序开始后,选择4,进行学生籍贯信息按学号查询操作,如图4-5所示。输入需要查询的学生学号,系统自动在所存储的文档中进行查找并显示出该生的籍贯信息。
图4-5 学号查询模块
4.1.6 姓名查询模块流程图
程序开始后,选择5,进行学生籍贯信息按姓名查询操作,如图4-6所示。输入需要查询的学生姓名,系统自动在所存储的文档中进行查找并显示出该生的籍贯信息。
图4-6 姓名查询模块
4.1.7 籍贯查询模块流程图
程序开始后,选择6,进行学生籍贯信息按姓名查询操作,如图4-7所示。输入需要查询的学生籍贯,系统自动在所存储的文档中进行查找并显示出该生的籍贯信息。
图4-7 籍贯查询模块
4.1.8 显示模块流程图
程序开始后,选择7,进行学生籍贯信息按姓名查询操作,如图4-8所示。系统将把储存在文档中的所有学生籍贯信息陈列出来,方便查找,统计和对比。
图4-8 显示模块
4.2 数据结构设计
1. struct info 系统结构体,用于储存学生籍贯信息。该结构体有三个成员studentID 、name 、 province 。分别表示学生的学号、姓名和籍贯。
结构体定义:
struct info
{
char * studentID; /* 定义学生学号信息 */
char * name;/* 定义学生姓名信息 */
char * province;/* 定义学生籍贯信息 */
friend comnirecord;
};
2. 全局变量
int mu 表示程序菜单的序号:1-8选项,为添加、删除、修改、显示等操作。 int k1 表示定义学生的学号。
int k2 表示定义学生的姓名。
int k3 表示定义学生的籍贯。
4.3 函数功能描述
1. menu( )
函数原型:void menu( )
menu 函数用于输出菜单所对应的功能选项。
2.Display( )
函数原型:void Display(info x)
Display 函数用于显示学生ID ,学生姓名,学生籍贯参数。
3.Insert( )
函数原型:Insert(int i,char * stuID,char * nam,char * prov)
Insert 函数用于存储用户信息的学号,姓名,籍贯。作为一个新的结点,然后将这个新的结点插入到规定位置的后面。
4.Delete( )
函数原型:Delete(char * stuID)
Delete( )函数用于删除用户该学号下的所有信息。
5.SearchID( )
函数原型:SearchID(char * stuID,info & x)
搜索记录簿中的学生学号。用于学号查询功能。
6.SearchNam( )
函数原型:SearchNam(char * nam,info & x)
搜索记录簿中的学生姓名。用于姓名查询功能。
7.SearchPro( )
函数原型:SearchPro(char * prov,Node * &x)
搜索记录簿中的学生籍贯。用于籍贯查询功能。
4.4限制条件
在输入值时必须按照程序所规定的输入,否则将运行错误或无法运行。在输入选项序号时必须在1-8之间,否则程序返回主菜单重新选择。在输入所要查询的学生信息时,要输入相关学号、姓名、籍贯。
第五章 系统测试和实现
5.1 欢迎菜单:
程序运行后出现欢迎菜单,下设添加、删除、修改、按学号查询、按姓名查询、按籍贯查询、显示信息、退出等选项。如图5-1所示:
图5-1 欢迎菜单
5.2 显示操作:
输入7,回车,系统首先显示原先存储在程序中的学生籍贯信息,如图5-2所示:
图5-2 显示操作
5.3 添加操作:
程序运行后,输入1,回车。程序进行学生籍贯信息添加操作,如图5-3所示。依次输入需要添加用户的学号,姓名,籍贯。系统进行信息收录。
图5-3 添加操作
5.4 删除操作:
程序运行后,输入2,回车。程序进行学生籍贯信息删除操作,如图5-4所示。输入需要删除用户的学号,系统进行该生的信息删除操作。
图5-4 删除操作
5.5 修改操作:
程序运行后,输入3,回车。程序进行学生籍贯信息修改操作,如图5-5所示。依次输入需要修改的用户学号,姓名,籍贯。系统进行信息修改操作。
图5-5 修改操作
5.6 按学号查询:
程序运行后,输入4,回车。程序进行学生籍贯信息按学号查询操作,如图5-6所示。输入需要查询的学生学号。系统进行该学号的查询并显示该生籍贯信息。
图5-6 按学号查询
5.7 按姓名查询:
程序运行后,输入5,回车。程序进行学生籍贯信息按姓名查询操作,如图5-7所示。输入需要查询的学生姓名。系统进行该生姓名的查询并显示该生籍贯信息。
图5-7 按姓名查询
5.8 按籍贯查询:
程序运行后,输入6,回车。程序进行学生籍贯信息按籍贯查询操作,如图5-8所示。输入需要查询的学生籍贯。系统进行所有籍贯查询并显示该籍贯下的学生信息。
图5-8 按籍贯查询
第六章 课程设计心得与体会
小组总结
为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识再创造,我们小组4个人进行了此次的课程设计,在本次课程设计中,我们利用到了本学期学到的大部分知识,在老师同学的帮助下,我们在规范化,严谨化,实用化上面有了很大进展。
在此次的学生籍贯信息记录簿程序开发过程中,有很多东西值得我们思考并总结。
开发过程大体可分为以下几个步骤:
(1)思考总体设计方案:总体结构和模块外部设计,功能分配。思考要实现整个程序大体需要的几个模块和其中用到的Visual C++语言基本操作符、语句等。
(2)画出总体设计方案流程图:用流程图的形式展现你的基本编程思想。
(3)流程图具体化:即将流程图中的几大模块的具体实现思考清楚,可以用流程图的形式展现.并想好实现的关键代码。
(4)编辑程序代码:这是一个至关重要复杂而且需要反复修改的环节,在此环
节中你将发现总体设计和模块思想会存在很多问题,需不断改进.如何实现各函数功能,达到预期效果也将是一项繁复的工作。
(5)代码的调试:在Visual C++6.0环境下输入代码并进行调试和正确运行。在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。
(6)最后修饰:程序可以正确运行之后,再不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。
通过这次课程设计,使我们更加熟悉的掌握了Visual C++语言的运用。帮助我们熟悉了更多Visual C++语言的功能,也让我们更加了解了软件工程的思想与运用,对于软件工程开发的5个重要组成部分:需求分析,设计,编码,调试,维护,我们有了更深刻的掌握和认识,也使我认识到了我们以前的错误,软件其实不仅仅是程序,软件开发其实也不仅仅是编程序,软件是思想在硬件上的再提和体现,处理的是逻辑和信息。
此外,我们的动手能力有了很大的提高,小组成员之间配合的也很默契,学到了许多解决实际问题的宝贵经验.同时也挖掘出了我们潜在的能力,使我们对自己更有自信,对编程也更有兴趣。我相信,只要努力、勤奋、坚持不懈,就没有什么做不到的事,不能还没开始就退缩,要勇于拼搏,敢于创新。
个人总结(一)
课程设计是培养学生综合运用所学知识,发展,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际能力的具体训练和考察过程。随着科学技术的发展,当今计算机存货在世界的每一个角落,因此,作为二十一世纪的大学生来说,掌握计算机开发技术是非常重要的。
对于此次的课程设计,感慨颇多。从确定题目到完成整个编程,从理论到实践,在一个多月的时间里可以学到很多很多东西,同时不仅可以巩固以前学过的知识,还学到了许多书本上没有的知识。通过此次课程设计,我懂得了理论与实践结合是很重要的,只有理论知识是完全不够的,只有把自己所学的理论知识和时间相结合起来,从理论中得出结论,才能真正的提高自己的实际动手能力和独立思考能力,才能真正为社会服务。
在设计过程中,我们遇到了很多的困难,各式各样,但是经过我们的努力和老师同学的帮助,能够很好地解决,我们的实践能力因此得到很大的提高。
我还意识到,自己掌握的只是还是很缺陷,在以后的课程学习中,我要更加认真仔细,全面地了解相关知识。
个人总结(二)
一个多月的的软件工程课程设计结束了,这也就意味着这学期的软件工程学习结束了,在这将近半年的学习中,虽然我不能说我将软件工程学习的有那么的好,但是通过学习,我还是受益良多。
通过这次的课程设计,我认识到了我以前对软件工程的错误的认识,认为软件就
是程序,软件的开发及时编写程序,只要编完了程序,一切也就OK 了。但其实不是这样的,软件不仅仅只是程序,软件开发也不仅仅是编程,软件是思想在硬件上的载体和实现,处理的是逻辑和信息,唯有对软件和软件的开发过程,有充分的认识,在能更好地开发出,过程受控制、质量受控制的软件产品。
此次的课程设计一共是小组四个人完成的,这也就有一个分配与配合的过程,从一开始的确定题目,到分配个人任务,再到大家都完成任务,中间的配合都很融洽,都能按时完成自己的任务。
过程中,也遇到了很多困难,但是通过请教老师同学,这些问题都得到了解决,更主要的是,通过课程设计的锻炼,对C++语言运用的更加灵活,了解了更多C++语言的功能,能很好的把软件工程的思想与C++语言结合起来,实践能力有了很大的提高,也提高了自己独立思考的能力,让我对变成更加感兴趣。以后,我要更加努力学习,将这门课程学的更好,能向一位真正的软件工程师更进一步!
个人总结(三)
本次的课程设计终于渐近尾声了,从起初的小组成立,再到确定课程设计的题目,分配任务,各自着手开始做各自的任务,算起来也有一段时间了。期间也难以避免地出现过好多或者复杂或者简单的问题,在小组成员的不断讨论与磨合下终于得以一一解决。
详细设计是一个至关重要的环节,需要不断地寻找更好的方法,反复地修改,尽最大的力量去完成整个设计。在这个过程中我发现总体的设计和模块部分都存在很多问题,还有很大的空间去改进,更难掌控的是如何函数功能的实现和预期效果的最终达成,在不断地调试和运行后,终于有了点起色。在程序可以正确运行后,又通过各种资料的查阅,运用了一些辅助性符号,使系统更加人性化,更方便操作。
通过这次的课程设计,我进一步提高了自己的动手能力,学到了许多课本上学不到的宝贵经验。同时使我对自己有了更好的信心,对编程也有了更浓厚的兴趣,我们还需要更加努力的学习,在合作中加强成员之间协调性,以做到更好。
我相信,只要坚持不懈,不断地学习,我就能不断成长,作出更好的设计!
个人总结(四)
伴随着我们的课程设计的结束,我们也即将和软件工程的课程学习说再见了,但是课程的结束并不意味着我们对软件工程的学习到此就结束了,通过本次的软件工程课程设计,我对软件工程产生了更多的兴趣,也对其有了更深刻的认识。
我主要的任务是起初的编写课程设计内容和要求以及代码的最终实现与检测,前者在查阅各种资料和书籍,借鉴前人的经验后,基本上能够轻松的完成。而后者却是个很艰巨的任务,在编译过程中出现了很多从没预料到的问题,在自己和其他小组成员的不断尝试和改进下,终于都得以解决。虽然最后的设计并不能说完美,但毕竟是我们小组辛苦地从无到有地一个字一个图地做出来的,我们对它算是很满意了。 回想起来,更能感受到其中的苦与乐,苦于不断地遇到各种棘手的问题,乐于在小组成员的共同努力下,解决问题之后的那种成就感,苦使我们成长,乐让我们对软件工程产生更大的兴趣,有了兴趣就有继续学习她的动力。相信在以后的学习中,我
们也能拿出百分百的热情,不断地提高自己的动手能力,做出更好的设计! 附录1:参考文献
[1]、田淑清, C语言程序设计, 北京:高等教育出版社,2006年1月
[2]、谭浩强.C 程序设计题解与上机指导. 第二版. 北京:清华大学出版社,2000年9月
附录2:程序清单
主程序:
#include
#include
#include
#include
#define FILENAME1 "sichuan.txt"
#define FILENAME2 "feisichuan.txt"
void menu()
{
cout
cout
cout
cout
cout
cout
cout
cout
cout
}
void main()
{
int mu;
cout
cout
cout
menu();
cin>>mu;
info inform;
inform.studentID=new char[10];
inform.name=new char[10];
inform.province=new char[10];
FILE* fh=fopen(FILENAME1,"r+");
FILE* fh2=fopen(FILENAME2,"r+");
if (fh==NULL||fh2==NULL)
{
perror(FILENAME1);
return;
}
comnirecord a(fh);//a是从四川籍的用户的链表
comnirecord b(fh2);//b是从非四川籍的用户的链表
while (mu!=8)
{
switch (mu)
{
case 1:
cout
cout
cin>>inform.studentID;
cout
cin>>inform.name;
cout
cin>>inform.province;
if (strcmp(inform.province,"四川")==0)
{
a.Insert(a.Getn()-1,inform.studentID,inform.name,inform.province); }
else
b.Insert(b.Getn()-1,inform.studentID,inform.name,inform.province); break;
case 2:
cout
cin>>inform.studentID;
if(!(a.Delete(inform.studentID)||b.Delete(inform.studentID)))
{
cout
}
break;
case 3:
cout
cin>>inform.studentID;
if(!(a.Delete(inform.studentID)||b.Delete(inform.studentID)))
{ cout>inform.studentID; cout>inform.name; cout>inform.province; if (strcmp(inform.province,"四川")==0) { a.Insert(a.Getn()-1,inform.studentID,inform.name,inform.province);
}
else
b.Insert(b.Getn()-1,inform.studentID,inform.name,inform.province);
}
break;
case 4:
cout
cin>>inform.studentID;
if (!(a.SearchID(inform.studentID)||b.SearchID(inform.studentID))) {
cout
}
break;
case 5:
cout
cin>>inform.name;
if (!(a.SearchNam(inform.name)||b.SearchNam(inform.name)))
{
cout
}
break;
case 6:
cout
cin>>inform.province;
if (!(a.SearchPro(inform.province)||b.SearchPro(inform.province))) {
cout
}
break;
}
} case 7: a.Display(); b.Display(); break; default: cout>mu; delete[]inform.studentID; delete[]inform.name; delete[]inform.province; fclose(fh); FILE* fg=fopen(FILENAME1,"w+"); FILE* fg2=fopen(FILENAME2,"w+"); a.WriteInFile(fg); b.WriteInFile(fg2);
comnirecord 头文件:
#include
#include
#include
class comnirecord;
struct info
{
char * studentID;
char * name;
char * province;
friend comnirecord;
};
class Node
{
info element;
Node * link;
friend comnirecord;
};
class comnirecord
{
public:
comnirecord(FILE * fp);
~comnirecord();
bool Insert(int i,char * stuID,char * nam,char * prov);//存取
void Display(info x);//显示
void Display();
bool Delete(char * stuID);// 按学号删除
bool SearchID(char * stuID);//按学号查询
bool SearchNam(char * nam);//按姓名查询
bool SearchPro(char * prov);//按籍贯查询
bool WriteInFile(FILE * fp);
int Getn();
private:
bool SearchID(char * stuID,info & x)const;
bool SearchNam(char * nam,info & x)const;
bool SearchPro(char * prov,Node * &x)const;
Node * first;
int n;
};
int comnirecord::Getn()
{
return n;
}
comnirecord::comnirecord(FILE * fp)
{
n=0;first=NULL;
int count=-1;
int q[3];
int k1,k2,k3;
char * s=new char[30];
while (fgets(s,30,fp)!=NULL)
{
Node * p=new Node;
int j=0;
for (int i=0;s[i]!='\0';i++)//可以考虑中间是用“,”隔开的情况
{
if (s[i]==' '&&j
{
q[j]=i;
j++;
}
}
p->element.studentID=new char[q[0]+1];
p->element.name=new char[q[1]-q[0]];
p->element.province=new char[q[2]-q[1]];
k1=sprintf(p->element.studentID,"%c",s[0]);
for (i=1;i
{
k1+=sprintf(p->element.studentID+k1,"%c",s[i]);
}
k2=sprintf(p->element.name,"%c",s[q[0]+1]);
for (i=q[0]+2;i
{
k2+=sprintf(p->element.name+k2,"%c",s[i]);
}
k3=sprintf(p->element.province,"%c",s[q[1]+1]);
for (i=q[1]+2;i
{
k3+=sprintf(p->element.province+k3,"%c",s[i]);
}
Insert(count,p->element.studentID,p->element.name,p->element.province); count++;
delete[]s;s=new char[30];
}
delete [] s;
}
comnirecord::~comnirecord()
{
Node *p;
while (first)
{
p=first->link;
delete first->element.studentID;// 是否需要??
delete first->element.name;
delete first->element.province;
delete first;
first=p;
}
}
bool comnirecord::Insert(int i,char * stuID,char * nam,char * prov)
{
if(in-1)
{
cout
cout
return false;
}
Node * q=new Node;
q->element.studentID=new char[strlen(stuID)+1];strcpy(q->element.studentID,stuID); q->element.name=new char[strlen(nam)+1];strcpy(q->element.name,nam);
q->element.province=new char[strlen(prov)+1];strcpy(q->element.province,prov); Node * p=first;
for (int j=0;jlink;
if (i>-1)
{
q->link=p->link;
p->link=q;
}
else{
q->link=first;
first=q;
}
n++;return true;
}
bool comnirecord::Delete(char * stuID)
{
if(!n)
{
cout
}
Node * p=first;
Node * q=first;
for (int j=0;jelement.studentID,stuID)!=0;j++)
{
q=p;
p=p->link;
}
if (!p)
{
//cout
return false;
}
if (p==first)
{
first=first->link;
}
else
{
p=q->link;
q->link=p->link;
}
delete []p->element.studentID;
delete []p->element.name;
delete []p->element.province;
delete []p;
n--; return true;
}
bool comnirecord::SearchID(char * stuID)
{
info x;
bool a=SearchID(stuID,x);
if (a)
{
Display(x);
}
return a;
}
bool comnirecord::SearchID(char * stuID,info & x)const
{
Node * p=first;
for (int j=0;jelement.studentID,stuID)!=0;j++) p=p->link; if (!p)
{
//cout
return false;
}
x.studentID=new
char[strlen(p->element.studentID)+1];strcpy(x.studentID,p->element.studentID);
x.name=new char[strlen(p->element.name)+1];strcpy(x.name,p->element.name); x.province=new
char[strlen(p->element.province)+1];strcpy(x.province,p->element.province);
return true;
}
bool comnirecord::SearchNam(char * nam)
{
info x;
bool a=SearchNam(nam,x);
if (a)
{
Display(x);
}
return a;
}
bool comnirecord::SearchNam(char * nam,info & x)const
{
Node * p=first;
for (int j=0;jelement.name,nam)!=0;j++) p=p->link;
if (!p)
{
//cout
return false;
}
x.studentID=new
char[strlen(p->element.studentID)+1];strcpy(x.studentID,p->element.studentID);
x.name=new char[strlen(p->element.name)+1];strcpy(x.name,p->element.name); x.province=new
char[strlen(p->element.province)+1];strcpy(x.province,p->element.province);
return true;
}
bool comnirecord::SearchPro(char * prov)
{
Node * x=NULL;
bool a=SearchPro(prov,x);
if (a)
{
Node * pq=x;
while (pq)
{ Display(pq->element);
pq=pq->link;
}
while (x)
{
pq=x->link;
delete x->element.studentID;// 是否需要??
delete x->element.name;
delete x->element.province;
delete x;
x=pq;
}
}
return a;
}
bool comnirecord::SearchPro(char * prov,Node * &x)const
{
Node * p=first;
/*x=NULL;*/
int count=0;
for (int j=0;j
{
if(strcmp(p->element.province,prov)==0)
{
Node * hp=new Node;
hp->element.studentID=new
char[strlen(p->element.studentID)+1];strcpy(hp->element.studentID,p->element.studentID);
hp->element.name=new
char[strlen(p->element.name)+1];strcpy(hp->element.name,p->element.name);
hp->element.province=new
char[strlen(p->element.province)+1];strcpy(hp->element.province,p->element.province); hp->link=x;
x=hp;
count++;
}
p=p->link;
}
if (count==0)
{ //cout
return false;}
return true;
}
void comnirecord::Display(info x)
{
cout
cout
}
void comnirecord::Display()
{Node *p=first;
while (p)
{
coutelement.studentIDelement.nameelement.province
p=p->link;
}
cout
bool comnirecord::WriteInFile(FILE * fp)
{
Node * p=first;
int k;
for (int i=0;i
{
char * s;
s=new
char[strlen(p->element.studentID)+strlen(p->element.name)+strlen(p->element.province)+
1];
k=sprintf(s,"%s",p->element.studentID); k+=sprintf(s+k,"%c",' '); k+=sprintf(s+k,"%s",p->element.name); k+=sprintf(s+k,"%c",' '); k+=sprintf(s+k,"%s",p->element.province); k+=sprintf(s+k,"%c",' '); k+=sprintf(s+k,"%s","\n"); fputs(s,fp);
p=p->link;
}
return true;
}