电话号码簿管理系统课程设计报告Word格式文档下载.docx
- 文档编号:5028307
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:28
- 大小:81.32KB
电话号码簿管理系统课程设计报告Word格式文档下载.docx
《电话号码簿管理系统课程设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《电话号码簿管理系统课程设计报告Word格式文档下载.docx(28页珍藏版)》请在冰点文库上搜索。
1、create建立新的电话号码簿
2、load读取电话号码簿
3、print打印电话号码簿
4、search查询电话号码
5、delete删除电话号码
6、append添加新的电话号码
7、modify修改电话号码
8、exit退出电话号码簿管理系统
请选择1-8之间的操作
图2电话号码簿管理系统主界面菜单
2.1.2根据所选菜单编写相应代码
定义结构体类型structtel,数据域charname[15];
chartel[12];
指针域ID*next(ID表示#defineIDstructtel)。
1、创建函数create:
利用循环输入的方式,将有关信息存入结构体,结构体根据实际的人数,采用动态方式建立单链表存储所有联系人信息,最后返回头指针head。
保存函数save:
头指针作形式参数,利用文件函数fopen建立一个文本文件来存放电话号码簿,将单链表中的联系人信息用循环的方式和函数fwrite写入文件,无返回值。
2、读取函数load:
无形式参数,利用文件函数fopen打开建立过的文本文件,在循环中利用fread函数依次读出文件中的信息,返回头指针。
3、打印函数print:
头指针作形式参数,定义一个临时变量ID*temp,利用此变量遍历单链表,同时输出联系人信息,如果没有联系人信息,则输出提示,无返回值。
4、查询函数search:
头指针作形式参数,利用双重循环,并且在内层循环中利用if语句实现查询功能,内层循环用来遍历单链表,外层循环用来实现是否继续查找功能,无返回值。
5、删除函数delete:
头指针作形式参数,利用双重循环,并且在内层循环中利用if语句实现查询并删除功能,内层循环用来遍历单链表,外层循环用来实现是否继续删除功能,无返回值。
6、添加函数append:
无形式参数,定义一个变量ID*temp,新联系人信息赋值予此变量中,利用fopen函数打开在create函数中建立的文件,在循环中依次输入联系人信息并利用fwrite函数将添加的信息存入文件中,无返回值。
7、修改函数modify:
头指针作形式参数,利用双重循环,内层循环用来遍历单链表,同时利用三个if语句分别找到待修改记录、确定是否修改、确定是否保存。
外层循环用来实现是否继续修改。
2.2模块图
图3电话号码簿管理系统模块图
2.3部分模块流程图
1主模块流程图
*haed=NULL
1?
输出主菜单
输入选择
(吸收回车)调用各子函数
图4主模块流程图
2create模块流程图
*head=*p1=*p2=NULL
为p1分配内存空间
输入姓名
输入的是‘#’
是否
total==0
是
否
返回head
退出循环
输入电话号码
head==NULL
head=p1
p2=p1
p2->
next=p1
total=total+1
next=NULL
释放空间
输出提示(是否存盘?
)
(吸收回车)输入选择
Saveflag=='
Y'
||saveflag=='
y'
调用save函数
返回head
图5create模块流程图
第3章程序代码设计
3.1create模块
1、函数原形:
ID*create()
2、功能:
利用while循环语句scanf、getchar、prinf、malloc、free函数完成对单链表的输入,存放n个联系人的信息(姓名、电话号码)。
3、变量及类型:
inttotal:
记录结点个数,定义为全局变量。
ID*head=NULL,*p1,*p2:
结构体指针,p1、p2为全局变量,创建单表所需的变量。
charsaveflag:
控制是否保存的变量。
4、说明:
首先将save模块在外部声明(便于其它模块调用),执行完输入函数后,会在键盘缓冲区中保存回车键,后面再对字符型变量赋值时,会将缓冲区中的回车键当成数据存入变量中,所以要在某些输入语句后面加getchar()函数(其它模块中也有类似情形。
)ID使用的是宏定义#defineIDstructtel。
5、代码:
见附录。
3.2save模块
voidsave(ID*head)
利用文件指针fp及文件函数fopen、fwrite、fclose将联系人信息存入磁盘。
FILE*fp:
定义文件指针(外部变量,便于其它函数使用)。
ID*t:
可以移动的指针,作用:
从头到尾遍历一遍单链表,向文件写入。
fp=fopen("
telephone.txt"
"
w"
)以只写形式在当前目录下建立文件telephone.txt。
fwrite(t,sizeof(ID),1,fp)向文件中写入数据,t表示输出数据的首地址,1表示数据块个数,数据块大小为sizeof(ID),fp是文件指针。
3.3load模块
ID*load()
while循环语句fopen、fread、feof、fclose、malloc函数读取文件telephone.txt中的信息。
ID*t1,*t2,*head=NULL:
结构体指针,遍历单链表所需的变量。
t1=(ID*)malloc(sizeof(ID))申请空间,以便于存放从文件中读取的内容。
while(!
feof(fp))当文件不处于结束位置时循环,fread(t1,sizeof(ID),1,fp)读取文件中数据,t表示输出数据的首地址,1表示数据块个数,数据块大小为sizeof(ID),fp是文件指针。
3.4print模块
voidprint(ID*head)
利用while循环语句printf函数依次输出联系人信息。
ID*temp:
临时变量,用来遍历单链表。
system("
cls"
)清屏,while(temp!
=NULL)当单链表未遍历完时循环。
如果head==NULL,则输出提示(当前电话号码簿为空)。
3.5search模块
voidsearch(ID*head)
利用双重循环查找,内层循环用来查找并输出,外层循环用来确定是否重新查找。
intflag,searchflag=1:
flag用来确定是否找到待查找记录的变量,searchflag用来确定是否重新查找(循环)的变量,searchflag==1时循环。
charcchoice:
c表示待查姓名的首字母,choice表示用户的选择,是否重新查找。
其中用到全局变量p1、p2来遍历单链表,判断语句if(p1->
name[0]==c)用来确定是否找到待查记录。
3.6delete模块
voiddelete(ID*head)
利用双重循环查找,内层循环用来查找并删除,外层循环用来确定是否继续查找。
flag用来确定是否找到待删除记录的变量,searchflag用来确定是否重新查找(循环)的变量,searchflag==1时循环。
charcchoiced:
c表示待查姓名的首字母,choice表示用户的选择,是否继续删除,d表示用户的选择,是否确认删除,确认删除后调用save函数。
整体上和search函数类似,先查找到待删除结点,找到后利用
if(p1==head)head=p1->
next;
elsep2->
next=p1->
语句删除结点,p1指向的是待删结点,p2所指的是p1所指结点的前一个结点。
3.7append模块
voidappend()
利用while循环语句malloc、free、fopen、fwrite、fclose函数依次添加联系人信息。
intflag=1:
控制是否循环(继续添加联系人)的变量,flag为1时继续添加。
ID*temp:
临时变量,用来存放新联系人信息。
charchoice:
用户的选择,控制flag中的值及是否跳出循环。
使用文件的方式为”a+”(允许在文件末尾追加数据),在循环中,每添加一次,要为temp分配一次空间,添加过后释放空间。
3.8modify模块
voidmodify(ID*head)
2、功能:
利用双重循环查找,内层循环用来查找并修改,外层循环用来确定是否继续修改。
flag用来确定是否找到待修改记录的变量,searchflag用来是否重新查找(循环)的变量,searchflag==1时循环。
charc,choice,d,s:
c表示待查姓名的首字母,choice表示用户的选择,是否继续修改,d表示用户的选择,是否确认修改,s表示用户的选择,是否保存修改后的记录(调用save函数)。
整体上和search函数类似,找到待修改信息后直接对该结点数据域重新赋值即可。
第4章C程序设计总结
4.1程序调试
本人在程序设计中遇到的困难、收获,如何解决问题以及感想。
4.1.1程序调试情况
调试方法:
每编好几个模块(包括相关模块),调试一次。
运行程序,出现如图主界面:
图6电话号码簿管理系统主界面
输入指令数‘1’后给予提示:
请输入姓名,以#作为结束的标志:
创建电话号码簿后,保存,打印正常。
load、search模块写好后,根据上一次创建的电话簿读取,然后查找,运行正常。
调试delete模块时,出现情况:
删除一个记录后,无法继续进行删除。
如图:
图7delete模块调试情况
如果输入‘y’,按提示操作,输入已有姓名首字母,却迅速显示一些提示后退出该功能。
查找原因后,发现在循环末尾少一句getchar()来吸收回车,由于回车作为首字母字符,故所有输入的字符都作为了下一个字符变量的值,从而导致判断失误。
加上getchar()后程序运行正常。
收获:
在循环语句中如果循环末尾和开头都有字符输入,应在末尾吸收回车或在开头输入字符前吸收回车。
append模块的调试:
添加记录后调用save函数保存,出现提示,错误的内存指令一系列信息。
思考:
第一次编写此模块源代码时将添加的记录直接调用save函数,而save函数中的文件使用方式是”w”,这种调用不符合添加规则,故无法调用save函数。
修改:
在此模块中打开已建立的文件,打开方式为”a+”,然后依次将新记录追加写入文件。
4.1.2感想
经此次设计,使我了解了设计一个软件的的大致开发流程,当遇见情况时的处理措施,还有独立解决问题和与他人交流合作的能力。
虽然有了点经验,但还是感觉不足,对计算机方面的一些设计思想不是清晰,还没有形成自己的编程风格。
我认为有待进一步学习。
谢辞
感谢班主任王老师的指导,感谢同学的交流与讨论,感谢父母的资助。
参考文献
[1]郭有强,《C语言程序设计》,清华大学出版社。
[2]谭浩强,《C程序设计》,清华大学出版社。
[3]刘振安,孙忱,刘燕君,《C程序设计课程设计》,机械工业出版社。
[4]汪诗林,《数据结构算法与应用》,机械工业出版社。
附录程序清单
#include"
stdio.h"
stdlib.h"
string.h"
conio.h"
/*不是C标准的头文件,表示consoleinput/output*/
#defineIDstructtel
structtel
{
charname[15];
ID*next;
};
voidsave();
inttotal=0;
ID*p1,*p2;
/*创建单链表函数*/
ID*head=NULL,*p1,*p2;
charsaveflag;
head=p1=p2=NULL;
/*p1是新开辟的指针,p2的作用是连接链表的尾部和新开辟的结点*/
printf("
\t\t\t\t欢迎使用\n"
);
while
(1)
{
p1=(ID*)malloc(sizeof(ID));
\n"
scanf("
%s"
p1->
name);
if(strcmp(p1->
name,"
#"
)==0)
if(total==0)
你输入了0条记录,单链表没有创建...\n"
free(p1);
returnhead;
}
break;
请输入电话号码:
tel);
if(head==NULL)/*第一次执行,以后不执行*/
head=p1;
p2=p1;
}
else
p2->
next=p1;
total++;
next=NULL;
/*收尾工作*/
getchar();
/*吸收回车*/
新建电话号码簿成功,共有%d个联系人,是否存盘?
Y/N\t"
total);
%c"
&
saveflag);
if(saveflag=='
save(head);
}
/*保存单链表函数*/
FILE*fp;
/*定义文件指针*/
ID*t;
/*定义一个可以移动的指针,作用:
从头到尾遍历一遍单链表,向文件中写入*/
if((fp=fopen("
))==NULL)
\t\t\t打开文件失败!
不存在该文件。
getch();
/*从键盘上等待用户输入一个字符*/
exit
(1);
\t\t\t正在保存文件,请稍...\n"
t=head;
while(t!
=NULL)
fwrite(t,sizeof(ID),1,fp);
t=t->
fclose(fp);
\t\t\t文件保存成功!
}
/*读取单链表函数*/
ID*t1,*t2,*head=NULL;
r"
/*等待用户输入一个字符*/
t1=(ID*)malloc(sizeof(ID));
/*申请空间,以便于存放从文件中读取的内容*/
head=t1;
while(!
feof(fp))
if(fread(t1,sizeof(ID),1,fp)!
=1)
/*如果没有读取的内容,则结束*/
t1->
next=(ID*)malloc(sizeof(ID));
t2=t1;
t1=t1->
t2->
\t\t\t文件读取完毕!
);
/*打印单链表函数*/
ID*temp;
temp=head;
system("
/*清屏*/
姓名\t\t电话号码\n"
if(head==NULL)
\t\t当前电话簿为空,请先创建新的号码或加载文件\n"
do{
printf("
%s\t\t%s\n"
temp->
name,temp->
temp=temp->
}while(temp!
=NULL);
/*创建查找函数*/
\t\t欢迎使用查找功能,请输入待查找姓名的首字母\n"
intflag,searchflag=1;
charc,choice;
while(searchflag)
{
请输入待查姓名的首字母:
"
c);
p1=head;
flag=0;
while(p1!
if(p1->
name[0]==c)
姓名:
%s\t电话号码:
%s\n"
name,p1->
flag=1;
p2=p1;
p1=p1->
/*p1指针向后移动一位*/
if(flag==0)
\t\t\t对不起,未能找到符合条件的记录。
\t\t\t查找完毕,是否重新查找?
Y/N\t"
choice);
getchar();
if(choice=='
||choice=='
)searchflag=1;
else
/*创建删除函数*/
charc,choice,d;
请输入待删除姓名的首字母:
while(p1!
\t\t\t是否删除该记录?
d);
if(d=='
||d=='
if(p1==head)head=p1->
\t\t\t完成,是否继续删除?
/*创建添加函数*/
intflag=1;
charchoice;
a+"
while(flag)
temp=(ID*)malloc(sizeof(ID));
请输入新联系人姓名:
\n请输入新联系人的电话号码:
fwrite(temp,sizeof(ID),1,fp);
free(temp);
\t\t\t添加完毕,是否继续添加?
if(ch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电话号码 管理 系统 课程设计 报告