目录
1.通讯录要求
实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 以名字排序所有联系人
实现数据保存(进行文件操作)
2.通讯录的实现
2.1 test.c的实现
完成一个通讯录首先就要做一个菜单。
菜单函数 menu()
void menu()
{
printf("************通讯录***********\n");
printf("******1.Add 2.Dele *****\n");
printf("******3.Search 4.Modify*****\n");
printf("******5.Show 6.Sort *****\n");
printf("******0.Exit *****\n");
printf("*****************************\n");
}
我们可以使用一个枚举类型来定义我们的选项,以此来增加我们代码的可读性。
枚举类型
enum option
{
Exit,
Add,
Dele,
Search,
Modify,
Show,
Sort
};
接着是我们的主函数。
主函数 main()
int main()
{
int input,ret=0;
Contact PeoList;//创建通讯录列表
Init_Contacts(&PeoList);//通讯录初始化
do {
menu();
printf("请做出选择:");
scanf("%d", &input);
switch (input)
{
case Add://增加
List_Add(&PeoList);
break;
case Dele://删除
List_Dele(&PeoList);
break;
case Search://查找
ret=List_Search(&PeoList);
if (ret == -1)
{
printf("查找失败\n");
}
else
{
printf("查找成功,是否查看详细信息(1.是 0.否)\n");
int temp;
do {
printf("请输入:");
scanf("%d", &temp);
if (temp == 1)
{
printf("%-10s %-4s %-5s %-20s %-20s\n", "姓名", "年龄", "性别", "电话号码", "住址");
printf("%-10s %-4d %-5s %-20s %-20s\n", PeoList.data[ret].name, PeoList.data[ret].age, PeoList.data[ret].sex, PeoList.data[ret].Tele, PeoList.data[ret].address);
}
else if (temp != 0)
{
printf("选择错误,请重新选择\n");
}
} while (!(temp == 1 || temp == 0));
}
break;
case Modify://修改
List_Modify(&PeoList);
break;
case Show://展示
List_Show(&PeoList);
break;
case Sort://排序
List_Sort(&PeoList);
break;
case Exit://退出
Stor_Contact(&PeoList);
List_Destroy(&PeoList);
printf("退出成功\n");
break;
default:
printf("选择无效,请重新选择\n");
break;
}
} while (input);
return 0;
}
2.2 头文件 contacts.h的实现
这个模块主要是储存一些函数声明和一些宏定义
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <windows.h>
#define Init_ListLen 3//初始通讯录长度
#define Add_Len 2//每次通讯录增加的长度
#define Max_NameLen 50//姓名长度
#define Max_SexLen 5//性别长度
#define Max_TeleLen 50//电话长度
#define Max_AddressLen 50//地址长度
typedef struct Peo
{
char name[Max_NameLen];//姓名
int age;//年龄
char sex[Max_SexLen];//性别
char Tele[Max_TeleLen];//电话
char address[Max_AddressLen];//地址
}Peo;
typedef struct Contact
{
Peo* data;//指向一个存储通讯录数据的空间
int sz;//表示当前存储的有效数据个数
int capacity;//表示当前通讯录的容量
}Contact;
void Init_Contacts(Contact* p);//初始化通讯录函数申明
void List_Add(Contact* p);//通讯录数据增加函数声明
int Check_List(Contact* p);
int Peo_ListLenAdd(Contact* p);
void List_Show(Contact* p);
void List_Destroy(Contact* p);
void List_Dele(Contact* p);
int List_Search(Contact* p);
void List_Modify(Contact* p);
void List_Sort(Contact* p);
void Init_ContactsAdd(Contact* p);//加载数据
void Stor_Contact(Contact* p);
2.3 contacts.c 函数模块的实现
初始化通讯录列表函数(读取文件)
void Init_ContactsAdd(Contact* p)
{
FILE* fp = fopen("contact.txt", "rb");
if (fp == NULL)
{
perror("Init_ContactAdd::fopen");
return;
}
Peo temp = { 0 };
while (fread(&temp,sizeof(Peo),1,fp))
{
if (Check_List(p) == 1)
{
if (Peo_ListLenAdd(p) == 0)
{
return;
}
}
p->data[p->sz] = temp;
p->sz++;
}
fclose(fp);
fp = NULL;
}
保存函数
void Stor_Contact(Contact* p)
{
FILE* fp = fopen("contact.txt", "wb");
int i = 0;
for (i = 0; i < p->sz; i++)
{
fwrite(p->data+i, sizeof(Peo), 1, fp);
}
fclose(fp);
}
初始化通讯录
void Init_Contacts(Contact*p)
{
p->data = (Peo*)malloc(sizeof(Peo) * Init_ListLen);
p->capacity = Init_ListLen;
p->sz = 0;
if (p->data == NULL)
{
printf("通讯录初始化失败\n");
printf("%s", strerror(errno));
}
Init_ContactsAdd(p);
return;
}
成员添加函数
void List_Add(Contact* p)
{
if (Check_List(p) == 1)
{
if (Peo_ListLenAdd(p) == 0)
{
return;
}
}
printf("请输入姓名\n");
scanf("%s", p->data[p->sz].name);
printf("请输入性别\n");
scanf("%s", p->data[p->sz].sex);
printf("请输入年龄\n");
scanf("%d", &(p->data[p->sz].age));
printf("请输入电话\n");
scanf("%s", p->data[p->sz].Tele);
printf("请输入住址\n");
scanf("%s", p->data[p->sz].address);
printf("增加完成\n");
p->sz += 1;
}
检查列表函数
int Check_List(Contact* p)
{
if (p->sz == p->capacity)
{
return 1;
}
return 0;
}
成员内存分配函数(动态分配)
int Peo_ListLenAdd(Contact* p)
{
Peo* str=NULL;
str = (Peo*)realloc(p->data,(p->capacity+Add_Len)*sizeof(Peo));
p->capacity += Add_Len;
if (str == NULL)
{
printf("分配内存失败\n");
printf("%s", strerror(errno));
return 0;
}
else
{
p->data = str;
return 1;
}
}
成员显示函数
void List_Show(Contact*p)
{
printf("%-10s %-4s %-5s %-20s %-20s\n", "姓名", "年龄", "性别", "电话号码", "住址");
int i = 0;
for (i = 0; i < p->sz; i++)
{
printf("%-10s %-4d %-5s %-20s %-20s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].Tele, p->data[i].address);
}
}
归还内存函数
void List_Destroy(Contact* p)
{
free(p->data);
p->data = NULL;
}
成员查找函数
int List_Search(Contact* p)
{
printf("请输入要查找人的姓名\n");
char name[Max_NameLen];
scanf("%s", name);
int i = 0, flag = 0;
for (i = 0; i < p->sz; i++)
{
if (strcmp(p->data[i].name, name) == 0)
{
flag = 1;
break;
}
}
if (flag == 1)
return i;
else
return -1;
}
成员删除函数
void List_Dele(Contact* p)
{
char name[Max_NameLen] = { 0 };
printf("请输入要删除的信息人的姓名\n");
scanf("%s", name);
int i = 0, flag = 0;
for (i = 0; i < p->sz; i++)
{
if (strcmp(p->data[i].name, name) == 0)
{
flag = 1;
break;
}
}
if (flag==1)
{
for (; i < p->sz-1; i++)
{
p->data[i] = p->data[i + 1];
}
printf("删除成功\n");
p->sz -= 1;
}
else
{
printf("未查找到被删除人信息,删除失败\n");
}
}
成员修改函数
void List_Modify(Contact*p)
{
char name[Max_NameLen];
int ret = -1;
printf("请输入要修改人的姓名\n");
scanf("%s", name);
int i = 0;
for (i = 0; i < p->sz; i++)
{
if (strcmp(p->data[i].name, name) == 0)
{
ret = i;
break;
}
}
if (ret == -1)
{
printf("修改失败,未找到修改人信息\n");
return;
}
else
{
printf("开始修改\n");
printf("请输入姓名\n");
scanf("%s", p->data[ret].name);
printf("请输入性别\n");
scanf("%s", p->data[ret].sex);
printf("请输入年龄\n");
scanf("%d", &(p->data[ret].age));
printf("请输入电话\n");
scanf("%s", p->data[ret].Tele);
printf("请输入住址\n");
scanf("%s", p->data[ret].address);
printf("修改完成\n");
}
return;
}
int cmp(const void* p1,const void* p2)
{
return(strcmp((*(Peo*)p1).name, (*(Peo*)p2).name));
}
成员排序函数
void List_Sort(Contact* p)
{
qsort(p->data, p->sz, sizeof(Peo), cmp);//按名字进行排序
printf("排序成功\n");
}