⭐前言⭐
※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入练习模式。若有错误,请多多指教。
👍 点赞 ⭐ 收藏 📝留言 都是我创作的最大的动力!
通讯录
⭐往期真集⭐
扫雷 | 扫雷小游戏最详细讲解【C语言】 |
猜数字 | 【C语言】猜数字小游戏详细教程 |
⭐思维导图⭐
⭐目录⭐
目录
※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入练习模式。若有错误,请多多指教。
16.DestContact函数(摧毁通讯录和讲联系人储存到文件)
1.通讯录功能
1. 添加联系人
2.删除联系人
3.找查联系人
4.修改联系人
5.打印联系人
6.清空联系人
7.联系人排序
8.使用说明
9.文件储存联系人
10.动态内存开辟
声明
//接口的声明
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
//宏
#define NAME 32
#define SEX 8
#define PHONE 12
#define ADDR 64
#define INITCAP 20 //初始化长度
#define INCREMENT 10 //自增长度
#define FILE_NAME "contact.txt" //打开文件的名字
//利用枚举来替换switch中的选项
enum Option
{
EXIT,//0
ADD,
DELECT,
SEARCH,
EDIT,
SHOW,
EMPTY,
SORT,
HELP,
};
//确认信息
enum check
{
NO,//0
YES,
};
//类型的声明
//联系人结构体
typedef struct Person
{
char name[NAME];
char sex[SEX];
int age;
char phone[PHONE];
char addr[ADDR];
}person_t,*person_p,**person_pp;
//通讯录结构体
typedef struct contact
{
int cap; //最大容量
int size; //当前容量
person_p data; //联系人列表
} contact_t,*contact_p,**contact_pp;
//函数的声明
//将光标移动到指定位置
void gotoxy(short x, short y);
//初始化通讯录
void Initcontact(contact_pp pc);
//添加联系人
void AddContact(contact_p pc);
//删除联系人
void DelContact(contact_p pc);
//查找联系人
void SeaContact(contact_p pc);
//修改联系人
void ModContact(contact_p pc);
//打印联系人
void ShowContact(contact_p pc);
//通讯录排序
void SortContact(contact_p pc);
//帮助(使用手册)
void HelpContact();
//清空通讯录
void EmpContact(contact_p pc);
//退出通讯录
void ExitContact(contact_p pc);
2.选择菜单
void menu1()
{
printf("\n#################################################################################\n");
printf("\n▓ * 欢迎使用通讯录 * ▓\n");
printf("\n#################################################################################\n");
printf("\n ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\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");
printf(" |◆|******|◆| |◆|******|◆|\n");
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("\n#################################################################################\n");
printf("\n▓ *** 请选择<0~7>: *** ▓\n");
printf("\n#################################################################################\n");
}
3.main函数
int main()
{
system("color 2");
int input = -1; //选择控制变量
//创建通讯录
contact_p mycon = NULL; //我的通讯录
Initcontact(&mycon); //初始化通讯录
while (1)
{
menu1();
//printf("请选择<0~7>:");
gotoxy(50, 22); //移动光标到(50,22)处
rewind(stdin);//清除缓存区多余的内容
scanf("%d", &input);
switch (input)
{
//使用枚举变量,使单词代替数字。
case ADD :
system("cls"); //清屏
AddContact(mycon); //添加联系人
system("pause"); //按任意键继续
break;
case DELECT:
system("cls");
DelContact(mycon); //删除联系人
system("pause");
break;
case SEARCH:
system("cls");
SeaContact(mycon); //查找联系人
system("pause");
break;
case EDIT:
system("cls");
ModContact(mycon); //修改联系人
system("pause");
break;
case SHOW:
system("cls");
ShowContact(mycon); //打印联系人
system("pause");
break;
case EMPTY:
system("cls");
EmpContact(mycon);//清空通讯录
system("pause");
break;
case SORT:
system("cls");
SortContact(mycon);//通讯录排序
system("pause");
break;
case HELP:
system("cls");
HelpContact();//使用说明
system("pause");
break;
case EXIT:
system("cls");
ExitContact(mycon);//退出
system("pause");
break;
default:
printf("输入错误!!!");
system("pause");
break;
}
system("cls");//清屏
}
return 0;
}
4.Initcontact函数(初始化函数)
//初始化通讯录
void Initcontact(contact_pp pc)
{
assert(pc);
//申请动态通讯录空间
*pc = (contact_p)malloc(sizeof(contact_t));
if (NULL == (*pc))
{
perror("Initcontact::malloc");
exit(1);
}
//申请动态通讯录成员空间
(*pc)->data = (person_p)malloc(sizeof(person_t) * INITCAP);
if (NULL == (*pc)->data)
{
perror("Initcontact::malloc");
exit(2);
}
//初始化通讯录最大容量和现有容量
(*pc)->cap = INITCAP;
(*pc)->size = 0;
//将开辟的空间初始化为0
memset((*pc)->data, 0, ((*pc)->cap) * sizeof(person_t));
//从文件中读取联系人
FileLoad(*pc);
}
5.FileLoad函数 (从文件中读取联系人)
注意:要有该文件。
//从文件中读取通讯录信息
void FileLoad(contact_p pc)
{
assert(pc);
//打开文件
FILE* fp = fopen(FILE_NAME, "rb");
if (NULL == fp)
{
perror("FileLoad::fopen");
return;
}
//读取文件
person_t tem = { 0 };
while (fread(&tem, sizeof(person_t), 1, fp))
{
CheckCap(pc);
pc->data[pc->size] = tem;
pc->size++;
}
//关闭文件
fclose(fp);
fp = NULL;
}
6.CheckCap函数(检查空间,若不够则开辟空间)
//检查空间容量
void CheckCap(contact_p pc)
{
//增容
if (pc->size == pc->cap)
{
person_p new = (person_p)realloc(pc->data, (pc->cap + INCREMENT) * sizeof(person_t));
if (NULL == new)
{
perror("CheckCap::realloc");
return;
}
else
{
pc->data = new;
}
pc->cap += INCREMENT;
printf("扩容成功!\n");
}
}
7.AddContact函数(添加联系人)
void static Add(contact_p pc, person_p p)
{
assert(pc && p);
//检查是否要开辟空间
CheckCap(pc);
pc->data[pc->size] = *p;
pc->size++;
printf("添加成功!\n");
}
//添加联系人
void AddContact(contact_p pc)
{
assert(pc);
person_t p = { 0 };
printf("请添加信息<姓名,性别,年龄,电话,地址>:\n");
scanf("%s %s %d %s %s", p.name, p.sex, &p.age, p.phone, p.addr);
Add(pc, &p);
}
8.DelContact函数(删除联系人)
//删除联系人
void DelContact(contact_p pc)
{
assert(pc);
if (0 == pc->size)
{
printf("================\n");
printf("|| 通讯录为空 ||\n");
printf("================\n");
return;
}
//删除
char name[NAME] = { 0 };
printf("请输入要删除人的名字:");
scanf("%s", name);
printf("\n请确定要删除%s联系人\n", name);
int n = 0;
while (1)
{
printf("----------------\n");
printf("| 1.YES | 2.NO |\n");
printf("----------------\n");
scanf("%d", &n);
if (1 == n )
{
int pos = FindByName(pc, name);
if (-1 == pos)
{
printf("不存在联系人:%s\n", name);
return;
}
else
{
for (int j = pos; j < (pc->size) - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->size--;
printf("删除成功!\n");
}
return;
}
else if (2 == n)
{
return;
}
else
{
printf("================\n");
printf("|| 输入错误 ||\n");
printf("================\n");
}
}
}
9.FindByName(姓名查找)
//通过姓名查找联系人。找到返回下标,没找到返回-1
int FindByName(contact_p pc, char name[])
{
int i = 0;
for (i = 0; i < pc->size; i++)
{
if (0 == strcmp((pc->data[i].name), name))
{
return i;
}
}
return -1;
}
10. SeaContact函数(查找联系人)
//查找联系人
void SeaContact(contact_p pc)
{
assert(pc);
if (0 == pc->size)
{
printf("================\n");
printf("|| 通讯录为空 ||\n");
printf("================\n");
return;
}
//输入要查找的姓名
char Sea_name[NAME] = { 0 };
printf("请输入姓名:");
scanf("%s", Sea_name);
int pos = FindByName(pc, Sea_name);
if (-1 == pos)
{
printf("================\n");
printf("||没有此联系人||\n");
printf("================\n");
return;
}
//打印联系人信息
else
{
printf("------------------------------------------------------------------------------\n");
printf("| name | sex | age | phone | adds |\n");
printf("| %-10s| %-5s| %-4d| %-16s| %-32s|\n", pc->data[pos].name, \
pc->data[pos].sex, pc->data[pos].age, \
pc->data[pos].phone, pc->data[pos].addr);
printf("------------------------------------------------------------------------------\n");
}
}
11. ModContact函数(修改联系人)
//修改联系人
void ModContact(contact_p pc)
{
assert(pc);
if (0 == pc->size)
{
printf("================\n");
printf("|| 通讯录为空 ||\n");
printf("================\n");
return;
}
//输入联系人的姓名
char name[NAME] = { 0 };
printf("请输入联系人的姓名:");
scanf("%s", name);
//查找联系人
int pos = FindByName(pc, name);
if (-1 == pos)
{
printf("================\n");
printf("||没有此联系人||\n");
printf("================\n");
return;
}
//打印联系人信息
printf("------------------------------------------------------------------------------\n");
printf("| name | sex | age | phone | addr |\n");
printf("| %-10s| %-5s| %-4d| %-16s| %-32s|\n", pc->data[pos].name, \
pc->data[pos].sex, pc->data[pos].age, \
pc->data[pos].phone, pc->data[pos].addr);
printf("------------------------------------------------------------------------------\n");
while (1)
{
//选择要修改的关键字
char mod[6] = { 0 };
printf("请输入想修改的部分:");
scanf("%s", mod);
//修改名字
if (0 == strcmp("name", mod))
{
printf("请输入新名字:");
rewind(stdin);//清空输入缓冲区
scanf("%s", pc->data[pos].name);
printf("================\n");
printf("|| 修改成功 ||\n");
printf("================\n");
return;
}
//修改性别
else if (0 == strcmp("sex", mod))
{
printf("请输入新性别:");
rewind(stdin);//清空输入缓冲区
scanf("%s", pc->data[pos].sex);
printf("================\n");
printf("|| 修改成功 ||\n");
printf("================\n");
return;
}
//修改年龄
else if (0 == strcmp("age", mod))
{
printf("请输入新年龄:");
rewind(stdin);//清空输入缓冲区
scanf("%d", &pc->data[pos].age);
printf("================\n");
printf("|| 修改成功 ||\n");
printf("================\n");
return;
}
//修改电话号码
else if (0 == strcmp("phone", mod))
{
printf("请输入新电话:");
rewind(stdin);//清空输入缓冲区
scanf("%s", pc->data[pos].phone);
printf("================\n");
printf("|| 修改成功 ||\n");
printf("================\n");
return;
}
//修改地址
else if (0 == strcmp("addr", mod))
{
printf("请输入新地址:");
rewind(stdin);//清空输入缓冲区
scanf("%s", pc->data[pos].addr);
printf("================\n");
printf("|| 修改成功 ||\n");
printf("================\n");
return;
}
//输入错误
else
{
printf("================\n");
printf("|| 输入错误 ||\n");
printf("================\n");
}
}
}
12. ShowContact函数(打印联系人)
//打印联系人
void ShowContact(contact_p pc)
{
assert(pc);
if (0 == pc->size)
{
printf("================\n");
printf("|| 通讯录为空 ||\n");
printf("================\n");
return;
}
printf("\n------------------------------------------------------------------------------\n");
printf(" 共%5d个联系人 |\n", pc->size);
//打印联系人信息
printf("------------------------------- contacts -------------------------------------\n");
printf("| name | sex | age | phone | addr |\n");
printf("------------------------------------------------------------------------------\n");
for (int i = 0; i < pc->size; i++)
{
printf("| %-10s| %-5s| %-4d| %-16s| %-32s|\n", pc->data[i].name, \
pc->data[i].sex, pc->data[i].age, \
pc->data[i].phone, pc->data[i].addr);
}
printf("------------------------------------------------------------------------------\n\n");
}
13.EmpContact函数(清空通讯录)
//清空通讯录
void EmpContact(contact_p pc)
{
assert(pc);
printf("确定清空通讯录吗?\n");
int n = 0;
while (1)
{
printf("----------------\n");
printf("| 1.YES | 2.NO |\n");
printf("----------------\n");
scanf("%d", &n);
if (1 == n)
{
//将开辟的空间初始化为0
memset(pc->data, 0, pc->cap * sizeof(person_t));
pc->size = 0;
return;
}
else if (2 == n)
{
return;
}
else
{
printf("================\n");
printf("|| 输入错误 ||\n");
printf("================\n");
}
}
}
14.SortContact函数(通讯录排序)
//通讯录排序
void SortContact(contact_p pc)
{
assert(pc);
if (0 == pc->size)
{
printf("================\n");
printf("|| 通讯录为空 ||\n");
printf("================\n");
return;
}
//冒泡排序
int i = 0, j = 0;
person_t tem;
int pos = 0;
for (i = pc->size - 1; i > 0; i--)
{
for (j = 0; j < i; j++)
{
if (1 == strcmp(pc->data[j].name, pc->data[j + 1].name))
{
tem = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tem;
pos = 1;
}
}
if (0 == pos)
{
break;
}
}
printf("================\n");
printf("|| 排序成功 ||\n");
printf("================\n");
}
15.HelpContact函数(使用说明)
//帮助(使用手册)
void HelpContact()
{
printf("\n");
printf("----------------------------------- HELP -----------------------------------\n");
printf("| 你可以在这个通讯录里找到你朋友的一些信息。 |\n");
printf("| 1、添加联系人信息,请选 ( 1 ). |\n");
printf("| 2、删除联系人信息,请选 ( 2 ). |\n");
printf("| 3、搜索联系人信息,请选 ( 3 ). |\n");
printf("| 4、修改联系人信息,请选 ( 4 ). |\n");
printf("| 5、打印联系人信息,请选 ( 5 ). |\n");
printf("| 6、清空通讯录信息,请选 ( 6 ). |\n");
printf("| 7、排序联系人信息,请选 ( 7 ). |\n");
printf("| 8、通讯录使用说明,请选 ( 8 ). |\n");
printf("| 9、退出通讯录信息,请选 ( 9 ). |\n");
printf("------------------------------------------------------------------------------\n\n");
}
16.DestContact函数(摧毁通讯录和讲联系人储存到文件)
//存储到文件
void FileStore(contact_p pc)
{
assert(pc);
//打开文件
FILE* pf = fopen(FILE_NAME, "wb");
if (NULL == pf)
{
perror("FileStore::fopen");
return;
}
//存储信息
int i = 0;
for (i = 0; i < pc->size; i++)
{
fwrite(pc->data + i, sizeof(person_t), 1, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
}
//摧毁通讯录
void DestContact(contact_p pc)
{
assert(pc);
FileStore(pc);
free(pc->data);//释放联系人
pc->data = NULL;
free(pc);
pc = NULL;
}
17.ExitContact函数(退出通讯录)
//退出通讯录
void ExitContact(contact_p pc)
{
printf("确定退出?\n");
int n = 0;
while (1)
{
printf("----------------\n");
printf("| 1.YES | 2.NO |\n");
printf("----------------\n");
scanf("%d", &n);
if (1 == n)
{
DestContact(pc);
printf("================\n");
printf("|| 退出通讯录 ||\n");
printf("================\n");
exit(0);
}
else if (2 == n)
{
return;
}
else
{
printf("================\n");
printf("|| 输入错误 ||\n");
printf("================\n");
}
}
}
18. 完整代码
完整代码及更多有趣的代码请移步到小森的Gitee仓库 Gitee