文章目录
- Ⅰ 系统功能介绍
- Ⅱ 系统前期准备
- ⒈菜单功能
- ⒉结构体设计
- ⒊通讯录初始化
- Ⅲ 系统功能实现
- ⒈添加联系人
- ⒉删除联系人
- ⒊查找联系人
- ⒋修改联系人
- ⒌显示联系人
- ⒍排序联系人
- ⒎清空联系人
- Ⅳ 完整代码展示
- ⒈test.c
- ⒉contact.h
- ⒊contact.c
Ⅰ 系统功能介绍
系统中需要实现的功能如下
- 添加联系人:向通讯录中添加新人。
- 信息包括(姓名、年龄、性别、电话、住址)最多能添加 100 人。
- 删除联系人:按照姓名删除指定联系人信息。
- 查找联系人:按照姓名查看指定联系人信息。
- 修改联系人:按照姓名修改指定联系人信息。
- 显示联系人:显示当前通讯录中所有联系人的信息。
- 排序联系人:将联系人按照指定方式排序。
- 清空联系人:清空通讯录中的所有信息。
- 说白了就是将通讯录中得所有内容初始化为全 0.
- 退出通讯录:退出当前所使用的通讯录。
Ⅱ 系统前期准备
⒈菜单功能
- 提示用户有哪些功能选项。
void menu()
{printf("|------------------------|\n");printf("|***** 1.添加联系人 *****|\n");printf("|***** 2.删除联系人 *****|\n");printf("|***** 3.查找联系人 *****|\n");printf("|***** 4.修改联系人 *****|\n");printf("|***** 5.显示联系人 *****|\n");printf("|***** 6.排序联系人 *****|\n");printf("|***** 7.清空联系人 *****|\n");printf("|***** 0.退出通讯录 *****|\n");printf("|------------------------|\n");
}
⒉结构体设计
- 像联系人这种有如此多属性的描述对象,不用犹豫直接用结构体将它定义为一个联系人类型。
1. 设计联系人类型
#define MAX 100 //联系人数组最大容量
#define MAX_NAME 20 //姓名成员的最大范围
#define MAX_SEX 10 //性别成员的最大范围
#define MAX_TELE 12 //电话成员的最大范围
#define MAX_ADDR 30 //住址成员的最大范围typedef struct PeoInfo //存储联系人的信息
{char name[MAX_NAME]; //姓名int age; //年龄char sex[MAX_SEX]; //性别char tele[MAX_TELE]; //电话char addr[MAX_ADDR]; //住址
}PeoInfo; //PeoInfo 为自定义联系人类型
- 再次重申:自定义的这个联系人类型他就是个类型,和 int、char 等其他类型没什么区别。.
2. 设计通讯录类型
- 当前构建的通讯录需要存放 100 个联系人的信息,即构建一个拥有 100 个元素的联系人数组(通讯录)即可。
- 在构建联系人数组(通讯录)时,还需要创建一个变量用来记录当前存储的联系人个数。
- 不妨直接将(联系人数组和计数器)都归并到一个通讯录类型。
typedef struct Contact //存储通讯录两个信息
{PeoInfo data[MAX]; //能存储 100 个联系人的联系人数组 (通讯录)int count; //记录通讯录当前有几个人的信息
}Contact; //自定义的通讯录类型
⒊通讯录初始化
- 将通讯录的内的值全部初始化为 0。
- 这一步非常关键,否则无法添加联系人信息。
- 初始化通讯录就是清空通讯录。
代码实现
void empty_contact(Contact* pc) //清空通讯录(初始化通讯录)
{//将联系人数组(通讯录)内的所有信息初始化为 0assert(pc);pc->count = 0;memset(pc->data, 0, sizeof(pc->data));
}
Ⅲ 系统功能实现
⒈添加联系人
- 增加联系人无非就是将信息添加到 con 里去,此时会修改 con 的值,所以需要传 con 的地址。
代码实现
void add_contact(Contact* pc) //添加联系人
{assert(pc);if (MAX == pc->count) //联系人数组存满了{printf("通讯录空间不足,无法录入\n");return;}printf("请输入姓名:");scanf("%s", pc->data[pc->count].name); //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++; //当前通讯录内联系人个数 + 1printf("录入成功\n");system("pause"); //按任意键继续system("cls"); //清屏
}
⒉删除联系人
实现思路
- 想要删除联系人首先就需要先找到这个联系人。
- 所以此模块需要写两个函数。
- 找到指定联系人的下标。
- 删除指定联系人。
找到指定联系人
- 该功能在(删除、查找、修改)联系人时都会用到。
int find_by_name(const Contact* pc, char name[])
{//该函数在(删除、查找、修改)时需要使用assert(pc);for (int i = 0; i < pc->count; i++){if (!strcmp(pc->data[i].name, name)){return i; //找到了就返回对应该联系人的对应下标}}return -1; //找不到指定联系人就返回 -1
}
删除指定联系人
- 将指定联系人后面的联系人在联系人数组中都往前挪一位即可。
void delete_contact(Contact* pc) //删除联系人
{assert(pc);if (0 == pc->count) //通讯录内得有元素可删{printf("通讯录为空\n");system("pause");system("cls");return;}int i = 0;char name[MAX_NAME] = { 0 };printf("请输入要删除的联系人:");scanf("%s", name);int pos = find_by_name(pc, name); //1.找到指定联系人的下标if (-1 == pos){printf("没有指定联系人\n");system("pause");system("cls");return;}for (i = pos; i < pc->count - 1; i++) //2.删除指定联系人 {pc->data[i] = pc->data[i + 1];} pc->count--; //通讯录当前人数 - 1printf("删除成功\n");system("pause");system("cls");
}
⒊查找联系人
实现思路
- 根据名字找到指定联系人,然后将指定联系人的所有信息打印出来。
代码实现
void search_contact(const Contact* pc) //查找联系人
{assert(pc);if (0 == pc->count) //通讯录内得先有人可被查找{printf("通讯录为空\n");system("pause");system("cls");return;}char name[MAX_NAME] = { 0 };printf("请输入要查找的联系人:");scanf("%s", name);int pos = find_by_name(pc,name); //找到指定联系人的位置if (-1 == pos){printf("没有指定联系人\n");system("pause");system("cls");return;}printf("姓名\t年龄\t性别\t电话\t住址\n");printf("%s\t%d\t%s\t%s\t%s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);system("pause");system("cls");
}
⒋修改联系人
实现思路
- 找到指定联系人的位置,然后将指定联系人的信息全部重新录入。
代码实现
void modif_contact(Contact* pc) //修改联系人
{assert(pc);if (0 == pc->count) //通讯录内得先有人可被修改{printf("通讯录为空\n");system("pause");system("cls");return;}char name[MAX_NAME] = { 0 };printf("请输入要修改的联系人:");scanf("%s", name);int pos = find_by_name(pc, name); //找到指定联系人的位置if (-1 == pos) //找不到联系人就结束掉函数{printf("没有指定联系人\n");system("pause");system("cls");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");system("pause");system("cls");
}
⒌显示联系人
实现思路
- 将联系人数组的内容从下标 0 的位置一直遍历到下标为 count 的位置。
- 打印联系人数组内的联系人的全部信息。
代码实现
void show_contact(const Contact* pc) //显示联系人
{assert(pc);if (0 == pc->count) //通讯录内得先由东西可以展示{printf("通讯录为空\n");system("pause"); //按任意键继续system("cls"); //清屏return;}int i = 0;printf("姓名\t年龄\t性别\t电话\t住址\n");for (i = 0; i < pc->count; i++){printf("%s\t%d\t%s\t%s\t%s\n", pc->data[i].name,pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}system("pause");system("cls");
}
⒍排序联系人
- 可选择的排序方式有很多中,这里就选择按照名字的方式来排序。
- 使用 qsort 函数来实现通讯录的排序。
比较函数
- 这里就选择按照名字来比较了。
int cmp_by_name(const void* e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
排序函数
void soft_contact(Contact* pc) //排序联系人
{assert(pc);if (0 == pc->count) //通讯录内得先有人可被排序{printf("通讯录为空\n");system("pause");system("cls");return;}qsort(pc->data, pc->count, sizeof(pc->data[0]), cmp_by_name);printf("排序成功\n");system("pause");system("cls");
}
⒎清空联系人
- 将通讯录数组里面的信息全部初始化为 0 即可。
- 说白了就是写一个初始化函数。
void empty_contact(Contact* pc) //清空联系人
{assert(pc);if (0 == pc->count) //通讯录内得先有人可被清空{printf("通讯录已为空\n");system("pause");system("cls");return;}pc->count = 0;memset(pc->data, 0, sizeof(pc->data));system("pause"); //按任意键继续system("cls"); //清屏
}
Ⅳ 完整代码展示
⒈test.c
#include "contact.h"void menu()
{printf("|------------------------|\n");printf("|***** 1.添加联系人 *****|\n");printf("|***** 2.删除联系人 *****|\n");printf("|***** 3.查找联系人 *****|\n");printf("|***** 4.修改联系人 *****|\n");printf("|***** 5.显示联系人 *****|\n");printf("|***** 6.排序联系人 *****|\n");printf("|***** 7.清空联系人 *****|\n");printf("|***** 0.退出通讯录 *****|\n");printf("|------------------------|\n");
}int main()
{int input = 0;Contact con; //通讯录init_contact(&con); //初始化通讯录do {menu();printf("请选择要进行的操作:");scanf("%d", &input);switch (input){case 1:add_contact(&con); break;case 2:delete_contact(&con); break;case 3:search_contact(&con); break;case 4:modif_contact(&con); break;case 5:show_contact(&con); break;case 6:soft_contact(&con); break;case 7:empty_contact(&con); break;case 0:printf("已退出通讯录\n"); break;default:printf("选择错误,请重新输入\n"); break;}} while (input);return 0;
}
⒉contact.h
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>#define MAX 100 //联系人数组最大容量
#define MAX_NAME 20 //姓名成员的最大范围
#define MAX_SEX 10 //性别成员的最大范围
#define MAX_TELE 12 //电话成员的最大范围
#define MAX_ADDR 30 //住址成员的最大范围typedef struct PeoInfo //自定义的联系人类型
{char name[MAX_NAME]; //姓名int age; //年龄char sex[MAX_SEX]; //性别char tele[MAX_TELE]; //电话char addr[MAX_ADDR]; //住址
}PeoInfo; typedef struct Contact //存储通讯录两个信息
{PeoInfo data[MAX]; //能存储 100 个联系人信息的联系人数组 (通讯录)int count; //记录通讯录当前有几个人的信息
}Contact; //自定义的通讯录类型void init_contact(Contact* pc); //初始化通讯录void add_contact(Contact* pc); //添加联系人void delete_contact(Contact* pc); //删除联系人void show_contact(const Contact* pc); //显示联系人void search_contact(const Contact* pc); //查找联系人void modif_contact(Contact* pc); //修改联系人void soft_contact(Contact* pc); //排序联系人void empty_contact(Contact* pc); //清空联系人
⒊contact.c
#include "contact.h"//初始化通讯录
void init_contact(Contact* pc)
{//将联系人数组(通讯录)内的所有信息初始化为 0assert(pc);pc->count = 0;memset(pc->data, 0, sizeof(pc->data));
}//添加联系人
void add_contact(Contact* pc)
{assert(pc);if (MAX == pc->count) //联系人数组存满了{printf("通讯录空间不足,无法录入\n");system("pause");system("cls");return;}printf("请输入姓名:");scanf("%s", pc->data[pc->count].name); //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++; //当前通讯录内联系人个数 + 1printf("录入成功\n");system("pause"); //按任意键继续system("cls"); //清屏
}//显示联系人
void show_contact(const Contact* pc)
{assert(pc);if (0 == pc->count) //通讯录内得先由东西可以展示{printf("通讯录为空\n");system("pause");system("cls");return;}int i = 0;printf("姓名\t年龄\t性别\t电话\t住址\n");for (i = 0; i < pc->count; i++){printf("%s\t%d\t%s\t%s\t%s\n", pc->data[i].name,pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}system("pause"); //按任意键继续system("cls"); //清屏
}//寻找指定联系人的位置
int find_by_name(const Contact* pc, char name[])
{//该函数在(删除、查找、修改)时需要使用assert(pc);for (int i = 0; i < pc->count; i++){if (!strcmp(pc->data[i].name, name)){return i;//找到了就返回对应联系人的数组下标}}return -1;
}//删除联系人
void delete_contact(Contact* pc)
{assert(pc);if (0 == pc->count) //通讯录内得有元素可删{printf("通讯录为空\n");system("pause");system("cls");return;}int i = 0;char name[MAX_NAME] = { 0 };printf("请输入要删除的联系人:");scanf("%s", name);int pos = find_by_name(pc, name); //1.找到指定联系人的下标if (-1 == pos){printf("没有指定联系人\n");system("pause");system("cls");return;}for (i = pos; i < pc->count - 1; i++) //2.删除指定联系人 {pc->data[i] = pc->data[i + 1];} pc->count--; //通讯录当前人数 - 1printf("删除成功\n");system("pause");system("cls");
}//查找联系人
void search_contact(const Contact* pc)
{assert(pc);if (0 == pc->count) //通讯录内得先有人可被查找{printf("通讯录为空\n");system("pause");system("cls");return;}char name[MAX_NAME] = { 0 };printf("请输入要查找的联系人:");scanf("%s", name);int pos = find_by_name(pc,name); //找到指定联系人的位置if (-1 == pos){printf("没有指定联系人\n");system("pause");system("cls");return;}printf("姓名\t年龄\t性别\t电话\t住址\n");printf("%s\t%d\t%s\t%s\t%s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);system("pause");system("cls");
}//修改联系人
void modif_contact(Contact* pc)
{assert(pc);if (0 == pc->count) //通讯录内得先有人可被修改{printf("通讯录为空\n");system("pause");system("cls");return;}char name[MAX_NAME] = { 0 };printf("请输入要修改的联系人:");scanf("%s", name);int pos = find_by_name(pc, name); //找到指定联系人的位置if (-1 == pos) //找不到联系人就结束掉函数{printf("没有指定联系人\n");system("pause");system("cls");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");system("pause");system("cls");
}int cmp_by_name(const void* e1, const void* e2)
{//按照名字来比较return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}//排序联系人
void soft_contact(Contact* pc)
{assert(pc);if (0 == pc->count) //通讯录内得先有人可被排序{printf("通讯录为空\n");system("pause");system("cls");return;}qsort(pc->data, pc->count, sizeof(pc->data[0]), cmp_by_name);printf("排序成功\n");system("pause");system("cls");
}//清空联系人
void empty_contact(Contact* pc)
{assert(pc);if (0 == pc->count) //通讯录内得先有人可被清空{printf("通讯录已为空\n");system("pause");system("cls");return;}pc->count = 0;memset(pc->data, 0, sizeof(pc->data));system("pause"); //按任意键继续system("cls"); //清屏
}