目标:
实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址,并将输入的个人信息保存在文件中,当下次打开通讯录可以查看以前录入的信息。
通讯录具有的功能:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
共有三个文件:
1. main .c 主界面
2. contact.h 变量及函数的声明
3. contact.c 具体的函数块
1. main .c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("**************************\n");
printf("****1.add 2.del ****\n");
printf("****3.search 4.modify ****\n");
printf("****5.show 6.delall ****\n");
printf("****7.sort 0.exit ****\n");
printf("**************************\n");
}
void test()
{
int input = 0;
//创建通讯录
Contact con;
//初始化通讯录
Init_Contact(&con);
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case ADD:
add_infor(&con);
break;
case DEL:
del_infor(&con);
break;
case SEARCH:
search_infor(&con);
break;
case MODIFY:
modify_infor(&con);
break;
case SHOW:
show_all_infor(&con);
break;
case DELALL:
del_all_infor(&con);
break;
case SORT:
sort_name_infor(&con);
break;
case EXIT:
Save_proinfor(&con);
Destroy_Contact(&con);
printf("退出通讯录\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
2. contact.h
#pragma once
#include
#include
#include
#include
#define Max 1000
#define Max_name 20
#define Max_sex 5
#define Max_tele 12
#define Max_address 30
enum OPTION
{
EXIT,//0
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
DELALL,
SORT,
};
//创建个人信息结构体(类型声明)
typedef struct proinfor
{
char name[Max_name];
char sex[Max_sex];
int age;
char tele[Max_tele];
char address[Max_address];
}Proinfor;
//通讯录
typedef struct contact
{
Proinfor* date;//指向个人信息(存放的数据)的空间
int count;//有效元素个数
int Max_count;//通讯录最大容量
}Contact;
//初始化通讯录
void Init_Contact(Contact* con);
//创建添加个人信息的函数
void add_infor(Contact* con);
//创建删除个人信息的函数
void del_infor(Contact* con);
//创建查找个人信息的函数
void search_infor(const Contact* con);
//创建修改个人信息的函数
void modify_infor(Contact* con);
//创建显示所有联系人信息的函数
void show_all_infor(const Contact* con);
//创建清空所有联系人的函数
void del_all_infor(Contact* con);
//创建以名字排序所有联系人的函数
void sort_name_infor(Contact* con);
//销毁通讯录
void Destroy_Contact(Contact* con);
//保存个人信息
void Save_proinfor(Contact* con);
3. contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void Load_Contact(Contact* con)
{
//打开文件
FILE* pc = fopen("contact.date", "rb");
//判断
if (pc==NULL)
{
perror("Load_Contact");
return;
}
//读取文件信息
Proinfor temp;
while (fread(&temp,sizeof(Proinfor),1,pc))
{
if (con->count == con->Max_count)
{
Proinfor* pr = (Proinfor*)realloc(con->date, (con->count + 2) * sizeof(Proinfor));
if (pr == NULL)//增容失败
{
perror("realloc");
return;
}
else//增容成功
{
con->date = pr;
con->Max_count += 2;
}
}
con->date[con->count] = temp;
con->count++;
}
//关闭文件
fclose(pc);
pc = NULL;
}
//初始化函数 通讯录
void Init_Contact(Contact* con)
{
assert(con);
/*con->date = (Proinfor*)malloc(3 * sizeof(Proinfor));
if (con->date == NULL)
{
printf("malloc");
return;
}*/
con->count = 0;
con->Max_count = 3;
Load_Contact(con);
}
//依据姓名查找联系人
int FindbyName(const Contact* con, char name[])
{
int i = 0;
for (i; i < con->count; i++)
{
if (strcmp(con->date[i].name, name) == 0)
{
return i;
}
}
return -1;//要删除的人不存在
}
//函数添加联系人
void add_infor(Contact* con)
{
assert(con);
if (con->count == con->Max_count)
{
Proinfor* pr = (Proinfor*)realloc(con->date, (con->count + 2) * sizeof(Proinfor));
if (pr == NULL)//增容失败
{
perror("realloc");
return;
}
else//增容成功
{
con->date = pr;
con->Max_count += 2;
}
}
printf("请输入名字:");
scanf("%s", con->date[con->count].name);
printf("请输入性别:");
scanf("%s", con->date[con->count].sex);
printf("请输入年龄:");
scanf("%d", &(con->date[con->count].age));
printf("请输入电话:");
scanf("%s", con->date[con->count].tele);
printf("请输入住址:");
scanf("%s", con->date[con->count].address);
con->count++;
printf("联系人添加成功\n");
}
//显示所有联系人
void show_all_infor(const Contact* con)
{
assert(con);
//打印列标题
printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
//打印数据
int i;
for (i = 0; i < con->count; i++)
{
printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
con->date[i].name,
con->date[i].sex,
con->date[i].age,
con->date[i].tele,
con->date[i].address);
}
}
//删除联系人
void del_infor(Contact* con)
{
if (con->count == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
assert(con);//保证con中数据有效
printf("请输入要删除的联系人的名字:");
char name[Max_name];
scanf("%s", &name);
//找要删除的人的下标del
int del = FindbyName(con, name);
if (del == -1)
{
printf("要删除的联系人不存在\n");
return;
}
//删除下标为del的人的信息
int i;
for (i = del; i < con->count - 1; i++)
{
con->date[i] = con->date[i + 1];
}
con->count--;
printf("成功删除联系人\n");
}
//查找个人信息
void search_infor(const Contact* con)
{
assert(con);
char name[Max_name];
printf("请输入要查找的联系人姓名:");
scanf("%s", &name);
int possion = FindbyName(con, name);
if (possion == -1)
{
printf("要查找的联系人不存在\n");
}
else
{
printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
con->date[possion].name,
con->date[possion].sex,
con->date[possion].age,
con->date[possion].tele,
con->date[possion].address);
}
return;
}
//修改指定联系人的信息
void modify_infor(Contact* con)
{
assert(con);
char name[Max_name];
printf("请输入要修改的联系人姓名:");
scanf("%s", &name);
int modify = FindbyName(con, name);
if (modify == -1)
{
printf("要修改的联系人不存在\n");
}
else
{
printf("请输入名字:");
scanf("%s", con->date[modify].name);
printf("请输入性别:");
scanf("%s", con->date[modify].sex);
printf("请输入年龄:");
scanf("%d", &(con->date[modify].age));
printf("请输入电话:");
scanf("%s", con->date[modify].tele);
printf("请输入住址:");
scanf("%s", con->date[modify].address);
printf("修改成功\n");
}
return;
}
//删除所有联系人
void del_all_infor(Contact* con)
{
int i;
for (i = 0; i < con->count - 1; i++)
{
con->date[i] = con->date[i + 1];
}
con->count--;
printf("成功删除联系人\n");
}
//依据名字给所有联系人排序
void sort_name_infor(Contact* con)
{
if (con->count <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
int i = 0;
int j = 0;
for (i = 0; i < con->count - 1; i++)
{
for (j = i + 1; j < con->count; j++)
{
if (strcmp(con->date[j].name, (con->date[j + 1]).name) == 1)
{
Proinfor tmp;
tmp = con->date[j];
con->date[j] = con->date[j + 1];
con->date[j + 1] = tmp;
}
}
printf("排序成功!\n");
}
}
//销毁通讯录
void Destroy_Contact(Contact* con)
{
free(con->date);
con->date = NULL;
con->count = 0;
con->Max_count = 0;
}
//保存通讯录中的个人信息
void Save_proinfor(Contact* con)
{
//打开文件(不存在自动建一个)
FILE* pc = fopen("contact.date", "wb");
//判断
if (pc==NULL)
{
perror("Save_proinfor");
return;
}
//写数据
int i;
for ( i = 0; i < con->count; i++)
{
fwrite(con->date, sizeof(Proinfor), 1, pc);
}
//关闭文件
fclose(pc);
pc = NULL;
}