通讯录管理系统.docx
- 文档编号:25262698
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:23
- 大小:339.66KB
通讯录管理系统.docx
《通讯录管理系统.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统.docx(23页珍藏版)》请在冰豆网上搜索。
通讯录管理系统
C程序设计实习报告
题目:
通讯录管理系统
学院:
机械与电子信息学院
专业:
机械设计制造及其自动化
姓名:
班级学号:
指导教师:
2011年7月日
目录
1、需求分析……………………………………………………………………………………3
2、概要设计……………………………………………………………………………………3
3、详细设计……………………………………………………………………………………4
4、测试、结果进行分析………………………………………………………………………13
5、总结…………………………………………………………………………………………15
6、参考文献……………………………………………………………………………………16
7、附录…………………………………………………………………………………………16
1.需求分析
设计要求:
实用C语言中有关链表及外部文件的内容,设计出通讯录管理系统。
建立通讯录信息,信息包含姓名、工作地点、电话、电子邮箱等;
提供添加、删除和修改通讯录信息的功能;
提供按不同方式查询的功能;如按姓名或电话查询;
将通讯录保存在文件中;
能够输出通讯录信息。
系统功能需求分析:
由于通讯录涉及到多个不同的数据组合成一个有机的整体,故使用结构体来实现。
而且链表能够动态地进行存储分配,根据需要开辟新的内存,没有浪费系统的内存资源,故采用链表结构。
整个程序使用多个函数,分别实现了创建、查找、删除、修改、存储、读取等功能。
2.概要设计
设计思想
本系统首先设计出了主函数,然后根据要实现的功能分别设计拉创建、添加、删除、查找、修改、保存功能的子函数。
在显示的函数设计过程中首先运用了文件的读取等必要的知识通过把文件的内容读取到内存然后打印出来。
删除函数的设计是首先从文件内找到要删除的人,然后通过写一个实现删除目的的FOR循环将该人从内存里删除,然后再用写入文件的方式将内存链表内的信息写入文件,实现删除。
查找用一个字符串对比的方法找出用户要查找的人,然后打印出来。
修改也大体和删除相同,添加函数在设计时通过申请一段内存空间,
然后通过指针将需要添加的信息添加进去,从而实现添加功能。
软件运行与开发平台
windows2000/xpVC++6.0
数据结构
charname[10]姓名
charworkplace[30]工作地点
charphonenumber[16]电话号码
charemail[50]电子邮件
系统结构图:
3.详细设计
系统流程图
1)结构体
structaddress_book//通讯录
{
charname[10];//姓名
charworkplace[30];//工作地点
charphonenumber[16];//电话号码
charemail[50];//电子邮件
structaddress_book*next;
};
2)创建模块
主程序:
structaddress_book*create(void)
{
structaddress_book*head,*p1,*p2;
n=0;
p1=(structaddress_book*)malloc(LEN);
p2=p1;
printf("请输入通讯录的内容!
姓名输入为空时表示创建完毕!
\n");
printf("请输入姓名:
");
scanf("%s",&p1->name);
printf("请输入工作单位:
");
scanf("%s",&p1->workplace);
printf("请输入电话号码:
");
scanf("%s",&p1->phonenumber);
printf("请输入电子邮件:
");
scanf("%s",&p1->email);
printf("\n");
head=NULL;
while(strcmp(p1->name,"0")!
=0)
{
n=n+1;
if(n==1)
head=p1;//初始化链表
else
p2->next=p1;
p2=p1;
p1=(structaddress_book*)malloc(LEN);//开辟内存
printf("请输入姓名:
");
scanf("%s",&p1->name);
printf("请输入工作单位:
");
scanf("%s",&p1->workplace);
printf("请输入电话号码:
");
scanf("%s",&p1->phonenumber);
printf("请输入电子邮件:
");
scanf("%s",&p1->email);
printf("\n");
}
p2->next=NULL;
return(head);
}
3)删除模块:
主函数:
structaddress_book*del(structaddress_book*head)
{
charname[10];
structaddress_book*p1,*p2;
printf("请输入要删除的姓名:
");
scanf("%s",name);
if(head==NULL)//链表为空
{
printf("通讯录为空\n");
return(head);
}
else
{
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("删除成功!
\n");
n=n-1;
}
else
printf("没有找到指定的姓名:
%s\n",name);
return(head);
}
}
4)修改模块
主程序:
structaddress_book*modify(structaddress_book*head)
{
structaddress_book*p1,*p2;
charname[10];
if(head==NULL)//链表为空
{
printf("通讯录为空,无法查找!
\n");
return(head);
}
else
{
p1=head;
printf("************************************************************\n");
printf("请输入要修改的姓名:
");
scanf("%s",name);
while(strcmp(p1->name,name)!
=0&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name,name)==0)//找到
{
printf("请输入姓名:
");
scanf("%s",&p1->name);
printf("请输入工作单位:
");
scanf("%s",&p1->workplace);
printf("请输入电话号码:
");
scanf("%s",&p1->phonenumber);
printf("请输入电子邮件:
");
scanf("%s",&p1->email);
printf("修改成功!
\n");
}
else
printf("此姓名不存在\n");
}
return(head);
}
5)查询模块
主函数
structaddress_book*queryname(structaddress_book*head)
{
structaddress_book*p1,*p2;
intm;
charname[10];
if(head==NULL)
{
printf("通讯录为空,无法查找!
\n");
return(head);
}
else
{
p1=head;
printf("****************************************************************\n");
printf("请输入要查询的姓名:
");
m=0;
scanf("%s",name);
while(p1!
=NULL)
{
if(strcmp(p1->name,name)!
=0&&p1->next!
=NULL)//未找到且未结束
{
p2=p1;
p1=p1->next;
}
elseif(strcmp(p1->name,name)==0)//找到输出并提出循环
{
m=1;
printf("\n");
printf("****************************************************************\n");
printf("%s%s%s%s\n",p1->name,p1->workplace,p1->phonenumber,p1->email);
printf("****************************************************************\n");
break;
}
else{
printf("您查找的姓名不存在!
");
break;//跳出循环
}
}
}
return(head);
}
//号码查询
structaddress_book*querynumber(structaddress_book*head)
{
structaddress_book*p1,*p2;
charnum[10];
if(head==NULL)//空链表
{
printf("通讯录为空,无法查找!
\n");
return(head);
}
else
{
p1=head;
printf("****************************************************************\n");
printf("请输入要查询的号码:
");
scanf("%s",num);
while(p1!
=NULL)
{
if(strcmp(p1->phonenumber,num)!
=0&&p1->next!
=NULL)//未找到且继续读取
{
p2=p1;
p1=p1->next;
}
elseif(strcmp(p1->phonenumber,num)==0)//找到输出跳出循环
{
printf("\n");
printf("****************************************************************\n");
printf("%s%s%s%s\n",p1->name,p1->workplace,p1->phonenumber,p1->email);
printf("****************************************************************\n");
break;
}
else{
printf("此号码不存在\n");
break;
}
}
}
return(head);
}
//写入文件
voidwrite(structaddress_book*head)
{
FILE*fp;//文件指针
structaddress_book*p1;
fp=fopen("list.txt","w");//打开文件
if(fp==NULL)
{
printf("不能打开文件!
!
1\n");
return;
}
else
{
p1=head;
for(;p1!
=NULL;)
{
fprintf(fp,"%s%s%s%s\n",p1->name,p1->workplace,p1->phonenumber,p1->email);//写入函数
p1=p1->next;
}
printf("保存完毕\n");}
fclose(fp);//关闭文件
}
6)公共模块
读取文件
主程序代码
structaddress_book*read(structaddress_book*head)
{
FILE*fp;
structaddress_book*p1,*p2;
fp=fopen("list.txt","r");
if(fp==NULL)
{
printf("不能打开文件!
!
1\n");
return(head);
}
else
{
head=release(head);//释放内存
p1=(structaddress_book*)malloc(LEN);//开辟内存
fscanf(fp,"%s%s%s%s",&p1->name,&p1->workplace,&p1->phonenumber,&p1->email);//读取文件
if(feof(fp)!
=0)
{
printf("当前通讯录为空!
\n");
return(head);
}
else
{
rewind(fp);//重新定位到文件开头
p2=p1;
head=p1;//链表初始化
n=0;
while(feof(fp)==0)//继续读取
{
fscanf(fp,"%s%s%s%s",&p1->name,&p1->workplace,&p1->phonenumber,&p1->email);
if(feof(fp)!
=0)
break;
p2->next=p1;
p2=p1;
p1=(structaddress_book*)malloc(LEN);
n=n+1;
}
p2->next=NULL;//链表结尾
return(head);
}
}
fclose(fp);//关闭文件
}
写入文件
voidwrite(structaddress_book*head)
{
FILE*fp;//文件指针
structaddress_book*p1;
fp=fopen("list.txt","w");//打开文件
if(fp==NULL)
{
printf("不能打开文件!
!
1\n");
return;
}
else
{
p1=head;
for(;p1!
=NULL;)
{
fprintf(fp,"%s%s%s%s\n",p1->name,p1->workplace,p1->phonenumber,p1->email);//写入函数
p1=p1->next;
}
printf("保存完毕\n");}
fclose(fp);//关闭文件
}
释放内存
structaddress_book*release(structaddress_book*head)
{
structaddress_book*p1;
while(head!
=NULL)//逐步释放head
{
p1=head;
head=head->next;
free(p1);
}
return(head);
}
4、测试、结果进行分析
主界面菜单
创建通讯录
删除记录
修改记录
查询记录
5、总结
通过本次课程设计深刻认识到C程序具有如下优点:
vc语言功能丰富、表达能力强、使用灵活方便、应用面广、目标效率高、可移植性好,既具有高级语言的许多优点,又具有低级语言的许多特点,因此特别适合于编写系统软件。
vc语言之所以能存在和发展,并具有较强的生命力,总是有其于其他语言的特点vc语言的主要特点如下:
1)语言简洁,紧凑,使用方便,灵活。
2)运算符丰富。
3)数据类型丰富,具有现代语言的各种数据结构。
4)具有结构化的控制语句。
5)语法限制不太严格,程序设计自由度大。
6)vc语言允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
7)生成目标代码质量高,程序执行效率高。
8)用vc语言编写的程序可移植性好(与汇编语言相比)。
在本次课程设计中,通过与老师交流,学到了许多关于调试程序和检查错误的技巧。
(1)先进行人工检查。
在写好一个程序后,不应匆匆上机,而应对纸面上的程序进行人工检查。
这一步非常重要,可以发现由于疏漏而造成的多出错误。
(2)人工检查后,进行上机调试,根据提示信息具体找出程序中的错误,有时提示的出错行并不是真正出错的行,如果本行找不到,则到上一行寻找。
如果系统错误过多,应从上到下逐一更正,可能仅有少数关键性错误。
6、参考文献
C语言设计(第三版)谭浩强
C语言课程设计与学习指导张冬梅刘远兴陈晶王媛妮
7、附录:
//结构体
structaddress_book
//释放内存
structaddress_book*release(structaddress_book*head)
//创建函数
structaddress_book*create(void)
//修改函数
structaddress_book*modify(structaddress_book*head)
//删除函数
structaddress_book*del(structaddress_book*head)
//输出函数
voidprint(structaddress_book*head)
//增加函数
structaddress_book*insert(structaddress_book*head)
//姓名查询
structaddress_book*queryname(structaddress_book*head)
//号码查询
structaddress_book*querynumber(structaddress_book*head)
//写入文件
voidwrite(structaddress_book*head)
//读取文件
structaddress_book*read(structaddress_book*head)
//菜单函数
voidmenu()
//主函数
voidmain()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 管理 系统