1,通讯录中能够存放个人信息
如:名字,性别,电话,地址等。
2,修改指定人的信息;
3,删除指定人的信息;
4,查找指定人的信息;
5,增加信息;
二 什么是高级版
所谓的高级版通讯录就是增加了动态内存开辟和通讯录内容的存储;
三 现在让我们来实现通讯录
首先把宏和头文件展示出来方便读者在阅读时容易理解
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_NAME 10
#define MAX_ADD 20
#define MAX_SEX 5
#define MAX_NUM 15
#define VALUE 2
#define DOUBLE_SZ 3
考虑到通讯录的的内容很多,现在我们用结构体把它们放在一起方便操作
#define MAX_NAME 10
#define MAX_ADD 20
#define MAX_SEX 5
#define MAX_NUM 15
typedef struct PeopleInfor
{
char name[MAX_NAME];//名字
char add[MAX_ADD];//住址
char sex[MAX_SEX];//性别
char num[MAX_NUM];//电话号码
int age;
}PeopleInfor;
考虑到通讯录的人数我们创建如下结构体
//合集
typedef struct PeopleColl
{
PeopleInfor* date;//每个人的信息
int sz;//以存储的联系人数量
int capacity;//通讯录的容量
}PeopleColl;
下面是主函数的创建:
函数名可以根据给人的喜好来设置
int main()
{
int a = 0;
PeopleColl con;
Initial(&con);//初始化
do {
menu();
printf("请选择:");
scanf("%d", &a);
switch (a)
{
case 1:
ADDITION(&con);//增加联系人
Check(con);
break;
case 2:
Delete(&con);//删除信息
break;
case 3:
SEEK(&con);//查找指定人的信息
break;
case 4:
Revise(&con);//修改信息
break;
case 5:
Check(con);//查看通讯录
break;
case 0: StoreIfor(&con);
Freed(&con);//释放通讯录
break;
default:
printf("选择错误,重新输入\n");
break;
}
} while (a);
return 0;
}
让我们从上到下来依次实现函数
1.初始化
初始化我们要改变结构体所以用到&;
void Initial(PeopleColl* con)
{
con->date = (PeopleInfor*)calloc(DOUBLE_SZ, sizeof(PeopleInfor));
if (con->date == NULL)
{
perror("Initial");
return;
}
con->sz = 0;
con->capacity = DOUBLE_SZ;
ReadIfor(con);
}
ReadIfor();函数单独解释
很容易理解,在打开通讯录的时候需要读取之前存储的内容
//读取信息
void ReadIfor(PeopleColl* con)
{
FILE* ptr = fopen("AddBook.dat", "rb");
if (ptr == NULL)
{
perror("ReadIfor");
printf("读取失败\n");
return;
}
else {
PeopleInfor mat = { 0 };
while (fread(&mat, sizeof(PeopleInfor), 1, ptr))
{
Congestion(con);
con->date[con->sz] = mat;
con->sz++;
}
}
}
2 增加联系人
void ADDITION(PeopleColl* con)
{
Congestion(con);
printf("请输入姓名:\n");
scanf("%s", con->date[con->sz].name);
printf("请输入性别:\n");
scanf("%s", con->date[con->sz].sex);
printf("请输入地址:\n");
scanf("%s", con->date[con->sz].add);
printf("请输入号码:\n");
scanf("%s", &(con->date[con->sz].num));
printf("请输入年龄:\n");
scanf("%d", &(con->date[con->sz].age));
con->sz++;
printf("录入成功\n");
}
在增加联系人前,要首先考虑通讯录是否为满;所以在这里创建了Congestion();增容函数;
Congestion()的实现如下:
void Congestion(PeopleColl* con)
{
if (con->sz == con->capacity)
{
PeopleInfor* p = (PeopleInfor*)realloc(con->date, (con->capacity + VALUE) * sizeof(PeopleInfor));
if (con->date == NULL)
{
perror("Congestion");
printf("增容失败\n");
return;
}
else
{
con->date = p;
con->capacity += VALUE;
printf("增容成功\n");
}
}
}
3 删除联系人
//删除信息
void Delete(PeopleColl* con)
{
if (con->sz == 0) {
printf("通讯录为空\n");
return;
}
char arr[MAX_NAME] = { 0 };
printf("请输入要删除人的名字:\n");
scanf("%s", arr);
int p = Seek(con, arr);
if (p == -1) {
printf("删除的人不存在\n");
}
else
{
int i = 0;
for (i = p; i < con->sz - 1; i++) {
con->date[i] = con->date[i + 1];
}
con->sz--;
printf("删除成功\n");
}
}
在删除联系人时,使用了一个函数Seek;该函数为查找函数,根据该函数的返回值来判断是否找到指定联系人(该函数也会在后续函数实现中使用);
int Seek(const PeopleColl* con, char arr[MAX_NAME])
{
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (strcmp(con->date[i].name, arr) == 0)
return i;
}
return -1;
}
4 查找信息
该·函数是查找函数的拓展,增加了一个显示信息的功能
//查找指定人的信息
void SEEK(PeopleColl* con)
{
if (con->sz == 0) {
printf("通讯录为空\n");
return;
}
char arr[MAX_NAME] = { 0 };
printf("请输入要查找人的名字:\n");
scanf("%s", arr);
int p = Seek(con, arr);
if (p == -1) {
printf("查找的人不存在\n");
}
else
{
printf("查找人的信息为:\n");
printf("%-10s %-10s %-20s %-20s %-10s\n", "姓名", "性别", "地址", "号码", "年龄");
printf("%-10s %-10s %-20s %-20s %-10d\n", con->date[p].name,
con->date[p].sex,
con->date[p].add,
con->date[p].num,
con->date[p].age);
}
}
5 修改信息
//修改信息
void Revise(PeopleColl* con)
{
if (con->sz == 0) {
printf("通讯录为空\n");
return;
}
char arr[MAX_NAME] = { 0 };
printf("请输入要修改人的名字:\n");
scanf("%s", arr);
int p = Seek(con, arr);
if (p == -1) {
printf("修改的人不存在\n");
}
else {
printf("请输入姓名:\n");
scanf("%s", con->date[p].name);
printf("请输入性别:\n");
scanf("%s", con->date[p].sex);
printf("请输入地址:\n");
scanf("%s", con->date[p].add);
printf("请输入号码:\n");
scanf("%s", &(con->date[p].num));
printf("请输入年龄:\n");
scanf("%d", &(con->date[p].age));
printf("修改成功\n");
}
}
修改信息的内容就是增加信息的缩减版
6 查看通讯录
该函数可以添加到每个选项的后面,达到显示效果
//查看信息
void Check(PeopleColl con)
{
if (con.sz == 0) {
printf("请先录入信息\n");
}
int i = 0;
printf("%-10s %-10s %-20s %-20s %-10s\n", "姓名", "性别", "地址", "号码", "年龄");
for (i = 0; i < con.sz; i++)
{
printf("%-10s %-10s %-20s %-20s %-10d\n", con.date[i].name,
con.date[i].sex,
con.date[i].add,
con.date[i].num,
con.date[i].age);
}
}
7 退出和存储信息
在我们退出之前要做到存储通讯录信息和销毁通讯录
//储存信息到文件
void StoreIfor(PeopleColl* con)
{
FILE* p = fopen("AddBook.dat", "wb");
if (p == NULL)
{
perror("StoreIfor");
printf("存储失败\n");
return;
}
//存储文件
int i = 0;
for (i = 0; i < con->sz; i++)
{
fwrite(con->date + i, sizeof(PeopleInfor), 1, p);
}
printf("存储成功\n");
//关闭文件
//释放指针避免内存泄露
fclose(p);
p = NULL;
}
销毁通讯录
void Freed(PeopleColl* con)
{
free(con->date);
con->date = NULL;
con->capacity = 0;
con->sz = 0;
}