c语言课程设计通讯录管理系统.docx
- 文档编号:9161697
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:19
- 大小:360.65KB
c语言课程设计通讯录管理系统.docx
《c语言课程设计通讯录管理系统.docx》由会员分享,可在线阅读,更多相关《c语言课程设计通讯录管理系统.docx(19页珍藏版)》请在冰豆网上搜索。
c语言课程设计通讯录管理系统
《C程序设计》课程设计报告
通讯录管理系统
一、设计目的与内容
设计一个简单通讯录管理系统,可以存储以下数据:
姓名,地址,邮编,Email,qq,编号,年龄。
手机号码。
并且可以实现增加或删除记录、按人名或电话号码进行查询记录、对记录中的姓
名和电话号码进行修改、利用文件保存记录、显示所有保存的记录等功能。
核心数据结构用到的结构体采用动态内存分配和链表结构。
使用文件进行存储和管理。
程序启动时可从文件中读取通信信息,或从键盘输入通信
信息;运行过程中如添加或删除记录时也可对文件进行存取;退出前可选择将学生信息
保存到文件中。
通讯录管理系统
二、算法的基本思想
功能
模块
数据结构定义如下:
一、structperson
二、{charname[10];
三、charaddr[20];
四、charpostnumber[10];
五、charemail[25];
六、charQQ[15];
七、charphone[15];
八、intage;
九、intnum;
一十、structperson*next;
一十一、};//定义结构体输入模块
1从键盘输入数据:
通过主函数调用insert函数,并将adr头指针传递给insert函数,执行函数,通过指针开辟空间并且输入结构体数据建立起一个链表,用t指针指向第一个结点,调用结束后,将t指针返回到调用位置处赋值给adr指针。
2从文件读入数数据:
运行程序时,通过主函数调用read函数,在read函数中读出文件contact.dat中存储的数据并显示在屏幕上,在read函数中定义了指向结构体的指针p,q,head,通过动态内存分配不断开辟一个结构体大小的空间节点,把从文件中读出的数据存储到开辟的空间中,通过p,q指针的移动将各节点连接成一个链表,使head指向头结点,将head指针返回到调用位置处赋值给adr指针。
一十二、查询模块
在此模块中可以实现按姓名或电话号码查询记录功能,通过主函数调用namesearch或phonesearch函数,在函数中输入要查询的记录的人名或电话号码,通过指针p从指向链表的头结点开始将节点中的姓名或电话号码与要查找的姓名或电话号码进行比较,若相等,则将此节点数据输出到屏幕,若p指向最后一个节点时,依然没找到查询的记录的人名或电话号码,则显示查找的内容不存在。
一十三、更新模块
通过增加、删除、修改记录,实现模块更新。
增加记录即为从键盘输入记录,删除和修改记录依然通过删除和修改链表中的节点来实现,删除或修改时,在函数中输入要删除或修改的记录的人名,通过指针p从指向链表的头结点开始查找需要删除或修改的记录,若找到则通过移动指针p实现删除或修改操作。
四、输出模块
创建链表完成时可以将链表数据输出到文件contact.dat中。
程序运行时可从此文件中读出数据到屏幕中,并自动创建一个链表,并将指向链表头结点指针p返回到调用处,以保证程序能继续执行其他模块。
三、主要功能模块流程图
四、系统测试
运行界面如下:
五、结论
按要求定义了一个结构体数组,程序运行时能够实现增加通讯录、删除通讯录、按姓名和电话号码查询通讯录、修改通讯录、通过文件存取通讯录等功能。
若文件中已存储记录,程序启动时可从文件中读取通信信息,并可继续进行其他模块。
能够当然程序也难免有缺陷,在现实通讯录时,没有增加显示总人数功能,程序运行界面不够简洁、美观。
六、源程序
#include
#include
#include
#include
structperson
{charname[10];
charaddr[20];
charpostnumber[10];
charemail[25];
charQQ[15];
charphone[15];
intage;
intnum;
structperson*next;
};//定义结构体
structperson*insert(structperson*t)/*增加记录功能*/
{
structperson*p,*e;
e=(structperson*)malloc(sizeof(structperson));
printf("姓名:
");
scanf("%s",e->name);
printf("通讯地址:
");
scanf("%s",e->addr);
printf("邮编:
");
scanf("%s",e->postnumber);
printf("email:
");
scanf("%s",e->email);
printf("QQ:
");
scanf("%s",e->QQ);
printf("电话:
");
scanf("%s",e->phone);
printf("年龄:
");
scanf("%d",&e->age);
printf("编号:
");
scanf("%d",&e->num);
if(t==NULL)
{
t=e;
p=e;
p->next=NULL;
}
else
{p=t;
while(p->next!
=NULL)p=p->next;
e->next=NULL;
p->next=e;
}
returnt;
}
structperson*clear(structperson*t)/*删除记录功能*/
{intm=0;
charname[10];
structperson*p=t,*q;
printf("输入需要删除记录的姓名:
");
scanf("%s",name);
for(;p!
=NULL;q=p,p=p->next)
if(strcmp(p->name,name)==0)
{m++;
break;
}
if(p==t)
t=t->next;
else
{
q->next=p->next;
free(p);
}
if(m==0)
printf("对不起,删除失败.\n");
else
printf("删除成功!
\n");
returnt;
}
voidmodify(structperson*t)/*修改记录功能*/
{
structperson*p=t;
intc,a=0;
charname[10];
printf("请输入需要修改的记录的姓名:
");
scanf("%s",name);
for(;p!
=NULL;p=p->next)
{
if(!
strcmp(p->name,name))
{a++;
break;
}
}
if(a==0)
{printf("要修改的记录不存在.\n");
return;
}
while
(1)
{system("cls");
printf("\n1修改姓名2修改地址3修改邮编4修改EMAIL5修改QQ6修改电话7修改年龄8修改编号9退出修改:
\n");
printf("请选择需要修改的内容:
");
scanf("%d",&c);
switch(c)
{case1:
printf("\n请输入修改后的姓名:
");
scanf("%s",p->name);
break;
case2:
printf("\n请输入修改后的地址:
");
scanf("%s",p->addr);
break;
case3:
printf("\n请输入修改后的邮编:
");
scanf("%s",p->postnumber);
break;
case4:
printf("\n请输入修改后的EMAIL:
");
scanf("%s",p->email);
break;
case5:
printf("\n请输入修改后的QQ:
");
scanf("%s",p->QQ);
break;
case6:
printf("\n请输入修改后的电话:
");
scanf("%s",p->phone);
break;
case7:
printf("\n请输入修改后的年龄:
");
scanf("%d",&p->age);
break;
case8:
printf("\n请输入修改后的编号:
");
scanf("%d",&p->num);
break;
default:
break;
}
if(c==9)
{printf("修改完毕!
\n");
break;
}
}
}
voidnamesearch(structperson*t)/*按人名查找显示记录*/
{intm=0;
structperson*p=t;
charname[10];
printf("请输入需要查找的姓名:
");
scanf("%s",name);
for(;p!
=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
{m++;
printf("姓名\t地址\t邮编\tEMAIL\tQQ\t电话\t年龄\t编号\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\n",p->name,p->addr,p->postnumber,p->email,p->QQ,p->phone,p->age,p->num);
break;
}
}
if(m==0)
printf("对不起,您要查找的内容不存在!
\n");
}
voidphonesearch(structperson*t)/*按电话号码查找显示记录功能*/
{intn=0;
structperson*p=t;
charphone[12];
printf("请输入需要查找的号码:
");
scanf("%s",phone);
for(;p!
=NULL;p=p->next)
{
if(strcmp(p->phone,phone)==0)
{n++;
printf("姓名\t地址\t邮编\tEMAIL\tQQ\t电话\t年龄\t编号\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\n",p->name,p->addr,p->postnumber,p->email,p->QQ,p->phone,p->age,p->num);
break;
}
}
if(n==0)
printf("对不起,您要查找的内容不存在!
\n");
}
voidsave(structperson*t)/*记录保存为文件功能*/
{structperson*p=t;
FILE*fp;
if((fp=fopen("contact.dat","wb"))==NULL)
{printf("无法打开此文件\n");
return;
}
else
while(p!
=NULL)
{fwrite(p,sizeof(structperson),1,fp);
p=p->next;
}
printf("恭喜您,文件已保存!
\n");
fclose(fp);
}
structperson*read()/*从文件中读记录功能*/
{structperson*p,*q,*head;
FILE*fp;
if((fp=fopen("contact.dat","rb"))==NULL)
{printf("无法打开此文件\n");
returnNULL;
}
printf("----------------------------------------------------------------------\n");
printf("姓名\t地址\t邮编\tEMAIL\tQQ\t电话\t年龄\t编号\n");
head=p=q=(structperson*)malloc(sizeof(structperson));
while(fread(p,sizeof(structperson),1,fp)==1)
{q=p;
printf("%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\n",p->name,p->addr,p->postnumber,p->email,p->QQ,p->phone,p->age,p->num);
p=(structperson*)malloc(sizeof(structperson));
q->next=p;
}
q->next=NULL;
printf("------------------------------------------------------------------------\n");
fclose(fp);
returnhead;
}
voidmain()//主函数代码
{
structperson*adr=NULL;
intchoice;
while
(1)
{system("color1c");//修改控制台程序色彩
system("pause");//暂停程序
system("cls");//清屏
printf("**************欢迎进入通讯录!
***********\n");
printf("**************系统功能菜单**************\n");
printf("########################################\n");
printf("########################################\n");
printf("\t\t1增加通讯记录\t\t\n");
printf("|_______________________________________|\n");
printf("\t\t2删除通讯记录\t\t\n");
printf("|_______________________________________|\n");
printf("\t\t3修改记录\t\t\n");
printf("|_______________________________________|\n");
printf("\t\t4按人名查找通讯记录\t\n");
printf("|_______________________________________|\n");
printf("\t\t5按电话号码查找通讯记录\n");
printf("|_______________________________________|\n");
printf("\t\t6记录保存为文件\t\t\n");
printf("|_______________________________________|\n");
printf("\t\t7从文件中读记录\t\t\n");
printf("|_______________________________________|\n");
printf("\t\t0退出通讯录程序\t\t\n");
printf("|_______________________________________|\n");
printf("#########################################\n");
printf("#########################################\n");//菜单界面
printf("\t\t请输入您需要的服务类型:
");//选择程序功能
scanf("%d",&choice);
switch(choice)
{
case1:
adr=insert(adr);
break;
case2:
adr=clear(adr);
break;
case3:
modify(adr);
break;
case4:
namesearch(adr);
break;
case5:
phonesearch(adr);
break;
case6:
save(adr);
break;
case7:
adr=read();
break;
default:
break;
}
if(choice==0)
{printf("程序已退出,谢谢您的使用!
\n");
break;}
}
}
7.小结
在这次c语言课程中,我真正了解了c语言编程的风格,对它的模块化设计和可移植性有了进一步了解,也了解了结构体,链表和文件的一些知识,懂得了一些程序界面设计的技巧,也知道了函数在c程序中的重要性,相信对以后学习工作有很大的帮助。
最后谢谢同学和老师的指教。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 通讯录 管理 系统