通讯录设计目 录
(一) 设计目的…………………………………..
(二) 总体设计…………………………………..
(三) 详细设计……………………………………
(四) 调试与测试…………………………………
(五) 源程序与执行结果…………………………
(六) 感想与总结…………………………………
一 设计目的
设计一个通讯录,包含编号、姓名、单位、通信地址、邮箱和联系电话等基本信息,应该具...
目 录
(一) 设计目的…………………………………..
(二) 总体设计…………………………………..
(三) 详细设计……………………………………
(四) 调试与测试…………………………………
(五) 源程序与执行结果…………………………
(六) 感想与
…………………………………
一 设计目的
设计一个通讯录,包含编号、姓名、单位、通信地址、邮箱和联系电话等基本信息,应该具有以下功能:
1.录入信息 ,将录入的信息导入链
.
2.删除,将指定的信息(按姓名)删除并保存.
3.修改,将指定的信息(按姓名)修改并保存.
4.浏览,将入的全部信息显示出来.
5.查找,按姓名查找指定的信息.
6. 保存,保存所录入,修改,删除,排序的信息.
二 总体设计
1程序设计过程
程序设计一般由两部分组成:算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。在通讯录管理程序中,由于预计记录数相对于一个单位的学生人数或职工人数来说不会太大,除了能够增加、保存外,更多的情况是查询,所以用静态数组保存数据,实现查询。
首先,定义一下各个
库函数,建立一个结构体数组,定义各个功能所需的函数等。然后设置主函数,程序采用模块化设计,主函数程序的入口,各模块独立,可分块调试,均由主函数控制调用。控制功能的实现通过循环执行一个开关语句,该语句的条件值是通过调用主菜单得到的返回值(head),根据该值,调用相应得各功能函数。分别编写showmenu()菜单,Appenditem()添加条目,print输出条目,Finditem1()查找条目( 按姓名 ),Correct()修改信息,Removeitem()删除信息,Saveandfree()保存到文件等函数。系统包括的功能模块,模块功能描述,各模块间的层次结构(即相互调用关系)以及模块之间的信息交换,最终成型。
2 实现的功能:
(1).本程序是一个简单的通讯管理系统。
(2).程序具有数据录入、删除、修改、浏览、查找、排序以及数据保存等功能。:
(3).创建通讯录包括编号、姓名、单位、通信地址、邮箱和联系电话等基本信息,。
3 数据流程图
开始
菜单
输入0~5
添加
输出
删除
保存并释放
查找
修改
p成立?
Break
Y
N
退出
三 详细设计
1.定义标准库函数 ,建立结构体数组。包括编号、姓名、单位、通信地址、邮箱和联系电话等基本信息。如
#include
#include
#include
struct Telephone
{
char number[200];
char name[20];
char fia[20];
char addrass[20];
char mail[20];
char telephone[20];
struct Telephone *next;
}student[50];
typedef struct Telephone TEL;
TEL *head=NULL;
2.定义实现数据录入、删除、修改、浏览、查找、排序以及数据保存等功能所需要的函数,
void showmenu(); /*菜单*/
void Appenditem(); /*添加条目*/
void print(); /*输出条目*/
void Finditem1(); /*查找条目( 按姓名 )*/
void Correct(); /*修改条目*/
void Removeitem(); /*删除信息*/
void Saveandfree(); /*保存到文件*/
void Open(); /*打开文件*/
3.分别编制各个功能所需的的函数,
(1)首先编制菜单,设置一个 Open()函数,打开文件。showmenu()菜单函数主要运用一个开关语句就能实现,菜单有7个选项,随便选择一个选项就能直接进入所要进的函数,如程序
char ch;
Open(); /*打开文件*/
while(1)
{
showmenu(); /*显示菜单*/
scanf(" %c",&ch);
switch(ch)
{
case '1':Appenditem(); /*添加条目*/
break;
case '2':print(); /*输出条目*/
break;
case '3':Finditem1(); /*查找条目1.按姓名*/
break;
case '4': Removeitem(); /*删除信息*/
print(); /*输出删除后的结果*/
break;
case '5': Correct(); /*修改信息*/
break;
case '0':Saveandfree(); /*保存并释放内存*/
exit(0); /*退出*/
break;
default:
printf("选择错误!");
break;
}
}
}
然后编制输出函数,使其输出菜单选项。
图1 主菜单
(2)编制Appenditem()添加条目函数。首先建立2个结构体指针*p1,*p2.并且利用p1=(TEL *)malloc(sizeof(TEL))申请结点,然后输入一系列信息,如编号、姓名、单位、通信、地址、邮箱、联系、电话等信息。最后申请空间将其保存。
图 2 添加信息
(3)编制print()输出函数,此函数主要是通过结构体指针实现的,将输入的数据一次通过printf将其显示出来。
图 3 显示信息
(4)编制Finditem1()查找函数。建立结构体指针TEL *p; 并且定义一个数组 char findname[20]; 利用比较函数strcmp(),比较所要查找的节点中的姓名。如果输入的姓名不存在,则只输出基本行,即编号、姓名、单位、通信、地址、邮箱、联系、电话。
如果存在则输出信息。如
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->name,findname)==0)
printf("%s\t%s\%s\t%s\t%s\t%s\n",p->number,p->name,p->fia,p->addrass,p->mail,p->telephone);
}
(5)Correct()函数旨在更改通讯录中的信息。运用这个函数时先按姓名查找要更改的信息,利用比较函数strcmp(),比较所要查找的节点中的姓名。找到之后再重新输入编号、姓名、单位、通信、地址、邮箱、联系、电话,并且覆盖原来的。
(6)Removeitem()函数用来删除信息,先按姓名查找要删除的信息。利用比较函数strcmp(),比较所要查找的节点中的姓名。找到之后释放姓名所在的结点。如果不存在则输出:“没有要删除的对象”。此函数分3种情况,删除头结点,删除中间或尾结点。所需算法不一样。算法如下
if(strcmp(p->name,findname)==0)
{if(p==head)
head=p->next; /*删除头结点*/
else
pr->next=p->next; /*删除中间或尾结点*/
free(p);
}else
printf("没有要删除的对象\n");
(7)Saveandfree()函数用来保存链表信息到文件并释放内存空间,主要运用文件函数实现。先将文件以“wb+”方式打开,再利用循环和fwrite()函数将内容写入文件中,写完之后关闭文件。因为信息已保存,所以还要释放链表空间。
(8)Open()函数用来打开已存在的文件,它的功能是读取以存储的文件内容,在利用print()函数显示出来。
4调试与测试
1.先有两人对各自的程序初步检查,初步排除一些常识性的错误,比如说:
(1)忘记加分号:
(2)其他语法性错误,如部分标示符忘记声明等。
2.上机调试与测试:
(1)在VC++ 6.0 环境中创建一个名为“叶振博、赵腾园.ccp”的文件。
(2)经过编译(修改错误)、连接、执行,最终得到了零错误的正确程序。
①用户界面
②录入信息
③输出信息
④查询信息
⑤删除信息
⑥修改信息
⑦保存并退出
5 序清单与执行结果
#include
#include
#include
struct Telephone
{
char number[200];
char name[20];
char fia[20];
char addrass[20];
char mail[20];
char telephone[20];
struct Telephone *next;
}student[50];
typedef struct Telephone TEL;
TEL *head=NULL;
void showmenu(); /*菜单*/
void Appenditem(); /*添加条目*/
void print(); /*输出条目*/
void Finditem1(); /*查找条目( 按姓名 )*/
void Correct(); /*修改条目*/
void Removeitem(); /*删除信息*/
void Saveandfree(); /*保存到文件*/
void Open(); /*打开文件*/
main()
{
char ch;
Open(); /*打开文件*/
while(1)
{
showmenu(); /*显示菜单*/
scanf(" %c",&ch);
switch(ch)
{
case '1':Appenditem(); /*添加条目*/
break;
case '2':print(); /*输出条目*/
break;
case '3':Finditem1(); /*查找条目1.按姓名*/
break;
case '4': Removeitem(); /*删除信息*/
print(); /*输出删除后的结果*/
break;
case '5': Correct(); /*修改信息*/
break;
case '0':Saveandfree(); /*保存并释放内存*/
exit(0); /*退出*/
break;
default:
printf("选择错误!");
break;
}
}
}
/*菜单*/
void showmenu()
{
printf("\n*********************通讯录**********************\n");
printf("* \t1.录入信息 *\n");
printf("* \t2.输出信息 *\n");
printf("* \t3.按姓名查询 *\n");
printf("* \t4.删除信息 *\n");
printf("* \t5.修改信息 *\n");
printf("* \t0.保存并退出! *\n");
printf("*************************************************\n");
printf("\t请选择:\n");
}
/*添加条目*/
void Appenditem()
{
TEL *p1=NULL,*p2=NULL;
p1=(TEL *)malloc(sizeof(TEL)); /*申请结点*/
printf("输入编号:\n");
scanf("%s",p1->number);
printf("输入姓名:\n"); /*添加信息*/
scanf("%s",p1->name);
printf("输入单位:\n");
scanf("%s",p1->fia);
printf("输入通讯地址:\n");
scanf("%s",p1->addrass);
printf("输入邮箱:\n");
scanf("%s",p1->mail);
printf("输入联系电话:\n");
scanf("%s",p1->telephone);
p1->next=NULL; /*保存到链表*/
if(head==NULL)
{
head=(TEL *)malloc(sizeof(TEL)); /*申请空间*/
head->next=p1;
}
else
{
for(p2=head;p2->next!=NULL;p2=p2->next); /*找到结点尾*/
p2->next=p1;
}
printf("此信息已添加!");
}
/*输出学生信息*/
void print()
{
TEL *p=NULL;
if(head==NULL)
{
printf("此通讯录中无记录,请输入记录后在使用本功能!\n");
return;
}
printf("*******************通讯录*********************\n"); /*输出信息*/
printf("编号\t姓名\t单位\t通信地址\t 邮箱\t联系电话\n");
for(p=head->next;p!=NULL;p=p->next)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->fia,p->addrass,p->mail,p->telephone);
}
/*查找信息1.按姓名*/
void Finditem1()
{
TEL *p;
char findname[20];
printf("请输入要查找的姓名:\n");
scanf("%s",findname);
printf("********************通讯录*********************\n");
printf("编号\t姓名\t单位\t通信地址\t 邮箱\t联系电话\n");
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->name,findname)==0)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->fia,p->addrass,p->mail,p->telephone);
}
}
/*修改信息*/
void Correct()
{
TEL *p1(TEL *head);
{
struct Telephone *p1;
char name[20];
printf("输入要修改的人名:\n");
scanf("%s",name);
p1=head;
int flag=0;
while(p1!=NULL)
{
if(strcmp(p1->name,name)==0)
{
printf("输入新编号:\n");
scanf("%s",p1->number);
printf("输入新姓名:\n"); /*添加新信息*/
scanf("%s",p1->name);
printf("输入新单位:\n");
scanf("%s",p1->fia);
printf("输入新通讯地址:\n");
scanf("%s",p1->addrass);
printf("输入邮箱:\n");
scanf("%s",p1->mail);
printf("输入新联系电话:\n");
scanf("%s",p1->telephone);
flag=1;
}
p1=p1->next;
}
}
printf("修改完成");
}
/*删除信息*/
void Removeitem()
{
char findname[20]; /*先查找 后删除*/
TEL *p=head,*pr=head;
printf("请输入要删除的姓名:\n");
scanf(" %s",findname);
if (head== NULL)
{
printf("无此结点!\n");
return;
}
while ((strcmp(p->name,findname)!=0 )&& p->next != NULL)
{
pr =p;
p =p->next;
}
if(strcmp(p->name,findname)==0)
{if(p==head)
head=p->next; /*删除头结点*/
else
pr->next=p->next; /*删除中间或尾结点*/
free(p);
}else
printf("没有要删除的对象\n");
printf("已删除");
}
/*保存链表信息到文件并释放内存空间*/
void Saveandfree()
{
TEL *p=NULL;
FILE *fp;
char *Book="books.txt";
if(head==NULL)
{
printf("\n记录为空!\n");
return;
}
else
p=head->next;
if((fp=fopen(Book,"wb+"))==NULL)
{
printf("\n打不开文件!\n");
return;
}
while(p!=NULL) /*保存信息*/
{
fwrite(p,sizeof(TEL),1,fp);
p=p->next;
}
printf("保存完毕!");
fclose(fp);
/*释放链表空间*/
for(;head->next!=NULL;)
{
p=head->next;
head->next=head->next->next;
free(p);
}
free(head);
}
/*文件信息输出到链表*/
void Open()
{
FILE *fp;
TEL *p1=NULL,*p2=NULL,*temp=NULL;
if((fp=fopen("books.txt","rb+"))==NULL)
{
printf("\n*******************通讯录******************\n");
return;
}
head=(TEL *)malloc(sizeof(TEL));
head->next=NULL;
temp=p2=head;
while(! feof(fp)) /*循环读取*/
{
p1=(TEL *)malloc(sizeof(TEL));
temp=p2;
p2->next=p1;
p2=p1;
fread(p1,sizeof(TEL),1,fp);
}
temp->next=NULL;
fclose(fp); /*关闭文件*/
}
四 感想与总结
这次课程设计不仅可以使我们巩固了以前所学过的知识,而且让我们学到了很多在书本上所没有学到过的知识。在设计的过程中遇到过各种各样的问题,但是我们没有放弃,我们借助了老师、同学、网络的力量终于完成程序,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……我们收获很多,感谢老师,感谢领导给我们这次实战演练的机会,这次程序设计让我们受益匪浅。
本文档为【通讯录设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。