C语言课程设计通信录管理.docx
《C语言课程设计通信录管理.docx》由会员分享,可在线阅读,更多相关《C语言课程设计通信录管理.docx(29页珍藏版)》请在冰点文库上搜索。
C语言课程设计通信录管理
课程设计(论文)
题目名称通信录管理
课程名称C语言课程设计
学生姓名
学号
系、专业信息工程系、信息大类
指导教师邓波
2008年6月8日
目录
1前言2
2需求分析2
2.1要求2
2.2任务2
2.3运行环境2
2.4开发工具2
3概要设计2
3.1系统流程图:
3
3.2函数“输入”流程图4
3.3函数“显示”流程图4
3.4函数“删除”流程图5
3.5函数“增加”流程图6
3.6函数“保存”流程图6
4详细设计7
4.1通信录管理7
4.2分析和设计7
4.3具体代码实现11
5课程设计的总结与体会16
参考文献16
致谢16
1
前言
编写一个程序,可以存入通信录信息,并对其进行管理。
可以根据不同的提示,对通信录进行各种不同的管理。
2需求分析
2.1要求
(1)用C语言实现程序设计。
(2)利用结构体进行相关信息处理。
(3)画出主要流程图。
(4)系统的各个功能模块要求用函数形式实现。
(5)界面良好(良好的人机互交),流程要有注释。
2.2任务
(1)录入通信录信息(包括姓名、单位、电话号码)。
(2)显示通信录里的所有成员的信息。
(3)查询通信录中某个人的信息。
(4)增加某个人的信息到通信录中。
(5)删除通信录里某个人的信息。
(6)保存通信录的信息。
2.3运行环境
(1)WINDOWS2000/XP系统
(2)Turboc2.0编译环境
2.4开发工具
C语言
3概要设计
3.1系统流程图(如图3.1)
图3.1系统流程图
3.2函数“输入”流程图(如图3.2)
图3.2函数“输入”流程图
3.3函数“显示”流程图(如图3.3)
图3.3函数“显示”流程图
3.4函数“查找”流程图(如图3.4)
图3.4函数“查找”流程图
3.5函数“删除”流程图(如图3.5)
图3.5函数“删除”流程图
3.6函数“增加”流程图(如图3.6)
图3.6函数“增加”流程图
3.7函数“保存”流程图(如图3.7)
图3.7函数“保存”流程图
4详细设计
4.1通信录管理
根据提示,对通信录进行不同的管理。
4.2分析和设计
在程序的开头部分是就宏定义了M#defineM50,随着在主函数中又有ADDRESSadr[M];这就定义了50个用来存放通信录的各种信息的结构体变量。
然后定义结构体变量
typedefstruct/*定义数据结构*/
{
charname[20];/*姓名*/
charunits[30];/*单位*/
chartele[10];/*电话*/
}ADDRESS;
定义了用来存放通信录的各种信息的结构体变量。
可以将通信录成员的姓名、单位、电话号码存入文件之中。
函数原型
intenter(ADDRESSt[]);/*输入记录*/
voidlist(ADDRESSt[],intn);/*显示记录*/
voidsearch(ADDRESSt[],intn);/*按姓名查找显示记录*/
intdelete(ADDRESSt[],intn);/*删除记录*/
intadd(ADDRESSt[],intn);/*插入记录*/
voidsave(ADDRESSt[],intn);/*记录保存为文件*/
voidprint(ADDRESStemp);/*显示单条记录*/
intmenu_select();/*主菜单函数*/
这就是程序中所有的子函数,在这里起到一个函数声明的作用。
函数“输入”
intenter(ADDRESSt[])
{
inti,n;
char*s;
clrscr();/*清屏*/
printf("\npleaseinputnum\n");/*提示信息*/
scanf("%d",&n);/*输入记录数*/
printf("pleaseinputrecord\n");/*提示输入记录*/
printf("nameunittelephone\n");
printf("------------------------------------------------\n");
for(i=0;i{
scanf("%s%s%s",t[i].name,t[i].units,t[i].tele);/*输入记录*/
printf("----------------------------------------------\n");
}
returnn;/*返回记录条数*/
}
/*显示记录,参数为记录数组和记录条数*/
这个函数表示的是调用的函数“输入”。
然后输入记录数,再将通信录成员的信息都输入系统,将其赋入结构体中,当输入成员的信息等于记录数时,结束输入。
函数“显示”
voidlist(ADDRESSt[],intn)
{
inti;
clrscr();
printf("\n\n*******************ADDRESS******************\n");
printf("nameunittelephone\n");
printf("------------------------------------------------\n");
for(i=0;iprintf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);
if((i+1)%10==0)/*判断输出是否达到10条记录*/
{
printf("Pressanykeycontinue...\n");/*提示信息*/
getch();/*按任意键继续*/
}
printf("************************end*******************\n");
}
这个函数表示的是调用的函数“显示”。
显示通信录里成员的信息。
函数“查找”
voidsearch(ADDRESSt[],intn)
{
chars[20];/*保存待查找姓名字符串*/
inti;/*保存查找到结点的序号*/
clrscr();/*清屏*/
printf("pleasesearchname\n");
scanf("%s",s);/*输入待查找姓名*/
i=find(t,n,s);/*调用find函数,得到一个整数*/
if(i>n-1)/*如果整数i值大于n-1,说明没找到*/
printf("notfound\n");
else
print(t[i]);/*找到,调用显示函数显示记录*/
}
/*显示指定的一条记录*/
voidprint(ADDRESStemp)
{
clrscr();
printf("\n\n********************************************\n");
printf("nameunittelephone\n");
printf("------------------------------------------------\n");
printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);
printf("**********************end***********************\n");
}
/*查找函数,参数为记录数组和记录条数以及姓名s*/
intfind(ADDRESSt[],intn,char*s)
{
inti;
for(i=0;i{
if(strcmp(s,t[i].name)==0)/*记录中的姓名和待比较的姓名是否相等*/
returni;/*相等,则返回该记录的下标号,程序提前结结束*/
}
returni;/*返回i值*/
}
这个函数表示的是调用的函数“查找”。
按姓名方式查找某个人是否在通信录里的成员。
在search中调用了两个函数,分别是显示函数和查找函数,在查找函数中试应用比较函数,比较要查找的姓名和通信录里面的姓名是否相等。
如果相等则显示该成员信息,否则显示没有找到。
函数“删除”
intdelete(ADDRESSt[],intn)
{
chars[20];/*要删除记录的姓名*/
intch=0;
inti,j;
printf("pleasedeletedname\n");/*提示信息*/
scanf("%s",s);/*输入姓名*/
i=find(t,n,s);/*调用find函数*/
if(i>n-1)/*如果i>n-1超过了数组的长度*/
printf("nofoundnotdeleted\n");/*显示没找到要删除的记录*/
else
{
print(t[i]);/*调用输出函数显示该条记录信息*/
printf("Areyousuredeleteit(1/0)\n");/*确认是否要删除*/
scanf("%d",&ch);/*输入一个整数0或1*/
if(ch==1)/*如果确认删除整数为1*/
{
for(j=i+1;j{
strcpy(t[j-1].name,t[j].name);/*将后一条记录的姓名拷贝到前一条*/
strcpy(t[j-1].units,t[j].units);/*将后一条记录的单位拷贝到前一条*/
strcpy(t[j-1].tele,t[j].tele);/*将后一条记录的电话拷贝到前一条*/
}
n--;/*记录数减1*/
}
}
returnn;/*返回记录数*/
}
这个函数表示的是调用的函数“删除”。
删除某个成员的信息。
首先是输入要删除人的姓名,然后调用find函数,如果没找到该成员则显示没有找到,如果找到了该成员,程序采用的方法是删除某位置的记录,后面的记录全部都往前一个位置。
函数“增加”
intadd(ADDRESSt[],intn)/*插入函数,参数为结构体数组和记录数*/
{
ADDRESStemp;/*新插入记录信息*/
inti,j;
chars[20];/*确定插入在哪个记录之前*/
printf("pleaseinputrecord\n");
printf("************************************************\n");
printf("nameunittelephone\n");
printf("--------------------------------------------------\n");
scanf("%s%s%s",temp.name,temp.units,temp.tele);/*输入插入信息*/
printf("------------------------------------------------\n");
printf("pleaseinputlocatename\n");
scanf("%s",s);/*输入插入位置的姓名*/
i=find(t,n,s);/*调用find,确定插入位置*/
for(j=n-1;j>=i;j--)/*从最后一个结点开始向后移动一条*/
{
strcpy(t[j+1].name,t[j].name);/*当前记录的姓名拷贝到后一条*/
strcpy(t[j+1].units,t[j].units);/*当前记录的单位拷贝到后一条*/
strcpy(t[j+1].tele,t[j].tele);/*当前记录的电话拷贝到后一条*/
}
strcpy(t[i].name,temp.name);/*将新插入记录的姓名拷贝到第i个位置*/
strcpy(t[i].units,temp.units);/*将新插入记录的单位拷贝到第i个位置*/
strcpy(t[i].tele,temp.tele);/*将新插入记录的电话拷贝到第i个位置*/
n++;/*记录数加1*/
returnn;/*返回记录数*/
}
这个函数表示的是调用的函数“增加”。
输入要增加的成员的信息,然后系统提示把新增的成员放通信录里的成员位置之前。
调用find函数,找到位置,然后该位置开始所有的成员往后移一个位置。
再将那个新纪录放在该位置上。
函数“保存”
voidsave(ADDRESSt[],intn)
{
inti;
FILE*fp;/*指向文件的指针*/
if((fp=fopen("record.txt","wb"))==NULL)/*打开文件,并判断打开是否正常*/
{
printf("cannotopenfile\n");/*没打开*/
exit
(1);/*退出*/
}
printf("\nSavingfile\n");/*输出提示信息*/
fprintf(fp,"%d",n);/*将记录数写入文件*/
fprintf(fp,"\r\n");/*将换行符号写入文件*/
for(i=0;i{
fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele);/*格式写入记录*/
fprintf(fp,"\r\n");/*将换行符号写入文件*/
}
fclose(fp);/*关闭文件*/
printf("****savesuccess***\n");/*显示保存成功*/
}
这个函数表示的是调用的函数“保存”。
打开文件,将信息存入文件中。
4.3具体代码实现
/******头文件(.h)***********/
#include"stdio.h"/*I/O函数*/
#include"stdlib.h"/*标准库函数*/
#include"string.h"/*字符串函数*/
#include"ctype.h"/*字符操作函数*/
#defineM50/*定义常数表示记录数*/
typedefstruct/*定义数据结构*/
{
charname[20];/*姓名*/
charunits[30];/*单位*/
chartele[10];/*电话*/
}ADDRESS;
/******以下是函数原型*******/
intenter(ADDRESSt[]);/*输入记录*/
voidlist(ADDRESSt[],intn);/*显示记录*/
voidsearch(ADDRESSt[],intn);/*按姓名查找显示记录*/
intdelete(ADDRESSt[],intn);/*删除记录*/
intadd(ADDRESSt[],intn);/*插入记录*/
voidsave(ADDRESSt[],intn);/*记录保存为文件*/
voidprint(ADDRESStemp);/*显示单条记录*/
intmenu_select();/*主菜单函数*/
/******主函数开始*******/
main()
{
inti;
ADDRESSadr[M];/*定义结构体数组*/
intlength;/*保存记录长度*/
clrscr();/*清屏*/
for(;;)/*无限循环*/
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{
case0:
length=enter(adr);break;/*输入记录*/
case1:
list(adr,length);break;/*显示全部记录*/
case2:
search(adr,length);break;/*查找记录*/
case3:
length=delete(adr,length);break;/*删除记录*/
case4:
length=add(adr,length);break;/*插入记录*/
case5:
save(adr,length);break;/*保存文件*/
case6:
exit(0);/*如返回值为6则程序结束*/
}
}
}
/*菜单函数,函数返回值为整数,代表所选的菜单项*/
menu_select()
{
chars[80];
intc;
gotoxy(1,25);/*将光标定为在第25行,第1列*/
printf("pressanykeyentermenu......\n");/*提示压任意键继续*/
getch();/*读入任意字符*/
clrscr();/*清屏*/
gotoxy(1,1);
printf("********************MENU*********************\n\n");
printf("0.Enterrecord\n");
printf("1.Listthefile\n");
printf("2.Searchrecordonname\n");
printf("3.Deletearecord\n");
printf("4.addrecord\n");
printf("5.Savethefile\n");
printf("6.Quit\n");
printf("***********************************************\n");
do{
printf("\nEnteryouchoice(0~6):
");/*提示输入选项*/
scanf("%s",s);/*输入选择项*/
c=atoi(s);/*将输入的字符串转化为整型数*/
}while(c<0||c>6);/*选择项不在0~6之间重输*/
returnc;/*返回选择项,主程序根据该数调用相应的函数*/
}
/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/
intenter(ADDRESSt[])
{
inti,n;
char*s;
clrscr();/*清屏*/
printf("\npleaseinputnum\n");/*提示信息*/
scanf("%d",&n);/*输入记录数*/
printf("pleaseinputrecord\n");/*提示输入记录*/
printf("nameunittelephone\n");
printf("------------------------------------------------\n");
for(i=0;i{
scanf("%s%s%s",t[i].name,t[i].units,t[i].tele);/*输入记录*/
printf("----------------------------------------------\n");
}
returnn;/*返回记录条数*/
}
/*显示记录,参数为记录数组和记录条数*/
voidlist(ADDRESSt[],intn)
{
inti;
clrscr();
printf("\n\n*******************ADDRESS******************\n");
printf("nameunittelephone\n");
printf("------------------------------------------------\n");
for(i=0;iprintf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);
if((i+1)%10==0)/*判断输出是否达到10条记录*/
{
printf("Pressanykeycontinue...\n");/*提示信息*/
getch();/*按任意键继续*/
}
printf("************************end*******************\n");
}
/*查找记录*/
voidsearch(ADDRESSt[],intn)
{
chars[20];/*保存待查找姓名字符串*/
inti;/*保存查找到结点的序号*/
clrscr();/*清屏*/
printf("pleasesearchname\n");
scanf("%s",s);/*输入待查找姓名*/
i=find(t,n,s);/*调用find函数,得到一个整数*/
if(i>n-1)/*如果整数i值大于n-1,说明没找到*/
printf("notfound\n");
else
print(t[i]);/*找到,调用显示函数显示记录*/
}
/*显示指定的一条记录*/
voidprint(ADDRESStemp)
{
clrscr();
printf("\n\n********************************************\n");
printf("nameunittelephone\n");
printf("------------------------------------------------\n");
printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);
printf("**********************end***********************\n");
}
/*查找函数,参数为记录数组和记录条数以及姓名s*/
intfind(ADDRESSt[],intn,char*s)
{
inti;
for(i=0;i{
if(strcmp(s,t[i].name)==0)/*记录中的姓名和待比较的姓名