1.联系人信息:姓名、性别、年龄、电话、地址
2.通讯录功能列表:
(0).清空通讯录
(1)添加联系人信息
(2)删除指定联系人信息
(3)查找指定联系人信息
(4)修改指定联系人信息
(5)按照名字排序所有联系人信息
(6)显示所有联系人信息
(7)清空所有联系人信息
3.实现通讯录
(1)头文件contact.h(声明函数)
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
//信息容量
#define MAX 1000
//名字
#define NAME_MAX 20
//性别
#define SEX_MAX 5
//电话
#define TELE_MAX 12
//地址
#define ADDR_MAX 30
//初始化前能够存放的数据空间个数
#define DEEAULT_MAX 3
//每次开辟增加n个数据空间个数
#define SZ_MAX 2
typedef struct Peoinfo
{
char name[NAME_MAX];//姓名
char sex[SEX_MAX];//性别
int age;//年龄
char tele[TELE_MAX];//电话
char addr[ADDR_MAX];//地址
}Peoinfo;
//静态版
//typedef struct contact
//{
// //创建一个大小为peoinfo结构体类型的数组
// peoinfo data[MAX];
// 记录当前通讯录中有效信息的个数
// int count;
//};
//动态版
typedef struct contact
{
//指向动态申请的空间,用来存放联系人的信息
Peoinfo* data;
//记录当前通讯录中有效信息的个数
int count;
//记录当前通讯录的最大容量
int capacity;
}contact;
enum option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
PRINT,
INIT
};
//声明控制间距
void distance();
//声明初始化通讯录
void INITcontact(contact* pc);
//声明增加信息
void ADDcontact(contact* pc);
//声明删除指定联系人
void DELcontact(contact* pc);
//声明查找指定人名字
int FINDBYname(const contact* pc, const char name[]);
//声明查找指定人的信息
void SEARCHcontact(const contact* pc);
//声明打印所有通讯录信息
void PRINTcontact(const contact* pc);
//声明修改指定人的信息
void MODIFYcontact(contact* pc);
//实现按照名字排序通讯录的信息
void SORTcontact(const contact* pc);
//销毁通讯录
void DESTORYcontact(contact* pc);
//保存通讯录
void SAVEcontact(const contact* pc);
(2)源文件contact.c(实现函数)
#include"contact.h"
//实现控制间距
void distance()
{
printf("\n\n\n");
}
//实现增加信息(静态版)
//void ADDcontact(contact *pc)
//{
// assert(pc);
// if (pc->count == MAX)
// {
// printf("通讯录已满,添加失败\n");
// return;
// }
// printf("请输入联系人的名字:");
// scanf("%s", pc->data[pc->count].name);
// printf("请输入年龄:");
// scanf("%d", &(pc->data[pc->count].age));
// printf("请输入性别:");
// scanf("%s", pc->data[pc->count].sex);
// printf("请输入电话:");
// scanf("%s", pc->data[pc->count].tele);
// printf("请输入地址:");
// scanf("%s", pc->data[pc->count].addr);
// pc->count++;
// printf("添加成功\n");
// distance();
//}
//增容
void LINcontact(contact* pc)
{
assert(pc);
if (pc->count == pc->capacity)
{
Peoinfo* ptr = realloc(pc->data, (pc->capacity + SZ_MAX) * sizeof(Peoinfo));
if (!ptr)
{
perror("ADDcontact");
printf("增容失败\n");
return;
}
else
{
pc->data = ptr;
pc->capacity += SZ_MAX;
printf("增容成功\n");
}
}
}
//实现增加信息(动态版)
void ADDcontact(contact* pc)
{
assert(pc);
//空间已满,考虑增容
LINcontact(pc);
printf("请输入联系人的名字:");
scanf("%s", pc->data[pc->count].name);
printf("请输入年龄:");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入性别:");
scanf("%s", pc->data[pc->count].sex);
printf("请输入电话:");
scanf("%s", pc->data[pc->count].tele);
printf("请输入地址:");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("添加成功\n");
distance();
}
//实现初始化通讯录(静态版)
//void INITcontact(contact *pc)
//{
// assert(pc);
// memset(pc->data,0,sizeof(pc->data));
// pc->count = 0;
//}
//实现初始化通讯录(动态版)
//void INITcontact(contact* pc)
//{
// assert(pc);
// pc->data = (Peoinfo*)malloc(DEEAULT_MAX * sizeof(Peoinfo));
// if (!(pc->data))
// {
// perror("Initcotact");
// return;
// }
// pc->count = 0;
// pc->capacity = DEEAULT_MAX;
//}
void LOADcontact(contact* pc)
{
assert(pc);
//打开文件
FILE* pf = fopen("contact.lin", "rb");
if (!pf)
{
perror("LOADcontact");
return;
}
//读取文件
Peoinfo tmp = { 0 };
while (fread(&tmp, sizeof(Peoinfo),1, pf))
{
LINcontact(pc);
pc->data[pc->count++] = tmp;
}
//关闭文件
fclose(pf);
pf = NULL;
}
//初始化通讯录(文件版)
void INITcontact(contact* pc)
{
assert(pc);
pc->data = (Peoinfo*)malloc(DEEAULT_MAX * sizeof(Peoinfo));
if (!(pc->data))
{
perror("Initcotact");
return;
}
pc->count = 0;
pc->capacity = DEEAULT_MAX;
memset(pc->data, 0, pc->capacity*sizeof(pc->data));
//信息存放至文件中
LOADcontact(pc);
}
//实现打印所有通讯录信息
void PRINTcontact(const contact* pc)
{
assert(pc);
printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i < pc->count; i++)
{
printf("%-20s %-20d %-20s %-20s %-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
//实现查找指定名字
int FINDBYname(const contact* pc,const char name[])
{
assert(pc);
for (int i = 0; i < pc ->count; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//实现删除指定联系人
void DELcontact(contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
char name[NAME_MAX] = { 0 };
printf("请输入删除人的名字:");
scanf("%s", name);
//查找名字
int pos=FINDBYname(pc, name);
if (pos == -1)
{
printf("要删除的信息不存在\n");
return;
}
else
{
for (int j = pos; j < pc->count-1 ; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->count--;
printf("删除成功");
}
}
//实现查找指定人的信息
void SEARCHcontact(const contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("请输入查找人的名字:");
scanf("%s", name);
distance();
//查找名字
int pos = FINDBYname(pc, name);
if (pos == -1)
{
printf("要查找的信息不存在\n");
return;
}
printf("%-20s %-20s %-20s %-20s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s %-20d %-20s %-20s %-20s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
//实现修改指定人的信息
void MODIFYcontact(contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("请输入修改人的名字:");
scanf("%s", name);
distance();
//查找名字
int pos = FINDBYname(pc, name);
if (pos == -1)
{
printf("要修改的信息不存在\n");
return;
}
printf("请输入联系人的名字:");
scanf("%s", pc->data[pos].name);
printf("请输入年龄:");
scanf("%d", &(pc->data[pos].age));
printf("请输入性别:");
scanf("%s", pc->data[pos].sex);
printf("请输入电话:");
scanf("%s", pc->data[pos].tele);
printf("请输入地址:");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
distance();
}
//实现按照名字排序通讯录的信息
void SORTcontact(const contact* pc)
{
assert(pc);
if (pc->count ==0)
{
printf("通讯录中没有联系人,排序失败\n");
return;
}
for (int i = 0; i < pc->count-1; i++)
{
for (int j = 0; j < pc->count - 1; j++)
{
if (strcmp(pc->data[j].name, pc->data[j + 1].name)>0)
{
Peoinfo tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
//销毁通讯录
void DESTORYcontact(contact* pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
pc->count = 0;
pc->capacity = 0;
}
//保存通讯录信息
void SAVEcontact(const contact* pc)
{
FILE*pf=fopen("contact.lin", "wb");
if (!pf)
{
perror("SAVEcontact");
return;
}
for (int i = 0; i < pc->count; i++)
{
fwrite(pc->data + i, sizeof(Peoinfo), 1, pf);
}
fclose(pf);
}
(3)源文件lin.c(主函数)
#include"contact.h"
void menu()
{
//控制间距
distance();
printf(" 0.exit 1.add\n");
printf(" 2.del 3.search\n");
printf(" 4.modify 5.sort\n");
printf(" 6.print 7.init\n");
//控制间距
distance();
}
void test()
{
int input = 0;
//创建通讯录
contact con;
//初始化通讯录
INITcontact(&con);
do
{
menu();
printf("请输入选项:");
scanf("%d", &input);
//控制间距
distance();
switch (input)
{
case EXIT:
//保存信息至文件中
SAVEcontact(&con);
//销毁通讯录
DESTORYcontact(&con);
printf("退出通讯录");
//控制间距
distance();
break;
case ADD:
//添加信息
ADDcontact(&con);
break;
case DEL:
//删除指定联系人
DELcontact(&con);
break;
case SEARCH:
//查找指定人的信息
SEARCHcontact(&con);
break;
case MODIFY:
//修改指定人的信息
MODIFYcontact(&con);
break;
case SORT:
//按照名字排序通讯录的信息
SORTcontact(&con);
break;
case PRINT:
//打印所有通讯录信息函数
PRINTcontact(&con);
break;
case INIT:
INITcontact(&con);
printf("清空成功");
break;
default:
printf("选择无效,请重新选择\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}