c语言课程设计通讯录管理系统.docx
《c语言课程设计通讯录管理系统.docx》由会员分享,可在线阅读,更多相关《c语言课程设计通讯录管理系统.docx(20页珍藏版)》请在冰豆网上搜索。
c语言课程设计通讯录管理系统
课程设计说明书NO1.
通讯录管理系统
1.课程设计的目的
C语言程序设计课程设计是计算机科学与技术(信息安全、电子商务)专业一门重要的专业技术基础课程,也是一门核心课程。
本课程设计的目的是为了配合C语言程序设计课程的开设,使学生能够较熟练地掌握C语言的基本内容及程序设计的基本方法与编程技巧,并能够培养学生应用计算机解决和处理实际问题的思维方法与基本能力,为进一步学习和应用计算机的专业知识打下基础。
2.设计方案论证
2.1系统功能模块划分:
主函数:
调用其它功能模块。
窗口操作:
预定义一些常用的窗口及信息提示函数供其它模块调用。
主菜单:
显示菜单,选择功能项。
数据输入:
输入通讯人姓名、单位、电话。
全部显示:
显示全部通讯人的姓名、单位、电话。
条件查询:
姓名查找并显示某个通讯人的姓名、单位、电话。
排序输出:
按序号显示记录。
数据读取:
把通讯人的信息保存到一个文件中。
数据存储:
读入文件中保存的通讯人信息。
2.2详细设计:
2.2.1数据结构设计:
程序设计中用到的结构体类型:
通讯人信息结构体类型:
typedefstruct/*定义数据结构*/
{
charname[20];/*姓名*/
charunits[30];/*单位*/
沈阳大学
课程设计说明书NO.2
chartele[10];/*电话*/
}
2.2.2程序代码
#include"stdio.h"/*I/O函数*/
#include"stdlib.h"/*标准库函数*/
#include"string.h"/*字符串函数*/
#include"ctype.h"/*字符操作函数*/
#defineM50/*定义常数表示记录数*/
typedefstruct/*定义数据结构*/
{
charname[20];/*姓名*/
chartele[10];/*电话*/
charunits[30];/*单位*/
}ADDRESS;
/******以下是函数原型*******/
intenter(ADDRESSt[]);/*输入记录*/
voidlist(ADDRESSt[],intn);/*显示记录*/
voidsearch(ADDRESSt[],intn);/*按姓名查找显示记录*/
intdelete(ADDRESSt[],intn);/*删除记录*/
intadd(ADDRESSt[],intn);/*插入记录*/
voidsave(ADDRESSt[],intn);/*记录保存为文件*/
intload(ADDRESSt[]);/*从文件中读记录*/
voiddisplay(ADDRESSt[]);/*按序号查找显示记录*/
voidsort(ADDRESSt[],intn);/*按姓名排序*/
voidqseek(ADDRESSt[],intn);/*快速查找记录*/
voidcopy();/*文件复制*/
voidprint(ADDRESStemp);/*显示单条记录*/
intfind(ADDRESSt[],intn,char*s);/*查找函数*/
沈阳大学
课程设计说明书NO.3
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:
length=load(adr);break;/*读文件*/
case7:
display(adr);break;/*按序号显示记录*/
case8:
sort(adr,length);break;/*按姓名排序*/
case9:
qseek(adr,length);break;/*快速查找记录*/
case10:
copy();break;/*复制文件*/
case11:
exit(0);/*如返回值为11则程序结束*/
}
}
}
/*菜单函数,函数返回值为整数,代表所选的菜单项*/
沈阳大学
课程设计说明书NO.4
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.Loadthefile\n");
printf("7.displayrecordonorder\n");
printf("8.sorttomakenewfile\n");
printf("9.Quickseekrecord\n");
printf("10.copythefiletonewfile\n");
printf("11.Quit\n");
printf("***********************************************\n");
do{
printf("\nEnteryouchoice(0~11):
");/*提示输入选项*/
scanf("%s",s);/*输入选择项*/
c=atoi(s);/*将输入的字符串转化为整型数*/
沈阳大学
课程设计说明书NO.5
}while(c<0||c>11);/*选择项不在0~11之间重输*/
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");
沈阳大学
课程设计说明书NO.6
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)
沈阳大学
课程设计说明书NO.7
{
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值*/
}
/*删除函数,参数为记录数组和记录条数*/
intdelete(ADDRESSt[],intn)
{
chars[20];/*要删除记录的姓名*/
intch=0;
inti,j;
printf("pleasedeletedname\n");/*提示信息*/
scanf("%s",s);/*输入姓名*/
沈阳大学
课程设计说明书NO.8
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;/*返回记录数*/
}
/*插入记录函数,参数为结构体数组和记录数*/
intadd(ADDRESSt[],intn)/*插入函数,参数为结构体数组和记录数*/
{
ADDRESStemp;/*新插入记录信息*/
inti,j;
chars[20];/*确定插入在哪个记录之前*/
沈阳大学
课程设计说明书NO.9
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;/*返回记录数*/
}
/*保存函数,参数为结构体数组和记录数*/
voidsave(ADDRESSt[],intn)
{
inti;
FILE*fp;/*指向文件的指针*/
if((fp=fopen("record.txt","wb"))==NULL)/*打开文件,并判断打开是否正常*/
沈阳大学
课程设计说明书NO.10
{
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");/*显示保存成功*/
}
/*读入函数,参数为结构体数组*/
intload(ADDRESSt[])
{
inti,n;
FILE*fp;/*指向文件的指针*/
if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/
{
printf("cannotopenfile\n");/*不能打开*/
exit
(1);/*退出*/
}
fscanf(fp,"%d",&n);/*读入记录数*/
for(i=0;i沈阳大学
课程设计说明书NO.11
fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele);/*按格式读入记录*/
fclose(fp);/*关闭文件*/
printf("Youhavesuccessreaddatafromfile!
!
!
\n");/*显示保存成功*/
returnn;/*返回记录数*/
}
/*按序号显示记录函数*/
voiddisplay(ADDRESSt[])
{
intid,n;
FILE*fp;/*指向文件的指针*/
if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/
{
printf("cannotopenfile\n");/*不能打开文件*/
exit
(1);/*退出*/
}
printf("Enterordernumber...\n");/*显示信息*/
scanf("%d",&id);/*输入序号*/
fscanf(fp,"%d",&n);/*从文件读入记录数*/
if(id>=0&&id{
fseek(fp,(id-1)*sizeof(ADDRESS),1);/*移动文件指针到该记录位置*/
print(t[id]);/*调用输出函数显示该记录*/
printf("\r\n");
}
else
printf("no%dnumberrecord!
!
!
\n",id);/*如果序号不合理显示信息*/
fclose(fp);/*关闭文件*/
沈阳大学
课程设计说明书NO.12
}
/*排序函数,参数为结构体数组和记录数*/
voidsort(ADDRESSt[],intn)
{
inti,j,flag;
ADDRESStemp;/*临时变量做交换数据用*/
for(i=0;i{
flag=0;/*设标志判断是否发生过交换*/
for(j=0;jif((strcmp(t[j].name,t[j+1].name))>0)/*比较大小*/
{
flag=1;
strcpy(temp.name,t[j].name);/*交换记录*/
strcpy(temp.units,t[j].units);
strcpy(temp.tele,t[j].tele);
strcpy(t[j].name,t[j+1].name);
strcpy(t[j].units,t[j+1].units);
strcpy(t[j].tele,t[j+1].tele);
strcpy(t[j+1].name,temp.name);
strcpy(t[j+1].units,temp.units);
strcpy(t[j+1].tele,temp.tele);
}
if(flag==0)break;/*如果标志为0,说明没有发生过交换循环结束*/
}
printf("sortsucess!
!
!
\n");/*显示排序成功*/
}
沈阳大学
课程设计说明书NO.13
/*快速查找,参数为结构体数组和记录数*/
voidqseek(ADDRESSt[],intn)
{
chars[20];
intl,r,m;
printf("\nPleasesortbeforeqseek!
\n");/*提示确认在查找之前,记录是否已排序*/
printf("pleaseenternameforqseek\n");/*提示输入*/
scanf("%s",s);/*输入待查找的姓名*/
l=0;r=n-1;/*设置左边界与右边界的初值*/
while(l<=r)/*当左边界<=右边界时*/
{
m=(l+r)/2;/*计算中间位置*/
if(strcmp(t[m].name,s)==0)/*与中间结点姓名字段做比较判是否相等*/
{
print(t[m]);/*如果相等,则调用print函数显示记录信息*/
return;/*返回*/
}
if(strcmp(t[m].name,s)<0)/*如果中间结点小*/
l=m+1;/*修改左边界*/
else
r=m-1;/*否则,中间结点大,修改右边界*/
}
if(l>r)/*如果左边界大于右边界时*/
printf("notfound\n");/*显示没找到*/
}
/*复制文件*/
voidcopy()
沈阳大学
课程设计说明书NO.14
{
charoutfile[20];/*目标文件名*/
inti,n;
ADDRESStemp[M];/*定义临时变量*/
FILE*sfp,*tfp;/*定义指向文件的指针*/
clrscr();/*清屏*/
if((sfp