通讯录分为三个文件:
test.c -- 测试通讯录
contact.h -- 函数和类型的声明
contact.c -- 函数的实现
1. test.c
test.c中主要写的是界面函数和测试函数。
界面函数 :
//界面
void menu()
{
printf("*********************************\n");
printf("*******1.add 2.del ******\n");
printf("*******3.search 4.modif ******\n");
printf("*******5.show 6.sort ******\n");
printf("*******0.exit ******\n");
}
测试函数:
//测试通讯录
void test()
{
int input = 0;
contact con;
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
//增加
AddContact(&con);
break;
case DEL:
//删除
DelContact(&con);
break;
case SEARCH:
//查找
SearchContact(&con);
break;
case MODIF:
//修改
ModifContact(&con);
break;
case SHOW:
//显示
ShowContact(&con);
break;
case SORT:
//排序
//......
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
}
完整的test.c:
#include"contact.h"
//界面
void menu()
{
printf("*********************************\n");
printf("*******1.add 2.del ******\n");
printf("*******3.search 4.modif ******\n");
printf("*******5.show 6.sort ******\n");
printf("*******0.exit ******\n");
}
//测试通讯录
void test()
{
int input = 0;
contact con;
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
//增加
AddContact(&con);
break;
case DEL:
//删除
DelContact(&con);
break;
case SEARCH:
//查找
SearchContact(&con);
break;
case MODIF:
//修改
ModifContact(&con);
break;
case SHOW:
//显示
ShowContact(&con);
break;
case SORT:
//排序
//......
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
2. contact.h
contact.h中主要写的是函数和类型的声明
类型声明:
注意contact.h是我们自定义的文件名,在test.c和contact.c中要包含一下:
包含自定义的头文件时,用双引号。
要实现一个通讯录,首先要有人的信息:姓名、年龄、性别、电话、住址等。
那我们就可以创建一个包含人的所有信息的结构体类型,并对其重命名为PeoInfo:
//人物信息
typedef struct PeoInfo
{
char name[NAME];
int age;
char sex[SEX];
char phone[PHONE];
char addr[ADDR];
}PeoInfo;
以上只是一个人的信息,但是我们要录入的不止一个人,此时就可以再创建一个通讯录的结构体类型并重命名为contact:
//通讯录
typedef struct contact
{
PeoInfo data[MAX];
int sz;
}contact;
其中data是存放通讯录中所有人的信息的数组,sz用来计数。
上述出现的所有数组的大小,我们可以对它们用#define定义:
#define NAME 20
#define SEX 5
#define PHONE 15
#define ADDR 30
#define MAX 100
函数声明:
要实现一个通讯录,需要具有以下功能:
1. 增加联系人
2. 删除联系人
3. 修改联系人
4. 查找联系人
5. 显示所有联系人的信息
6. 排序功能
不同的功能,可以封装为不同的函数,函数声明在contact.h,函数实现在contact.c
//函数声明
//初始化通讯录
void InitContact(contact* pc);
//增加联系人
void AddContact(contact* pc);
//显示所有联系人
void ShowContact(const contact* pc);
//删除指定联系人
void DelContact(contact* pc);
//查找指定联系人
void SearchContact(contact* pc);
//修改指定联系人
void ModifContact(contact* pc);
函数功能我们也可以使用枚举类型:
enum OPTION
{
EXIT,
ADD,
DEL,
SEARCH,
MODIF,
SHOW,
SORT
};
完整的contact.h:
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define NAME 20
#define SEX 5
#define PHONE 15
#define ADDR 30
#define MAX 100
enum OPTION
{
EXIT,
ADD,
DEL,
SEARCH,
MODIF,
SHOW,
SORT
};
//人物信息
typedef struct PeoInfo
{
char name[NAME];
int age;
char sex[SEX];
char phone[PHONE];
char addr[ADDR];
}PeoInfo;
//通讯录
typedef struct contact
{
PeoInfo data[MAX];
int sz;
}contact;
//函数声明
//初始化通讯录
void InitContact(contact* pc);
//增加联系人
void AddContact(contact* pc);
//显示所有联系人
void ShowContact(const contact* pc);
//删除指定联系人
void DelContact(contact* pc);
//查找指定联系人
void SearchContact(contact* pc);
//修改指定联系人
void ModifContact(contact* pc);
3. contact.c
做好了以上准备,下面我们就可以在test.c中的test()函数中,定义结构体变量:
contact con;//定义结构体变量
InitContact(&con);//初始化通讯录
初始化通讯录:
//初始化通讯录
void InitContact(contact* pc)
{
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
}
增加联系人:
//增加联系人
void AddContact(contact* pc)
{
assert(pc);
if (pc->sz == MAX)
{
printf("通讯录已满,无法添加\n");
return;
}
printf("请输入姓名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].phone);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
显示联系人:
//显示联系人
void ShowContact(const contact*pc)
{
assert(pc);
//打印列标题
printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址");
//打印数据
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].phone,
pc->data[i].addr);
}
}
由于不论是删除、查找,还是修改联系人,首先要做的都是先找到联系人,所以我们不妨写个查找函数,后面要用的时候直接调用它就行。
查找函数:
//查找函数
static int Find_by_name(const contact* pc, char del_name[])
{
int i = 0;
int del = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(del_name, pc->data[i].name) == 0)
{
return i;
}
}
return -1;
}
删除联系人:
//删除联系人
void DelContact(contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
assert(pc);
char del_name[NAME] = { 0 };
printf("请输入姓名:>");
scanf("%s", &del_name);
//找到要删除的人
int del = Find_by_name(pc, del_name);
if (del == -1)
{
printf("要删除的人不存在\n");
return;
}
//删除
int i = 0;
for (i = del; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功删除联系人\n");
}
查找联系人:
//查找联系人
void SearchContact(contact* pc)
{
char find_name[NAME] = { 0 };
printf("请输入要查找人的姓名:>");
scanf("%s", &find_name);
int pos = Find_by_name(pc, find_name);
if (pos == -1)
{
printf("要查找的人不存在\n");
}
else
{
//打印列标题
printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址");
//打印数据
int i = 0;
printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].phone,
pc->data[pos].addr);
}
}
修改联系人:
//修改联系人
void ModifContact(contact* pc)
{
char mod_name[NAME];
printf("请输入要修改的人的姓名:>");
scanf("%s", &mod_name);
int pos = Find_by_name(pc, mod_name);
if (pos == -1)
{
printf("要修改的联系人不存在\n");
}
else
{
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].phone);
printf("请输入地址:>");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
}
排序功能我们之前的章节讲过,这里不再赘述。下面附上contact.c的完整代码:
完整的contact.c:
#include"contact.h"
//初始化通讯录
void InitContact(contact* pc)
{
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
}
//增加联系人
void AddContact(contact* pc)
{
assert(pc);
if (pc->sz == MAX)
{
printf("通讯录已满,无法添加\n");
return;
}
printf("请输入姓名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].phone);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
//显示联系人
void ShowContact(const contact*pc)
{
assert(pc);
//打印列标题
printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址");
//打印数据
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].phone,
pc->data[i].addr);
}
}
//查找函数
static int Find_by_name(const contact* pc, char del_name[])
{
int i = 0;
int del = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(del_name, pc->data[i].name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人
void DelContact(contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
assert(pc);
char del_name[NAME] = { 0 };
printf("请输入姓名:>");
scanf("%s", &del_name);
//找到要删除的人
int del = Find_by_name(pc, del_name);
if (del == -1)
{
printf("要删除的人不存在\n");
return;
}
//删除
int i = 0;
for (i = del; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功删除联系人\n");
}
//查找联系人
void SearchContact(contact* pc)
{
char find_name[NAME] = { 0 };
printf("请输入要查找人的姓名:>");
scanf("%s", &find_name);
int pos = Find_by_name(pc, find_name);
if (pos == -1)
{
printf("要查找的人不存在\n");
}
else
{
//打印列标题
printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址");
//打印数据
int i = 0;
printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].phone,
pc->data[pos].addr);
}
}
//修改联系人
void ModifContact(contact* pc)
{
char mod_name[NAME];
printf("请输入要修改的人的姓名:>");
scanf("%s", &mod_name);
int pos = Find_by_name(pc, mod_name);
if (pos == -1)
{
printf("要修改的联系人不存在\n");
}
else
{
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].phone);
printf("请输入地址:>");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
}