前言:
通讯录想必大家熟知,主要功能就是保存用户的信息,这期博客跟着我用 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"); }
总结:
静态通讯录的逻辑与之前的小游戏是十分类似的,写到这里,我们会发现,每次重启程序,储存的联系人信息都消失了,这也是取名静态的原因,下一期通讯录会升级为动态通讯录,期待吧 ~