C语言课程设计通讯录管理系统Word文档格式.docx
《C语言课程设计通讯录管理系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言课程设计通讯录管理系统Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
3.功能模块图
4.数据结构设计
整个程序中用到的数据主要是全局变量MAX100和字符变量name[10]、addr[20]、phnum[20]、email[20]。
5.算法设计
1.主函数
主函数的设计一般比较的简单,只提供输入,功能处理和输出部分的函数调用。
其中个功能模块用菜单方式选择。
菜单部分也可以写成函数。
[流程图]
[程序]
main()/*****************主函数*****************/
{intn;
/**********变量保存选择菜单数子***************/
creat();
do
{printf("
\n\t***********************************************\n"
);
printf("
\n\n\t*************WELCOMETOUSE!
***************\n"
\n\t**********************************************\n"
\n\n\t\t*****Pleasemakeachoicebelow*****\n"
\n\t\t1.Addapieceofmeg"
\n\t\t2.Listallthemeg"
\n\t\t3.Deleteapieceofmeg"
\n\t\t4.Findapieceofmeg"
\n\t\t5.Alterapieceofmeg"
\n\t\t6.SaveandQuit"
\n\t\t7.Createanaddressbook"
\n\n\n"
\t********InputYourChoice:
****************\n"
scanf("
%d"
&
n);
switch(n)/*****************输入n的在1-6之间执行switch************/
{case1:
Add();
/*添加模块*/
break;
case2:
List();
/*显示模块*/
case3:
Delete();
/*删除模块*/
case4:
Find();
/*查询模块:
分为名字查询(0)和电话号码查询
(1)*/
case5:
Alter();
/*修改模块:
分为修改名字(0)和修改电话号码
(1)*/
case6:
exit(0);
/*退出模块*/
case7:
creat();
/*带回链表起始地址*/
fclose(fp);
default:
/**********输入的n不在1-6之间执行default************/
\n\t********************************************\n"
\n\tThenumshouldbe1-6\n"
}
}while
(1);
}
2.各功能模块设计
[数据结构]
通讯录的数据信息:
人名、工作单位、电话号码、E-mail地址均可以采用字符型数组;
可以采用结构体的形式,把各信息作为结构的成员,由于通讯录要具有添加、查找、和删除的功能,所以整个通讯录采用链表比较容易的实现以上功能。
用结构体变量作为链表中的接点是最合适的。
结构体变量可以是指针类型,我们可以用这个指针类型的成员来存放下一个结点的地址。
结构体的类型如下:
structpersons{typedefstructp{
charname[10]charname[10];
charaddr[20];
charphnum[20];
charemail[20];
}persons[MAX];
structp*next;
}p,*linklist;
structpersons类型为每个链表成员;
typedefstructp为一个动态的结点,它的成员next存放下一个结点的地址。
以下为各模块分析时要用的指针:
linklisthead=NULL,t=NULL;
/**************定义头指针和尾指针*************/
p*s,*p0,*p1,*p2,*p3,*p4,*p5;
inti;
charname1[10],ch;
charstr1[20];
FILE*fp;
/********************定义文件指针***********************/
(1)输入模块
voidcreat()/*将文件的信息读入结构体数组在转存入链表中*/
{intj;
longk;
fp=fopen("
people.txt"
"
r+"
/****************打开文件**********************/
if(fp!
=NULL)
{for(i=1;
i<
MAX;
i++)
{j=fgetc(fp);
if(j==EOF)
return;
k=i-1;
fseek(fp,k*sizeof(structpersons),0);
/************读取一个人的信息***************/
fread(&
persons[i],sizeof(structpersons),1,fp);
s=(linklist)malloc(sizeof(p));
/**************装存入链表中***********/
strcpy(s->
name,persons[i].name);
addr,persons[i].addr);
phnum,persons[i].phnum);
strcpy(s->
email,persons[i].email);
if(head==NULL)/***********用尾插法将其插入链表中**********/
head=s;
else
{t->
next=s;
t=s;
}}
{fp=fopen("
w"
i=1;
/*****不能打开另开辟一个文件*****/
⑵添加模块
由于运用的是链表的形式,且通讯录只是按照输入的先后循序排序,所以对添加的信息采用插入末端的方式,同时添加也使用于空通讯录的信息输入。
voidAdd()/*******向通讯录中添加(或输入)一个人的信息*********/
{s=(linklist)malloc(sizeof(p));
s->
next=NULL;
\n\n\t*********Pleaseinputthesb'
smessage:
**********"
\n\n\t\tname:
"
scanf("
%s"
s->
name);
\n\n\t\tAddr:
addr);
\n\n\t\tphnum:
phnum);
printf("
\n\n\t\temai:
email);
if(head==NULL)
/*******若通讯录为空则添加在头指针之后相当于输入信息*********/
/***********添加到链表的末尾************/
}
⑶显示模块
链表的一大好处是只要定义了头指针,则所有的信息就很容易的找到,指针会一环扣一环的找到每个信息,显示出每个信息,直到最后到位指针结束。
voidList()/*****************显示所有的信息*******************/
{p0=head;
/**************p0指向头指针*******************/
while(p0!
=NULL)/****************通讯录不为空******************/
\tname:
p0->
\taddr:
\tphnum:
\temail:
%s\n"
p0=p0->
next;
/**************p0向后移一个位置*****************/
}
⑷删除模块
删除一个人的信息相当于是删除链表中的一个结点。
在删除后又要保证链表不间断,如同手牵手排队的小孩,一个离队后,它两侧的小孩又自动地把手牵起来,保证不间断即把结点从链表中分离开来,只要撤销原来的链表关系即可。
要删除地信息
voidDelete()/************定义一个删除的函数***************/
{charname0[10];
p1=head;
\n\t**********Pleaseinputaname:
*************\n"
/*输入要删除人的姓名*/
\n\t\tname0:
gets(name0);
name0);
while((strcmp(name0,p1->
name)!
=0)&
&
(p1!
=NULL))/*根据各种情况判断可能性*/
{p2=p1;
p1=p1->
}/***************指针向后移一个位置****************/
if(strcmp(name0,p1->
name)==0)/******找到要删除的位置*******/
{if(p1==head)head=p1->
elsep2->
next=p1->
\n\t**************Deletesuccess!
******************\n"
else
\n\t**************Deletefail!
/*没找到要删除的位置*/
⑸查询模块
按照题目的要求查询可以分为姓名查询和电话号码查询
voidFind()/***********定义一个查询的函数**************/
charphnum1[20],name1[10];
\n\t*******Searchbynameorphpnum?
*****name(n=0)\phnum(n=1)*********\n"
*******Inputthenumberof'
n'
:
/*******************选择查询方式******************/
if(n==0)/****************姓名查询***************/
{printf("
\n\tname:
p3=head;
gets(name1);
name1);
/*****************输入姓名***************/
while((strcmp(name1,p3->
(p3!
p3=p3->
if(p3->
name==NULL)/**************没有找到**************/
\n\t**************Cannotfindthemessage!
elseif(strcmp(name1,p3->
name)==0)/******找到信息并输出******/
\n\t*********Foundthemessage:
**********\n"
%s"
p3->
\taddress:
elseif(n==1)/***************电话号码查询***************/
\n\tphnum1"
gets(phnum1);
phnum1);
/****************输入电话号码***************/
while((strcmp(phnum1,p3->
phnum)!
if(p3->
phnum==NULL)/***************没有找到**************/
\n\t************Cannotfindthemessage!
***********"
elseif(strcmp(phnum1,p3->
phnum)==0)/******找到信息并输出******/
\n\n\t**********Foundthemessage:
*********"
⑹修改模块
按照题目的要求查询可以分为修改姓名和修改电话号码,修改模块的设计思路和查询模块的思路基本上相同。
[流程图]
voidAlter()/***************定义一个修改的函数*****************/
{intm;
charphnum2[20],name2[10];
\n\n\t****Whichmessagedoyouwanttoalter?
*******name(m=0)\phnum(m=1)*********\n"
************Inputthenumberof'
m'
m);
/*******************选择修改内容******************/
if(m==0)/*********************修改姓名*********************/
name2);
/**************输入要修改的姓名***************/
p4=head;
while((strcmp(name2,p4->
(p4!
p4=p4->
if(p4==NULL){printf("
\n\t*********Cannotfindthemame!
elseif(strcmp(name2,p4->
name)==0)/********找到要修改的姓名********/
\n\n\t*********Inputthenewnessage:
************\n"
\n\n\n\t\tname:
canf("
/**********输入新的信息**********/
strcpy(p4->
name,name2);
/*******新的姓名修改成功*******/
\n\n\t************Alteredsuccess!
elseif(m==1)/***************修改电话号码***************/
\n\tphnum:
phnum2);
/************输入要修改的电话号码***************/
p4=head;
while((strcmp(phnum2,p4->
if(p4==NULL)
\n\t************Cannotfindthephnum!
*********\n"
elseif(strcmp(phnum2,p4->
phnum)==0)/******找到要修改的电话号码*****/
\n\n\t**********Inputthenewnessage:
\n\n\n\t\tphnum:
phnum2);
phnum,phnum2);
/*******新的电话号码修改成功*******/
⑺保存模块
voidSave()/************定义一个保存信息的函数************/
{intj;
fp=fopen("
for(p5=head,j=0;
p5!
=NULL;
j++,p5=p5->
next)/*将信息装出入结构体数组在出入链表中*/
{strcpy(persons[j].name,p5->
strcpy(persons[j].addr,p5->
strcpy(persons[j].phnum,p5->
strcpy(persons[j].email,p5->
fwrite(&
persons[j],sizeof(structpersons),1,fp);
6.程序代码
#include<
stdio.h>
stdlib.h>
string.h>
#defineMAX100
structpersons
{
charname[10];
charemail[20];
}persons[MAX];
typedefstructp{
charname[10];
charphnum[20];
voidcreat()
{j=fgetc(fp);
{fp=fopen("
voidAdd()
{s=(linklist)malloc(sizeof(p));
\n\n\t\t