资源描述
学号
理工大学华夏学院
课 程 设 计
课程名称 C语言课程设计
题 目 通讯录管理系统的设计
专 业 软件工程
班 级 软件工程1121班
姓 名 邓燕蓉
成 绩
指导教师 王绪梅
2013年2月25日至2013年3月1 日
课程设计任务书
学生: 邓燕蓉 专业班级: 软件工程1121班
指导教师:王绪梅 工作单位: 理工大学华夏学院
设计题目:通讯录管理系统的设计
要求完成的主要任务:
1. 任务描述
设计一个管理通讯录的程序。
完成:1、数据的插入、删除、修改和显示功能;
2、实现按人名或进行查询的功能;
3、提供键盘式选择菜单以实现功能选择。
提示:信息记录要求放到文件中,因而要实现文件的输入输出操作,整个系统可以设计为多模块结构,由数据插入模块、数据修改模块、数据删除模块、数据显示模块和数据查询模块组成。
2. 本课程涉与的知识点
变量的定义、输入和输出函数、结构体类型的定义、结构体数组、循环语句、选择语句,文件的操作等。
3. 要求完成的任务
⑴ 完成整个规定任务的设计与调试,最后得出正确结果,并经教师检查与答辩;
⑵ 写出规的课程设计报告,在设计思想描述时一定要画出程序算法流程图;
⑶ 课程设计结束后交设计说明书等文档和设计容:
⑷从2月26日起,学生每天至少要到设计教室半天以上;
设计报告撰写格式要求:
设计报告的主要容是详细写出在设计过程中所用到的主要技术或方法;
课程设计报告按通用格式书写,具体要求见资料:“课程设计说明书的书写容与格式”
时间安排:
第一天: 学生先在实验室集中,由指导教师介绍课程设计的目的、布置任务后选题;
第二天-第四天:学生在实验室完成设计,经教师检查并回答提问,确认设计完成;
第五天: 教师在计算机上先检查设计报告、学生修改后打印提交
指 导 教 师 签字: 2013年2月20日
系 主 任 签 字: 2013年2月23日
目 录
1.设计题目3
2.开发环境3
2.1硬件环境3
2.2软件环境3
3. 开发工具3
4.完成时间3
5. 设计思想3
6.设计过程与设计步骤 4
6.1需求分析 4
6.2系统设计4
6.3详细设计5
7. 测试运行13
8. 评价与修订13
9. 设计体会13
10. 参考文献14
1 设计题目
通讯录管理系统的设计
2 开发环境
2.1硬件环境
微机系列,存在1G以上
2.2软件环境
Microsoft Windows XP
3 开发工具
Word 2003; VC++6.0
4 完成时间
2013.2.25----2013.3.1
5 设计思想
根据要求,薄以文本文件存放在文件中,故需要提供文件的输入,输出等操作;还需要保存记录进行添加,修改,删除,查找等操作;另外还应该提供键盘式选择菜单以实现功能选择:设计一个函数,使其弹出界面
**************欢迎使用通讯录系统**************"
1.创建通讯录。
2.插入信息。
3.查询记录。
4.修改记录。
5.删除记录。
6.显示所有记录。
7.保存记录到文件。
0.退出通讯录。
请输入0~7。
6 设计过程与设计步骤
6.1 需求分析
(1)信息记录要存放到文件中去,因而要实现文件的输入输出操作;
(2)要实现数据的插入、删除、修改和显示功能,因而要实现插入、删除、修改和显示操作;
(3)要实现按人名或进行查询的功能,因而要提供查找操作;
(4)另外还应该提供键盘式选择菜单以实现功能选择整个系统可以设计为数据插入模块、数据修改模块、数据删除模块、数据显示模块和数据查询模块。
6.2 系统设计
系统的主模块结构如图6-1所示。
6
0
7
5
4
3
2
1
choice
switch
Choice=?
Add()
插入信息
Find()
查询信息
Create()
创建通讯录
Alter()
修改信息
Delete()
删除信息
List()
显示信息
******感谢您的使用******
Save()
保存到文件
图6-1.系统主模块流程图
开 始
结 束
6.3详细设计
采用结构体数组。结构体数组定义如下:
Struct { Char name[20]; //人名 Int tel; //固定 Int mobile1; //移动1 Int mobile2; //移动1 Char email[20]; //email地址 ………………}
(1)数据插入模块 输入数据,然后采用追加方式写文件。
(2)数据修改模块 通过菜单选择修改、。可以把要修改的或存储在临时变量里面,然后读文件,找到要修改的记录,把该记录重新以新的值写入。
(3)数据删除模块 删除一条记录,则输入要删除的人名,然后读文件,把文件中读出来的记录的人名与待删除的人名比较,如果不匹配,则重新写入文件;否则舍弃不再写入文件。
(4)数据显示模块 采用分屏显示,每屏10条记录。读文件,输出结果。
(5)数据查询模块 用基本查找算法对簿实现按人名或的查询(读文件,把读出记录得相应字段与输入的查询字段比较),并把结果输出。
(6)用Word绘图工具绘制出与之对应的清晰直观的程序流程图,根据流程图写出程序并运用软件VC++6.0验证所编写的程序是否正确,并做出改正,直到程序正确为止。
图6-2.系统创建模块流程图
系统的创建模块结构如图6-2所示。
N
Y
Y
开 始
TEL*p1[100],*p2,m,i
输入m
i=1
i<=m?
p1[i]=(TEL *)malloc(sizeof(TEL)) *)malloc(sizeof(TEL))
p1[i]->next=NULL
head->next==NULL?
head->next=p1[i]
p2=head
p2->next!=NULL
p2->next=p1[i]
p2=p2->next
i++
return
结 束
N
Y
输出信息已添加!
输入p1[i]->name, p1[i]->sex, p1[i]->tel, p1[i]->city, p1[i]->eip
系统的插入模块结构如图6-3所示。
N
Y
Y
开 始
TEL *p,*q
(q=(TEL*)malloc(sizeof(TEL)))==NULL?
exit(1)
p=head
p->next!=NULL
p->next=q
p=p->next
q->next=NULL
return
结 束
输入q->name, q->sex,,
q->tel, q->city, q->eip
输出此信息已添加!
图6-3.系统插入模块流程图
系统的查询模块结构如图6-4所示。
N
N
N
Y
Y
Y
开 始
TEL *p,name[50]
head->next==NULL?
return
p=head->next
p=p->next
p!=NULL?
strcmp(p->name,name)==0?
p->next==NULL?
Y
输出此通讯录为空!
次通讯录为空!
!
输入name
次通讯录为空!
!
输出无此信息!
次通讯录为空!
!
输出p->name,p->sex,p->city,p->eip,p->tel
结 束
图6-4.系统查询模块流程图
图6-5.系统修改模块流程图
系统的修改模块结构如图6-5所示。
N
Y
N
Y
Y
N
Y
开 始
TEL *p, *p1,name[50]
head->next==NULL?
输出此通讯录为空!
次通讯录为空!
!
return
输入name
次通讯录为空!
!
p=head->next
p!=NULL?
strcmp(p->name,name)==0?
break
p->next==NULL?
输出无此信息!
次通讯录为空!
!
p=p->next
p1=(TEL *)malloc(sizeof(TEL))
strcpy(p->name,p1->name); strcpy(p->sex,p1->sex); strcpy(p->tel,p1->tel);
strcpy(p->city,p1->city); strcpy(p->eip,p1->eip);
输出p->name,p->sex,p->city,p->eip,p->tel
结 束
图6-6.系统删除模块流程图
系统的删除模块结构如图6-6所示。
N
Y
Y
Y
Y
N
N
Y
开 始
TEL *p = head->next, *p1 =head->next,*p2,name[50]
head->next==NULL?
输出此通讯录为空!
次通讯录为空!
!
return
输入name
次通讯录为空!
!
strcmp(p->name,nam)!=0?&&p->next!= NULL
Y
p==head->next&&p->next!=NULL
p1=p; p =p->next
p =p->next;
strcmp(name,p->name)==0?
head->next = p->next
p==head->next&&p->next==NULL
head->next = p->next
p1->next= p->next
N
输出p2->name,p2->sex,p2->city,p2->eip,p2->tel
结 束
系统的显示模块结构如图6-7所示。
Y
Y
结 束
开 始
TEL *p
head->next==NULL
输出通讯录中无记录!
次通讯录为空!
!
return
N
p=head->next
p=p->next
N
p!=NULL
输出p->name,p->sex,p->city,p->tel,p->eip
图6-7.系统显示模块流程图
系统的保存模块结构如图6-8所示。
Y
开 始
TEL*p,i,n,name[50]
fclose(fp)
fclose(fp)
fclose(fp)
fp=fopen(name,"w")==NULL
输出t[i].name, t[i].sex,t[i].city ,t[i].eip, t[i].tel
Y
N
i=0
exit(1)
i<n?
i++
N
输出保存成功!
次通讯录为空!
!
结 束
图6-8.系统保存模块流程图
7 测试运行
运用软件VC++6.0,Word2003等不断测试,不断修改后,程序符合要求,设计的通讯录功能基本能正常运行,到存入系统中的功能,因为自己对文件程序的编写方面不够成熟所以程序中的保存功能并没有达到存入系统中的功能。
8 评价与修订
在设计过程中,在对C语言的循环结构的运用方面存在很多的问题,不够灵活,不仅浪费了我的很多时间,又降低了我对此次课程设计的热情,通过询问同学和老师得到解决。通过同学们的交流,询问老师,我知道我有很多方面不足需要得到有效的改善,所以在以后的日子里,自己应该多搞一些实际操作,多运用,才能更加熟悉各种开发软件。
9 设计体会
这次的课程设计是我们进入大学以来学习C语言结果的一次大考验。自己动手,发现问题和解决问题。并发现了许多自己的不足,平时没掌握的的知识在实践中暴露,经过不断的思考,查阅书籍和上网查资料与上机运行,解决了大部分的问题,还有一些小问题。但是,我相信在今后的学习中,一定能把它解决好。当今计算机应用在生活中可以说是无处不在。因此作为二十一世纪的大学生来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言程序设计是十分必要的。我不仅巩固了C语言程序设计的容,掌握设计的基本方法,强化了上机动手能力,还进一步掌握了以下知识:数据类型,分支控制,循环控制,结构体与数组,指针,文件操作,编译预处理等;通过课程设计,掌握了程序的局部测试,调试方法,建立程序系统调试,测试的基本概念和思想,学会较大程序的系统测试和调试方法。当我选择通讯录管理系统时,首先系统分析主要思路和框架哦,与同学讨论,联系所学的知识。我知道书上和老师讲的有限,所以上网搜也是一种利用资源的表现。在编程中,特别是结构体,指针的部分,几乎是一片空白。不过经过几天的努力,大体把课本上的知识点看了一遍,知识点也基本上掌握了,所以下一步就是开始正式的编程序了。当读懂了C语言编程的基本过程和方法,经过一波三折,终于开始正式编程。
通过这次的课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的知识与实际结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力。
在课程设计过程中,收获知识,提高能力的同时,我也学到了很多的人生哲理,懂得了怎么去制定计划,怎么去实现这个计划,并掌握了在执行的过程中怎样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定把课程设计的精神带到生活中,使生活变得更好。
10 参考文献
[1] 詹春华,沙·C语言程序设计教程··科学,2011年8月
[2]王敬华,林萍,静·C语言程序设计··清华大学,2007年10月
[3] 谭浩强·C++程序设计·:清华大学·2004
[4]董志民,建平,肖利娜.《C语言程序设计》教学改革探索与实践[J].电脑,
[5] 王路明•C语言程序设计教程•:邮电大学,2005年5月
[6]严蔚敏,吴伟民.数据结构(C语言版)[M].:清华大学,1997.
[7]詹春华,沙. 《C语言程序设计教程》 科学,2011.8
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Telephone
{ char name[50];
char sex[30];
char tel[30];
char city[30];
char eip[30];
struct Telephone *next;
}TEL;
TEL *head;
void Initiate();
void Menu();
void Create();
void Add();
void Find();
void Alter();
void Delete();
void List();
void save (TEL t[],int n);
int main()
{ int choice;
char YN;
Initiate();
do
{ system("cls");
Menu();
printf("请选择0-7的数字\n");
scanf("%d",&choice);
printf("\n");
switch(choice)
{ case 1:Create();break;
case 2:Add();break;
case 3:Find();break;
case 4:Alter();break;
case 5:Delete();break;
case 6:List();break;
case 7:save();break;
case 0:printf("************感您的使用************\n");
exit(0);break;
default:printf("输入有误!请重新输入\n");break;
}
printf("是否继续 Y or N? \n");
do
{ scanf("%c",&YN);
}while(YN!='Y'&&YN!='y'&&YN!='N'&&YN!='n');
}while(YN=='Y'||YN=='y');
}
//初始化
void Initiate()
{ if((head=(TEL *)malloc(sizeof(TEL)))==NULL) exit(1);
head->next=NULL;
}
//显示菜单
void Menu()
{
printf("**************欢迎使用通讯录系统**************");
printf("\n");
printf("\n");
printf(" 1.创建通讯录。\n");
printf(" 2.插入信息。\n");
printf(" 3.查询记录。\n");
printf(" 4.修改记录。\n");
printf(" 5.删除记录。\n");
printf(" 6.显示所有记录。\n");
printf(" 7.保存记录到文件。\n");
printf(" 0.退出通讯录。\n");
printf(" 请输入0~7 \n");
}
//创建通讯录
void Create()
{ TEL *p1[100],*p2;
int m,i;
scanf("%d",&m);
for(i=1;i<=m;i++)
{ p1[i]=(TEL *)malloc(sizeof(TEL));
printf("请输入第%d条信息!\n",i);
scanf("%s",&p1[i]->name);
scanf("%s",&p1[i]->sex);
scanf("%s",&p1[i]->tel);
scanf("%s",&p1[i]->city);
scanf("%s",&p1[i]->eip);
p1[i]->next=NULL;
if(head->next==NULL)
head->next=p1[i];
else
{ for(p2=head;p2->next!=NULL;p2=p2->next);
p2->next=p1[i];
}
}
printf("信息已添加!\n");
return;
}
//添加通讯录信息
void Add()
{ TEL *p,*q;
if((q=(TEL *)malloc(sizeof(TEL)))==NULL) exit(1);
printf("请输入要添加的信息!\n");
scanf("%s",&q->name);
scanf("%s",q->sex);
scanf("%s",q->tel);
scanf("%s",q->city);
scanf("%s",q->eip);
for(p=head;p->next!=NULL;p=p->next) ;
p->next=q;
q->next=NULL;
printf("此信息已添加!");
return;
}
//查找通讯录信息
void Find()
{ TEL *p;
char name[50];
if(head->next==NULL)
{ printf("此通讯录为空!\n");
return;
}
scanf("%s",&name);
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
{ printf("\t性别\t城市\t \t\n");
printf("%s\t%s\t%s\t%s\t%s\n",p->name,p->sex,p->city,p->eip,p->tel);
}
else if(p->next==NULL)
printf("无此信息!\n");
}
}
//修改通讯录信息
void Alter()
{ char name[50];
TEL *p, *p1;
if (head->next == NULL)
{ printf("此通讯录为空!\n");
return;
}
scanf("%s",name);
for(p=head->next;p!=NULL;p=p->next)
{ if(strcmp(p->name,name)==0)
break;
else if(p->next==NULL)
{ printf("无此信息!\n");
return;
}
}
p1=(TEL *)malloc(sizeof(TEL));
scanf("%s",p1->name);
strcpy(p->name,p1->name);
scanf("%s",p1->sex);
strcpy(p->sex,p1->sex);
scanf("%s",p1->tel);
strcpy(p->tel,p1->tel);
scanf("%s",p1->city);
strcpy(p->city,p1->city);
scanf("%s",p1->eip);
strcpy(p->eip,p1->eip);
printf("此信息已修改!\n");
printf("\t性别\t城市\t \t\n");
printf("%s\t%s\t%s\t%s\t%s\n",p->name,p->sex,p->city,p->eip,p->tel);
free(p1);
}
//删除通讯录信息
void Delete()
{
char name[50];
TEL *p = head->next, *p1 =head->next,*p2;
if (head->next == NULL)
{ printf("此通讯录为空!\n");
return;
}
scanf(" %s",name);
while ((strcmp(p->name,name)!=0 )&& p->next != NULL)
{ p1=p;
p =p->next;
}
if (strcmp(name, p->name)==0)
{ if (p == head->next&&p->next!=NULL)
head->next = p->next;
else if(p==head->next&&p->next==NULL)
{ head->next=p->next;
printf("信息已删除,先此通讯录为空!!\n");
return;
}
else
p1->next = p->next;
}
else
{ printf("此信息不存在!!!\n");
return;
}
printf("此信息已删除!");
printf("\t性别\t城市\t \t\n");
for(p2=head->next;p2!=NULL;p2=p2->next)
printf("%s\t%s\t%s\t%s\t%s\n",p2->name,p2->sex,p2->city,p2->eip,p2->tel);
}
//显示所有记录
void List()
{ TEL *p;
if(head->next==NULL)
{ printf("此通讯录中无记录!\n");
return;
}
printf("\t性别\t城市\t \t\n");
for(p=head->next;p!=NULL;p=p->next)
printf("%s\t%s\t%s\t%s\t%s\n",p->name,p->sex,p->city,p->tel,p->eip);
}
//保存信息到文件
void save(TEL t[],int n)
{ int i=0;
TEL *fp;
char name[50];
printf("\n 保存文件\n");
scanf(“\t%s”,name);
fp=fopen(name,"w") ;
if(fp==NULL)
{ printf("\t不能打开文件\n");
exit(1);
}
fprintf(fp,"**************通讯录系统**************\n");
fprintf(fp,"%d",n);
fprintf(fp," \t性别\t城市\t \t\n");
for(i=0;i<n;i++)
fprintf(fp,"%-3s\t%-6s\t%-3s\t%-20s\t%-20s\n",t[i].name, t[i].sex, t[i].city ,t[i].eip, t[i].tel);
fprintf(fp,"**************共有%d记录**************");
fclose(fp);
printf("保存成功!\n");
}
设计过程中现场提问(或答辩)记载:
1.提问:怎样设计所给的要求?
答:先建一个文件,包含插入模块,查询模块,显示模块,修改模块,删除模块,保存模块。
2.提问:怎样画流程图?
答:先设计一个总流程图,结束,然后再按模块画出各个流程图,如图
3.提问:要用到哪些函数?
答:打开文件,关闭文件
指导教师评语:
成绩评定等级:
指导教师(签名):
2013年 3月 7日
31 / 32
展开阅读全文