#include<stdio.h>
#include<stdlib.h>
#include<string.h>//需要用到strcmp函数
#pragma warning(disable:4996)
#define N 15//最大储存信息数
int t = 1;//t用来控制整个程序的执行,以及程序的退出;
//函数声明
void menu();//主菜单
void increase();//数据添加模块
void seek();//数据查看模块
void dele();//数据删除模块
void modify();//数据修改模块
void exit();//退出函数
struct communicationMethod
{
char name[20]; //姓名
char tel[12]; //电话号码
int type; //分类:0表示办公类,1表示个人类,2表示商务类
char email[20]; //电子邮件地址
int num; //条目编号
}ComMtd[N];
int main()
{
int num;//num是菜单选项
while (t)//t是全局变量,用exit函数来控制循环是否继续
{
menu();//输出主菜单界面
printf("请输入编号选择功能:");
scanf("%d", &num);
switch (num)
{
case 1: seek(); break; //数据查看模块
case 2: increase(); break;//数据添加模块
case 3: modify(); break; //数据修改模块
case 4: dele(); break; //数据删除模块
case 5: exit(); break; //退出系统模块
default:printf("输入有误,请重新输入!");
}
}
system("pause");
return 0;
}
void menu()
{
printf("\n\t\t\t\t手机通信录管理系统\n");
printf("\t\t*********************菜单**************************\n");
printf("\t\t* 1-数据查看 *\n");
printf("\t\t* 2-数据添加 *\n");
printf("\t\t* 3-数据修改 *\n");
printf("\t\t* 4-数据删除 *\n");
printf("\t\t* 5-退出系统 *\n");
printf("\t\t***************************************************\n");
}
void increase() //数据添加模块
{
int i, j, k = 0, flag, m = 0;//k代表人数
FILE* in, * out;
if ((in = fopen("D:\\手机通信录.txt", "r")) == NULL)//打开文件
{
printf("打开文件失败!\n");
exit(0);
}
for (i = 0; i < N; i++)//N是最大的人数,可在程序开头进行更改
{
if (fread(&ComMtd[i], sizeof(struct communicationMethod), 1, in) == 1)
k++; //记录人数
}
if (k == 0)
{
printf("当前通讯录有0人!\n");
}
else
{
printf("当前通讯录有%d人\n",k);
}
fclose(in);
i = k;
if (k == 15)
{
printf("通信录已满!\n");
return;
}
printf("\n请输入待增加的联系人人数:\n");
scanf("%d", &m);
if (m > 0)
{
do {
flag = 1;
while (flag)
{
flag = 0;
printf("请输入第%d位联系人姓名\n", i + 1);
scanf("%s", ComMtd[i].name);
for (j = 0; j < i; j++)
{
if (strcmp(ComMtd[i].name, ComMtd[j].name)==0)
{
printf("数据已经存在,请重新输入或者取消!");
flag = 1;
break;
}
}//判断是否重复
}
printf("请输入第%d位联系人电话号码\n", i + 1);
scanf("%s", ComMtd[i].tel);
printf("请输入第%d位联系人的分类(0表示办公类,1表示个人类,2表示商务类):\n", i + 1);
scanf("%d", ComMtd[i].type);
printf("请输入第%d位联系人的电子邮件地址:\n", i + 1);
scanf("%s", ComMtd[i].email);
ComMtd[i].num = i+1;
i++;
} while (i < k + m);//只要当前人数还没到达添加后的总人数,就得继续添加
}
if ((out = fopen("D:\\手机通信录.txt", "w")) == NULL)
{
printf("打开文件失败!\n");
exit(0);
}
for (i = 0; i < k + m; i++)
{
if (fwrite(&ComMtd[i], sizeof(struct communicationMethod), 1, out) != 1)
{
printf("添加失败!\n");
}
}
printf("添加完成!\n");
fclose(out);
system("pause");
}
void seek() //数据查看模块
{
int i, k = 0, num, flag;
FILE* in;
if ((in = fopen("D:\\手机通信录.txt", "r")) == NULL)//打开文件
{
printf("打开文件失败!\n");
exit(0);
}
for (i = 0; i < N; i++)//N是最大的人数,可在程序开头进行更改
{
if (fread(&ComMtd[i], sizeof(struct communicationMethod), 1, in) == 1)
k++; //记录人数
}
if (k == 0)
{
printf("当前通讯录有0人,请添加后查看!\n");
return;
}
else
{
printf("当前通讯录有%d人\n", k);
}
fclose(in);
printf("\t\t*****************************\n");
printf("\t\t**-------0-办公类查询------**\n");
printf("\t\t**-------1-个人类查询------**\n");
printf("\t\t**-------2-商务类查询------**\n");
printf("\t\t**-------3-退出本菜单------**\n");
printf("\t\t*****************************\n");
while (1)
{
flag = 0;
printf("请输入编号选择功能:");
scanf("%d", &num);
switch (num)
{
case 0:
for (i = 0; i < k; i++)
{
if (ComMtd[i].type == 0)
{
flag = 1;
printf("姓名\t\t电话号码\t\t类别\t\t电子邮箱\t\t条目编号\n");
printf("%s\t\t%s\t\t%d\t\t%s\t\t%d\n", ComMtd[i].name, ComMtd[i].tel, ComMtd[i].type, ComMtd[i].email, ComMtd[i].num);
}
}break;
case 1:
for (i = 0; i < k; i++)
{
if (ComMtd[i].type == 1)
{
flag = 1;
printf("姓名\t\t电话号码\t\t类别\t\t电子邮箱\t\t条目编号\n");
printf("%s\t\t%s\t\t%d\t\t%s\t\t%d\n", ComMtd[i].name, ComMtd[i].tel, ComMtd[i].type, ComMtd[i].email, ComMtd[i].num);
}
}break;
case 2:
for (i = 0; i < k; i++)
{
if (ComMtd[i].type == 2)
{
flag = 1;
printf("姓名\t\t电话号码\t\t类别\t\t电子邮箱\t\t条目编号\n");
printf("%s\t\t%s\t\t%d\t\t%s\t\t%d\n", ComMtd[i].name, ComMtd[i].tel, ComMtd[i].type, ComMtd[i].email, ComMtd[i].num);
}
}break;
case 3: return;
default: printf("请在0--3之间输入\n");
}
if (flag == 0)
{
printf("找不到符合的记录!\n请重新输入!");
}
}
}
void dele()//数据删除模块
{
int i, j, flag, k = 0;
char s1[20];
FILE* in, * out;
if ((in = fopen("D:\\手机通信录.txt", "r")) == NULL)//打开文件
{
printf("打开文件失败!\n");
exit(0);
}
for (i = 0; i < N; i++)//N是最大的人数,可在程序开头进行更改
{
if (fread(&ComMtd[i], sizeof(struct communicationMethod), 1, in) == 1)
k++;
}
if (k == 0)
{
printf("当前通讯录有0人,请先添加!\n");
return;
}
else
{
printf("当前通讯录有%d人!\n",k);
}
printf("请输入需要删除的联系人的名字:\n");
scanf("%s", s1);
flag = 0;
for (i = 0; i < k; i++)
{
if (strcmp(s1, ComMtd[i].name) == 0)
{
flag = 1;
for (j = i; j < k - 1; j++)
{
ComMtd[j] = ComMtd[j + 1];//直接把后面都往前移动一位
}
}
if (flag == 1)
{
break; //说明已经找到了需要删除的联系人,结束循环
}
}
if (flag == 0)
{
printf("该联系人不存在!\n");
}
if (flag == 1)
{
if ((out = fopen("D:\\手机通信录.txt", "w")) == NULL)
{
printf("打开文件失败!\n");
exit(0);
}
for (i = 0; i < k - 1; i++)
{
if (fwrite(&ComMtd[i], sizeof(struct communicationMethod), 1, out) != 1)
{
printf("删除失败!\n");
}
}
printf("删除成功!\n");
fclose(out);
}
system("pause");
}
void modify()//数据修改模块
{
int i, flag, k = 0;
char name2[20]; //姓名
char tel2[12]; //电话号码
int type2; //分类:0表示办公类,1表示个人类,2表示商务类
char email2[20]; //电子邮件地址
int num; //编号
FILE* in, * out;
if ((in = fopen("D:\\手机通信录.txt", "r")) == NULL)//打开文件
{
printf("打开文件失败!\n");
exit(0);
}
for (i = 0; i < N; i++)//N是最大的人数,可在程序开头进行更改
{
if (fread(&ComMtd[i], sizeof(struct communicationMethod), 1, in) == 1)
k++; //记录人数
}
if (k == 0)
{
printf("当前通讯录有0人,请先添加!\n");
return;
}
else
{
printf("当前通讯录有%d人!\n", k);
}
printf("请输入需要修改的联系人姓名:\n");
getchar();
gets(name2);
while (1)
{
flag = 0;
for (i = 0; i < k; i++)
{
if (strcmp(name2, ComMtd[i].name) == 0)
{
flag = 1;
int num;
printf("***************************************************\n");
printf("*----------------1-修改电话号码--------------------*\n");
printf("*----------------2-修改分类------------------------*\n");
printf("*----------------3-修改电子邮件地址-----------------*\n");
printf("*----------------4-修改条目编号---------------------*\n");
printf("*----------------5-退出本菜单-----------------------*\n");
printf("****************************************************\n\n");
printf("请输入编号选择功能:");
scanf("%d", &num);
switch (num)
{
case 1:
printf("请输入新的电话号码:\n");
getchar();
gets(tel2);
strcpy(ComMtd[i].tel, tel2); break;
case 2:
getchar();
printf("请输入新的分类(0表示办公类,1表示个人类,2表示商务类):\n");
scanf("%d", &type2);
ComMtd[i].type = type2; break;
case 3:
printf("请输入新的电子邮件地址:\n");
getchar();
gets(email2);
strcpy(ComMtd[i].email, email2); break;
case 4:
printf("请输入新的条目编号:\n");
scanf("%d", &num);
ComMtd[i].num = num; break;
case 5:
return; break;
default:
printf("请在1--5之间选择!\n");
}
if (num > 0 && num < 5)
{
if ((out = fopen("D:\\手机通信录.txt", "w")) == NULL)
{
printf("打开文件失败!\n");
exit(0);
}
for (i = 0; i < k; i++)
{
if (fwrite(&ComMtd[i], sizeof(struct communicationMethod), 1, out) != 1)
{
printf("修改失败!\n");
}
}
printf("修改成功!\n");
fclose(out);
}
break; //找到联系人,结束循环;
}
}
if (flag == 0)
{
printf("没有找到该联系人,请重新输入需要修改信息的联系人姓名:\n");
gets(name2);
}
}
system("pause");
}
void exit() //退出系统模块
{
int g; //控制是否确认退出
printf("即将退出,确认请按1,取消请按0\n");
scanf("%d", &g);
if (g == 1)
{
t = 0;//t是main函数中while函数是否继续执行的控制条件,是一个全局变量,程序开头已经定义并且赋值位 1
printf("成功退出!\n");
}
if (g == 0)
{
printf("退出已取消!\n");
system("pause");
}
}