前言
实现一个通讯录;
通讯录可以用来存储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;
}
}
}