利用c语言实现电话簿管理系统课程设计.docx
《利用c语言实现电话簿管理系统课程设计.docx》由会员分享,可在线阅读,更多相关《利用c语言实现电话簿管理系统课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
![利用c语言实现电话簿管理系统课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/21/c971243f-7cbb-426d-b679-ce4c6980dbdf/c971243f-7cbb-426d-b679-ce4c6980dbdf1.gif)
利用c语言实现电话簿管理系统课程设计
课程设计(论文)
电话簿管理系统VER1.0
系别:
计算机科学与技术系
专业(班级):
作者(学号):
指导教师:
完成日期:
2011年6月15日
蚌埠学院教务处制
摘要
电话簿管理系统是利用单链表实现电话簿管理,进而掌握C语言中的结构体、链表,指针、函数(系统函数,自定义函数)等C语言知识。
本文通过利用模块化程序设计思想,使用单链表和结构体等编写出的可以实现存储、打印、删除等功能的电话簿管理系统。
通过完成这个课程设计让我们熟悉并掌握在c语言中使用结构体、单链表,指针,函数,和模块化设计思想。
关键词结构体,链表,指针,函数
第一章前言
在前面我们学习了c语言的一些基础知识对c语言有了初步的认识和了解,为了让我们更加全面地了解c语言程序设计的步骤和方法,在老师的指导下我们进行了一次综合实训。
设计一个简单的电话簿管理系统,可以存储,删除等电话号码。
为了方便使用DEV-C++来编写程序,可以添加汉字备注方便理解程序。
根据前面所学的单链表、指针、函数、结构体等知识在使用模块化设计思想去编写。
设计“通讯录管理系统”使其具有数据插入、修改、删除、显示和查询等功能。
使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
其功能包括以下各项:
1)数据包括:
人名、电话号码。
2)可对记录中的姓名和电话号码进行修改。
3)可增加或删除记录。
4)可显示所有保存的记录。
第二章电话簿管理系统介绍
2.1流程图
电话簿管理系统因具备以下功能有流程图表示,如下图2.10
图2.10
2.2程序编写概要
1主函数main()
主函数使用户进入电话簿管理系统主界面——用户选择界面,用户可以选择要使用的功能并选择相应的选项进入该功能。
使用printf函数和switchcase结构来编写主函数。
2creat()函数
creat函数用来建立新的电话号码簿,用户可以通过它来向系统输入数据。
为下面的操作提供数据。
3delete函数
delete函数用来删除不需要的数据,可以用单链表来实现,并要记住用free函数来释放被删除链表的空间,避免浪费空间。
4save函数
当需要保存已输入的数据时就需要用到save函数,该函数可以将数据存储到指定的地方为以后使用。
5load函数
顾名思义load函数是将所存的数据从文件所在位置读取出来以便做打印等处理。
6search函数
当存入很多文件时候,再用普通的方法打印输出所有数据再查找文件中的目标文件就会很麻烦,这时你需要从已存文件中快速找出你所想要的用户的电话号码就要选择此功能,他可以快速找出你所输入用户名的电话号码,简单方便。
7append函数
Append函数用来像已有的文件中添加新的电话号码文件。
8modify函数
在你无意中或心急的时候很有可能将数据输入错误,所以你还需要具有修改数据的功能,将错误的数据重新输入在进行保存工作,确保数据的正确性,modify函数具有该功能。
第三章主要功能实现
3.1删除功能设计
单链表中的元素是可以删除的,要想删除指定的元素逻辑上是把它从单链表中分离出来,并调用free函数释放其储存空间。
算法如下:
删除链表中的第i个结点,就是要让其前驱的指针绕过该结点,指向该结点的后续结点。
假设指针P已经指向链表中的第i-1个结点,如图3.10所示。
则删除a[i]结点最基本的操作可以用一条语句实现:
p->next=p->next->next。
headp
…
图3.10
这样操作会浪费掉所有删除的结点空间。
如果被删除的结点不再使用了,则释放其存储空间,因此需要按如下方式实现:
temp=p->next;
p->next=temp->next;
free(temp);
3.2添加功能设计
链表的插入是指将一个结点插入到一个已有的链表中去。
算法如下:
首先产生新结点,并放入数据,然后搜索要插入的位置,再将结点连入到已有链表中。
设指针p已经指向了a[i-1]结点,且要插入结点(值为data)由s指向,如图3.20所示,则插入的操作由下面两个语句来实现。
s->next=p->next;
p->next=s;
上面的两条插入语句顺序不可颠倒。
P
X
S
图3.20
第四章源程序
#include
#include
#include
#include/*不是c标准的文件。
*/
#defineIDstructtel
structtel
{
charname[10];
chartel[11];
ID*next;
};
inttotal=0;
ID*create()
{
ID*head,*p1,*p2;
voidsave(ID*head);
charsaveflag;
head=p1=p2=NULL;
printf("欢迎使用电话簿管理系统VER1.0\n");
while
(1)
{
p1=(ID*)malloc(sizeof(ID));
printf("请输入姓名,以#作为结尾\n");
scanf("%s",p1->name);
if(strcmp(p1->name,"#")==0)
{
if(total==0)
{
printf("你输入了0条记录,单链表没有创建...\n");
free(p1);
return(head);
}
else
{
break;
}
}
printf("请输入电话号码:
\n");
scanf("%s",p1->tel);
if(head==NULL)
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
total++;
}
p2->next=NULL;
free(p1);
printf("\n新建电话号码簿成功,共有%d个联系人,是否保存?
Y/N\n",total);
getchar();
scanf("%c",&saveflag);
if(saveflag=='y'||saveflag=='Y')
save(head);
else
printf("\n请在退出程序之前,保存当前的编辑工作!
\n");
returnhead;
}
voidprint(ID*head)
{
ID*temp;
temp=head;
system("cls");/*清屏*/
printf("姓名:
\t电话号码:
\n");
if(head==NULL)
{
printf("当前链表为空,请先创建新的链表或者加载文件\n");
}else
do
{
printf("%s\t%s\n",temp->name,temp->tel);
temp=temp->next;
}while(temp!
=NULL);
}
voidsave(ID*head)
{
FILE*fp;
ID*t;/*定义一个可以移动的指针,作用:
从头到尾遍历一遍单链表,向文件中写入*/
if((fp=fopen("telephone.txt","w"))==NULL)
{
printf("打开文件失败!
\n");
getch();
exit
(1);
}
printf("正在保存文件,请稍候...\n");
t=head;
while(t!
=NULL)
{
fwrite(t,sizeof(ID),1,fp);
t=t->next;
}
fclose(fp);
printf("文件保存成功\n");
}
ID*load()
{
FILE*fp;
ID*t1,*t2,*head=NULL;
charch;
if((fp=fopen("telephone.txt","r"))==NULL)/*判断文件是否存在*/
{
printf("打开文件失败!
没有该文件\n");
getch();
exit
(1);
}
ch=fgetc(fp);/*判断文件是否为空*/
if(ch==EOF)
{
printf("文件为空,请重新建立一个电话簿\n");
return(head);
}
else
{
printf("文件正在读取中...\n");rewind(fp);
}
t1=(ID*)malloc(sizeof(ID));
head=t1;
while(!
feof(fp))
{
if(fread(t1,sizeof(ID),1,fp)!
=1)
break;/*如果没有读取的内容,则结束*/
t1->next=(ID*)malloc(sizeof(ID));
t2=t1;
t1=t1->next;
}
t2->next=NULL;
fclose(fp);
printf("文件读取完毕\n");
returnhead;
}
voidsearch(ID*head)
{
printf("欢迎使用查找功能,只需要输入待查找者姓名的首字母:
\n");
ID*p;
intflag,searchflag=1;
charc,choice;
while(searchflag)
{
flag=0;
printf("\n请输入待查找者姓名的首字母:
\n");
scanf("%c",&c);
getchar();
p=head;
while(p!
=NULL)
{
if(p->name[0]==c)
{
printf("姓名:
%s\t电话号码:
%s\n",p->name,p->tel);
flag=1;
}
p=p->next;/*p1指针向后移动一位*/
}
if(flag==0)
printf("\n对不起,未能找到符合条件的记录\n");
printf("\n查找完毕,是否需要重新查询?
Y/N");
scanf("%c",&choice);
getchar();
if(choice=='y'||choice=='Y')
{
searchflag=1;
}
else
{
searchflag=0;
system("cls");
}
}
}
ID*delete_(ID*head)
{
ID*p1,*p2;
charsaveflag;
p1=p2=head;
chars[10];/*存放查找姓名*/
system("cls");
printf("请输入要删除的姓名:
");
scanf("%s",s);
while(strcmp(p1->name,s)&&p1!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1==NULL)
printf("对不起,没有找到要删除的姓名记录,请检查你要删除的姓名是否正确");
else
{
printf("你要删除的电话记录为:
\n");
printf("姓名%s\t电话号码%s\n",p1->name,p1->tel);
printf("请确定是否要删除该记录?
Y/N?
\n");
getchar();
scanf("%c",&saveflag);
if(saveflag=='y'||saveflag=='Y')
{
getchar();
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
free(p1);
printf("正在删除记录,请稍后...\n");
printf("该电话记录已删除成功,是否存盘?
Y/N?
\n");
getchar();/*吸收回车*/
scanf("%c",&saveflag);
if(saveflag=='y'||saveflag=='Y')
save(head);
else
printf("请在退出之前保存当前的编辑工作!
\n");
}
else
printf("该电话记录没有被删除\n");
}
return(head);
}
/*添加单链表*/
ID*append(ID*head)
{
charsaveflag;
ID*p1,*p2,*info;
p1=p2=head;
info=(ID*)malloc(sizeof(ID));
system("cls");
while(p1!
=NULL)
{
p2=p1;
p1=p1->next;
}
printf("请输入添加的姓名:
");
scanf("%s",info->name);
printf("请输入添加的号码:
");
scanf("%s",info->tel);
info->next=NULL;
if(p1==head)
head=info;
else
p2->next=info;
printf("新添加电话号码成功,是否存盘?
Y/N?
\n");
getchar();/*吸收回车*/
scanf("%c",&saveflag);
if(saveflag=='y'||saveflag=='Y')
save(head);
else
printf("请在退出之前保存当前的编辑工作!
\n");
return(head);
}
/*修改单链表*/
ID*modify(ID*head)
{
ID*p1;ID*p2;
charsaveflag;
p1=p2=head;
chars[10];/*存放查找姓名*/
system("cls");
printf("请输入要修改的姓名:
");
scanf("%s",s);
while(strcmp(p1->name,s)&&p1!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1==NULL)
printf("对不起,没有找到要修改的姓名记录\n");
else
{
printf("你要修改的电话记录为:
\n");
printf("姓名%s\t电话号码%s\n",p1->name,p1->tel);
printf("请输入修改后的号码:
");
scanf("%s",p1->tel);
printf("该电话记录已修改成功\n");
printf("新建电话号码成功,是否存盘?
Y/N?
\n");
getchar();/*吸收回车*/
scanf("%c",&saveflag);
if(saveflag=='y'||saveflag=='Y')
save(head);
else
printf("请在退出之前保存当前的编辑工作!
\n");
}
return(head);
}
intmain()
{
ID*head=NULL;/*structtel*head;*/
intchoice;/*代表用户的选择*/
while
(1)/*死循环*/
{
printf("\n");
printf("\n");
printf("\n");
printf("\t\t**********************\n");
printf("\t\t*欢迎使用*\n");
printf("\t\t**********************\n");
printf("\t\t**********电话簿管理系统VER1.0**********\n");
printf("\t\t****1create建立新的电话号码簿****\n");
printf("\t\t****2delete删除新的电话号码****\n");
printf("\t\t****3print打印电话号码****\n");
printf("\t\t****4save保存电话号码簿****\n");
printf("\t\t****5load读取电话号码簿文件****\n");
printf("\t\t****6search查找电话号码****\n");
printf("\t\t****7append添加新的电话号码****\n");
printf("\t\t****8modify修改电话号码****\n");
printf("\t\t****9exit退出电话号码簿系统****\n");
printf("\t\t**********电话簿管理系统VER1.0**********\n");
scanf("%d",&choice);
getchar();/*吸收回车*/
switch(choice)
{
case1:
head=create();break;
case2:
head=delete_(head);break;
case3:
print(head);break;
case4:
save(head);break;
case5:
head=load();break;
case6:
search(head);break;
case7:
head=append(head);break;
case8:
head=modify(head);break;
case9:
exit(0);break;
default:
printf("选择错误,请在1-9之间选择\n");
}
}
return0;
}
第五章系统测试
1主界面
2输入内容
3打印内容
4删除
说明删除成功,程序基本成功
5查找
6增加
7修改
第五章结语
这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。
自己动手,自己发现和解决问题。
发现了自己的许多不足。
平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。
我相信在以后的学习能够解决好它们。
但是,收获还是不小的,我不仅对C的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。
当我选择通讯录这个题目时,一开始想运用大量链表及指针来完成,但是在慢慢琢磨之后,觉得这个不一定要用链表,于是改变了编程思路。
当然还有不少文件的读写问题,不过还是通过不断测试之后顺利解决了。
还有一点体会就是,书上和老师教的内容是有限的,我们需要不断地靠自己去学习,向他人请教,了解和掌握更多的知识,这样我们才能编出更好的C程序。
总体来说,这次C语言程序设计实验还是比较成功的,虽然最终程序还存在一些不足,但能取得这样的成绩我还是比较高兴的。
致谢
在整个程序设计的过程中,王老师给了我们很大的帮助,从论文的排版到程序的设计在到上机得调试老师不怕麻烦一一为我们指导,感谢王老师的重要帮助。
参考文献
[1]郭有强,《C语言程序设计》,清华大学出版社
[2]谭浩强,《C程序设计》,清华大学出版社
[3]刘振安,孙忱,刘燕君,《C程序设计课程设计》,机械工业出版社
[4]汪诗林,《数据结构算法与应用》,机械工业出版社
[5]李云清,杨庆红,揭安全.数据结构(C语言版)[M].北京:
人民邮电出版社
[6]李春葆.数据结构(C语言版)习题与解析[M].北京:
清华大学出版社