通讯录管理C语言课程设计.docx
- 文档编号:29848115
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:28
- 大小:238.17KB
通讯录管理C语言课程设计.docx
《通讯录管理C语言课程设计.docx》由会员分享,可在线阅读,更多相关《通讯录管理C语言课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
通讯录管理C语言课程设计
学号
2014-2015学年第二学期
1308210115
《高级语言程序设计》
课程设计报告
题目:
通讯录管理
专业:
计算机科学与技术
班级:
13级计科
(2)班
姓名:
指导教师:
樊郁徽
成绩:
计算机学院
2015年4月30日
目录
1设计内容及要求1
1.1设计内容1
1.2设计任务及具体要求1
2概要设计2
2.1系统的设计思想2
2.2总体程序框图2
2.3各个模块之间的主要关系3
3设计过程和程序代码3
3.1主函数的程序流程图3
3.2对关键代码加以分析说明4
4设计结果与分析9
4.1数据结构.……………………………………………………………………9
4.2程序采用模块化设计9
4.3menu()主菜单9
4.4Add()输入记录10
4.5Print()显示所有记录12
4.6Find()查找记录13
4.7Delete()删除记录14
4.8SaveFree()保存记录到文件15
5总结15
参考文献16
源程序代码16
1设计内容及要求
1.1课程设计内容
正像一个电话本一样,记录下每位学生的信息,并把它保存在文件中,帮助自己记住好多有用的信息,可以给个人的学习生活带来很大的方便。
而且使用起来非常的方便,特别是在现在计算机使用普及的环境下,一个通讯录系统程序,省去了翻查纸质通讯录的麻烦。
(一)给电话簿添加新的记录,其中包括姓名,地址,学号,qq号码,电话号码,邮箱地址。
(二)输出通讯录相应记录的模块,根据用户输入的姓名进行输出。
(三)删除通讯录相应记录的模块,根据用户输入的关键字进行删除。
(四)最后保存并退出该系统。
1.2设计任务及具体要求
主要利用c语言的指针操作设计开发一个通讯录系统,具有如下功能:
可以向通讯录中添加新成员的记录并且可以输出相应的记录,而且可以删除记录。
操作界面要符合用户的一般习惯,图形或文本界面都可以。
要求:
明确课程设计的目的,能根据课程设计的要求,查阅相关文献,为完成设计准备必要的知识;熟练的掌握结构数组的使用方法;初步了解软件开发的一般方法和步骤;为进一步开发出高质量的信息管理系统打下坚实的基础。
2概要设计
2.1系统的设计思想
设计思路程序设计一般由两部分组成:
算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。
在通讯录管理程序中,由于预计记录数相对于一个单位的学生人数或职工人数来说不会太大,除了能够加入、删除、保存等外,更多的情况是查询,且能够实现快速查询,所以选用静态数组保存数据,实现多种查询方式。
2.2总体程序框图
图2.2-A总程序框图
2.3各个模块之间的主要关系
该程序的功能主要是实现对通讯人员的查找,修改,删除,保存并退出。
各个模块之间的关系是相互联系的。
首先,主函数包含了所有的子函数。
主函数是整个程序的核心。
子函数之间也是有联系的,对个人通讯信息的查找、删除、插入、显示,必须是在成员录入的情况下进行。
3设计过程和程序代码
3.1主函数的程序流程图
1)
主函数程序(N-S)流程图及运行界面
主函数程序(N-S)流程图(见图3.1-A)
主函数main()
定义变量intc;;
While
(1)
Scanf("%c",&c)
switch(c)
case'1':
Add();break;添加记录
case'2':
print();break;输出条目
case'3':
Find();break;查找条目1.按姓名2.按学号
case'4':
Delete();删除信息
print();break;输出删除后的结果
case'0':
SaveFree();保存并释放内存exit(0);退出
default:
printf("选择错误\n");
图3.1-A主函数程序
简单说明:
该功能主要显示的是给用户一个进入界面,它主要的是显示该程序主要能够执行的有哪些功能。
下面是显示给用户的界面。
(见图3.1-A)
主函数程序运行界面:
图3.1-B主函数界面
3.2对关键代码加以分析说明
1、/*添加记录*/
voidAdd()
{
LIST*p1=NULL,*p2=NULL;
p1=(LIST*)malloc(sizeof(LIST));/*申请结点*/
printf("输入姓名:
\n");/*添加信息*/
scanf("%s",p1->name);
printf("输入地址:
\n");
scanf("%s",p1->addr);
printf("输入学号:
\n");
scanf("%s",p1->num);
printf("请输入qq号:
\n");
scanf("%s",p1->qq);
printf("输入电话:
\n");
scanf("%s",p1->phnum);
printf("请输入email:
\n");
scanf("%s",p1->email);
p1->next=NULL;/*保存到链表*/
if(head==NULL)
{
head=(LIST*)malloc(sizeof(LIST));/*申请空间*/
head->next=p1;
}
else
{
for(p2=head;p2->next!
=NULL;p2=p2->next);/*找到结点尾*/
p2->next=p1;
}
printf("此记录已添加!
");
}
通过本段函数可以把要添加的成员的姓名,学号,qq号码,地址,邮箱等信息添加到通讯录中。
二、/*输出学生信息*/
voidprint()
{
LIST*p=NULL;
if(head==NULL)
{
printf("这是一个新记录,请添加记录\n");
return;
}
printf("**************通讯录系统*********************\n");/*输出信息*/
printf("姓名\t\t地址\t学号\t\tqq\t\t电话\t\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
三、/*查找信息1.按姓名、2、按学号*/
voidFind()
{
LIST*p;
charname1[20],num1[20];
inti;
printf("请输入查找方式1、按姓名;2、按学号");
scanf("%d",&i);
if(i==1)
{
printf("请输入要查找的姓名:
\n");
scanf("%s",name1);
printf("**************通讯录系统*********************\n");
printf("姓名\t\t地址\t学号\tqq\t电话\t\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
{
if(strcmp(p->name,name1)==0)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
}
elseif(i==2)
{
printf("请输入要查找人的学号:
\n");
scanf("%s",num1);
printf("**************通讯录系统*********************\n");
printf("姓名\t\t地址\t学号\tqq\t电话\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
{
if(strcmp(p->num,num1)==0)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
}
else
printf("请选择1和2两个数字\n");
}
通过此段函数将成员的具体信息全部输出来。
四、/*删除信息*/
voidDelete()
{
charname1[20];/*先查找后删除*/
LIST*p=head->next,*pr=head->next;
printf("请输入要删除的姓名:
\n");
scanf("%s",name1);
if(head->next==NULL)
{
printf("无此节点!
\n");
return;
}
while((strcmp(p->name,name1)!
=0)&&p->next!
=NULL)
{
pr=p;
p=p->next;
}
if(strcmp(name1,p->name)==0)/*输出删除信息*/
{
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->next->name,p->next->addr,
p->next->num,p->next->qq,p->next->phnum,p->next->email);
if(p==head->next)
head->next=p->next;
else
pr->next=p->next;
free(p);
}
printf("此记录已删除!
");
}
通过这个函数可以把指定人员的姓名,学号,地址,邮箱,等信息删除。
4设计结果与分析
4.1数据结构
由于使用静态数组需要预先估计记录数,表示记录数,也就是数组的大小,记录联系人的信息至少应有姓名、地址、学号、电话、qq、email,所以定义每个数组元素的类型为结构体。
由于数组存储是采用顺序存放,在内存空间中占用连续空间,所以若干条记录通讯录的管理实质就是对顺序存储的线性表的管理。
结点结构如下:
structlist
{
charname[20];
charaddr[20];
charnum[20];
charqq[10];
charphnum[20];
charemail[30];
structlist*next;
};
4.2程序采用模块化设计
主函数是程序的入口,各模块独立,可分块调试,均由主函数控制调用。
控制功能的实现通过循环执行一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数,同时设置一个断点,即当返回值为一定条件时运行exit()函数结束程序,以免造成死循环。
4.3menu()主菜单
直接利用输出函数printf输出字符串,在屏幕上显示一个菜单,并显示选项,输入0-5之间的数字,将此数字作为菜单函数的返回值返回主函数这个数字调用相应的功能函数。
制作简便由于程序中很多地方用到了字符串输入语句,会造成下一个字符不能正确读入,为了在程序调用执行了各个函数后能够清晰地看到菜单,并输入新的选项,首先写了一条输出信息,一条读字符语句getchar()等待输入字符,按任意键即可进入主菜单。
读者可以将这两行来体会它的功能。
按照所见即所得的方式直接设计输出函数,输出字符串,达到菜单效果,将精力主要放在程序功能的实现上,利用do循环语句,一直执行scanf(“%s”,s),按照字符串形式输入,则循环等待重新输入。
既然是数字选项,为什么不用整数格式输入,而要按字符串输入,再将其转换呢?
如果按照整数格式输入,当用户输入了非数字字符,例如a和b等,由于类型不同将导致程序出错,所以对于不参与运算的数据,表面上看是数字,也应将其设为字符处理,例如电话号码,千万不要设为整数类型。
程序设计技巧很多,所以读者在编程调试中应注意并仔细体会。
而且利用格式输出,把画面尽量美观,给人以视觉的享受。
同时也可以一目了然,直到该做什么。
说明:
图4.3-A是程序在vc中通过编译、组建、运行得到的界面。
图4.3-A程序运行界面
4.4Add()输入记录
输入记录时按照一条一行的格式输入,每个数据之间用空格分隔,较为清晰,且能直接反映数据之间的关系。
但由于scanf函数的特性,在输入时,数据用回车分隔也是可以的与界面设计不吻合。
由于记录并不是一次性全部输入,而是随时填加和删除的,而预先开辟的空间数往往大于实际的记录数,所以程序设计为首先输入准备输入的记录数n,然后用for循环语句循环n次,输入记录。
通讯录的每一条记录有三个字段,都是字符串类型,用格式输入printf("输入姓名:
\n");/*添加信息*/
scanf("%s",p1->name);
printf("输入地址:
\n");
scanf("%s",p1->addr);
printf("输入学号:
\n");
scanf("%s",p1->num);
printf("请输入qq号:
\n");
scanf("%s",p1->qq);
printf("输入电话:
\n");
scanf("%s",p1->phnum);
printf("请输入email:
\n");
scanf("%s",p1->email);,继续输入下一条,达到规定的记录数,输入停止,返回记录数到主函数。
说明:
根据提示要求按1输入每一条记录信息得到图4.4-A图4.4-B。
结果如下:
图4.4-A输入信息界面
图4.4-B输入信息界面
4.5Print()显示所有记录
通讯录建立好后,更频繁的操作是显示和查找记录,本函数实现显示所有记录功能
将主函数传递过来的数组输出,输出时,为了格式美观清晰,设计一定的样式输出,注意利用格式输出函数,根据字段的长度设定输出的长度,而且利用结构体的链表进行输出,保证输出所有的记录。
说明:
图4.5-A是按照提示要求输入2,将显示所有录入信息。
结果如下所示:
图4.5-A输出信息界面
4.6Find()查找记录
查找指定姓名的记录,采用顺序查找法。
首先输入要查找记录的姓名,然后顺序查找结点,如果没找到,则输出没找到信息,否则,显示找到的记录信息。
因为程序多次用到了查找和显示记录,例如删除记录中,所以编写了一个find()函数,专门进行查找。
从第一条记录开始,将指针一直往后移,直到找到要求着到的记录为止。
如果没有给出提示信息。
说明:
图4.6-A和图4.6-B是按提示要求查询记录,输入3之后可按学号或姓名两种方式来查找学生记录。
结果如下所示:
图4.6-A按姓名查找界面
图4.6-B按学号查找界面
4.7Delete()删除记录
输入要删除记录的姓名如果没有该记录,然后顺序查找结点,如果没找到,则输出没找到信息,否则,显示找到的记录信息。
因为程序多次用到了查找和显示记录从第一条记录开始,将指针一直往后移,直到找到要求着到的记录为止。
否则显示没找到信息;否则,调用print函数,依次将每个字段拷贝到前一条记录的相应字段,即覆盖了前一条记录,达到前移的目的,直到最后一条记录。
并把删除的记录在屏幕上显示出来。
程序结束。
4.8SaveFree()保存记录到文件
前面我们讲到的数据输入和输出是以终端为对象的,当程序关闭后,数据也就丢失了,所以为了能随时查阅数据,必须将数据输出到磁盘文件上保存起来,使用时再从磁盘中读入到内存中,这就用到了磁盘文件的读写操作。
5总结
刚拿到这个课程设计的时候,心里觉着应该不是很难,但是但真正要做的时候,才明白任何一个程序都有其精华的部分,即使再简单的程序都应认真的去做,后来我找了参考书,而且还上网查阅了许多资料,最终在vc上输入程序的时候,又出现了许多问题,我修改了许多次,但是依然无法执行,后来我找了同学来帮我找出错误,过了好长时间才输入正确的程序,最终执行出来。
在以后写程序的过程中,应该注意细节,即使是定义一个小小的变量,还有在使用结构指针的时候,要注意使用方法,由于指针自己掌握的不是很好,所以在写程序时出现了许多问题,这就要求我要好好学习指针。
程序是一种灵活的东西,光靠死记硬背是不行的,需要加以理解基本思想,学习C语言之后并不是说拿到什么程序我都会做了,它只是锻炼和培养了我们的思维,还有同学之间在一起相互讨论促进了友情和互帮互助的精神。
我们需要学习C的语法,巩固基础知识,掌握程序设计方法和提高程序设计能力,通过算法和流程图来表示。
这也算是一次小小的实习吧,对我们的帮助很大,是一次动手锻炼的机会,培养专业学习的兴趣,收获了更多的知识,同时也认识到了学好专业课的重要性,值得我们深思和考虑未来的发展。
参考文献
[1]姜灵芝,余健.C语言课程设计案例精编,北京:
清华大学出版社,2008.1
[2]郭翠英等编著,C语言课程设计案例精编,北京:
中国水利水电出版社,2004.3
[3]贾学.宋海民.C语言程序设计.北京:
中国铁道出版社,2007
[4]赵海廷.C语言程序设计.北京:
人民邮电出版社,2006.
[5]范刚龙.王康平.C程序设计.武汉:
武汉理工大学出版社,2006
[6]张强华.C语言程序设计.北京:
人民邮电出版社,2010
[7]徐新华.C语言程序设计教程.北京:
清华大学出版社,2010
[8]谭浩强.C语言程序设计.北京:
清华大学出版社,2011
[9]徐建民.C语言程序设计.北京:
电子工业出版社,2009
源程序代码
#include
#include
#include
structlist
{
charname[20];
charaddr[20];
charnum[20];
charqq[10];
charphnum[20];
charemail[30];
structlist*next;
};
typedefstructlistLIST;
LIST*head=NULL;
voidmenu();/*菜单*/
voidAdd();/*添加记录*/
voidprint();/*输出记录*/
voidFind();/*查找记录(按姓名)*/
voidDelete();/*删除记录*/
voidSaveFree();/*保存到文件*/
voidCreat();/*打开文件*/
voidmain()
{
charc;
Creat();/*打开文件*/
while
(1)
{
menu();/*显示菜单*/
scanf("%c",&c);
switch(c)
{
case'1':
Add();break;/*添加记录*/
case'2':
print();break;/*输出条目*/
case'3':
Find();break;/*查找条目1.按姓名*/
case'4':
Delete();/*删除信息*/
print();break;/*输出删除后的结果*/
case'0':
SaveFree();/*保存并释放内存*/
exit(0);/*退出*/
break;
default:
printf("选择错误!
");
break;
}
}
}
/*菜单*/
voidmenu()
{
printf("\n*****************通讯录系统*********************\n");
printf("***********\t1.添加记录*******************\n");
printf("***********\t2.输出记录*******************\n");
printf("***********\t3.查询记录*****************\n");
printf("***********\t4.删除记录*******************\n");
printf("***********\t0.保存并退出!
****************\n");
printf("************************************************\n");
printf("\t请选择将要进行的操作:
\n");
}
/*添加记录*/
voidAdd()
{
LIST*p1=NULL,*p2=NULL;
p1=(LIST*)malloc(sizeof(LIST));/*申请结点*/
printf("输入姓名:
\n");/*添加信息*/
scanf("%s",p1->name);
printf("输入地址:
\n");
scanf("%s",p1->addr);
printf("输入学号:
\n");
scanf("%s",p1->num);
printf("请输入qq号:
\n");
scanf("%s",p1->qq);
printf("输入电话:
\n");
scanf("%s",p1->phnum);
printf("请输入email:
\n");
scanf("%s",p1->email);
p1->next=NULL;/*保存到链表*/
if(head==NULL)
{
head=(LIST*)malloc(sizeof(LIST));/*申请空间*/
head->next=p1;
}
else
{
for(p2=head;p2->next!
=NULL;p2=p2->next);/*找到结点尾*/
p2->next=p1;
}
printf("此记录已添加!
");
}
/*输出学生信息*/
voidprint()
{
LIST*p=NULL;
if(head==NULL)
{
printf("这是一个新记录,请添加记录\n");
return;
}
printf("**************通讯录系统*********************\n");/*输出信息*/
printf("姓名\t\t地址\t学号\t\tqq\t\t电话\t\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 管理 语言 课程设计