简单通讯录
1. 问题提出
编写一个简单的通讯录管理程序。
2. 功能要求
实现通讯录的显示、增、删、改、查功能。
通讯录要保存在文件中,每次启动程序都从文件中读取当前的所有记录,每次退出程序时都更新通讯录。
通讯录中至少含有以下字段:姓名、电话号码、地址(嵌套结构)、邮政编码、email。
3. 知识点及参考资料
知识点:文件、循环、数组、嵌套结构体、链表(选用)、函数等。
参考资料:C语言程序设计(第二版)(教材)。
4.完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 函数声明
void Shu_Ru(); // 信息录入
void Shou(); // 显示主菜单
void xingmingchaxun(); // 按姓名查询
void dianhuachaxun(); // 按电话查询
void chaxunyemian(); // 信息查询页面
void HeadShow(); // 显示表头
void AllShow(); // 显示所有信息
void xiugai(); // 信息修改
void Dle(); // 信息删除
void xinxixiugai(); // 信息修改或删除操作页面
void weiye(); // 尾页显示
// 定义结构体person,用于存储个人信息
struct person {
char name[8]; // 名字
char phone[11]; // 电话
char addr[100]; // 地址
char yzbm[10]; // 邮政编码
char email[30]; // EMAIL
} pe[100] = {0}; // 初始化结构体数组pe
// 信息录入函数
void Shu_Ru() {
int c = 0; // 记录输入的联系人数量
char r; // 用于控制是否继续输入
int i = 0;
FILE *fp = NULL;
fp = fopen("d:\\jiandan.txt", "a"); // 以追加模式打开文件
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
while (1) {
// 输入联系人信息
printf("请输入名字:"); scanf("%s", pe[c].name);
printf("电话:"); scanf("%s", pe[c].phone);
printf("地址:"); scanf("%s", pe[c].addr);
printf("邮政编码:"); scanf("%s", pe[c].yzbm);
printf("EMAIL:"); scanf("%s", pe[c].email);
// 显示输入的信息
printf("%s\t%s\t%s\t%s\t%s\n", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
c++;
getchar(); // 吸收换行符
// 判断是否继续输入
for (;;) {
printf("按1继续输入,按0结束\n");
scanf("%c", &r);
getchar(); // 吸收换行符
if (r == '1' || r == '0') break;
printf("输入错误!%c不是1和0,请重新输入......\n", r);
}
if (r == '0') break; // 如果选择结束,退出循环
system("cls"); // 清屏
}
// 将录入的信息写入文件
for (i = 0; i < c; i++) {
fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
}
fclose(fp); // 关闭文件
}
// 显示主菜单
void Shou() {
printf("################# 通讯录管理系统 v1.0 ###################\n");
printf("#####################################################################\n");
printf("# #\n");
printf("# 1-----------------信息录入------------------- #\n");
printf("# #\n");
printf("# 2-----------------信息查询------------------- #\n");
printf("# #\n");
printf("# 3-----------------信息查看------------------- #\n");
printf("# #\n");
printf("# 4-----------------信息修改------------------- #\n");
printf("# #\n");
printf("# 5-----------------退出系统------------------- #\n");
printf("# #\n");
printf("#####################################################################\n");
printf("#####################################################################\n");
}
// 按姓名查询
void Xingmingchaxun() {
system("cls"); // 清屏
char name0[8]; // 存储待查询的姓名
int i;
int c = 0;
FILE *fp = NULL;
fp = fopen("d:\\jiandan.txt", "r"); // 以只读模式打开文件
if (fp == NULL) {
printf("文件打开失败!");
return;
}
// 从文件中读取数据到结构体数组
while (feof(fp) == 0) {
fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
c++;
}
fclose(fp); // 关闭文件
// 输入要查询的姓名
printf("请输入要查询的姓名:");
scanf("%s", name0);
// 遍历结构体数组,查找匹配的姓名
for (i = 0; i < c; i++) {
if (strcmp(name0, pe[i].name) == 0) {
HeadShow(); // 显示表头
printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
printf("-----------------------------------------------------------------------------\n");
printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
printf("请按任意键继续......\n");
getchar();
break; // 找到后立即退出,提升效率
}
}
if (i == c) printf ("查无此人\n"); // 当没有找到时输出提示
}
// 按电话查询
void Dianhuachaxun() {
system("cls"); // 清屏
char phone0[11]; // 存储待查询的电话
int i;
int c = 0;
FILE *fp = NULL;
fp = fopen("d:\\jiandan.txt", "r"); // 以只读模式打开文件
while (feof(fp) == 0) {
fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
c++;
}
fclose(fp); // 关闭文件
// 输入要查询的电话
printf("请输入要查询的电话:");
scanf("%s", phone0);
// 遍历结构体数组,查找匹配的电话
for (i = 0; i < c; i++) {
if (strcmp(phone0, pe[i].phone) == 0) {
HeadShow(); // 显示表头
printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
printf("-----------------------------------------------------------------------------\n");
printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
printf("请按任意键继续......\n");
getchar();
break; // 找到后立即退出
}
}
if (i == c) printf ("查无此人\n"); // 当没有找到时输出提示
}
// 信息查询页面
void chaxunyemian() {
system("cls"); // 清屏
char Check_key;
printf("################### 通讯录管理系统 v1.0 ####################\n");
printf("#####################################################################\n");
printf("# #\n");
printf("# 1------按姓名查询 #\n");
printf("# #\n");
printf("# 2------按电话号码查询 #\n");
printf("# #\n");
printf("# 3------退出查询模块 #\n");
printf("# #\n");
printf("#####################################################################\n");
printf("#####################################################################\n");
// 输入操作序号
printf("请输入操作序号:");
scanf("%c", &Check_key);
getchar();
// 根据用户输入进行相应操作
switch (Check_key) {
case '1':
Xingmingchaxun();
getchar();
break;
case '2':
Dianhuachaxun();
getchar();
break;
case '3':
printf("按任意键退出......\n");
getchar();
return;
default:
printf("输入错误!按任意键继续......\n");
getchar();
}
}
// 显示表头
void HeadShow() {
printf("################# 通讯录管理系统 v1.0 ###################\n");
printf("---------------------------------------------------------------------\n");
}
// 显示所有信息
void AllShow() {
system("cls"); // 清屏
int i; // 条件变量,循环变量
char r = '1';
int c = 0;
FILE *fp = NULL;
fp = fopen("d:\\jiandan.txt", "r"); // 以只读模式打开文件
if (fp == NULL) {
printf("文件打开失败!");
return;
}
while (feof(fp) == 0) {
fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
c++;
}
fclose(fp); // 关闭文件
// 显示表头
HeadShow();
printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
printf("-----------------------------------------------------------------------------\n");
// 显示所有联系人信息
for (i = 0; i < c - 1; i++) {
printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
}
printf("请按任意键继续......\n");
getchar();
}
// 信息修改函数
void Xiugai() {
FILE *fp;
system("cls"); // 清屏
int i = 0;
int c = 0;
char name0[8];
char phone0[11];
int x;
fp = fopen("d:\\jiandan.txt", "r+"); // 以读写模式打开文件
if (fp == NULL) {
printf("文件打开失败!");
return;
}
while (feof(fp) == 0) {
fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
c++;
}
fclose(fp); // 关闭文件
printf("请输入要修改的记录名字:");
scanf("%s", name0);
// 查找匹配的联系人信息
for (i = 0; i < c; i++) {
if (strcmp(name0, pe[i].name) == 0) {
printf("该名字的记录如下:\n");
printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
printf("-----------------------------------------------------------------------------\n");
printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
printf("要修改请输入1,按任意键退出\n");
scanf("%d", &x);
if (x == 1) {
printf("请输入姓名:"); scanf("%s", pe[i].name);
printf("电话:"); scanf("%s", pe[i].phone);
printf("地址:"); scanf("%s", pe[i].addr);
printf("邮政编码:"); scanf("%s", pe[i].yzbm);
printf("EMAIL:"); scanf("%s", pe[i].email);
} else break;
}
}
// 重新写入文件
fp = fopen("d:\\jiandan.txt", "w");
if (fp == NULL) {
printf("文件打开失败!");
return;
}
for (i = 0; i < c - 1; i++) {
fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
}
fclose(fp); // 关闭文件
printf("请按任意键继续......\n");
getchar();
getchar();
}
// 信息删除函数
void Dle() {
FILE *fp;
system("cls"); // 清屏
int i = 0;
int c = 0;
char name0[8];
char phone0[11];
int x;
fp = fopen("d:\\jiandan.txt", "r+"); // 以读写模式打开文件
if (fp == NULL) {
printf("文件打开失败!");
return;
}
while (feof(fp) == 0) {
fscanf(fp, "%s%s%s%s%s", pe[c].name, pe[c].phone, pe[c].addr, pe[c].yzbm, pe[c].email);
c++;
}
fclose(fp); // 关闭文件
printf("请输入要删除的记录名字:");
scanf("%s", name0);
// 查找匹配的联系人信息
for (i = 0; i < c; i++) {
if (strcmp(name0, pe[i].name) == 0) {
printf("该名字的记录如下:\n");
printf("姓名\t\t电话\t\t地址\t\t邮政编码\t\tEMAIL\n");
printf("-----------------------------------------------------------------------------\n");
printf("%s\t\t%s\t\t%s\t\t%s\t\t\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
printf("要删除请输入1,按任意键退出\n");
scanf("%d", &x);
if (x == 1) {
for (; i < c - 1; i++) {
pe[i] = pe[i + 1]; // 将后面的记录前移
}
c--;
} else break;
}
}
// 重新写入文件
fp = fopen("d:\\jiandan.txt", "w");
if (fp == NULL) {
printf("文件打开失败!");
return;
}
for (i = 0; i < c - 1; i++) {
fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", pe[i].name, pe[i].phone, pe[i].addr, pe[i].yzbm, pe[i].email);
}
fclose(fp); // 关闭文件
printf("请按任意键继续......\n");
getchar();
getchar();
}
// 信息修改或删除操作页面
void Xinxixiugai() {
system("cls"); // 清屏
char Check_key;
printf("################### 通讯录管理系统 v1.0 ####################\n");
printf("#####################################################################\n");
printf("# #\n");
printf("# 1------信息修改 #\n");
printf("# #\n");
printf("# 2------信息删除 #\n");
printf("# #\n");
printf("# 3------退出修改模块 #\n");
printf("# #\n");
printf("#####################################################################\n");
printf("#####################################################################\n");
// 输入操作序号
printf("请输入操作序号:");
scanf("%c", &Check_key);
getchar();
// 根据用户输入进行相应操作
switch (Check_key) {
case '1':
Xiugai();
getchar();
break;
case '2':
Dle();
getchar();
break;
case '3':
printf("按任意键退出......\n");
getchar();
return;
default:
printf("输入错误!按任意键继续......\n");
getchar();
}
}
// 尾页显示函数
void Weiye() {
system("cls"); // 清屏
printf("#####################################################################\n");
printf("# #\n");
printf("# 欢迎下次使用本系统,再见! #\n");
printf("# #\n");
printf("#####################################################################\n");
getchar();
}
// 主函数
int main() {
system("color f1"); // 设置系统颜色
char key;
while (1) {
system("cls"); // 清屏
Shou(); // 显示主菜单
printf("请选择对应的操作:");
scanf("%c", &key); // 获取用户输入的操作序号
getchar();
switch (key) {
case '1':
Shu_Ru();
break;
case '2':
chaxunyemian();
break;
case '3':
AllShow();
break;
case '4':
Xinxixiugai();
break;
case '5':
Weiye();
return 0;
default:
printf("输入错误!请按任意键继续......\n");
getchar();
}
}
return 0;
}