C语言课程设计通讯录管理系统Word文档格式.docx

上传人:b****6 文档编号:18143353 上传时间:2022-12-13 格式:DOCX 页数:27 大小:465.88KB
下载 相关 举报
C语言课程设计通讯录管理系统Word文档格式.docx_第1页
第1页 / 共27页
C语言课程设计通讯录管理系统Word文档格式.docx_第2页
第2页 / 共27页
C语言课程设计通讯录管理系统Word文档格式.docx_第3页
第3页 / 共27页
C语言课程设计通讯录管理系统Word文档格式.docx_第4页
第4页 / 共27页
C语言课程设计通讯录管理系统Word文档格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

C语言课程设计通讯录管理系统Word文档格式.docx

《C语言课程设计通讯录管理系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言课程设计通讯录管理系统Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。

C语言课程设计通讯录管理系统Word文档格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1