C语言课程设计手机通讯录管理系统.docx
《C语言课程设计手机通讯录管理系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计手机通讯录管理系统.docx(28页珍藏版)》请在冰点文库上搜索。
C语言课程设计手机通讯录管理系统
C语言课程设计
手机通信录管理系统
院系:
姓名:
学号:
班号:
指导教师:
2014年12月
一题目要求
模拟手机通讯录管理系统,实现对手机中的通讯录进行管理。
功能要求如下:
(1)查看功能:
选择此功能时,列出下列三类选择。
A:
办公类
B:
个人类
C:
商务类
当选中某类时,显示出此类所有数据中的姓名和电话号码
(2)增加功能:
能录入新数据
每个结点包括:
姓名,电话号码,分类(办公类、个人类、商务类),电子邮件。
例如:
杨春,,商务类,。
当录入重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通讯录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
(3)修改功能:
选中某个人的姓名时,可对此人的相应数据进行修改。
(4)删除功能:
选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
二需求分析
根据题目要求,由于通信录信息是存放在文件中,所以应提供文件的输入、输出等操作;在程序中需要浏览个人的信息,应提供显示、查找、增加、删除等操作;另外还应提供键盘式选择菜单实现功能选择。
三总体设计
根据上面的需求分析,可以将这个系统的设计分为如下六大模块:
查找、增加、修改、删除、显示、退出。
图系统功能模块图
四详细设计
1.主函数
主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
[如图]
N
Y
图主函数流程图
[程序]
/***菜单*****/
voidmenu()/*主界面*/
{
intn,w1;/*变量n保存选择菜单数字,w判断输入的数字是否在功能菜单对应数字范围内*/
do
{
puts("\t\t**MENU****\n\n");
puts("\t\t\t\t1.查询成员资料");
puts("\t\t\t\t2.增加一位成员资料");
puts("\t\t\t\t3.修改一位成员资料");
puts("\t\t\t\t4.删除一位成员资料");
puts("\t\t\t\t5.成员总名单查看");
puts("\t\t\t\t6.退出系统");
puts("\n\n\t\t***\n");
printf("请选择您要执行的功能(1-6):
[]\b\b");
scanf("%d",&n);
if(n<1||n>5)
{w1=1;getchar();}
elsew1=0;
}while(w1==1);
switch(n)
{case1:
search();break;/*查看模块*/
case2:
add();break;/*增加模块*/
case3:
modify();break;/*修改模块*/
case4:
del();break;/*删除模块*/
case5:
browse();break;/*显示模块*/
case6:
exit(0);/*退出*/
}
}
/***主函数****/
main()
{menu();}
2.各功能模块设计
(1)查看模块
[数据结构]
我们的原始数据只有一类,为个人通信录信息,取名为:
。
[分析]
单独看各数据信息,姓名、电话号码、分类、电子邮件都是字符型,可以采用字符型数组。
数据信息存放在文件中,一条记录对应一个人,既符合习惯又方便信息管理。
现在要考虑的问题是:
一个人的记录从文件中读出来后以什么形式存放
我们应该很容易想到:
每个人的信息是不是可以采用结构体的形式呢这样把个人通信信息的姓名、电话号码等作为结构体成员不就可以把一个人的信息作为一个整体来处理了吗如果要存放若干个人的信息就用结构体数组。
structperson
{
charname[10];
charphone[11];
charclassify[10];
chare_mile[20];
}per[N];
charA[]={"office"};
charB[]={"single"};
charC[]={"business"};
}
[注意]
stu[N]中N为所有记录人的个数,程序中采用宏定义的方式,可以随时在源程序宏定义中改,本程序宏定义#defineN15。
同时还定义三种分类:
办公类、个人类、商务类。
[流程图]
YN
图查看模块流程图
[程序]
/***查看功能**/
search()
{
voidmenu();
intn,j,k=-1;
charp[10];
n=load();
printf("\n\nClassifyA:
office\nClassifyB:
single\nClassifeC:
business\n\nEnterclassifythatyouwanttosearch!
Classify:
");
/*输入要找的人的分类***/
scanf("%s",p);
for(j=0;jif(strcmp(p,per[j].classify)==0)
{
k=j;
printf("\n(%d).%s%s\n",j,per[j].name,per[j].phone);
}
if(k==-1)
/****如果要查找的分类不存在,则显示不存在****/
{
printf("\n\nNOEXIST!
");
}
menu();
}
(2)增加模块
[需求分析]
该模块的功能是:
能录入新数据每个结点包括:
姓名,电话号码,分类(办公类、个人类、商务类),电子邮件。
当录入重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通讯录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
[流程图]
YN
YN
YN
图增加模块流程图
[程序]
/**增加功能***/
voidadd()
{
voidmenu();
intn,j;
FILE*fp;
charname[10],classify[10],e_mile[20];
charphone[11];
n=load();
printf("\n\nThenameandphoneofthepersonyouwanttoaddare:
\n\n");
/输入要增加人的姓名和电话号码/
scanf("%s%s",name,phone);
if((fp=fopen("","r+"))==NULL)
{
printf("\n\nCannotopen!
\n\n");
}
for(j=0;j{
if(strcmp(name,per[j].name)==0&&strcmp(phone,per[j].phone)==0)/*如果输入的姓名和电话已存在,则提示已存在*/
{
printf("\n\nThemessageisexist!
\n");break;
}
}
if(j==15)
{
ame)==0)
{
do
{
puts("\nModifyby=>\n\n1).name2).phone:
3).classify:
4).e_mile:
");
printf("Whitchyouneeded:
[]\b\b");
/*输入要修改的选项**/
scanf("%d",&c);
if(c>4||c<1)
{
puts("\nChioceerror!
Pleaseagain!
");
getchar();
}
}while(c>8||c<1);break;
}
do
{
switch(c)
{
case1:
printf("name");scanf("%s",per[j].name);break;
case2:
printf("phone");scanf("%s",per[j].phone);break;
case3:
printf("classify");scanf("%s",per[j].classify);break;
case4:
printf("e_mile");scanf("%s",per[j].e_mile);break;
}
}while(c<1||c>4);
if(j==n)printf("\n\nThenameyouwantisnotexist!
\n");
for(i=0;ifprintf(fp,"%s%s%s%s\n",per[i].name,per[i].phone,per[i].classify,per[i].e_mile);
fclose(fp);
menu();
}
(4)删除模块
[需求分析]
该模块的功能是按用户输入个人的姓名删除此人的全部信息。
做法是保存未被删除的所有信息,即实现功能,并且自动调整后续条目的编号。
这样比起删除一般做法较为简单。
[流程图]
图删除模块图
[程序]
/删除功能****/
voiddel()
{
inti,j,n;
FILE*fp;
charname[10];
n=load();
printf("\n\nDelbyname:
");
/输入要删除人的姓名**/
scanf("%s",name);
if((fp=fopen("","w"))==NULL)
{
printf("\n\nCannotopen!
\n\n");
}
for(j=0;jif(strcmp(name,per[j].name)==0)
break;
for(i=0;iif(i!
=j)
/**删除选项,并自动调整其他所有选项*/
fprintf(fp,"%s%s%s%s\n",per[i].name,per[i].phone,per[i].classify,per[i].e_mile);
fclose(fp);
menu();
}
(5)显示模块
[需求分析]
该模块的功能是显示所有人的通信信息。
[流程图]
图显示模块流程图
[程序]
/****显示功能***/
voidbrowse()
{
voidmenu();
intn,i;
n=load();
for(i=0;i{
printf("\n(%d).%s-%s-%s-%s\n",i,per[i].name,per[i].phone,per[i].classify,per[i].e_mile);
}
menu();
}
3.公共函数
以下是在每个功能中都有可能用到的公共函数。
加载函数load()
[说明]
该程序用来加载所有记录,并且可以返回所有记录的个数。
[程序]
intload()/****加载函数****/
/*****加载所有记录,并且可以返回所有记录的个数**/
{
FILE*fp;
inti;
if((fp=fopen("","r"))==NULL)
{printf("\nCannotopenfile\n");
return0;
}
for(i=0;!
feof(fp);i++)
{fscanf(fp,"%s%s%s%s",&per[i].name,&per[i].phone,&per[i].classify,&per[i].e_mile);
e_mile);
}
fclose(fp);
return(i);
}
五上机操作
1.数据源
个人通信文件格式:
每行储存一个人的信息:
姓名、电话号码、分类、电子邮件。
例如:
ZhaoA
QianA
SunA
LiB
ZhouB
WuC
ZhengC
WangC
Feng99999999C
2.编译、连接和运行
3.结果
下面是各模块的界面图:
(1)主菜单函数
(2)查看模块
在主界面出现后输入1回车看到下图:
输入要找人的分类,如下图:
(3)增加模块
录入了重复的姓名和电话号码时回车看到下图:
通信录中超过15条信息时回车看到下图:
(4)修改模块
输入要修改人的姓名回车看到下图:
(5)删除模块
输入要删除人的姓名是回车看到下图:
(6)显示模块
(7)退出模块
六总结
课程设计是一次将理论知识运用于解决实际生活中所遇到的问题的实战是一次理解和深化理论知识,树立知识服务生活,知识服务经济发展的的理念。
在本次设计过程中,我通过查阅资料,以及调查身边的人进行系统需求分析,在此基础上建立系统模型,编写代码,进行调试。
过程是曲折的,有时候一个字母的大小写就要花上几个小时的时间去查找。
但正是这个过程让我了解了自己对这么语言的掌握程度,锻炼了我独立解决问题的能力,同时让我意识到严谨的态度对一个系统开发者的重要性。
通过这一个星期的上机实习,我进一步理解和运用了结构优化设计的思想和方法,学会了调试一个较长程序的基本方法,学会了利用流程图表示算法,进一步掌握和提高利用C语言进行程序设计的能力。
学以致用,手机通讯录管理系统是我独立开发的第一个系统。
由于能力所限,这个系统还相对简单,且有可能存在一定的缺陷,但这并没有影响到我设计成功后的喜悦。
最后,衷心的感谢本次课程设计的曹弘老师,正因为老师的指点,使得我少走了很多弯路,同时授予了我很多作为设计人员应该有的正确理念和行为。
附录源程序
#include<>
#include<>
#include<>
#defineN15
structperson
{
charname[10];
charphone[11];
charclassify[10];
chare_mile[20];
}per[N];
charA[]={"office"};
charB[]={"single"};
charC[]={"business"};
intload()/****加载函数****/
/*****加载所有记录,并且可以返回所有记录的个数**/
{
FILE*fp;
inti;
if((fp=fopen("","r"))==NULL)
{printf("\nCannotopenfile\n");
return0;
}
for(i=0;!
feof(fp);i++)
fscanf(fp,"%s%s%s%s",&per[i].name,&per[i].phone,&per[i].classify,&per[i].e_mile);
fclose(fp);
return(i);
}
/***查看功能**/
search()
{
voidmenu();
intn,j,k=-1;
charp[10];
n=load();
printf("\n\nClassifyA:
office\nClassifyB:
single\nClassifeC:
business\n\nEnterclassifythatyouwanttosearch!
Classify:
");
/*输入要找的人的分类***/
scanf("%s",p);
for(j=0;jif(strcmp(p,per[j].classify)==0)
{
k=j;
printf("\n(%d).%s%s\n",j,per[j].name,per[j].phone);
}
if(k==-1)/****如果要查找的分类不存在,则显示不存在****/
{
printf("\n\nNOEXIST!
");
}
menu();
}
/**增加功能***/
voidadd()
{
voidmenu();
intn,j;
FILE*fp;
charname[10],classify[10],e_mile[20];
charphone[11];
n=load();
printf("\n\nThenameandphoneofthepersonyouwanttoaddare:
\n\n");
/输入要增加人的姓名和电话号码/
scanf("%s%s",name,phone);
if(!
(fp=fopen("","r+"))==NULL)
{
printf("\n\nCannotopen!
\n\n");
}
for(j=0;j{
if(strcmp(name,per[j].name)==0&&strcmp(phone,per[j].phone)==0)/*如果输入的姓名和电话已存在,则提示已存在*/
{
printf("\n\nThemessageisexist!
\n");break;
}
}
if(j==15)
{
ame)==0)
{
do
{
puts("\nModifyby=>\n\n1).name2).phone:
3).classify:
4).e_mile:
");
printf("Whitchyouneeded:
[]\b\b");
/*输入要修改的选项**/
scanf("%d",&c);
if(c>4||c<1)
{
puts("\nChioceerror!
Pleaseagain!
");
getchar();
}
}while(c>8||c<1);break;
}
do
{
switch(c)
{
case1:
printf("name");scanf("%s",per[j].name);break;
case2:
printf("phone");scanf("%s",per[j].phone);break;
case3:
printf("classify");scanf("%s",per[j].classify);break;
case4:
printf("e_mile");scanf("%s",per[j].e_mile);break;
}
}while(c<1||c>4);
if(j==n)printf("\n\nThenameyouwantisnotexist!
\n");
for(i=0;ifprintf(fp,"%s%s%s%s\n",per[i].name,per[i].phone,per[i].classify,per[i].e_mile);
fclose(fp);
menu();
}
/删除功能****/
voiddel()
{
inti,j,n;
FILE*fp;
charname[10];
n=load();
printf("\n\nDelbyname:
");
/输入要删除人的姓名**/
scanf("%s",name);
if((fp=fopen("","w"))==NULL)
{
printf("\n\nCannotopen!
\n\n");
}
for(j=0;jif(strcmp(name,per[j].name)==0)
break;
for(i=0;iif(i!
=j)
/**删除选项,并自动调整其他所有选项*/
fprintf(fp,"%s%s%s%s\n",per[i].name,per[i].phone,per[i].classify,per[i].e_mile);
fclose(fp);
menu();
}
/****显示功能***/
voidbrowse()
{
voidmenu();
intn,i;
n=load();
for(i=0;i{
printf("\n(%d).%s-%s-%s-%s\n",i,per[i].name,per[i].phone,per[i].classify,per[i].e_mile);
}
menu();
}
/***菜单*****/
voidmenu()
{
intn,w1;/*变量n保存选择菜单数字,w判断输入的数字是否在功能菜单对应数字范围内*/
do
{
puts("\t\t****通讯录主界面****\n\n");
puts("\t\t\t\t1.查询成员资料");
puts("\t\t\t\t2.增加一位成员资料");
puts("\t\t\t\t3.修改一位成员资料");
puts("\t\t\t\t4.删除一位成员资料");
puts("\t\t\t\t5.成员总名单查看");
puts("\t\t\t\t6.退出系统");
puts("\n\n\t\t***\n");
printf("Choiceyournumber(1-6):
[]\b\b");
scanf("%d",&n);
if(n<1||n>6)
{w1=1;getchar();}
elsew1=0;
}while(w1==1);
switch(n)
{case1:
search();break;/*查看模块*/
case2:
add();break;/*增加模块*/
case3:
modify();break;/*修改模块*/
case4:
del();break;/*删除模块*/
case5:
browse();break;/*显示模块*/
case6:
exit(0);/*退出*/
}
}
/***主函数****/
main()
{menu();}