前言:生活中处处都会看到或是用到通讯录,今天我们就通过C语言来简单的模拟实现一下通讯录。
鸡汤:跨越山海,终见曙光!
链接:gitee仓库:代码链接
当然了,在模拟实现一个通讯录前我们依然需要一个大致的框架。
- 可以保存至少100人的信息
- 增加人的信息
- 删除指定人的信息
- 查找指定人的信息
- 修改指定联系人的信息
- 排序通讯录的信息(这个等作者以后时间充足了再来实现)
- 显示所有联系人的信息
当然了,既然是实现一个通讯录这样的功能,我们把在写这个功能的时候把它分成三个模块
主函数
话不多说,看代码:
实现一个功能,当然还是从主函数开始写,这个主函数的大体思路我们在之前的三子棋功能中也实现过,想要看的可以点这个链接:[三子棋]
(https://blog.csdn.net/m0_64826370/article/details/132393038?spm=1001.2014.3001.5501/)
创建一个通讯录,我们需要创建联系人的信息,我们可以选择用结构体来存放
//类型的声明 typedef struct PeoInfo { char name[NAME_MAX];//保存姓名 int age; char sex[SEX_MAX];//性别 char tele[TELE_MAX];//电话 char addr[ADDR_MAX];//地址 }PeoInfo; //创建通讯录,将联系人记录下来 typedef struct Contact { PeoInfo* data;//存放数据 int sz;//记录当前通讯录中存在的人的信息个数 int capacity;//记录的是通讯录的当前容量 }Contact;
主函数部分:
#define _CRT_SECURE_NO_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"); } enum Option//使用枚举,增加代码的可读性 { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT }; int main() { int input = 0; Contact con; InitContact(&con);//创建一块通讯录的同时,初始化一块通讯录 do { menu(); printf("请输入你的选择:>"); scanf("%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://排序 //qsort break; case EXIT://退出 DestroyContact(&con);//销毁空间 printf("退出\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }
声明部分
#pragma once #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #define MAX 100 #define DEFAULT_SZ 3 #define DEFAULT_INC 2 //类型的声明 typedef struct PeoInfo { char name[NAME_MAX];//保存姓名 int age; char sex[SEX_MAX];//性别 char tele[TELE_MAX];//电话 char addr[ADDR_MAX];//地址 }PeoInfo; ; //动态 typedef struct Contact { PeoInfo* data;//存放数据 int sz;//记录当前通讯录中存在的人的信息个数 int capacity;//记录的是通讯录的当前容量 }Contact; //初始化通讯录 void InitContact(Contact* pc); //增加联系人 void AddContact(Contact* pc); void DestroyContact(Contact* pc); //显示所有联系人 void ShowContact(Contact* pc); //删除指定联系人 void DelContact(Contact* pc); //查找指定联系人 void SearchContact(Contact* pc); //修改指定联系人 void ModifyContact(Contact* pc); //销毁通讯录 void DestroyContact(Contact* pc);
初始化通讯录
void InitContact(Contact* pc) { assert(pc); pc->sz = 0; pc->capacity = DEFAULT_SZ; pc->data = calloc(pc->capacity, sizeof(PeoInfo));//开辟一个能存放当前容量的空间 if (pc->data == NULL)//判断开辟是否成功 { perror("calloc"); return; } memset(pc->data, 0, sizeof(pc->data));//将开辟的空间全部初始化为0 }
实现扩容的函数
void CheckCapacity(Contact* pc)//给通讯录增容 { if (pc->sz == pc->capacity)//判断是否是需要增容 { PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo));//扩容 if (ptr != NULL)//判断是否增容成功 { pc->data = ptr; pc->capacity += DEFAULT_INC; printf("增容成功\n"); } else { perror("AddContact->realloc"); return; } } }
增加通讯录所需要人
void AddContact(Contact* pc)//增容 { assert(pc); CheckCapacity(pc); //增加信息 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(Contact* pc)//显示通讯录 { assert(pc); if (pc->sz == 0) { printf("通讯录为空,无需打印\n"); return; } int i = 0; //名字 年龄 性别 电话 地址 printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < pc->sz; i++) { //打印每个人信息 printf("%-20s%-5d%-5s%-12s%-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)//删除所需要删除的人 { char name[NAME_MAX]; assert(pc); if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } //找到联系人 printf("输入删除人的名字:"); scanf("%s", name); //找到名字为name的人 int ret = FindByName(pc, name);//找到这个人所在的位置 if (ret == -1) { 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"); }
查找需要找的人
void SearchContact(Contact* pc)//查找人 { assert(pc); char name[NAME_MAX]; printf("输入查找人的名字:"); scanf("%s", name); //找到名字为name的人 int ret = FindByName(pc, name); if (ret == -1) { printf("要查找的人不存在\n"); return; } //显示出来 printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址"); printf("%-20s%-5d%-5s%-12s%-30s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr); }
修改通讯录
void ModifyContact(Contact* pc)//修改通讯录 { assert(pc); char name[NAME_MAX]; printf("输入要修改人的名字:"); scanf("%s", name); //找到名字为name的人 int ret = FindByName(pc, name); if (ret == -1) { printf("要修改的人不存在\n"); return; } //修改 printf("请输入名字:"); scanf("%s", pc->data[ret].name); printf("请输入年龄:"); scanf("%d", &pc->data[ret].age); printf("请输入性别:"); scanf("%s", pc->data[ret].sex); printf("请输入电话:"); scanf("%s", pc->data[ret].tele); printf("请输入地址:"); scanf("%s", pc->data[ret].addr); }
通讯录的实现
#define _CRT_SECURE_NO_WARNINGS #include "contact.h" //动态 void InitContact(Contact* pc) { assert(pc); pc->sz = 0; pc->capacity = DEFAULT_SZ; pc->data = calloc(pc->capacity, sizeof(PeoInfo));//开辟一个能存放当前容量的空间 if (pc->data == NULL)//判断开辟是否成功 { perror("calloc"); return; } memset(pc->data, 0, sizeof(pc->data));//将开辟的空间全部初始化为0 } void CheckCapacity(Contact* pc)//给通讯录增容 { if (pc->sz == pc->capacity)//判断是否是需要增容 { PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo));//扩容 if (ptr != NULL)//判断是否增容成功 { pc->data = ptr; pc->capacity += DEFAULT_INC; printf("增容成功\n"); } else { perror("AddContact->realloc"); return; } } } void DestroyContact(Contact* pc)//删除通讯录 { free(pc->data);//释放所开辟的空间 pc->data = NULL; pc->capacity = 0; pc->sz = 0; } void AddContact(Contact* pc)//增容 { assert(pc); CheckCapacity(pc); //增加信息 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(Contact* pc)//显示通讯录 { assert(pc); if (pc->sz == 0) { printf("通讯录为空,无需打印\n"); return; } int i = 0; //名字 年龄 性别 电话 地址 printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < pc->sz; i++) { //打印每个人信息 printf("%-20s%-5d%-5s%-12s%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } } int FindByName(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; } } return -1;//找不到 } void DelContact(Contact* pc)//删除所需要删除的人 { char name[NAME_MAX]; assert(pc); if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } //找到联系人 printf("输入删除人的名字:"); scanf("%s", name); //找到名字为name的人 int ret = FindByName(pc, name);//找到这个人所在的位置 if (ret == -1) { 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"); } void SearchContact(Contact* pc)//查找人 { assert(pc); char name[NAME_MAX]; printf("输入查找人的名字:"); scanf("%s", name); //找到名字为name的人 int ret = FindByName(pc, name); if (ret == -1) { printf("要查找的人不存在\n"); return; } //显示出来 printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址"); printf("%-20s%-5d%-5s%-12s%-30s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr); } void ModifyContact(Contact* pc)//修改通讯录 { assert(pc); char name[NAME_MAX]; printf("输入要修改人的名字:"); scanf("%s", name); //找到名字为name的人 int ret = FindByName(pc, name); if (ret == -1) { printf("要修改的人不存在\n"); return; } //修改 printf("请输入名字:"); scanf("%s", pc->data[ret].name); printf("请输入年龄:"); scanf("%d", &pc->data[ret].age); printf("请输入性别:"); scanf("%s", pc->data[ret].sex); printf("请输入电话:"); scanf("%s", pc->data[ret].tele); printf("请输入地址:"); scanf("%s", pc->data[ret].addr); }
好了,今天的内容博主就讲到这里了,如果有讲的不好的地方,欢迎各位到评论区留言,如果觉得博主讲的不错就送上一个三连吧~谢谢各位