前言
实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
目录
一、通讯录菜单
首先我们要设计一个简易菜单来完成交互
编辑
代码实现
void Menu() { printf("****************通 讯 录****************\n"); printf("* [1] Add [2] Del *\n"); printf("* [3] Find [4] Modify *\n"); printf("* [5] Show [6] Clear *\n"); printf("* [7] Sort [0] Quit *\n"); printf("****************************************\n"); }
二、枚举主函数内部选项
我们采用枚举对主函数菜单的选择进行设置
enum { QUIT, ADD, DEL, FIND, MODIFY, SHOW, CLEAR, SORT };
三、通讯录主函数
我们通过上面枚举,用switch分支来实现菜单选择。
代码实现
void main() { Contact cont; InitContact(&cont); int select = 1; while (select) { Menu(); printf("请选择:>"); scanf("%d", &select); if (select == QUIT) break; switch (select) { case ADD: AddContact(&cont); break; case DEL: DelContact(&cont); break; case FIND: FindContact(&cont); break; case MODIFY: ModifyContact(&cont); break; case SHOW: ShowContact(&cont); break; case CLEAR: ClearContact(&cont); break; case SORT: SortContact(&cont); //qsort break; } } }
四、定义联系人及通讯录
这里是为了实现题目要求,要使用自定义结构体(struct)
1.定义联系人
代码实现
typedef struct PersonInfo { char name[MAX_NAME_SIZE]; char sex[MAX_SEX_SIZE]; int age; char tel[MAX_TEL_SIZE]; char address[MAX_ADDR_SIZE]; }PersonInfo;
2.定义通讯录
代码实现
typedef struct Contact { PersonInfo cont[MAX_CONTACT_SIZE]; size_t capacity; size_t size; }Contact;
五、声明全局变量
这里是对上面结构体内部信息的声明
代码实现
#define MAX_NAME_SIZE 10 #define MAX_SEX_SIZE 3 #define MAX_TEL_SIZE 12 #define MAX_ADDR_SIZE 128 #define MAX_CONTACT_SIZE 8
六、初始化通讯录
代码实现
void InitContact(Contact *pcont) { assert(pcont != NULL); memset(pcont->cont, 0, sizeof(PersonInfo)* MAX_CONTACT_SIZE); pcont->capacity = MAX_CONTACT_SIZE; pcont->size = 0; }
七、通讯录功能实现
1.增加联系人
编辑
代码实现
void AddContact(Contact *pcont) { assert(pcont != NULL); if (IsFullContact(pcont)) { printf("通讯录空间已满,不能新增信息.....\n"); return; } printf("姓名:>"); scanf("%s", pcont->cont[pcont->size].name); printf("性别:>"); scanf("%s", pcont->cont[pcont->size].sex); printf("年龄:>"); scanf("%d", &pcont->cont[pcont->size].age); printf("电话:>"); scanf("%s", pcont->cont[pcont->size].tel); printf("住址:>"); scanf("%s", pcont->cont[pcont->size].address); pcont->size++; printf("增加完成.......\n"); }
2.删除联系人
编辑
代码实现
void DelContact(Contact *pcont) { assert(pcont != NULL); printf("请输入要删除的名字:>"); char name[MAX_NAME_SIZE] = { 0 }; scanf("%s", name); int i; for (i = 0; i<pcont->size; ++i) { if (strcmp(name, pcont->cont[i].name) == 0) break; } if (i >= pcont->size) { printf("要删除的信息不存在.....\n"); return; } for (int k = i; k<pcont->size - 1; ++k) pcont->cont[k] = pcont->cont[k + 1]; pcont->size--; printf("删除完成.......\n"); }
3.查找联系人
编辑
代码实现
int FindContact(Contact *pcont) { assert(pcont != NULL); printf("请输入要查找的姓名:>"); char name[MAX_NAME_SIZE] = { 0 }; scanf("%s", name); printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址"); for (int i = 0; i<pcont->size; ++i) { if (strcmp(name, pcont->cont[i].name) == 0) { printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name, pcont->cont[i].sex, pcont->cont[i].age, pcont->cont[i].tel, pcont->cont[i].address); return i; } } return -1; }
4.修改联系人
编辑
代码实现
void ModifyContact(Contact *pcont) { assert(pcont != NULL); printf("请输入要修改的名字:>"); char name[MAX_NAME_SIZE] = { 0 }; scanf("%s", name); int i; for (i = 0; i<pcont->size; ++i) { if (strcmp(name, pcont->cont[i].name) == 0) break; } if (i >= pcont->size) { printf("要修改的信息不存在.....\n"); return; } printf("你想修改什么信息(1-姓名 2-性别 3-年龄 4-电话 5-住址)\n"); int select; scanf("%d", &select); if (select == 1) { printf("请输入要修改姓名:>"); scanf("%s", pcont->cont[i].name); } else if (select == 2) { printf("请输入要修改性别:>"); scanf("%s", pcont->cont[i].sex); } else if (select == 3) { printf("请输入要修改年龄:>"); scanf("%d", &pcont->cont[i].age); } else if (select == 4) { printf("请输入要修改电话:>"); scanf("%s", pcont->cont[i].tel); } else if (select == 5) { printf("请输入要修改地址:>"); scanf("%s", pcont->cont[i].address); } printf("修改完成.......\n"); }
5.显示联系人
编辑
代码实现
void ShowContact(Contact *pcont) { assert(pcont != NULL); printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址"); for (int i = 0; i<pcont->size; ++i) { printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name, pcont->cont[i].sex, pcont->cont[i].age, pcont->cont[i].tel, pcont->cont[i].address); } }
6.清除联系人
编辑
代码实现
void ClearContact(Contact *pcont) { assert(pcont != NULL); pcont->size = 0; printf("清除完成.......\n");
7.排序联系人
编辑
代码实现
void SortContact(Contact *pcont) { assert(pcont != NULL); for (int i = 0; i<pcont->size - 1; ++i) { for (int j = 0; j<pcont->size - 1 - i; ++j) { if (strcmp(pcont->cont[j].name, pcont->cont[j + 1].name) > 0) { PersonInfo tmp = pcont->cont[j]; pcont->cont[j] = pcont->cont[j + 1]; pcont->cont[j + 1] = tmp; } } } printf("排序完成.......\n"); }
八、完整代码
utili.h
#ifndef _UTILI_H_ #define _UTILI_H_ #include<stdio.h> #include<assert.h> #include<string.h> #include<stdbool.h> #endif /* _UTILI_H_ */
contact.h
#ifndef _CONTACT_H_ #define _CONTACT_H_ #include"utili.h" enum { QUIT, ADD, DEL, FIND, MODIFY, SHOW, CLEAR, SORT }; #define MAX_NAME_SIZE 10 #define MAX_SEX_SIZE 3 #define MAX_TEL_SIZE 12 #define MAX_ADDR_SIZE 128 #define MAX_CONTACT_SIZE 8 //定义通讯录人员信息 typedef struct PersonInfo { char name[MAX_NAME_SIZE]; char sex[MAX_SEX_SIZE]; int age; char tel[MAX_TEL_SIZE]; char address[MAX_ADDR_SIZE]; }PersonInfo; //定义通讯录结构 typedef struct Contact { PersonInfo cont[MAX_CONTACT_SIZE]; size_t capacity; size_t size; }Contact; ///////////////////////////////////////////////////////////// bool IsFullContact(Contact *pcont); void InitContact(Contact *pcont); void AddContact(Contact *pcont); void ShowContact(Contact *pcont); int FindContact(Contact *pcont); void DelContact(Contact *pcont); void ModifyContact(Contact *pcont); void SortContact(Contact *pcont); void ClearContact(Contact *pcont); #endif /* _CONTACT_H_ */
contact.cpp
#include"contact.h" void InitContact(Contact *pcont) { assert(pcont != NULL); memset(pcont->cont, 0, sizeof(PersonInfo)* MAX_CONTACT_SIZE); pcont->capacity = MAX_CONTACT_SIZE; pcont->size = 0; } bool IsFullContact(Contact *pcont) { assert(pcont != NULL); return pcont->size >= pcont->capacity; } void AddContact(Contact *pcont) { assert(pcont != NULL); if (IsFullContact(pcont)) { printf("通讯录空间已满,不能新增信息.....\n"); return; } printf("姓名:>"); scanf("%s", pcont->cont[pcont->size].name); printf("性别:>"); scanf("%s", pcont->cont[pcont->size].sex); printf("年龄:>"); scanf("%d", &pcont->cont[pcont->size].age); printf("电话:>"); scanf("%s", pcont->cont[pcont->size].tel); printf("住址:>"); scanf("%s", pcont->cont[pcont->size].address); pcont->size++; printf("增加完成.......\n"); } void ShowContact(Contact *pcont) { assert(pcont != NULL); printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址"); for (int i = 0; i<pcont->size; ++i) { printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name, pcont->cont[i].sex, pcont->cont[i].age, pcont->cont[i].tel, pcont->cont[i].address); } } int FindContact(Contact *pcont) { assert(pcont != NULL); printf("请输入要查找的姓名:>"); char name[MAX_NAME_SIZE] = { 0 }; scanf("%s", name); printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址"); for (int i = 0; i<pcont->size; ++i) { if (strcmp(name, pcont->cont[i].name) == 0) { printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name, pcont->cont[i].sex, pcont->cont[i].age, pcont->cont[i].tel, pcont->cont[i].address); return i; } } return -1; } void DelContact(Contact *pcont) { assert(pcont != NULL); printf("请输入要删除的名字:>"); char name[MAX_NAME_SIZE] = { 0 }; scanf("%s", name); int i; for (i = 0; i<pcont->size; ++i) { if (strcmp(name, pcont->cont[i].name) == 0) break; } if (i >= pcont->size) { printf("要删除的信息不存在.....\n"); return; } for (int k = i; k<pcont->size - 1; ++k) pcont->cont[k] = pcont->cont[k + 1]; pcont->size--; printf("删除完成.......\n"); } void ModifyContact(Contact *pcont) { assert(pcont != NULL); printf("请输入要修改的名字:>"); char name[MAX_NAME_SIZE] = { 0 }; scanf("%s", name); int i; for (i = 0; i<pcont->size; ++i) { if (strcmp(name, pcont->cont[i].name) == 0) break; } if (i >= pcont->size) { printf("要修改的信息不存在.....\n"); return; } printf("你想修改什么信息(1-姓名 2-性别 3-年龄 4-电话 5-住址)\n"); int select; scanf("%d", &select); if (select == 1) { printf("请输入要修改姓名:>"); scanf("%s", pcont->cont[i].name); } else if (select == 2) { printf("请输入要修改性别:>"); scanf("%s", pcont->cont[i].sex); } else if (select == 3) { printf("请输入要修改年龄:>"); scanf("%d", &pcont->cont[i].age); } else if (select == 4) { printf("请输入要修改电话:>"); scanf("%s", pcont->cont[i].tel); } else if (select == 5) { printf("请输入要修改地址:>"); scanf("%s", pcont->cont[i].address); } printf("修改完成.......\n"); } void SortContact(Contact *pcont) { assert(pcont != NULL); for (int i = 0; i<pcont->size - 1; ++i) { for (int j = 0; j<pcont->size - 1 - i; ++j) { if (strcmp(pcont->cont[j].name, pcont->cont[j + 1].name) > 0) { PersonInfo tmp = pcont->cont[j]; pcont->cont[j] = pcont->cont[j + 1]; pcont->cont[j + 1] = tmp; } } } printf("排序完成.......\n"); } void ClearContact(Contact *pcont) { assert(pcont != NULL); pcont->size = 0; printf("清除完成.......\n"); }
contactMain.cpp
#include"contact.h" void Menu() { printf("****************通 讯 录****************\n"); printf("* [1] Add [2] Del *\n"); printf("* [3] Find [4] Modify *\n"); printf("* [5] Show [6] Clear *\n"); printf("* [7] Sort [0] Quit *\n"); printf("****************************************\n"); } void main() { Contact cont; InitContact(&cont); int select = 1; while (select) { Menu(); printf("请选择:>"); scanf("%d", &select); if (select == QUIT) break; switch (select) { case ADD: AddContact(&cont); break; case DEL: DelContact(&cont); break; case FIND: FindContact(&cont); break; case MODIFY: ModifyContact(&cont); break; case SHOW: ShowContact(&cont); break; case CLEAR: ClearContact(&cont); break; case SORT: SortContact(&cont); //qsort break; } } }