欢迎来到 Claffic 的博客 💞💞💞
前言:
通讯录想必大家熟知,主要功能就是保存用户的信息,这期博客跟着我用 C语言 写一个简单的通讯录,其逻辑类似于往期的猜数字游戏,让我们开始吧 。
通讯录的要求:
1.能录入联系人的信息:姓名+年龄+性别+地址+电话号码;
2.最多存放 100 个人的信息;
3.其他功能:
⑴ 增加联系人
⑵ 删除指定联系人
⑶ 查找指定联系人信息
⑷ 修改指定联系人信息
⑸ 展示所有联系人信息
⑹ 排序
按照惯例,先进行代码分块:
test.c --- 测试通讯录(main函数所在)
contact.c --- 通讯录实现
contact.h --- 函数声明
1.整体框架
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("***************************\n");
printf("** 1.Add 2.Delete **\n");
printf("** 3.Search 4.Modify **\n");
printf("** 5.Show 6.Sort **\n");
printf("** 0.Exit **\n");
printf("***************************\n");
}
int main()
{
int input = 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:
printf("已退出通讯录\n");
break;
}
} while (input);
return 0;
}
是不是很熟悉呀?
没错,框架与往期 猜数字游戏,三子棋游戏 极其类似。
2.创建通讯录
一个通讯录包含联系人信息和已包含的联系人个数,这可以作为一个结构体:
//contact.h
typedef struct Contact
{
PeoInform data[100];//存放的联系人
int sz;//当前已经存放的联系人个数
}Contact;
联系人需要 姓名+年龄+性别+地址+电话号码 的参数,那我们又可以把它作为一个结构体;
//contact.h
typedef struct PeoInform
{
char name[20];
int age;
char sex[5];
char addr[30];
char tele[12];
}PeoInform;
3.通讯录的初始化
封装一个初始化函数:
//test.c
Init_Contact(&con); //传地址,防止占用过大内存
用 memset 函数进行初始化:
//contact.c
void Init_Contact(Contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
}
4.添加联系人
上来先要判断成员是否填满:
接下来就是提示和输入了。
//contact.c
void Add_Contact(Contact* pc)
{
if (pc->sz == 100)
{
printf("联系人已满,无法添加\n");
}
else
{
printf("请输入名字:>\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄:>\n");
scanf("%d", &(pc->data[pc->sz].age));//因成员age是整型,所以需要取地址。
printf("请输入性别:>\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入地址:>\n");
scanf("%s", pc->data[pc->sz].addr);
printf("请输入电话:>\n");
scanf("%s", pc->data[pc->sz].tele);
pc->sz++;
}
}
5.查找联系人
我们按照名字查找联系人,
用名称查找函数接收返回值并进行判断,
若找不到,直接返回并提示,
若能找到,打印出找到的联系人信息。
//contact.c
void Search_Contact(const Contact* pc)
{
assert(pc);
char name[100] = { 0 };
printf("请输入要查找联系人的姓名:>");
scanf("%s", name);
int pos = Sear_Byname(pc, name);
if (-1 == pos)
{
printf("未找到该联系人\n");
return;
}
printf("%-10s\t%-4d\t%-5s\t%-20s\t-12%s\n", pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].addr,
pc->data[pos].tele);
}
切记,判断字符串是否相等要用 strcmp 函数。
int Sear_Byname(const Contact* pc, char name[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
else
return -1;
}
}
6.展示所有联系人
存放了联系人,可以看看所有联系人:
//contact.c
void Show_Contact(Contact* pc)
{
assert(pc);
printf("%-10s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].addr,
pc->data[i].tele);
}
}
打印的时候,可以在 % 与 s(或其他) 之间加入固定数值以对齐
(负数左对齐,正数右对齐)
7.删除联系人
要删除联系人,其实就是要删除的联系人被它之后的联系人覆盖而已;
依次覆盖,用循环来实现:
//contact.c
void Dele_Contact(Contact* pc)
{
assert(pc);
char name[100] = { 0 };
if (pc->sz == 0)
{
printf("通讯录空,无法删除\n");
return;
}
//删除
//找到要删除的人
printf("请输入要删除人的名字:>");
scanf("%s", name);
int ret = Sear_Byname(pc, name);
if (-1 == ret)
{
printf("要删除的人不存在\n");
return;
}
int i = 0;
//删除
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--; //总数减少,莫忘记
printf("删除成功\n");
}
8.修改联系人
这一部分与查找联系人类似
//contact.c
void Modi_Contact(Contact* pc)
{
assert(pc);
char name[100] = { 0 };
printf("请输入要修改人的名字:>");
scanf("%s", name);
int pos = Sear_Byname(pc, name);
if (-1 == pos)
{
printf("要修改的人不存在\n");
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].addr);
printf("请输入电话:>");
scanf("%s", pc->data[pos].tele);
printf("修改完成\n");
}
源码已上传至 我的gitee,
拿走不谢 ~
总结:
静态通讯录的逻辑与之前的小游戏是十分类似的,写到这里,我们会发现,每次重启程序,储存的联系人信息都消失了,这也是取名静态的原因,下一期通讯录会升级为动态通讯录,期待吧 ~
如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦 💗💗💗
关注我 不迷路!!!