同学录的设计与实现说明书.docx
《同学录的设计与实现说明书.docx》由会员分享,可在线阅读,更多相关《同学录的设计与实现说明书.docx(38页珍藏版)》请在冰豆网上搜索。
![同学录的设计与实现说明书.docx](https://file1.bdocx.com/fileroot1/2023-1/26/b9923bc2-ea15-44c2-8b05-1f498e6ba1c8/b9923bc2-ea15-44c2-8b05-1f498e6ba1c81.gif)
同学录的设计与实现说明书
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2011年春季学期
面向对象课程设计
说明书
题目:
同学录的设计与实现
专业班级:
姓名:
学号:
指导教师:
成绩:
面向对象课程设计说明书
目录
一、序言3
二、摘要3
三、系统总体设计4
1设计思路4
2系统总体框图4
3系统流程图5
四、详细设计6
1输出函数功能及流程图6
2创建函数及流程图7
3删除函数及流程图7
4增加函数及流程图8
5修改函数及流程图8
6排序函数及流程图8
7分类查找函数及流程图8
8释放内存函数及流程图10
9保存函数及流程图11
10综合操作函数及流程图12
五、总结13
六、参考文献13
七、致谢13
八、附录13
程序源代码13
一、序言
随着现代科技的发展,计算机技术已经越来越受到人们的青睐,计算机已经不是什么高科技产品,伴随的人们生活水平的提高,计算机已经走入了寻常百姓家。
计算机的发展得益于C语言等计算机语言的发展,运用计算机语言,我们可以实现各种各样的功能。
就我们现在所学的知识而言,我们也可以运用C语言(C++)实现一些简单的管理系统,如:
学生成绩管理系统、图书管理系统、通讯录等。
此次课程设计,我所设计的是运用C语言(C++)做一个同学录,主要实现显示、查找、修改、插入、追加、删除、排序、输出等功能。
由于与顺序结构相比较,链表比较方便插入和删除操作,所以本同学录的主要实现方式使用的是链表[1]和文件[2],参考资料为谭浩强的《C语言程序设计》(清华大学出版社)。
为了使得程序条理清晰,模块化显著,同学录的基本功能的实现使用的是线性表和文件相结合的方式。
二、摘要
该同学录管理程序主要实现以下几个功能:
(1).增加联系人;
(2).查找联系人;
(3).对联系人按姓名排序;
(4).修改联系人信息;
(5).删除联系人;
(6).保存联系人;
(7).显示单个联系人;
(8).创建并保存同学录文件;
(9).打开同学录文件;
(10).安全退出并释放内存空间。
关键字:
同学录、链表、线性表、联系人、排序、
三、系统总体设计
1设计思路
通过对塞班S60v5平台手机的了解,我们知道手机通讯录的基本功能即为:
添加、查找、排序、删除、修改、保存、打开等,这些同样适用于同学录。
又因为程序是用C语言(C++)编写,同时要在电脑上显示运行,所以必须创建一个联系人数据存储文件(同学录.dat)来保存写入的联系人信息,这就需要用程序能够对所录入的信息在系统外存中开辟一个空间进行保存,以便于在以后需要的时候直接打开调用。
整个程序是利用链表和文件的形式进行编写的。
2系统总体框图
系统框图如图1所示
3系统流程图
实现对一级菜单:
创建同学录、按名字进行排序、综合操作、保存、打开、退出功能的控制,分别调用各个子函数。
程序流程图如图2所示。
四、详细设计
1输出函数功能及流程图
输出函数实现同学录内容的输出,通过指针文件调用头函数来实现。
其流程图如图3所示。
2创建函数及流程图
通过定义两个指针数组,利用链表对函数进行调用,实现对同学录函数的创建。
其流程图如图4所示。
3删除函数及流程图
通过查找自己不需要的姓名,程序直接将其删除,在运行期间,程序会自动判断该内容是否在同学录中,若存在则将其直接删除,若不存在则输出“名字不存在本同学录中”。
其流程图如图5所示。
4增加函数及流程图
为完善同学录的功能,在不改变已存的同学录内容的前提下,程序从内存中另外开辟空间进行对同学录的补充,实现增加功能。
函数流程图如图6所示。
5修改函数及流程图
对写入错误的信息进行修改,通过键盘输入的选项,程序自动进行查找并提示用户输入修改的内容。
函数流程图如图7所示。
6排序函数及流程图
该模块实现的是对无序的信息进行按名字排序,先对每个名字的首字母进行比较,相同则进行下一个字母的比较,直到排序完成。
函数流程图如图8所示。
7分类查找函数及流程图
流程图如图9所示。
8释放内存函数及流程图
为节省系统内存,在进行完一次操作以后将会对其所开辟的空间进行释放。
函数流程图如图10所示。
9保存函数及流程图
将所有联系人信息写入函数后,程序会生成一个文件来保存联系人信息,从而可以在关闭VC环境的情况下,依然可以在系统中找到该文件,实现了文件保存功能。
流程图如图11所示。
10综合操作函数及流程图
综合操作包括分类查找、单个显示、增加、删除、修改功能,是对整个同学录进行的比较全面系统的操作,其中分类查找和修改又包括下一级菜单。
分类查找包括按姓名、职业、手机、email、地址查找;修改包括按姓名、职业、手机、email、地址、全部修改进行修改。
流程图如图12所示。
五、总结
本程序是运用链表、结构体、文件指针以及指针数组的综合应用来实现的,能够实现的功能为对联系人的添加、查找、排序、删除、修改、保存和生成联系人数据文件(同学录.dat)。
我通过对程序的调整、修改,学习到了课堂上没有学到的知识,丰富了自己的知识面,加深了对C语言的了解和认识。
在编写和修改程序的过程中,学习到了链表、结构体、文件指针的应用。
在这期间,遇到了很多困难,由于本程序很长(700余行代码),修改起来很困难,一处逻辑错误就要查找很长时间,这就给此次课程设计带来了一定的困难。
但是我没有放弃,在老师和同学的帮助下,克服了一个个的困难,最终将程序调试完成,运行时也没有警告和错误了,但是该程序还是存在着一些不足的地方,功能方面并没有达到我预期的目的,例如没有实现我预想的图形化界面,没有再加入几个辅助功能模块的。
由于时间有限,再加上我的才学疏浅,最终提交的同学录管理系统还是不尽完美,我会在本次课程设计结束后将其进一步完善,从而更深层次的学习C语言。
六、参考文献
1.谭浩强,张基温《C语言程序设计教程》[M].第3版.高等教育出版社,2006;
2.顾治华,陈天煌《C语言程序设计》[M].北京:
机械工业出版社,2007;
3.戴志诚,赵国峰.JSP信息化系统建设案例[M].北京:
人民邮电出版社,2006.12;
4.侯风巍,杨永田《数据结构要点精析(C语言版)》.北京航空航天大学出版社,2008;
5.孙鑫C++视频教程.来自互联网;
6.其他视频教程。
七、致谢
首先,我要感谢我的课程设计老师赵付青老师,谢谢赵老师对我的谆谆教导,为我做课程设计奠定了理论基础。
另外,感谢赵老师在我做课程设计的过程中给我提出的宝贵意见和建议,我根据赵老师的建议对我的程序进行了改进,从而使程序更加完善。
最后我还要感谢,在课程设计的这两周给我帮助的同学们,谢谢他们给我鼓励和支持!
八、附录
程序源代码
#include
#include
#include
#include
#defineNULL0
#defineLENsizeof(structTXL_project)
intn;
structTXL_project{
charName[30];
charWork[30];
charHandSet[30];
charQQ[30];
charAddress[30];
structTXL_project*next;
};
structTXL_project*ShiFang(structTXL_project*head);//释放内存函数声明
/////////////////创建函数/////////////////////////
structTXL_project*creat(void){
system("color5E");
structTXL_project*head,*p1,*p2;
charName[20];
n=0;
p1=(structTXL_project*)malloc(LEN);
p2=p1;
printf("请输入同学录的内容!
\n姓名输入为0时则表示创建完毕!
\n\n");
printf("\n请输入姓名:
\t");gets(Name);
if(strcmp(Name,"0")!
=0){
strcpy(p1->Name,Name);
printf("请输入职业:
\t");gets(p1->Work);
printf("请输入手机号码:
\t");gets(p1->HandSet);
printf("请输入QQ号码:
\t");gets(p1->QQ);
printf("请输入地址:
\t");gets(p1->Address);
head=NULL;
while
(1){
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
printf("\n请输入姓名:
\t");gets(Name);
if(strcmp(Name,"0")==0){
break;
}
else{
p1=(structTXL_project*)malloc(LEN);
strcpy(p1->Name,Name);
printf("请输入职业:
\t");gets(p1->Work);
printf("请输入手机号码:
\t");gets(p1->HandSet);
printf("请输入QQ号码:
\t");gets(p1->QQ);
printf("请输入地址:
\t");gets(p1->Address);
}
}
p2->next=NULL;
return(head);
}
else{
return0;
}
}
/////////////////输出函数///////////////////
voidprint(structTXL_project*head){
structTXL_project*p;
system("cls");
if(head!
=NULL){
p=head;
printf("本同学录现在共有%d人:
\n",n);
printf("姓名--------职业----------------手机号码--------QQ号码------地址----------------★\n");
printf("==================================================================================\n");
do{
printf("%-10s",p->Name);
printf("%-18s",p->Work);
printf("%-14s",p->HandSet);
printf("%-10s",p->QQ);
printf("%-30s",p->Address);
printf("\n");
p=p->next;
}while(p!
=NULL);
printf("==================================================================================\n");
}
else
printf("同学录为空,无法输出信息!
\n");
}
////////////////删除函数/////////////////////
structTXL_project*delet(structTXL_project*head){
structTXL_project*p1,*p2;
charName[30];
if(head==NULL){
printf("同学录为空,无法删除!
\n");
return(head);
}
printf("请输入要删除的名字:
\t");
gets(Name);
p1=head;
while((strcmp(p1->Name,Name))!
=0&&p1->next!
=NULL){
p2=p1;
p1=p1->next;
}
if(strcmp(p1->Name,Name)==0){
if(p1==head){
head=p1->next;
}
else{
p2->next=p1->next;
}
printf("已成功删除:
%s\n",Name);
system("pause");
free(p1);
n=n-1;
}
else{
printf("%s不在本同学录中,无需删除!
\n",Name);
system("pause");
}
return(head);
}
////////////////////增加函数/////////////////////////
structTXL_project*insert(structTXL_project*head){
structTXL_project*p0,*p1,*p2;
charName[20];
p1=head;
printf("请输入增加的内容:
\n");
printf("\n请输入姓名:
\t");gets(Name);
if(strcmp(Name,"0")==0){
printf("姓名不能为0,添加失败!
\n");
system("pause");
return(head);
}
else{
p0=(structTXL_project*)malloc(LEN);
strcpy(p0->Name,Name);
printf("请输入职业:
\t");gets(p0->Work);
printf("请输入手机号码:
\t");gets(p0->HandSet);
printf("请输入QQ号码:
\t");gets(p0->QQ);
printf("请输入地址:
\t");gets(p0->Address);
n=n+1;
if(head==NULL){
head=p0;
p0->next=NULL;
return(head);
}
else{
while(strcmp(p0->Name,p1->Name)>0&&(p1->next!
=NULL)){
p2=p1;
p1=p1->next;
}
if(strcmp(p0->Name,p1->Name)<0||strcmp(p0->Name,p1->Name)==0){
if(head==p1){
head=p0;
}
else{
p2->next=p0;
}
p0->next=p1;
}
else{
p1->next=p0;
p0->next=NULL;
}
return(head);
}
}
}
////////////////显示函数/////////////////////
structTXL_project*xianshi(structTXL_project*head){
structTXL_project*p1,*p2;
charName[30];
intm;
if(head==NULL){
printf("同学录为空,无法显示!
\n");
return(head);
}
p1=head;
m=0;
printf("请输入需要显示人的姓名:
");
gets(Name);
while(p1!
=NULL){
while((strcmp(p1->Name,Name))!
=0&&p1->next!
=NULL){
p2=p1;
p1=p1->next;
}
if(strcmp(p1->Name,Name)==0){
m++;
printf("%s的通讯信息如下:
\n",Name);
printf("姓名--------职业----------------手机号码--------QQ号码------地址----------------★\n");
printf("==================================================================================\n");
printf("%-10s",p1->Name);
printf("%-18s",p1->Work);
printf("%-14s",p1->HandSet);
printf("%-10s",p1->QQ);
printf("%-30s",p1->Address);
printf("\n");
printf("==================================================================================\n");
}
p1=p1->next;
}
if(m==0){
printf("\n\t此人不在本同学录中!
\n");
}
return(head);
}
///////////////修改函数////////////////////
structTXL_project*xiugai(structTXL_project*head){
structTXL_project*p1,*p2;
charnum[10];
charName[30];
charName1[30];
charWork[30];
charHandSet[30];
charQQ[30];
charAddress[30];
if(head==NULL){
printf("同学录为空,无法修改!
\n");
return(head);
}
printf("请输入需要修改的姓名:
");
gets(Name);
p1=head;
while((strcmp(p1->Name,Name))!
=0&&p1->next!
=NULL){
p2=p1;
p1=p1->next;
}
if(strcmp(p1->Name,Name)==0){
printf("请选择修改的内容:
\n");
printf("******************************\n");
printf("**1姓名**\n");
printf("**2职业**\n");
printf("**3手机**\n");
printf("**4QQ号码**\n");
printf("**5Address**\n");
printf("**6全部修改**\n");
printf("******************************\n");
printf("请输入您的选择:
\t");
gets(num);
system("cls");
switch(*num){
case'1':
printf("请重新输入姓名:
");
gets(Name);
strcpy(p1->Name,Name);
break;
case'2':
printf("请重新输入职业:
");
gets(Work);
strcpy(p1->Work,Work);
break;
case'3':
printf("请重新输入手机号码:
");
gets(HandSet);
strcpy(p1->HandSet,HandSet);
break;
case'4':
printf("请重新输入QQ号码:
");
gets(QQ);
strcpy(p1->QQ,QQ);
break;
case'5':
printf("请重新输入地址:
");
gets(Address);
strcpy(p1->Address,Address);
break;
case'6':
printf("请重新输入姓名:
");gets(Name1);strcpy(p1->Name,Name1);
printf("请重新输入职业:
");gets(Work);strcpy(p1->Work,Work);
printf("请重新输入手机号码:
");gets(HandSet);strcpy(p1->HandSet,HandSet);
printf("请重新输入QQ号码:
");gets(QQ);strcpy(p1->QQ,QQ);
printf("请重新输入地址:
");gets(Address);strcpy(p1->Address,Address);
break;
default:
printf("操作错误,此项不存在!
\n");
system("pause");
break;
}
}
else{
printf("此人未在本同学录中\n无法为其修改信息\n请先添加后再做修改!
\n");
system("pause");
}
return(head);
}
///////////////排序函数/////////////////////
structTXL_project*PaiXu(structTXL_project*head){
structTXL_project*p1,*p2;
inti,j;
structTXL_project1{
charName[30];
charWork[30];
charHandSet[30];
charQQ[30];
charAddress[30];
};
structTXL_project1px[200];
structTXL_project1temp;
if(head==NULL){