C语言实验报告之电话薄管理.docx
《C语言实验报告之电话薄管理.docx》由会员分享,可在线阅读,更多相关《C语言实验报告之电话薄管理.docx(25页珍藏版)》请在冰豆网上搜索。
C语言实验报告之电话薄管理
实验报告———电话簿管理
一、实验内容:
实验名称:
电话簿管理
实验目的:
设计一个电话簿管理小程序。
具有加入、删除、显示和查询联系人电话号码的功能。
实验要求:
(1)电话簿记录按姓名排序存放,显示时每屏不超过20个记录,超过时分屏显示。
(2)设计记录修改功能,能选择修改用户的姓名、电话,在修改或删除之前需要用户进一步确认,确认无误后再进行操作。
(3)设计能显示和存储录入的时间。
(4)设计默认的查询方式,即查询时只输入姓名的首字母,所有符合这一条件的电话资料均在屏幕上显示。
二、算法说明:
S1:
宏定义界面,定义与电话簿有关的数据结构
S2:
定义与电话簿有关的数组
S3:
定义主菜单函数
S4:
用子函数确定各功能的实现
S5:
用switch函数选择实现菜单中的各功能
三、程序清单;
#include"stdio.h"/*标准输入输出函数库*/
#include"stdlib.h"/*标准函数库*/
#include"string.h"/*字符串函数库*/
#include"conio.h"/*屏幕操作函数库*/
#defineHEADER1"---------------------------TELEPHONEBOOK---------------------------\n"
#defineHEADER2"|num|name|phonenumber|address|\n"
#defineHEADER3"|--------------|------------|-----------------|---------------------|\n"
#defineFORMAT"|%-10s|%-10s|%-15s|%-20s|\n"
#defineDATAp->num,p->name,p->phonenum,p->address
#defineEND"---------------------------------------------------------------------\n"
#defineN100
intsaveflag=0;/*是否需要存盘的标志变量*/
/*定义与电话簿有关的数据结构*/
typedefstructtelebook/*标记为telebook*/
{
charnum[4];/*编号*/
charname[10];/*姓名*/
charphonenum[15];/*电话号码*/
charaddress[20];/*地址*/
}TELEBOOK;
voidmenu()/*主菜单*/
{
system("cls");/*调用DOS命令,清屏.与clrscr()功能相同*/
textcolor(13);/*在文本模式中选择新的字符颜色*/
gotoxy(10,5);/*在文本窗口中设置光标*/
cprintf("Thetelephone-bookManagementSystem\n");
gotoxy(10,8);
cprintf("*************************Menu********************************\n");
gotoxy(10,9);
cprintf("*1inputrecord2displayrecord*\n");
gotoxy(10,10);
cprintf("*3deleterecord4searchrecord*\n");
gotoxy(10,11);
cprintf("*5modifyrecord6insertrecord*\n");
gotoxy(10,12);
cprintf("*7sortrecord8saverecord*\n");
gotoxy(10,13);
cprintf("*0quitsystem*\n");
gotoxy(10,14);
cprintf("*************************************************************\n");
/*cprintf()送格式化输出至文本窗口屏幕中*/
}
/*格式化输出表头*/
voidprintheader()
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
/*格式化输出表中数据*/
voidprintdata(TELEBOOKpp)
{
TELEBOOK*p;
p=&pp;
printf(FORMAT,DATA);
}
/*显示数组temp[]中存储的电话簿记录,内容为telebook结构中定义的内容*/
voidDisp(TELEBOOKtemp[],intn)
{
inti;
if(n==0)/*表示没有电话簿记录*/
{
printf("\n=====>Nottelephonerecord!
\n");
getchar();
return;
}
printf("\n\n");
printheader();/*输出表格头部*/
i=0;
while(i{
printdata(temp[i]);
i++;
printf(HEADER3);
}
getchar();
}
voidWrong()/*输出按键错误信息*/
{
printf("\n\n\n\n\n***********Error:
inputhaswrong!
pressanykeytocontinue**********\n");
getchar();
}
voidNofind()/*输出未查找此记录的信息*/
{
printf("\n=====>Notfindthistelephonerecord!
\n");
}
/*************************************************************
作用:
用于定位数组中符合要求的记录,并返回保存该记录的数组元素下标值
参数:
findmess[]保存要查找的具体内容;nameorphonenum[]保存按什么在数组中查找;
**************************************************************/
intLocate(TELEBOOKtemp[],intn,charfindmess[],charnameorphonenum[])
{
inti=0;
if(strcmp(nameorphonenum,"phonenum")==0)/*按电话号码查询*/
{
while(i{
if(strcmp(temp[i].phonenum,findmess)==0)/*若找到findmess值的电话号码*/
returni;
i++;
}
}
elseif(strcmp(nameorphonenum,"name")==0)/*按姓名查询*/
{
while(i{
if(strcmp(temp[i].name,findmess)==0)/*若找到findmess值的姓名*/
returni;
i++;
}
}
return-1;/*若未找到,返回一个整数-1*/
}
/*输入字符串,并进行长度验证(长度voidstringinput(char*t,intlens,char*notice)
{
charn[255];
do{
printf(notice);/*显示提示信息*/
scanf("%s",n);/*输入字符串*/
if(strlen(n)>lens)printf("\nexceedtherequiredlength!
\n");
/*进行长度校验,超过lens值重新输入*/
}while(strlen(n)>lens);
strcpy(t,n);/*将输入的字符串拷贝到字符串t中*/
}
/*增加电话簿记录*/
intAdd(TELEBOOKtemp[],intn)
{
charch,num[10];
inti,flag=0;
system("cls");
Disp(temp,n);/*先打印出已有的电话簿信息*/
while
(1)/*一次可输入多条记录,直至输入编号为0的记录才结束添加操作*/
{
while
(1)/*输入记录编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/
{
stringinput(num,10,"inputnumber(press'0'returnmenu):
");/*格式化输入编号并检验*/
flag=0;
if(strcmp(num,"0")==0)/*输入为0,则退出添加操作,返回主界面*/
{returnn;}
i=0;
while(i{
if(strcmp(temp[i].num,num)==0)
{
flag=1;
break;
}
i++;
}
if(flag==1)/*提示用户是否重新输入*/
{getchar();
printf("==>Thenumber%sisexisting,tryagain?
(y/n):
",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
else
returnn;
}
else
{break;}
}
strcpy(temp[n].num,num);/*将字符串num拷贝到temp[n].num中*/
stringinput(temp[n].name,15,"Name:
");
stringinput(temp[n].phonenum,15,"Telephone:
");
stringinput(temp[n].address,15,"Adress:
");
saveflag=1;
n++;
}
returnn;
}
/*按编号或姓名,查询电话簿记录*/
voidQur(TELEBOOKtemp[],intn)
{
intselect;/*1:
按姓名查,2:
按电话号码查,其他:
返回主界面(菜单)*/
charsearchinput[20];/*保存用户输入的查询内容*/
intp=0;
if(n<=0)/*若数组为空*/
{
system("cls");
printf("\n=====>Notelephonerecord!
\n");
getchar();
return;
}
system("cls");
printf("\n=====>1Searchbyname=====>2Searchbytelephonenumber\n");
printf("pleasechoice[1,2]:
");
scanf("%d",&select);
if(select==1)/*按姓名查询*/
{
stringinput(searchinput,10,"inputtheexistingname:
");
p=Locate(temp,n,searchinput,"name");
/*在数组temp中查找编号为searchinput值的元素,并返回该数组元素的下标值*/
if(p!
=-1)/*若找到该记录*/
{
printheader();
printdata(temp[p]);
printf(END);
printf("pressanykeytoreturn");
getchar();
}
else
Nofind();
getchar();
}
elseif(select==2)/*按电话号码查询*/
{
stringinput(searchinput,15,"inputtheexistingtelephonenumber:
");
p=Locate(temp,n,searchinput,"phonenum");
if(p!
=-1)
{
printheader();
printdata(temp[p]);
printf(END);
printf("pressanykeytoreturn");
getchar();
}
else
Nofind();
getchar();
}
else
Wrong();
getchar();
}
/*删除电话簿记录:
先找到保存该记录的数组元素的下标值,然后在数组中删除该数组元素*/
intDel(TELEBOOKtemp[],intn)
{
intsel;
charfindmess[20];
intp=0,i=0;
if(n<=0)
{system("cls");
printf("\n=====>Notelephonerecord!
\n");
getchar();
returnn;
}
system("cls");
Disp(temp,n);
printf("\n=====>1Deletebyname=====>2Deletebytelephonenumber\n");
printf("pleasechoice[1,2]:
");
scanf("%d",&sel);
if(sel==1)
{
stringinput(findmess,10,"inputtheexistingname:
");
p=Locate(temp,n,findmess,"name");
getchar();
if(p!
=-1)
{
for(i=p+1;i{
strcpy(temp[i-1].num,temp[i].num);
strcpy(temp[i-1].name,temp[i].name);
strcpy(temp[i-1].phonenum,temp[i].phonenum);
strcpy(temp[i-1].address,temp[i].address);
}
printf("\n==>deletesuccess!
\n");
n--;
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
elseif(sel==2)/*先按电话号码查询到该记录所在的数组元素的下标值*/
{
stringinput(findmess,15,"inputtheexistingtelephonenumber:
");
p=Locate(temp,n,findmess,"phonenum");
getchar();
if(p!
=-1)
{
for(i=p+1;i{
strcpy(temp[i-1].num,temp[i].num);
strcpy(temp[i-1].name,temp[i].name);
strcpy(temp[i-1].phonenum,temp[i].phonenum);
strcpy(temp[i-1].address,temp[i].address);
}
printf("\n=====>deletesuccess!
\n");
n--;
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
returnn;
}
/*修改电话簿记录。
先按输入的联系人姓名查询到该记录,
然后提示用户修改该记录编号之外的值,编号不能修改*/
voidModify(TELEBOOKtemp[],intn)
{
charfindmess[20];
intp=0;
if(n<=0)
{system("cls");
printf("\n=====>Notelephonenumberrecord!
\n");
getchar();
return;
}
system("cls");
printf("modifytelephonebookrecorder");
Disp(temp,n);
stringinput(findmess,10,"inputtheexistingname:
");/*输入并检验该姓名*/
p=Locate(temp,n,findmess,"name");/*查询到该数组元素,并返回下标值*/
if(p!
=-1)/*若p!
=-1,表明已经找到该数组元素*/
{
printf("Number:
%s,\n",temp[p].num);
printf("Name:
%s,",temp[p].name);
stringinput(temp[p].name,15,"inputnewname:
");
printf("Name:
%s,",temp[p].phonenum);
stringinput(temp[p].phonenum,15,"inputnewtelephone:
");
printf("Name:
%s,",temp[p].address);
stringinput(temp[p].address,30,"inputnewaddress:
");
printf("\n=====>modifysuccess!
\n");
getchar();
Disp(temp,n);
getchar();
saveflag=1;
}
else
{Nofind();
getchar();
}
return;
}
/*插入记录:
按编号查询到要插入的数组元素的位置,然后在该记录编号之后插入一个新数组元素。
*/
intInsert(TELEBOOKtemp[],intn)
{
charch,num[10],s[10];/*s[]保存插入点位置之前的记录编号,num[]保存输入的新记录的编号*/
TELEBOOKnewinfo;
intflag=0,i=0,kkk=0;
system("cls");
Disp(temp,n);
while
(1)
{stringinput(s,10,"pleaseinputinsertlocationaftertheNumber:
");
flag=0;i=0;
while(i{
if(strcmp(temp[i].num,s)==0){kkk=i;flag=1;break;}
i++;
}
if(flag==1)
break;/*若编号存在,则进行插入之前的新记录输入操作*/
else
{getchar();
printf("\n=====>Thenumber%sisnotexisting,tryagain?
(y/n):
",s);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{returnn;}
}
}
/*以下新记录的输入操作与Add()相同*/
while
(1)
{stringinput(num,10,"inputnewNumber:
");
i=0;flag=0;
while(i{
if(strcmp(temp[i].num,num)==0){flag=1;break;}
i++;
}
if(flag==1)
{
getchar();
printf("\n=====>Sorry,Thenumber%sisexisting,tryagain?
(y/n):
",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{returnn;}
}
else
break;
}
strcpy(newinfo.num,num);/*将字符串num拷贝到newinfo.num中*/
stringinput(newinfo.name,15,"Name:
");
stringinput(newinfo.phonenum,15,"Telephone:
");
stringinput(newinfo.address,15,"Adress:
");
saveflag=1;/*在main()有对该全局变量的判断,若为1,则进行存盘操作*/
for(i=n-1;i>kkk;i--)/*从最后一个组织元素开始往向移一个元素位置*/
{
strcpy(temp[i+1].num,temp[i].num);
strcpy(temp[i+1].name,temp[i].name);
strcpy(temp[i+1].phonenum,temp[i].phonenum);
strcpy(temp[i+1].address,temp[i].address);
}
strcpy(temp[kkk+1].num,newinfo.num);/*在kkk的元素位置后插入新记录*/
strcpy(temp[kkk+1].name,newinfo.name);
strcpy(temp[kkk+1].phonenum,newinfo.phonenum);
strcpy(temp[kkk+1].address,newinfo.address);
n++;
Disp(temp,n);
printf("\n\n");
getchar();
returnn;
}
/*利用选择排序法实现数组的按记录编号或姓名的升序排序*/
voidSelectSort(TELEBOOKtemp[],intn)
{
inti=0,j=0,flag=0,indexmin,select;
charcharflag[10];
TELEBOOKnewinfo;
if(n<=0)
{system("cls");
printf("\n=====>Nottelephonerecord!
\n");
getchar();
return;
}
system("cls");
Disp(temp,n);/*显示排序前的所有记录*/
printf("==>1SORTBYNUMBER==>2SORTBYNAME\n");
printf("pleasechoice[1,2]:
");
scanf("%d",&select);
if(select==1)/*按记录编号排序*/
{
for(i=0;i{
flag=32767;index