C语言课程设计通讯录实验报告.docx
《C语言课程设计通讯录实验报告.docx》由会员分享,可在线阅读,更多相关《C语言课程设计通讯录实验报告.docx(29页珍藏版)》请在冰点文库上搜索。
C语言课程设计通讯录实验报告
太原学院计算机工程系
课程设计报告
课程名称:
数据结构课程设计
*****:
苏建花
专业班级:
计算机工程系网络三班
*******
2015年12月30日
计算机工程系课程设计报告
课程名称:
C语言课程设计
成绩:
课程设计题目:
通讯录管理系统
指导教师:
(签名):
班级:
网络14-3班姓名:
苏建花学号:
目录(参考)
1.设计目的与要求…………………………………………X
1.1题目与设计要求……………………………………X
1.2本程序涉及的知识点………………………………X
2.功能设计………………………………………………X
2.1总体设计……………………………………………X
2.2详细设计……………………………………………X
3.程序实现……………………………………………X
3.1程序实现时应考虑的问题…………………………X
3.2XX模块核心代码…………………………………X
4.测试分析……………………………………………X
4.1测试结果及分析…………………………………X
4.总结…………………………………………………X
参考文献………………………………………………X
1、设计目的与要求
这次课程设计的目的在于:
1.熟练的掌握C语言课程中所学的理论知识,并对其进行应用;
2.通过综合C语言的基本知识来解决实际问题;
3.加强分析和解决问题的能力;
4.提高实践动手能力,将知识化为实际成果
1.1题目与设计要求
(1)题目:
通讯录
(2)设计要求
a、建立通讯录信息,信息至少包含姓、名、电话号码、住址、分类(如同事、朋友、同学、家人等)等。
b、该系统提供添加、删除、修改和查找功能,其中按姓名方式删除、修改,按姓名、姓氏方式查找。
c、将通讯录保存在文件中。
d、能够输出通讯录中的信息。
1.2本程序设计的知识点
(1)采用结构体数组。
structPerson
{
chara[16];
chars[16];
chard[16];
charf[24];
structPerson*next;
}stu;
(2)运用函数之间的调用
主函数可以调用子函数,子函数之间可以相互调用,子函数不能调用主函数,主函数可以多次调用一个子函数,也可以一次调用多个子函数。
(3)利用指针变量
structPerson*head;
structPerson*p1,*p2
2、功能设计
添加:
添加通讯录记录
修改:
修改通讯录记录
删除:
删除通讯录记录
查找:
查询通讯录记录
显示:
显示通讯录记录
统计:
统计通讯录数目
2.1需求分析
信息记录要存放到文件中去,因而要实现文件的输入输出操作;要实现数据的插入、删除、修改和显示功能,因而要实现插入、删除、修改和显示操作;要实现按人名或姓氏进行查询的功能,因而要提供查找操作;另外还应该提供键盘式选择菜单以实现功能选择。
2.2总体设计
整个系统可设计分为数据插入模块、数据修改模块、数据删除模块、数据显示模块、数据查询模块和数据统计模块
2、3详细设计
2.3.1、菜单函数
菜单函数首先标出欢迎使用通讯录管理系,然后给出用户可选择的项目,用户可以通过选择该项前的代码来实现想要实现的功能,其流程图如图:
2.3.2、添加通讯录
将结构体数组分成几个数组分别对每个数组赋值,用while循环对不同地址的数组分别赋值。
流程图如下(假设w=1)
2.3.2、修改通讯录
修改通讯录通过指针变量用另一个数据代替原先存在的数据,将新的数据存储在文件中,其流程图如下:
(假设w=1)
2.3.4、显示通讯录
显示通讯录通过循环函数将全部的通讯录信息以此显示出来,其流程图如图:
2.3.5、删除通讯录
删除通讯录通过数组中该位置之后的数据存放位置向前移一位来实现删除功能,其流程图如下:
2.3.6、查找通讯录(假设w=1)
查找通讯录通过数组位置查找相关信息实现查找功能,其流程图如下:
2.3.7、统计通讯录
统计通讯录通过循环函数将全部的通讯录信息以此显示出来,(假设w=1)流程图如下:
2.3.8、退出通讯录
在使用完通讯录后,按7键便会退出系统,其流程图如下图所示:
3、程序实现
3、1程序实现时应该考虑的问题
1.分析系统中的各个实体之间的关系及其属性和行为;
2.根据问题描述设计系统的类层次;
3.完成类层次中各个类的描述,包括属性和方法;
4.完成类中各个成员函数的定义;
5.在程序中应该考虑主函数与子函数之间的调用情况,数组的使用。
6.完成系统的应用模块;
7功能调试;
8.完成系统总结报告以及系统使用说明书。
注:
各函数之间的调用关系,如下图所示:
3、2源代码及说明
(见附加)
4、测试分析
4.1测试结果及分析(以下列操作为例)
进入系统后,系统会出现如下图:
显示输入账号和密码:
输入账号和密码后会进入主菜单页码:
在主菜单中输入1后,选择要操作的文件,选择同学,输入要添加的个数,输入姓名电话号码地址,结果如下图:
在主菜单中输入2后,输入要修改人的姓名。
系统找到后会提示输入新的姓名
电话号码地址,结果如下图:
在主菜单中输入3后,选择要操作的文件,选择查找的方式,。
结果如下图
在主菜单中输入4后,输入要操作的文件,然后输入要删除的人的姓名,结果如下图:
在主菜单中输入5后,选择要操作的文件,会显示出此文件中所有的信息,结果如下图:
在主菜单中输入6后,输入要操作的文件,系统会统计出此文件中的总数,结果如下图
在主菜单中输入7后,“会显示谢谢您的使用,请按任意键退出”。
在运行的过程中曾出现,每执行完一个操作返回主菜单後就无法再继续执行接下来的操作,后来我从网上搜了一下,当执行system("cls");时会清除屏幕,然后我就在多次的修改中将程序中多余的system("cls");语句删除后,程序终于可以正常运行。
而且编译时会出现如下信息,但好在不影响程序的正常运行。
5、总结
这个课题是设计一个通讯录系统,该通讯系统能够较好的管理好我们的通讯录记录,具有添加、修改、查找、删除、显示和统计的功能,但是该系统依旧有漏洞,此程序必须按照系统提示的操作来执行,而且还有部分的功能缺陷,例如用户无法自行修改用户名和密码,必须使用系统分配的数据登陆系统。
功能也不是很齐全,没有排序功能,没有加密功能,还需要进一步的更新,才能达到更好地效果。
从刚开始的不只如何下手到最后看到自己的程序按自己的想法运行,心里时不时的有一种喜悦我在编写过程中,逐步的了解了程序模块化设计的思想含义。
在整个程序设计的过程中语法的错误还是比较容易检查的,但是对于那些逻辑思维的问题方面的缺陷不易查出,因此常常出现系统提示没有错误但是仍然不能够正常运行的境况,尽管有很多不足之处,但我在整个系统程序设计的过程中,我可以感受到自己对C语言有了一定的掌握,对整体的把握度也提高了很多。
此外编程是一项高精度需求的工作,所以我们要有规范化,标准化的代码编写习惯。
良好的编写习惯,不但有助于代码的纠错,也有助于各功能负责人员之间的协同合作。
我们还要有模块化思维能力,模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大的避免重复性的工作。
另外我们要重视程序的算法,在程序中,算法是灵魂,我们要努力学习各种先进的算法,提高自己的编程能力。
而在这个过程中,我更深的理解和运用结构化程序设计的思想和方法,掌握开发一个小型实用系统的基本方法,同时学会了一些调试一个较长程序的基本方法,提高了书写程序设计开发文档的能力(书写课程设计报告)。
参考文献
1、谭浩强着.C程序设计(第四版).北京:
清华大学出版社,2010
2、谭浩强着.C程序设计(第四版)学习辅导.北京:
清华大学出版社,2010
3、3.C编写组编.常用C语言用法速查手册.北京:
龙门书局,1995
4、[2]刘振安.C语言程序设计[M].机械工业出版社,2007
附加:
#include
#include
#include
#include
#include
#defineLENsizeof(structPerson)
voidtianjia();//对调用的函数进行声明
voidtongji();
voidshanchu();
voidchazhao();
voidxianshi();
voidxiugai();
FILE*fp;
structPerson//声明一个结构体类型structPerson
{
chara[16];
chars[16];
chard[16];
charf[24];
structPerson*next;
}stu;
////////////////////////////////////////////主菜单
voidmenu()
{inti=0;
printf("*******************************************************************************\n");
printf("*\t\t1添加通讯录*\n");
printf("*\t\t2修改通讯录*\n");
printf("*\t\t3查找通讯录*\n");
printf("*\t\t4删除通讯录*\n");
printf("*\t\t5显示通讯录*\n");
printf("*\t\t6统计通讯录*\n");
printf("*\t\t7退出通讯录*\n");
printf("*******************************************************************************\n");
printf("\t\t\t请输入操作1-7,以Enter结束\n\t\t\t\t");
while(i==0)
{
scanf("%d",&i);
switch(i)//用switch函数实现多分支选择结构
{
case1:
tianjia();break;
case2:
xiugai();break;
case3:
chazhao();break;
case4:
shanchu();break;
case5:
xianshi();break;
case6:
tongji();break;
case7:
printf("\t\t\t谢谢您的使用,请按任意键退出....\n");getchar();break;
default:
printf("\t\t您的输入有误,请重新输入,并以Enter结束\n");menu();
}
}
}
/////////////////////////////////////////////////////////////////////////////////1添加
voidtianjia()
{
intw=0;
inti=0,n;
structPerson*head;//定义指针变量
structPerson*p1,*p2;
printf("\t\t请输入要操作的通讯录文件1同学2家人3同事4朋友:
\n\t\t\t");
while(w==0)
{scanf("%d",&w);
if(w==1)//建立同学文件
{
if((fp=fopen("tongxue.txt","a"))==NULL){fp=fopen("tongxue.txt","w+");
printf("\t\t\t同学文件已建立");
}
elseprintf("\t\t\t\t同学文件已存在\n");
}
elseif(w==2)//建立家人文件
{if((fp=fopen("jiaren.txt","a"))==NULL)
{fp=fopen("jiaren.txt","w+");
printf("\t\t\t家人文件已建立");
}
elseprintf("\t\t\t\t家人文件已存在\n");
}
elseif(w==3)//建立同事文件
{
if((fp=fopen("tongshi.txt","a"))==NULL)
{fp=fopen("tongshi.txt","w+");
printf("\t\t\t同事文件已建立");
}
elseprintf("\t\t\t\t同事文件已存在\n");
}
elseif(w==4)//建立朋友文件
{
if((fp=fopen("pengyou.txt","a"))==NULL){fp=fopen("pengyou.txt","w+");
printf("\t\t\t朋友文件已建立");
}
elseprintf("\t\t\t\t朋友文件已存在\n");
}
else{printf("\t\t\t您的输入有误,请重新输入");w=0;}
}
printf("\t\t\t\t请输入添加的个数\n\t\t\t");
scanf("%d",&n);
p2=malloc(LEN);
while(i{p1=malloc(LEN);
if(i==0)head=p1;
elsep2->next=p1;
printf("\t\t\t请输入以下信息,并以Enter结束\n");
printf("\t\t\t姓名电话号码地址\n\t\t\t");
scanf("%s%s%s%s",p1->a,p1->s,p1->d,p1->f);
p2=p1;
i++;
}
p2->next=NULL;
while(head!
=NULL)
{
fprintf(fp,"%-16s%-16s%-16s%-24s\n",head->a,head->s,head->d,head->f);
head=head->next;
}
fclose(fp);
menu();
}
//////////////////////////////////////////////////////////////////////////////2修改
voidxiugai()
{inti=0,w=0;
longoffset;
chara[16],s[16],d[16],f[24];
structPerson*p;
printf("\t\t请输入要操作的通讯录文件1同学2家人3同事4朋友:
\n\t\t\t");
while(w==0)
{scanf("%d",&w);
if(w==1)
{if((fp=fopen("tongxue.txt","r+"))==NULL)
{printf("\t\t\t请添加数据\n");
menu();
fp=fopen("tongxue.txt","w+");
printf("\t\t同学文件已建立\n");
}
elseprintf("\t\t\t同学文件已存在\n")
}
elseif(w==2)
{if((fp=fopen("jiaren.txt","r+"))==NULL)
{printf("\t\t\t请添加数据\n");
menu();
fp=fopen("jiaren.txt","w+");
printf("\t\t家人文件已建立\n");
}
elseprintf("\t\t家人文件已存在\n");
}
elseif(w==3)
{
if((fp=fopen("tongshi.txt","r+"))==NULL)
{printf("\t\t\t请添加数据\n");
menu();
fp=fopen("tongshi.txt","w+");
printf("\t\t同事文件已建立\n");
}
elseprintf("\t\t\t同事文件已存在\n");
}
elseif(w==4)
{
fp=fopen("pengyou.txt","r+");
if((fp=fopen("pengyou.txt","r+"))==NULL){fp=fopen("pengyou.txt","w+");
printf("\t\t朋友文件已建立\n");
}
elseprintf("朋友文件已存在");
}
else
{
printf("\t\t\t输入错误,请重新输入\n");
w=0;
}
}
printf("\t\t请输入要修改人的姓名:
\n\t\t\t");
scanf("%s%s",a,s);
p=malloc(LEN);
while(!
feof(fp))
{offset=ftell(fp);
fscanf(fp,"%s%s%s%s\n",p->a,p->s,p->d,p->f);
if((strcmp(a,p->a)==0)&&(strcmp(s,p->s)==0))
{printf("\t\t\t已找到记录:
\n%-16s%-16s%-16s%-16s\n",p->a,p->s,p->d,p->f);
i=1;
break;
}
}
if(i==1)
{printf("\t\t\t请输入新的姓名号码地址:
\n\t\t\t");
scanf("%s%s%s%s",a,s,d,f);
fseek(fp,offset,0);
fprintf(fp,"%-16s%-16s%-16s%-24s\n",a,s,d,f);
printf("\t\t\t恭喜,已修改成功!
\n");
}
else
printf("\t\t\t无此相关信息\n")fclose(fp);
menu();
}
////////////////////////////////////////////////////////////////////////////////3查找
voidchazhao()
{
chara[16],s[16],d[16],f[24],m[16],n[16];
intw=0,e=0;
printf("\t\t请输入要操作的通讯录文件1同学2家人3同事4朋友:
\n\t\t\t");
while(w==0)
{
scanf("%d",&w);
if(w==1)
{
if((fp=fopen("tongxue.txt","r+"))==NULL)
{printf("\t\t\t请添加数据\n");
menu();
fp=fopen("tongxue.txt","w+");
printf("\t\t\t同学文件已建立\n");
}
elseprintf("\t\t\t同学文件已存在\n");
}
elseif(w==2)
{
if((fp=fopen("jiaren.txt","r+"))==NULL)
{printf("\t\t\t请添加数据\n");
menu();
fp=fopen("jiaren.txt","w+");
printf("\t\t\t家人文件已建立\n");
}
elseprintf("\t\t\t家人文件已存在\n");
}
elseif(w==3)
{
if((fp=fopen("tongshi.txt","r+"))==NULL)
{printf("\t\t\t请添加数据\n");
menu();
fp=fopen("tongshi.txt","w+");
printf("\t\t\t同事文件已建立\n");
}
elseprintf("\t\t\t同事文件已存在\n");
}
elseif(w==4)
{fp=fopen("pengyou.txt","r+");
if((fp=fopen("pengyou.txt","r+"))==NULL)
{printf("\t\t\t请先添加数据\n");
menu();fp=fopen("pengyou.txt","w+");
printf("\t\t\t朋友文件已建立\n");
}
elseprintf("\t\t\t朋友文件已存在\n");
}
else{printf("\t\t\t输入错误,请重新输入\n");w=0;
}
}
printf("\t\t请输入查找方式1:
按姓氏查找2:
按姓名查找\n\t\t\t");
while(e==0)
{scanf("%d",&e);
if(e==1)//按姓氏查找
{printf("\t\t\t请输入姓氏:
\n");
scanf("%s",m);
printf("\t\t\t查找结果如下:
\n姓\t\t名\t\t电话\t\t地址\n\n");
while(feof(fp)==0)
{
fscanf(fp,"%s%s%s%s\n",a,s,d,f);
if(strcmp(a,m)==0)
printf("%-16s%-16s%-16s%-24s\n",a,s,d,f;
}
}
elseif(e==2)//按姓名查找
{printf("\t\t\t请输入姓\t名:
\n");
scanf("%s%s",m,n);
printf("\t\t\t查找结果如下:
\n姓\t\t名\t\t电话\t\t地址\n\n");
while(feof(fp)==0)
{
fscanf(fp,"%s%s%s%s\n",a,s,d,f);
if(strcmp(a,m)==0&&strcmp(s,n)==0)
printf("%-16s%-16s%-16s%-24s\n",a,s,d,f);
}
}
else{printf("你想干嘛,重新输入吧!
1按姓氏查找2按姓名查找");e=0;}
}
fclose(fp);
menu();
}
////////////////////////////////////////////////////////////////////////////4删除
voidshanchu()
{
inti=0,w=0;
longoffset;
chara[16],s[16],d[16],f[24];
structPerson*p;
printf("\t\t请输入要操作的通讯录文件1同学2家人3同事4朋友:
\n\t\t\t");
while(w==0)
{
scanf("%d",&