目录
实现思路
1.通讯录中保存人的信息:名字、年龄、性别、电话、住址
2.通讯录的功能:
- 通讯录可以存放100个人的信息
- 增加联系人
- 删除指定联系人
- 修改指定联系人
- 查找指定联系人
- 显示所有联系人的信息
- 排序功能
实现以上思路,我们需要创建3个文件
- test.c - 测试通讯录
- contact.h - 函数和类型的声明
- contact.c - 函数的实现
我们可以以结构体的形式设计保存每个人的信息
struct PeoInfo
{
//....
}
当通讯录需要存放100个人的信息时,我们可以以数组形式存放这些结构体
开始实现
创建3个文件
在头文件Contact.h进行类型的声明
代码
cpp
#pragma once
//类型的声明
typedef struct PeoInfo
{
char name[20];
int age;
char sex[5];
char tele[12];
char addr[30];
}PeoInfo;
写出主函数,我们需要在test()中完成我们的整个测试,
我们打印菜单,同时通过do..while()循环,完成功能的选择
(注:记得加上 **#include"Contact.h"**引用自己的头文件)
代码
cpp
#define _CRT_SECURE_N0_WARNINGS 1
#include<stdio.h>
#include"Contact.h"//记得双引号引用自己的头文件
//打印菜单
void menu()
{
printf("*******************************\n");
printf("***** 1.add 2.del ******\n");
printf("***** 3.search 4.modify ******\n");
printf("***** 5.show 6.sort ******\n");
printf("***** 0.exit ******\n");
printf("*******************************\n");
}
void test()
{
int input = 0;
//首先得有通讯录
PeoInfo data[100];
int sz=0;//记录通讯录的人数的增加
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 0:
break;
default:
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
我们对通讯录部分进行整合封装,并初始化
用预处理指令如#define MAX 100让类型声明中的数据可以修改,便于维护
将利用枚举代替数字,更加直观
添加增加联系人功能
添加显示联系人信息的功能
我们现在已经加了两个功能,来运行测试一下
好了,测试成功,我们继续添加功能
添加删除联系人功能
改进:将删除功能中的查询联系人部分封装为函数,后续功能需要查询就可以字节调用这个函数,提高代码复用性。(注:这个函数不需要在头文件声明,因为该函数只需要在内部使用)
添加查找指定联系人的功能
添加修改指定联系人的功能
对于排序功能,排序方式有很多种,比如按姓名排序,按年龄排序等等,可以跟据需求来设计,这里就不一一实现了。
添加退出功能,直接打印退出游戏并跳出。
当选择到非法字符时,打印重新选择,并跳出选择界面。
到这里,一个建议的通讯录就完成了。
让我们来测试一下
测试
测试成功!
下面是这个通讯录程序的实现代码
代码
Test.c
cpp
#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.sort ******\n");
printf("***** 0.exit ******\n");
printf("*******************************\n");
}
void test()
{
int input = 0;
//首先得有通讯录
//PeoInfo data[100];
//int sz = 0;
Contact con;
InitContact(&con);//结构体传参,最好传地址
do
{
menu();
printf("请选择:>");
scanf_s("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
//排序
//按名字排序?
//按年龄排序?
break;
case EXIT:
printf("退出通讯录\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
Contact.c
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void InitContact(Contact* pc)
{
assert(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].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
void ShowContact(const Contact* pc)
{
int i = 0;
//打印列标题
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄","性别", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
//删除联系人功能实现
//常规写法*********
//void DelContact(Contact* pc)
//{
// if (pc->sz == 0)
// {
// printf("通讯录为空,无法删除\n");
// return;
// }
// char name[MAX_NAME] = { 0 };
// assert(pc);
// //删除
// printf("请输入要删除的人的名字:>");
// scanf("%s", name);
//
// //找到要删除的人//遍历
// int i = 0;
// int del = 0;
// int flag = 0;
// for (i = 0; i < pc->sz; i++)
// {
// if (strcmp(pc->data[i].name, name)==0)//strcmp()用于比较两个字符串是否相等,相等返回0
// {
// del = i;
// flag = 1;
// break;
// }
// }
// if (flag == 0)
// {
// printf("要删除的联系人不存在\n");
// return;
// }
//
//
// //删除坐标为del的联系人
// for (i = del; i < pc->sz-1; i++)
// {
// pc->data[i] = pc->data[i + 1];
// }
// pc->sz--;
// printf("成功删除联系人\n");
//}
//****************
//*******************
//封装查询函数
int FindByName(const Contact* pc, char name[])
{
//找到要删除的人//遍历
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)//strcmp()用于比较两个字符串是否相等,相等返回0
{
return i;//找到了
}
}
return -2;//找不到
}
//*****************************
//删除过程中有查询步骤,查询可以单独封装为函数,其他功能也可以使用这个函数
void DelContact(Contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
char name[MAX_NAME] = { 0 };
assert(pc);
//删除
printf("请输入要删除的人的名字:>");
scanf("%s", name);
//找到要删除的人//遍历
int del = FindByName(pc, name);
if (del == 0)
{
printf("要删除的联系人不存在\n");
return;
}
int i = 0;
//删除坐标为del的联系人
for (i = del; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功删除联系人\n");
}
//添加查询指定联系人的功能
void SearchContact(const Contact* pc)
{
assert(pc);
char name[MAX_NAME] = { 0 };
printf("请输入要查找联系人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -2)
printf("要查找的人不存在\n");
else
{
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
//打印数据
printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
}
//修改指定联系人
void ModifyContact(Contact* pc)
{
assert(pc);
char name[MAX_NAME] = { 0 };
printf("请输入要修改人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, 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].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
}
Contact.h
cpp
#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
//枚举 代替数字,更加直观
enum OPTION
{
EXIT,//0
ADD,//1
DEL,//2
SEARCH,//3
MODIFY,//4
SHOW,//5
SORT//6
};
//类型的声明
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[100];
int sz;
}Contact;
//函数声明
//
//初始化通讯录
void InitContact(Contact* pc);
//增加联系人
void AddContact(Contact* pc);
//显示所有联系人的信息
void ShowContact(const Contact* pc);//只打印,不涉及修改信息,所以加const
//删除指定联系人
void DelContact(Contact* pc);
//查找指定联系人
void SearchContact(Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);