目录
实现思路
开始实现
添加增加联系人功能
添加显示联系人信息的功能
添加删除联系人功能
添加查找指定联系人的功能
添加修改指定联系人的功能
测试
代码
Test.c
Contact.c
Contact.h
实现思路
1.通讯录中保存人的信息:名字、年龄、性别、电话、住址
2.通讯录的功能:
- 通讯录可以存放100个人的信息
- 增加联系人
- 删除指定联系人
- 修改指定联系人
- 查找指定联系人
- 显示所有联系人的信息
- 排序功能
实现以上思路,我们需要创建3个文件
- test.c - 测试通讯录
- contact.h - 函数和类型的声明
- contact.c - 函数的实现
我们可以以结构体的形式设计保存每个人的信息
struct PeoInfo
{
//....
}
当通讯录需要存放100个人的信息时,我们可以以数组形式存放这些结构体
开始实现
创建3个文件
在头文件Contact.h进行类型的声明
代码
#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" 引用自己的头文件)
代码
#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
#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
#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
#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,//0ADD,//1DEL,//2SEARCH,//3MODIFY,//4SHOW,//5SORT//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);