烟台大学
计算机与控制工程学院
作者:林颖
时间:2016年12月27日
题目:电子模拟通讯录
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct person //每个元素都是结构体类型
{
char name[15]; //结构体数组,用于存储姓名
char celephone[22];
char address[22];
char sex[5];
int len;
}per[500];
//定义一个per数组,它有500个元素
int num=0;//*外部变量num为文件中的纪录数*//
FILE *fp;
#define MAX_LINE 100
void mainmenu();//*主菜单*//
void newrecord();//新添纪录(括写入到文件)*//
void readfromfile();//*读取文件*//
void searchmenu();//*查询菜单*//
void searchbyname();//*按姓名查询*//
void searchbycelephone();//*按手机号码查询*//
void xiugaimenu();//*修改菜单*//
void xiugaibyname();//*按姓名查找修改*//
void xiugaibycelephone();//*按手机号码查找修改*//
void xiugaixiangmu(int a);//*查找后要修改的项目(分名字和号码)*//
void deletemenu();//*删除菜单*//
void deleteall();//*删除所有信 息*//
void deleteone();//*删除单个*//
void deletebycelephone(); //*按手机号码删除*//
void deletebyname();//*按姓名删除*//
void showall();//*输 出 全 部 信 息*//
void paixu();//*姓名排序*//
void main()//*主函数*//
{
while (1)
{
mainmenu();
}
} //*主函数结束*//
void mainmenu()//*主菜单函数*//
{
int a; //以下模块是主界面
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(" | 选择8:姓名排序 |\n");
printf(" | 选择0:退出系统 |\n\n");
printf("--------------------------------------------\n");
printf("\t ******************************************\n");
printf("【请选择数字0-7,其他键暂时不起作用】\n");
loop1:
scanf("%d",&a);
switch (a)
{
case 1:readfromfile();
break;
case 2:newrecord();
break;
case 3:searchmenu();
break;
case 4:xiugaimenu();
break;
case 5:deletemenu();
break;
case 6:deleteall();
break;
case 7:showall();
break;
case 8:paixu();
break;
case 0:exit(0);
default:printf("对不起!您的输入有误!请重新输入:");
getchar();
goto loop1;
}
}
****************************************************
功能描述:将输入的联系人的姓名按长度的进行排序
输入:无
输出:有顺序的输出联系人信息
返回值:0
****************************************************
void paixu()//姓名排序
{
int i;
int j;
char na[15]; //结构体数组,用于存储姓名
char ce[22];
char add[22];
char se[5];
if(num!=0)
{
printf("该通讯录里共有%d个联系人");
for(i=0;i<num;i++)
{
per[i].len=strlen(per[i].name);
}
for(i=0;i<num-1;i++)
{
for(j=i+1;j<num;j++)
{
if(per[i].len>per[i+1].len)
{
strcpy(na,per[i+1].name);
strcpy(per[i+1].name,per[i].name);
strcpy(per[i].name,na);
strcpy(ce,per[i+1].celephone);
strcpy(per[i+1].celephone,per[i].celephone);
strcpy(per[i].celephone,ce);
strcpy(se,per[i+1].sex);
strcpy(per[i+1].sex,per[i].sex);
strcpy(per[i].sex,se);
strcpy(add,per[i+1].address);
strcpy(per[i+1].address,per[i].address);
strcpy(per[i].address,add);
}
}
}
for(i=0;i<num;i++)
{
printf("顺序\t姓名\t\t性别\t\t电话\t\t家庭地址\n");
printf("--------------------------------\n");
printf("[%d]\t%s\t\t%s\t\t%s\t\t%s\n",i+1,per[i].name,per[i].sex,per[i].celephone,per[i].address);
}
}
}
*****************************************************************
功能描述:将文件里保存的信息按行读出
输入:无
输出:文件中保存的数据
返回值:0
*****************************************************************
void readfromfile()//读取文件
{
char buf[MAX_LINE]; /*缓冲区*/
FILE *fp; /*文件指针*/
int len; /*行字符个数*/
if((fp = fopen("d://string.txt","r")) == NULL)
{
printf("该文件为空,没有联系人\n");
exit (1) ;
}
while(fgets(buf,MAX_LINE,fp) != NULL)
{
printf(" 姓名\t\t性别\t\t电话\t\t家庭地址\n");
len = strlen(buf);
buf[len-1] = '\0'; /*去掉换行符*/
printf("%s\n",buf);
}
}
*****************************************************************
功能描述:向线性表中输入新的联系人
输入:联系人的姓名,性别,手机号,地址
输出:无
返回值:0
*****************************************************************
void newrecord()//*添加纪录模块*// { int a; int i; loop: printf("\n 请输入您要添加的联系人的信息:\n"); printf("请输入姓名:"); name: scanf("%s",&per[num].name); if(strlen(per[num].name)==0) { printf("对不起!您的输入有误!请重新输入:"); goto name; } if((fp=fopen("d:\\string.txt","a"))==NULL) //打开文件
{ printf("无法打开文件\n"); exit(1); } fprintf(fp,"%-15s",per[num].name); //将字符串写进文件 fclose(fp); //关闭文件 printf("请输入性别:"); sex: scanf("%s",&per[num].sex); if(strlen(per[num].sex)==0) { printf("对不起!您的输入有误!请重新输入:"); goto sex; } if((fp=fopen("d:\\string.txt","a"))==NULL)
//打开文件 { printf("无法打开文件\n"); exit(1); } fprintf(fp,"%-15s",per[num].sex); //将字符串写进文件 fclose(fp); //关闭文件 printf("请输入手机号码:"); celephone: scanf("%s",&per[num].celephone); if(strlen(per[num].celephone)==0) { printf("对不起!您的输入有误!请重新输入:\n"); goto celephone; } if((fp=fopen("d:\\string.txt","a"))==NULL)
//打开文件 { printf("无法打开文件\n");exit(1); } fprintf(fp,"%-20s",per[num].celephone); //将字符串写进文件 fclose(fp); //关闭文件 printf("请输入家庭地址:"); address: scanf("%s",&per[num].address); if(strlen(per[num].address)==0) { printf("对不起!您的输入有误!请重新输入"); goto address; } if((fp=fopen("d:\\string.txt","a"))==NULL)
//打开文件 { printf("无法打开文件\n"); exit(1); } fprintf(fp,"%-15s\n",per[num].address); //将字符串写进文件 fclose(fp); //关闭文件 num++; printf("\n是否继续添加?\n"); printf("\n[1]继续 [2]不继续\n"); printf("请输入您的选择 "); scanf("%d",&a); if(a==1) { goto loop; } else { printf("\n请按任意数字键返回主菜单");
scanf("%d",&i); return; } }
*****************************************************************
功能描述:查询联系人的全部信息
输入:联系人的姓名或手机号
输出:联系人的全部信息
返回值:0
*****************************************************************
void searchmenu()//*查询菜单*// **模块3** { int a; printf("\n_______****欢 迎 使 用 查 询 菜 单****_______"); printf("\n [1]按姓名查询"); printf("\n [2]按手机号码查询"); printf("\n
其他键-返回主菜单"); printf("请输入您的选择\n"); scanf("%d",&a); switch (a) { case 1:searchbyname(); break; case 2:searchbycelephone(); break; default:mainmenu(); break; } } void searchbyname()//*:按姓名查询*// { int mark=0; int i,j,findmark=0; int a=0; char name[15]; printf("\n
按姓名查找 "); printf("\n请输入姓名:"); scanf("%s",name); for(i=a;i<num;i++) { if (strcmp(per[i].name,name)==0) { findmark++; printf("\n以下是您查找的联系人的信息");printf("\n********————————————********"); printf("\n名字: %s",per[i].name); printf("\n性别: %s",per[i].sex); printf("\n手机号码:
%s",per[i].celephone);printf("\n家庭地址: %s",per[i].address); printf("\n********————————————********");if ((i+1)<num) { printf("\n是否继续查找相同名字的联系人的信息?"); printf("\n[1]继续 [2]不继续"); scanf("%d",&j); if (j==1) { a=i; mark++; continue;} else break; } else{ printf("\n请按任意数字键返回主菜单");
scanf("%d",&j); return; } } } if(mark!=0) { printf("\n对不起! 没有相同名字的该联系人的信息!!");printf("\n请按任意数字键返回主菜单"); scanf("%d",&j);return; } else if(findmark==0) { printf("\n对不起!没有该联系人的信息!");printf("\n请按任意数字键返回主菜单"); scanf("%d",&j);return; } } void searchbycelephone()//*1:按手机号码查询*//
{ int mark=0; int i,j; int a=0; char celephone[11]; printf("\n———————****按手机号码查找****————————\n"); printf("\n请输入手机号码:\n"); scanf("%s",celephone); for(i=0;i<num;i++) { if (strcmp(per[i].celephone,celephone)==0) { printf("\n ———****以下是您查找的联系人的信息***———— "); printf("\n********————————————********");
printf("\n名字: %s",per[i].name); printf("\n性别: %s",per[i].sex); printf("\n手机号码: %s",per[i].celephone);printf("\n家庭地址: %s",per[i].address); printf("\n********————————————********"); printf("\n请按任意数字键返回主菜单"); mark++; scanf("%d",&j); return; } } if (mark==0) {
printf("\n对不起!没有该联系人的信息!");printf("\n请按任意数字键返回主菜单"); scanf("%d",&j); return; } } *****************************************************************
功能描述:修改联系人的相关信息
输入:联系人的姓名或手机号
输出:联系人的信息
返回值:0
*****************************************************************
void xiugaimenu()//*修改菜单*// { int i,j; if(num==0) { printf("\n对不起!文件中无任何纪录!");
printf("\n请按任意数字键返回主菜单"); scanf("%d",&j); return; }else { printf("\n[1]按姓名修改 [2]按手机号码修改\n"); printf("请输入您的数字选择:"); loop6:scanf("%d",&i); switch (i) { case 1:xiugaibyname();break; case 2:xiugaibycelephone();break; default:printf("对不起!您的输入有误!请重新输入:");goto loop6;
}}}void xiugaibyname()//*1:按姓名修改*// { int a=0; int findmark=0; int xiugaimark=0; int i,j; char name[15]; printf("\n请输入要修改联系人的姓名:"); scanf("%s",name); for (i=a;i<num;i++) { if (strcmp(per[i].name,name)==0) { printf("\n\t\t以下是您要修改的联系人的纪录:"); findmark++; printf("\n********————————————********");
printf("\n名字: %s",per[i].name); printf("\n性别: %s",per[i].sex); printf("\n手机号码: %s",per[i].celephone);printf("\n家庭地址: %s",per[i].address); printf("\n********————————————********");printf("\n是否修改?"); printf("\n[1]修改 [2]不修改"); printf("请输入您的数字选择:"); scanf("%d",&j);
if (j==1) { xiugaixiangmu(i); xiugaimark++; printf("\n\t\t修改成功"); if((i+1)<num) { printf("\n是否继续修改相同姓名的联系人的信息?"); printf("\n[1]继续 [2]不继续"); printf("请输入您的数字选择: "); scanf("%d",&j); if (j==1) { a=i; findmark++; continue; } } printf("\n是否继续修改?(1代表继续;2代表不继续)");
printf("\n[1]继续 [2]不继续"); printf("请输入您的数字选择: "); scanf("%d",&j); if (j==1) xiugaibyname(); return; }}} if ((xiugaimark==0)&&(findmark==0)){ printf("\n没有该联系人的纪录"); printf("\n是否继续修改?)"); printf("\n[1]继续 [2]不继续)"); printf("请输入您的数字选择:");scanf("%d",&j); if (j==1)
xiugaibyname(); return; } else if (findmark!=0) { printf("\n没有重名信息"); printf("\n是否继续修改?"); printf("\n[1]继续 [2]不继续)"); printf(" 请输入您的数字选择: ");scanf("%d",&j); if (j==1) xiugaibyname(); return; } }void xiugaibycelephone()//按手机号码修改*// { int findmark=0; int i,j;
char celephone[11]; printf("\n请输入要修改联系人的手机号码:"); scanf("%s",celephone);for (i=0;i<num;i++) { if (strcmp(per[i].celephone,celephone)==0) { printf("\n以下是您要修改的联系人的纪录:"); findmark++; printf("\n********————————————********"); printf("\n名字: %s",per[i].name); printf("\n性别:
%s",per[i].sex); printf("\n手机号码: %s",per[i].celephone);printf("\n家庭地址: %s",per[i].address); printf("\n********————————————********");printf("\n是否修改?"); printf("\n[1]修改 [2]不修改"); printf(" 请输入您的数字选择: "); scanf("%d",&j); if (j==1) { xiugaixiangmu(i); printf("\n修改成功");
printf("\n是否继续修改?"); printf("\n[1]继续 [2]不继续)"); printf("请输入您的数字选择: "); scanf("%d",&j); if (j==1) xiugaixiangmu(i); break;}}}if (findmark==0){ printf("\n对不起!没有该联系人的纪录!"); printf("\n是否继续修改?"); printf("\n[1]继续 [2]不继续)");printf("请输入您的数字选择: "); scanf("%d",&j);
if (j==1) xiugaibycelephone(); return; } }void xiugaixiangmu(int a)//*修改项目*// { int i; printf("\n___***请输入您要修改的项目***____"); printf("\n\n"); printf("\n1-手机号码\n");printf("\n2-姓名\n"); printf("\n3-QQ号码\n");printf("\n4-回主菜单\n"); printf("\n\n"); printf("请输入您的数字选择:\n");scanf("%d",&i);
loop9: switch (i) { case 1:printf("请输入手机号码:"); scanf("%s",&per[a].celephone); break; case 2:printf("请输入姓名:");scanf("%s",&per[a].name);break; case 4:mainmenu(); break; default: printf("对不起!您的输入有误!请重新输入:"); goto loop9; }}
*****************************************************************
功能描述:删除联系人的全部信息
输入:联系人的姓名或手机号
输出:反馈信息
返回值:0
*****************************************************************
void deletemenu()//*删除菜单*// { int i,j; if(num==0) { printf("\n对不起!文件中无任何纪录!"); printf("\n请先添加个人信息!"); printf("\n请按任意数字键返回主菜单"); scanf("%d",&j); return; } else
{ printf("\n______***删 除 菜 单***________"); printf("\n[1]删除单个"); printf("\n[2]返回主菜单 "); printf("\n\t\t "); printf("\n\t\t请输入您的数字选择: "); loop4: scanf("%d",&i); switch (i) { case 1:deleteone();break; case 2:mainmenu();break; default:printf("对不起!您的输入有误!请重新输入:");
goto loop4; }}}void deleteall()//*删除所有信息*// **模块5.1** { int i,j; printf("\n确认删除?\n"); printf("[1]确认 [2]不删除)\n "); scanf("%d",&i); if (i==1) { fclose(fp); if ((fp=fopen("per.bin","wb"))==NULL) { printf("\n不能打开文件,删除失败"); readfromfile(); } num=0; printf("\n记录已删除!");
printf("\n请按任意数字键返回主菜单"); scanf("%d",&j); return; }}void deleteone()//*删除单个*/ **模块5.2** { int i; printf("\n[1]按手机号码删除 [2]按姓名删除");printf("\n请输入您的选择:"); loop5:scanf("%d",&i);; switch (i) { case 1:deletebycelephone();break; case 2:deletebyname();break; default:printf("对不起!您的输入有误!请重新输入:");goto
loop5;}}void deletebyname()//1:按姓名删除*// **模块5.2.1** { int a=0; int findmark=0; int i,j,k; int deletemark=0; char name[15]; printf("\n请输入您要删除的联系人的姓名:"); scanf("%s",name); for (i=a;i<num;i++) { if (strcmp(per[i].name,name)==0) { printf("\n以下是您要删除的联系人的纪录:");
findmark++; printf("\n********————————————********"); printf("\n名字: %s",per[i].name); printf("\n性别: %s",per[i].sex); printf("\n手机号码: %s",per[i].celephone);printf("\n家庭地址: %s",per[i].address); printf("\n********————————————********");printf("\n是否删除?\n");printf("\n[1]删除
[2]不删除\n");printf("\n请输入您的数字选择: "); scanf("%d",&k);if(k==1){ for (j=i;j<num-1;j++) //*纪录移动,从per数组中删除之*// per[j]=per[j+1];num--; deletemark++; printf("\n\t\t删除成功"); if((i+1)<num) { printf("\n是否继续删除相同姓名的联系人的信息?"); printf("\n[1]删除 [2]不删除)"); printf("\n请输入您的数字选择:
"); scanf("%d",&k); if(k=1) { a=i; findmark++; continue; }} printf("\n是否继续删除?"); printf("\n[1]继续 [2]不继续"); printf("\n请输入您的数字选择:"); scanf("%d",&k); if(k==1) deleteone(); else break; } } else continue; } if((deletemark==0)&&(findmark==0)) { printf("\n对不起!没有该联系人的纪录!");
printf("\n是否继续删除?");printf("\n[1]继续 [2]不继续"); printf("请输入您的数字选择: "); scanf("%d",&k); if(k==1) deleteone(); } else if(findmark!=0) { printf("\n对不起!没有重名信息!"); printf("\n是否继续删除?"); printf("\n[1]继续 [2]不继续"); printf("请输入您的数字选择: "); scanf("%d",&k); if(k==1) deleteone();
}}void deletebycelephone()//*2:按手机号码删除*// **模块5.2.2** { int i,j,h,m; int deletemark=0;char celephone[11]; printf("\n请输入要删除的联系人的手机号码:");scanf("%s",celephone); for(i=0;i<num;i++) { if(strcmp(per[i].celephone,celephone)==0) { deletemark++; printf("\n\t\t以下是您要删除的联系人的纪录:");
printf("\n********————————————********"); printf("\n名字: %s",per[i].name); printf("\n性别: %s",per[i].sex); printf("\n手机号码: %s",per[i].celephone);printf("\n家庭地址: %s",per[i].address); printf("\n********————————————********");printf("\n是否删除?\n"); printf("\n[1]删除
[2]不删除)\n");printf(" 请输入您的数字选择:"); scanf("%d",&h); if(h==1) { for (j=i;j<num-1;j++) /*纪录移动,从per数组中删除之*/ per[j]=per[j+1]; num--; printf("\n删除成功"); printf("\n是否继续删除?(1代表继续;2代表不继续)\n"); printf("\n[1]继续 [2]不继续\n");printf(" 请输入您的数字选择: "); scanf("%d",&h); if(h==1)
deletebycelephone(); } } } if(deletemark==0) { printf("\n对不起!没有该联系人的纪录!"); printf("\n是否继续删除?\n");printf("\n[1] 继续 [2]不继续");printf("请输入您的数字选择: "); scanf("%d",&m); if(m==1) deletebycelephone(); }}
*****************************************************************
功能描述:输出所有联系人
输入:无
输出:所有联系人
返回值:0
*****************************************************************
void showall()//*输 出 全 部 信 息*// { int i,j; if(num!=0) { printf("\n*************** 以下为通讯录所有信息************");for (i=0;i<num;i++) { printf("\n********————————————********");
printf("\n名字: %s",per[i].name); printf("\n性别: %s",per[i].sex); printf("\n手机号码: %s",per[i].celephone);printf("\n家庭地址: %s",per[i].address); printf("\n********————————————********");printf("\t\t"); if (i+1<num) { printf("\n__________________________"); system("pause");
} } printf("\n************************************************"); } else printf("\n对不起!通讯录中无任何纪录!"); printf("\n请按任意数字键返回主菜单"); scanf("%d",&j);return ;}
实验结果
输入联系人
查询联系人信息
修改联系人信息
删除单个联系人
输出全部联系人
姓名排序
从文件中导入
在文件中保存的关键数据