1.通讯录的功能
1.创建联系人
2.创建群组
3.对联系人进行增删减改
4.对联系人进行查找
5.对联系人进行排序
2.代码展示
/*
通讯录管理程序
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define N 1000
//结构体的定义
struct record
{
char name[20]; //联系人姓名
char phone[20]; //联系人电话
char adress[40]; //联系人地址
char qunming[25]; //联系人所在群组(默认位置在其他)
} contact[N];
int NO=0; //用于记录联系人的总个数
FILE *fp;
//函数声明
void mainmenu(); //主菜单
void newrecord(); //新建联系人函数
void showmenu(); //浏览菜单
void showgroup(); //按群显示
void showall(); //显示全部
void searchmenu(); // 查找菜单
void searchname(); // 按名字查找
void searchphone(); //按电话号码查找
void modifymenu(); // 修改菜单
void deletemenu(); //删除菜单
void newrecordmenu(); //创建菜单
void deleteall(); //删除所有联系人
void deletesingle(); //删除一个联系人
void deletename(); //删除联系人名字
void deletephone(); //删除联系人电话号码
void paixu(); //排序函数(按名字从小到大)
int loadfile(); //建立文件
void savefile(); //保存文件
void savegroupfile(char *filename);//更新群里的内容
void deletegroupOne(); //联系人退群函数
//主函数
int main()
{
printf("\n\t\t 欢迎使用通讯录管理系统");
loadfile();
while (1)
{
mainmenu();
}
}
//主菜单
void mainmenu()
{
char choice;
system("cls");
system("color f4");
printf("\n\t\t***********************************************************");
printf("\n 通讯录管理系统主菜单 \n");
printf(" |-------------------------------|\n");
printf(" | 选择[1]:创建功能菜单 |\n");
printf(" | 选择[2]:显示功能菜单 |\n");
printf(" | 选择[3]:查找功能菜单 |\n");
printf(" | 选择[4]:修改功能菜单 |\n");
printf(" | 选择[5]:删除功能菜单 |\n");
printf(" | 选择[6]:退出 |\n");
printf(" |-------------------------------|\n");
printf("\n");
printf("\n\t\t***********************************************************");
choice=getche();
switch (choice)
{
case '1':
newrecordmenu();
break;
case '2':
showmenu();
break;
case '3':
searchmenu();;
break;
case '4':
modifymenu();
break;
case '5':
deletemenu();
break;
case '6':
printf("\n\n\t\t\t感谢你的使用,bye bye!\n");
exit(0);
default:
mainmenu();
}
}
// 创建模块
void newrecordmenu()
{
char choice;
system("cls");
system("color f4");
printf("\n\t\t********************************************************");
printf("\n\t\t 创建功能菜单 ");
printf("\n\t\t |-------------------------------|");
printf("\n\t\t | 1-创建联系人 |");
printf("\n\t\t | 2-返回主菜单 |");
printf("\n\t\t |-------------------------------|");
printf("\n\t\t********************************************************");
printf("\n\t\t***********************************************************");
choice=getche();
switch (choice)
{
case '1':
newrecord();
break;
case '2':
mainmenu();
break;
default :
mainmenu();
}
}
void newrecord()
{
int number;
printf("\n\t\t***********请输入你想添加的联系人的个数");
scanf("%d",&number);
printf("\n\t\t***************请依次输入%d个联系人信息 ****************\n",number);
while(number--)
{
printf("\n\t\t输入姓名:");
scanf("%s",contact[NO].name);
printf("\n\t\t输入电话号码:");
scanf("%s",contact[NO].phone);
printf("\n\t\t输入家庭住址:");
scanf("%s",contact[NO].adress);
strcpy(contact[NO].qunming,"其他");
printf("\n\t\t***********************************************************");
NO++;
savefile();
}
return;
}
//浏览模块
void showmenu()
{
char choice;
system("cls");
system("color f4");
printf("\n\t\t********************************************************");
printf("\n\t\t 显示功能菜单 ");
printf("\n\t\t |-------------------------------|");
printf("\n\t\t | 1-按群显示 |");
printf("\n\t\t | 2-显示全部 |");
printf("\n\t\t | 3-返回主菜单 |");
printf("\n\t\t |-------------------------------|");
printf("\n\t\t********************************************************");
printf("\n\t\t***********************************************************\n");
choice=getche();
switch (choice)
{
case '1':
showgroup();
break;
case '2':
showall();
break;
case '3':
mainmenu();
break;
default :
showmenu();
}
}
void showall()
{
int i;
system("cls");
system("color f4");
paixu();
if(NO!=0)
{
printf("\n\t\t*************** 以下为通讯录所有信息************\n");
for (i=0; i<NO; i++)
{
printf("\n\t\t---------------------------------------------");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t所在群位置:%s",contact[i].qunming);
printf("\n\t\t---------------------------------------------");
}
printf("\n\t\t*****************************************************");
}
else
printf("\n\t\t+_+通讯录中无任何纪录");
printf("\n\t\t按任意键返回主菜单:");
getch();
return;
}
void showgroup()
{
FILE *fp1;
char qunflag[30];
char qunfile[30];
printf("\n\t\t请输入你要显示的群名(例如:亲人,朋友):");
scanf("%s",qunflag);
printf("\n\t\t*************** 以下为(%s群)中所有信息************\n",qunflag);
for(int i=0;i<NO;i++)
{
if(strcmp(contact[i].qunming,qunflag)==0)
{
printf("\n\t\t---------------------------------------------");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t---------------------------------------------");
printf("\n");
printf("\n\t\t***********************************************************");
}
}
savegroupfile(qunflag);
printf("\n\t\t是否继续查看群组?(1/0)");
if (getch()=='1')
showgroup();
return;
}
//查找模块
void searchmenu()
{
char choice;
system("cls");
system("color f4");
printf("\n\t\t********************************************************");
printf("\n\t\t -----------------------------");
printf("\n\t\t | 查找菜单 |");
printf("\n\t\t | 1-按姓名查找 |");
printf("\n\t\t | 2-按电话查找 |");
printf("\n\t\t | 3-返回主菜单 |");
printf("\n\t\t |---------------------------|");
printf("\n\t\t********************************************************\n");
//printf("\n\t\t你选择了:");
choice=getche();
switch (choice)
{
case '1':
searchname();
break;
case '2':
searchphone();
break;
case '3':
mainmenu();
break;
}
}
void searchname()
{
int flag=0;
int i;
char name[20];
printf("\n\t\t***************** 按姓名查找 *******************");
printf("\n\t\t请输入姓名:");
scanf("%s",name);
for(i=0; i<NO; i++)
{
if (strcmp(contact[i].name,name)==0)
{
printf("\n\t\t************ 以下是您查找的联系人信息 **********");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t所在群位置:%s",contact[i].qunming);
printf("\n\t\t************************************************");
printf("\n\t\t按任意键返回主菜单:");
flag=1;
getch();
return;
}
}
if(flag==0)
{
printf("\n\t\t没有该姓名的联系人纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
void searchphone()
{
int flag=0;// 判断是否查到联系人的标志
int i;
char phone[20];
printf("\n\t\t****************** 按电话查找 ******************");
printf("\n\t\t请输入电话:");
scanf("%s",phone);
for(i=0; i<NO; i++)
{
if (strcmp(contact[i].phone,phone)==0)
{
printf("\n\t\t************* 以下是您查找的联系人信息 *********");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t所在群位置:%s",contact[i].qunming);
printf("\n\t\t************************************************");
printf("\n\t\t按任意键返回主菜单:");
flag++;
getch();
return;
}
}
if (flag==0)
{
printf("\n\t\t没有该联系人信息");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
void modifymenu()
{
int flag=0; //判断是否找到联系人的标志
int i,k;
char choice;
char name[20];
struct record modify; //新建一个联系人结构体
system("cls");
printf("\n\t\t请输入您要修改的姓名:");
scanf("%s",name);
for(i=0; i<NO; i++)
{
if (strcmp(contact[i].name,name)==0)
{
k=i;
flag=1;
modify=contact[i]; //保存当前要修改的联系人的信息
printf("\n\t\t********** 以下是您将修改的联系人信息 **********");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t所在群位置:%s",contact[i].qunming);
printf("\n\t\t是否继续?(1/0)");
if(getch()=='0')
modifymenu();
else
{
printf("\n\t\t选择您要修改的选项:");
printf("\n\t\t\t(1).姓 名");
printf("\n\t\t\t(2).联系电话");
printf("\n\t\t\t(3).家庭住址");
printf("\n\t\t\t(4).存放群组的位置");
printf("\n\t\t\t(5).返 回");
choice=getch();
switch(choice)
{
case '1':
printf("\n更改后的姓名:");
//strcpy(contact[i].name,"");
//savefile();
//char nametemp[20];
scanf("%s",contact[i].name);
strcat(contact[i].name,"\0");
//strcpy(contact[i].name,nametemp);
break;
case '2':
printf("\n更改后的联系电话:");
scanf("%s",contact[i].phone);
break;
case '3':
printf("\n更改后的家庭住址:");
scanf("%s",contact[i].adress);
break;
case '4':
printf("\n更改后的群组名(例如:亲人,同事):");
scanf("%s",contact[i].qunming);
savegroupfile(contact[i].qunming);
break;
case '5':
mainmenu();
break;
default:
modifymenu();
}
printf("\n\t\t您的修改结果为:");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t所在群位置:%s",contact[i].qunming);
printf("\n\t\t确认修改?1/0");
if(getch()=='0')
{
contact[i]=modify; //重新将原来的联系人信息拷贝到当前节点
printf("\n\t\t修改未保存!");
}
else
{
printf("\n\t\t 修改成功!");
}
savefile(); //保存联系人信息
printf("\n\t\t是否继续修改?(1/0)");
if (getch()=='1')
modifymenu();
return;
}
}
}
if (flag==0)
{
printf("\n\t\t+_+没有该联系人的纪录");
printf("\n\t\t是否继续修改?(1/0)");
if (getch()=='1')
modifymenu();
}
return;
}
//删除模块
void deletemenu()
{
char choice;
if(NO==0)
{
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
system("cls");
printf("\n\t\t******************* 删除菜单 *******************");
printf("\n\t\t****************** 1-删除所有 ******************");
printf("\n\t\t****************** 2-删除单个 ******************");
printf("\n\t\t***************** 3-将某个联系人退群 ***********");
printf("\n\t\t***************** 4-返回主菜单 *****************");
printf("\n\t\t************************************************");
printf("\n\t\t你选择了:");
choice=getchar();
switch(choice)
{
case '1':
deleteall();
break;
case '2':
deletesingle();
break;
case '4':
mainmenu();
break;
case '3':
deletegroupOne();
break;
default:
deletemenu();
}
}
void deleteall()
{
printf("\n\t\t确认删除?(1/0)");
if (getche()=='1')
{
if ((fp=fopen("联系人.txt","a+"))==0)
{
printf("\n\t\t+_+不能打开文件,删除失败");
mainmenu();
}
NO=0;
savefile();
printf("\n\t\t所有联系人纪录已删除,按任意键返回主菜单");
getch();
fclose(fp);
return;
}
else
return;
}
void deletesingle()
{
char choice;
printf("\n\t\t\t1-按姓名删除");
printf("\n\t\t\t2-按号码删除");
printf("\n\t\t\t3-返回删除菜单");
printf("\n\t\t请选择:");
choice=getche();
switch (choice)
{
case '1':
deletename();
break;
case '2':
deletephone();
break;
case '3':
deletemenu();
break;
}
}
void deletename()
{
int i,j;
int flag=0; //用于判断是否找到联系人的标志
char name[20];
printf("\n\t\t请输入要删除联系人姓名:");
scanf("%s",name);
if(NO==0)
{
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
for (i=0; i<NO; i++)
{
if (strcmp(contact[i].name,name)==0)
{
printf("\n\t\t以下是您要删除的联系人纪录:");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t所在群位置:%s",contact[i].qunming);
printf("\n\t\t是否删除?(1/0)");
if (getch()=='1')
{
for (j=i; j<NO-1; j++)
contact[j]=contact[j+1]; //用后一个联系人的信息将前一个联系人的信息覆盖
NO--;
flag=1;
printf("\n\t\t^_^删除成功");
savefile();
savegroupfile(contact[i].qunming);
printf("\n\t\t是否继续删除?(1/0)");
if (getch()=='1')
deletename();
return;
}
else
return;
}
continue;
}
if (flag==0)
{
printf("\n\t\t没有该联系人的纪录");
printf("\n\t\t是否继续删除?(1/0)");
if (getch()=='1')
deletename();
return;
}
}
void deletephone()
{
int i,j;
int flag=0; //用于判断是否找到联系人的标志
char phone[20];
printf("\n\t\t请输入要删除联系电话:");
scanf("%s",phone);
if(NO==0)
{
printf("\n\t\t+_+对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
for (i=0; i<NO; i++)
{
if (strcmp(contact[i].phone,phone)==0)
{
printf("\n\t\t以下是您要删除的联系人纪录:");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t所在群位置:%s",contact[i].qunming);
printf("\n\t\t是否删除?(1/0)");
if (getch()=='1')
{
for (j=i; j<NO-1; j++)
contact[j]=contact[j+1];
NO--;
flag=1;
printf("\n\t\t^_^删除成功");
savefile();
savegroupfile(contact[i].qunming);
printf("\n\t\t是否继续删除?(1/0)");
if (getch()=='1')
deletephone();
return;
}
else
return;
}
continue;
}
if (flag==0)
{
printf("\n\t\t+_+没有该联系人的纪录");
printf("\n\t\t是否继续删除?(1/0)");
if (getch()=='1')
deletephone();
return;
}
}
void deletegroupOne()
{
int i,j;
int flag=0;
char name[20];
printf("\n\t\t请输入要退群联系人姓名:");
scanf("%s",name);
if(NO==0)
{
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
for (i=0; i<NO;i++)
{
if (strcmp(contact[i].name,name)==0)
{
printf("\n\t\t以下是您要删除的联系人纪录:");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t所在群位置:%s",contact[i].qunming);
printf("\n\t\t是否退群?(1/0)");
if (getch()=='1')
{
char namefileflag[25];
strcpy(namefileflag,contact[i].qunming);
strcpy(contact[i].qunming,"其他");
savefile();
savegroupfile(contact[i].qunming);
savegroupfile(namefileflag);
printf("\n\t\t^_^退群成功");
flag=1;
printf("\n\t\t是否继续退群?(1/0)");
if (getch()=='1')
deletegroupOne();
return;
}
else
return;
}
continue;
}
if (flag==0)
{
printf("\n\t\t没有该联系人的纪录");
printf("\n\t\t是否继续删除?(1/0)");
if (getch()=='1')
deletegroupOne();
return;
}
}
//排序模块
void paixu()
{
int i,j;
struct record temp; //交换变量
for(i=0; i<NO-1; i++)
for(j=0; j<NO-i-1; j++)
{
if(strcmp(contact[j].name,contact[j+1].name)>0)
{
temp=contact[j];
contact[j]=contact[j+1];
contact[j+1]=temp;
}
}
}
// 写入文件预读取文件模块
int loadfile()
{
FILE *fp;
if ((fp=fopen("联系人.txt","at+"))==0)
{
printf("\n\t\t\t\t建立失败");
exit(0);
}
else
{
printf("\n\n\t\t\t 电话簿建立成功!");
}
while(!feof(fp) && fread(&contact[NO],sizeof(struct record),1,fp))
{
char c=fgetc(fp); // 用于将文件中的换行符吸收
NO++;
}
fclose(fp);
printf("\n\t\t\t 按任意键进入主菜单");
getch();
return 0;
}
void savegroupfile(char *filename)
{
FILE *fp1;
char filename1[30];
strcpy(filename1,filename);
strcat(filename1,".txt");
if ((fp1=fopen(filename1,"w+"))==0)
{
printf("\n\t\t+_+文件打开失败!\n");
}
for(int i=0;i<NO;i++)
{
if(strcmp(contact[i].qunming,filename)==0)
{
if (fwrite(&contact[i],sizeof(struct record),1,fp1)!=1)
{
printf("\n\t\t写入文件错误!\n");
}
else
{
fputc(10,fp1); // 往文件中写入换行符,让文件中保存的内容更方便查询
}
}
}
fclose(fp1);
}
void savefile()
{
int i;
if ((fp=fopen("联系人.txt","w+"))==0)
{
printf("\n\t\t+_+文件打开失败!\n");
}
for (i=0; i<NO; i++)
{
if (fwrite(&contact[i],sizeof(struct record),1,fp)!=1)
{
printf("\n\t\t写入文件错误!\n");
}
else
{
fputc(10,fp); // 往文件中写入换行符,让文件中保存的内容更方便查询
}
}
printf("\n\t\t 已更新文件!\n");
fclose(fp);
}
3.未解决问题
1.查找不能进行模糊查找
2.群的创建有点乱