题目简介
实现一个通讯录;
通讯录可以用来存储个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
- 保存联系人到文件
- 加载联系人
代码总览
Contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define MAX 1000 //通讯录最大存储量
#define NAME_MAX 20//名字最大长度
#define SEX_MAX 5 //性别...
#define ADDR_MAX 30 //地址...
#define TELE_MAX 12 //电话...
typedef struct PeoInfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char addr[ADDR_MAX];
char tele[TELE_MAX];
}PeoInfo;
//动态的通讯录
typedef struct contact
{
PeoInfo* data;
int size;
int capacity;
}contact;
void InitContact(contact* pcon);
void AddContact(contact* pcon);
void DelContact(contact* pcon);
void ShowContact(const contact* pcon);
void SearchContact(const contact* pcon);
void DestroyContact(contact* pcon);
int CheckContact(contact* pcon);
void ModifyContact(contact* pcon);
void SortContact(contact* pcon);
void SaveContact(contact* pcon);
void LoadContact(contact* pcon);
#endif
Contact.c
#include"Contact.h"
void InitContact(contact* pcon)
{
assert(pcon);
pcon->data = (PeoInfo*)malloc(3 * sizeof(PeoInfo));
if (pcon->data == NULL)
{
perror("InitContact::malloc");
exit(1);
}
pcon->size = 0;
pcon->capacity = 3;
LoadContact(pcon);
}
int CheckContact(contact* pcon)
{
assert(pcon);
if (pcon->size == pcon->capacity)
{
PeoInfo* ptr = (PeoInfo*)realloc(pcon->data, (pcon->capacity + 2) * sizeof(PeoInfo));
if (ptr == NULL)
{
return 0;
}
else
{
pcon->data = ptr;
pcon->capacity += 2;
printf("增容成功\n");
return 1;
}
}
return 1;
}
void AddContact(contact* pcon)
{
assert(pcon);
if (CheckContact(pcon) == 0)
{
printf("增容失败!");
exit(1);
}
printf("请输入姓名:>\n");
scanf("%s", pcon->data[pcon->size].name);
printf("请输入年龄:>\n");
scanf("%d", &(pcon->data[pcon->size].age));
printf("请输入性别:>\n");
scanf("%s", pcon->data[pcon->size].sex);
printf("请输入地址:>\n");
scanf("%s", pcon->data[pcon->size].addr);
printf("请输入电话:>\n");
scanf("%s", pcon->data[pcon->size].tele);
pcon->size++;
printf("添加成功\n");
}
void DestroyContact(contact* pcon)
{
assert(pcon);
pcon->size = 0;
pcon->capacity = 0;
free(pcon->data);
pcon->data = NULL;
}
static int FindContact(const contact* pcon, char name[])//只有内部可以看到
{
int i = 0;
for (i = 0; i < pcon->size; i++)
{
if (strcmp(pcon->data[i].name, name) == 0)
return i;
}
return -1;
}
void DelContact(contact* pcon)
{
assert(pcon);
if (pcon->size == 0)
{
printf("没有你要删除的联系人!\n");
return;
}
int i = 0;
int pos = 0;
char name[NAME_MAX] = { 0 };
printf("请输入你要删除人的姓名:>\n");
scanf("%s", name);
pos = FindContact(pcon, name);
if (pos == -1)
{
printf("没有找到你要删除的人\n");
return;
}
for (i = pos; i < pcon->size - 1; i++)
{
pcon->data[i] = pcon->data[i + 1];
}
pcon->size--;
printf("删除成功!\n");
}
void ShowContact(const contact* pcon)
{
assert(pcon);
if (pcon->size == 0)
return;
int i = 0;
printf("%10s\t%5s\t%5s\t%15s\t%15s\t\n", "姓名", "年龄", "性别", "地址", "电话");
for (i = 0; i < pcon->size; i++)
{
printf("%10s\t%5d\t%5s\t%15s\t%15s\t\n",
pcon->data[i].name,
pcon->data[i].age,
pcon->data[i].sex,
pcon->data[i].addr,
pcon->data[i].tele);
}
}
void SearchContact(const contact* pcon)
{
assert(pcon);
if (pcon->size == 0)
return;
char name[NAME_MAX] = { 0 };
int pos = 0;
printf("请输入你要查找的人的姓名:>\n");
scanf("%s", name);
pos = FindContact(pcon, name);
if (pos == -1)
{
printf("没有找到你要找的人\n");
return;
}
printf("%10s\t%5s\t%5s\t%15s\t%15s\t\n", "姓名", "年龄", "性别", "地址", "电话");
printf("%10s\t%5d\t%5s\t%15s\t%15s\t\n",
pcon->data[pos].name,
pcon->data[pos].age,
pcon->data[pos].sex,
pcon->data[pos].addr,
pcon->data[pos].tele);
}
void ModifyContact(contact* pcon)
{
assert(pcon);
if (pcon->size == 0)
return;
char name[NAME_MAX] = { 0 };
int pos = 0;
printf("请输入你要查找的人的姓名:>\n");
scanf("%s", name);
pos = FindContact(pcon, name);
if (pos == -1)
{
printf("没有找到你要找的人\n");
return;
}
printf("请输入修改后的姓名:>\n");
scanf("%s", pcon->data[pos].name);
printf("请输入修改后的年龄:>\n");
scanf("%d", &(pcon->data[pos].age));
printf("请输入修改后的性别:>\n");
scanf("%s", pcon->data[pos].sex);
printf("请输入修改后的地址:>\n");
scanf("%s", pcon->data[pos].addr);
printf("请输入修改后的电话:>\n");
scanf("%s", pcon->data[pos].tele);
}
void SortContact(contact* pcon)
{
assert(pcon);
if (pcon->size == 0)
return;
int i = 0;
int j = 0;
PeoInfo tmp;
for (i = 0; i < pcon->size - 1; i++)
{
for (j = 0; j < pcon->size - i - 1; j++)
{
if (strcmp(pcon->data[j].name, pcon->data[j + 1].name) > 0)
{
tmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
void SaveContact(contact* pcon)
{
FILE* pf = fopen("contact.dat", "wb");
int i = 0;
if (pf == NULL)
{
perror("SaveContact::fopen");
return;
}
//写
for (i = 0; i < pcon->size; i++)
{
fwrite(&(pcon->data[i]), sizeof(PeoInfo), 1, pf);
}
fclose(pf);
pf = NULL;
}
void LoadContact(contact* pcon)
{
FILE* pf = fopen("contact.dat", "rb");
PeoInfo tmp = { 0 };
if (pf == NULL)
{
perror("SaveContact::fopen");
return;
}
//读
while (fread(&tmp, sizeof(PeoInfo), 1, pf))
{
CheckContact(pcon);
pcon->data[pcon->size] = tmp;
pcon->size++;
}
fclose(pf);
pf = NULL;
}
test.c
#include"Contact.h"
contact con;
void menu()
{
printf("************************\n");
printf("***1.添加 2.删除***\n");
printf("***3.查找 4.修改***\n");
printf("***5.显示 6.清空***\n");
printf("***7.排序 0.exit***\n");
printf("************************\n");
}
enum //不加枚举名作用类似于#define
{
Exit,
Add,
Del,
Search,
Modify,
Show,
Clear,
Sort
};
void test()
{
int input = 0;
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
printf("\n");
switch (input)
{
case Exit:
SaveContact(&con);
printf("退出程序\n");
return;
case Add:
AddContact(&con);
break;
case Del:
DelContact(&con);
break;
case Search:
SearchContact(&con);
break;
case Modify:
ModifyContact(&con);
break;
case Show:
ShowContact(&con);
break;
case Clear:
DestroyContact(&con);
break;
case Sort:
SortContact(&con);
break;
default:
printf("选择有误,请重新选择\n");
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}