摘要:前言我们需要用语言模拟一个通讯录可以用来存储个人的信息每个人的信息包括姓名电话性别住址年龄功能包括新增联系人查找联系人删除联系人修改联系人查看所有联系人以名字排序所有联系人注此版本不包含其他内容,后续会出更加全面的升级版本通讯录语言简易版
前言:
我们需要用C语言模拟一个通讯录可以用来存储1000个人的信息
每个人的信息包括:
姓名、电话、性别、住址、年龄
功能包括:
- 新增联系人
- 查找联系人
- 删除联系人
- 修改联系人
- 查看所有联系人
- 以名字排序所有联系人
注:此版本不包含其他内容,后续会出更加全面的升级版本
目录
菜单能够实现和用户的交互。
那么作为一个通讯录怎么能没有菜单选项呢?
我们第一步先来设计一个菜单选项
代码如下:
void menu(){ printf("*********************************/n"); printf("** 1. 添加联系人 **/n"); printf("** 2. 删除联系人 **/n"); printf("** 3. 查找联系人 **/n"); printf("** 4. 修改联系人 **/n"); printf("** 5. 显示所有联系人 **/n"); printf("** 6. 按姓名排序联系人 **/n"); printf("** 0. exit **/n"); printf("*********************************/n");}
演示效果:
写完了通讯录菜单后,我们就要对主函数进行设计
代码如下:
int main(){ int input = 0; //创建通讯录 struct Contact con;//con就是通讯录,里面包含:1000个元素的数和size //初始化通讯录 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: MoidfyContact(&con); break; case SHOW: ShowContact(&con); break; case SORT: SortContact(&con); break; case EXIT: printf("退出通讯录/n"); break; default: printf("选择错误/n"); break; } } while (input); return 0;}
上面主函数内部的分支循环 case 中我们输入的字符是为了便于理解,但是这样是没办法实现最开始的以数字来进行菜单选项的初衷的,所以我们需要枚举这些选择功能来达到这样的一个效果。
代码如下:
enum Choose{ EXIT, //0 ADD, //1 DEL, //2 SEARCH,//3 MODIFY,//4 SHOW, //5 SORT //6};
这一步是为了实现前言中的通讯录内容以及联系人内容,为此我们需要用到结构体函数 struct
代码如下:
//结构体:通讯录中每个成员的信息typedef struct PeoInform{ char name[MAX_NAME]; int age; char sex[MAX_SEX]; char phone[MAX_PHONE]; char address[MAX_ADDRESS];}PeoInform;
代码如下:
//通讯录类型struct Contact{ struct PeoInform data[MAX];//存放1000个信息 int size;//记录当前结构体内已经有的元素个数};
为了实现我们上面结构体内部的这些内容,我们需要进行一些声明
代码如下:
#define MAX 1000#define MAX_NAME 20#define MAX_SEX 5#define MAX_PHONE 12#define MAX_ADDRESS 30
尽管我们这是一个基础的通讯录,它并不具备保存功能,但是我们应该让它拥有一个初始化功能。
代码如下:
//初始化通讯录的函数void InitContact(struct Contact *ps){ memset(ps->data, 0, sizeof(ps->data)); ps->size = 0;//设置通讯录最初只有0个元素}
为了更好的实现通讯录功能,使其可读性提高,这里特意设计了一个函数来通过查找姓名来实现通讯录的功能
代码如下:
//修饰FindByName函数,使其封装在程序内部,不暴露出去static int FindByName(const struct Contact *ps, char name[MAX_NAME]){ int i = 0; for(i = 0; i < ps->size; i++) { if(0 == strcmp(ps->data[i].name, name)) { return i; } } return -1;//找不到的情况}
//增加一个信息到通讯录void AddContact(struct Contact *ps){ if(ps->size == MAX) { printf("通讯录已满,无法增加/n"); } else { printf("请输入名字:>"); scanf("%s", ps->data[ps->size].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[ps->size].age)); printf("请输入性别:>"); scanf("%s", ps->data[ps->size].sex); printf("请输入电话:>"); scanf("%s", ps->data[ps->size].phone); printf("请输入家庭地址:>"); scanf("%s", ps->data[ps->size].address); ps->size++; printf("添加成功/n"); }}
模拟效果:
//删除指定的联系人void DelContact(struct Contact *ps){ char name[MAX_NAME]; printf("请输入要删除人的名字:>"); scanf("%s", name); //1.查找要删除的人在什么位置 //找到了返回名字所在元素的下标 //找不到返回 -1 int pos = FindByName(ps, name); //2.删除 //查询不到联系人 if (pos == -1) { printf("查询不到要删除的联系人,请重试/n"); } else { //删除数据 int j = 0; for(j = pos; j < ps->size-1; j++) { ps->data[j] = ps->data[j + 1]; //由于删除了这个数据,所以后面的数据会顶替上来 } ps->size--; printf("删除成功/n"); }}
演示效果:
//查找指定的人的信息void SearchContact(const struct Contact *ps){ char name[MAX_NAME]; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(ps, name); if (pos == -1) { printf("要查找的人不存在,请重试/n"); } else { printf("%-20s/t%-4s/t%-5s/t%-12s/t%-20s/n", "名字", "年龄", "性别", "电话", "地址"); printf("%-20s/t%-4d/t%-5s/t%-12s/t%-20s/n", ps->data[pos].name, ps->data[pos].age, ps->data[pos].sex, ps->data[pos].phone, ps->data[pos].address); }}
演示效果:
//修改指定联系人的信息void MoidfyContact(struct Contact *ps){ char name[MAX_NAME]; printf("请输入要修改联系人的名字:>"); scanf("%s", name); int pos = FindByName(ps, name); if (pos == -1) { printf("要修改联系人的信息不存在,请重试/n"); } else { printf("请输入名字:>"); scanf("%s", ps->data[pos].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[pos].age)); printf("请输入性别:>"); scanf("%s", ps->data[pos].sex); printf("请输入电话:>"); scanf("%s", ps->data[pos].phone); printf("请输入家庭地址:>"); scanf("%s", ps->data[pos].address); printf("修改完成/n"); }}
演示效果:
//展示通讯录中联系人的信息void ShowContact(const struct Contact *ps){ if(ps->size == 0) { printf("通讯录为空/n"); } else { int i = 0; //标题 printf("%-20s/t%-4s/t%-5s/t%-12s/t%-20s/n", "名字", "年龄", "性别", "电话", "地址"); //数据 for(i = 0; i < ps->size; i++) { printf("%-20s/t%-4d/t%-5s/t%-12s/t%-20s/n", ps->data[i].name, ps->data[i].age, ps->data[i].sex, ps->data[i].phone, ps->data[i].address); } }}
演示效果:
//按姓名排序通讯录内容void SortContact(struct Contact *ps){ if (ps->size <= 0){ printf("通讯录中没有联系人,请添加!/n"); } int i = 0; int j = 0; for (i = 0; i< ps->size - 1; i++) { for (j = 0; j< ps->size - i - 1; j++) { if (strcmp( ps->data[j].name, ( ps->data[j + 1]).name) > 0) { PeoInform tmp; tmp = ps->data[j]; ps->data[j] = ps->data[j + 1]; ps->data[j + 1] = tmp; } } printf("排序成功!/n"); }}
演示效果:
由于此时通讯录只有一个成员,我们无法直观地实现按名字排序的效果,所以这边添加了几个联系人来更好的演示。
(1)排序前
(2)排序后
写到这里我们是不是忘记了点什么?没错,那就是头文件,不引用头文件就会产生报错,所以我们在写代码的时候一定要加上头文件哦!
代码如下:
#include #include #include
最后我们献上完整的代码:
#include #include #include #define MAX 1000#define MAX_NAME 20#define MAX_SEX 5#define MAX_PHONE 12#define MAX_ADDRESS 30//枚举:选择功能enum Choose{ EXIT, //0 ADD, //1 DEL, //2 SEARCH,//3 MODIFY,//4 SHOW, //5 SORT //6};//结构体:通讯录中每个成员的信息typedef struct PeoInform{ char name[MAX_NAME]; int age; char sex[MAX_SEX]; char phone[MAX_PHONE]; char address[MAX_ADDRESS];}PeoInform;//通讯录类型struct Contact{ struct PeoInform data[MAX];//存放1000个信息 int size;//记录当前结构体内已经有的元素个数};//初始化通讯录的函数void InitContact(struct Contact *ps){ memset(ps->data, 0, sizeof(ps->data)); ps->size = 0;//设置通讯录最初只有0个元素}//增加一个信息到通讯录void AddContact(struct Contact *ps){ if(ps->size == MAX) { printf("通讯录已满,无法增加/n"); } else { printf("请输入名字:>"); scanf("%s", ps->data[ps->size].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[ps->size].age)); printf("请输入性别:>"); scanf("%s", ps->data[ps->size].sex); printf("请输入电话:>"); scanf("%s", ps->data[ps->size].phone); printf("请输入家庭地址:>"); scanf("%s", ps->data[ps->size].address); ps->size++; printf("添加成功/n"); }}//修饰FindByName函数,使其封装在程序内部,不暴露出去static int FindByName(const struct Contact *ps, char name[MAX_NAME]){ int i = 0; for(i = 0; i < ps->size; i++) { if(0 == strcmp(ps->data[i].name, name)) { return i; } } return -1;//找不到的情况}//删除指定的联系人void DelContact(struct Contact *ps){ char name[MAX_NAME]; printf("请输入要删除人的名字:>"); scanf("%s", name); //1.查找要删除的人在什么位置 //找到了返回名字所在元素的下标 //找不到返回 -1 int pos = FindByName(ps, name); //2.删除 //查询不到联系人 if (pos == -1) { printf("查询不到要删除的联系人,请重试/n"); } else { //删除数据 int j = 0; for(j = pos; j < ps->size-1; j++) { ps->data[j] = ps->data[j + 1]; //由于删除了这个数据,所以后面的数据会顶替上来 } ps->size--; printf("删除成功/n"); }}//查找指定的人的信息void SearchContact(const struct Contact *ps){ char name[MAX_NAME]; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(ps, name); if (pos == -1) { printf("要查找的人不存在,请重试/n"); } else { printf("%-20s/t%-4s/t%-5s/t%-12s/t%-20s/n", "名字", "年龄", "性别", "电话", "地址"); printf("%-20s/t%-4d/t%-5s/t%-12s/t%-20s/n", ps->data[pos].name, ps->data[pos].age, ps->data[pos].sex, ps->data[pos].phone, ps->data[pos].address); }}//修改指定联系人的信息void MoidfyContact(struct Contact *ps){ char name[MAX_NAME]; printf("请输入要修改联系人的名字:>"); scanf("%s", name); int pos = FindByName(ps, name); if (pos == -1) { printf("要修改联系人的信息不存在,请重试/n"); } else { printf("请输入名字:>"); scanf("%s", ps->data[pos].name); printf("请输入年龄:>"); scanf("%d", &(ps->data[pos].age)); printf("请输入性别:>"); scanf("%s", ps->data[pos].sex); printf("请输入电话:>"); scanf("%s", ps->data[pos].phone); printf("请输入家庭地址:>"); scanf("%s", ps->data[pos].address); printf("修改完成/n"); }}//展示通讯录中的信息void ShowContact(const struct Contact *ps){ if(ps->size == 0) { printf("通讯录为空/n"); } else { int i = 0; //标题 printf("%-20s/t%-4s/t%-5s/t%-12s/t%-20s/n", "名字", "年龄", "性别", "电话", "地址"); //数据 for(i = 0; i < ps->size; i++) { printf("%-20s/t%-4d/t%-5s/t%-12s/t%-20s/n", ps->data[i].name, ps->data[i].age, ps->data[i].sex, ps->data[i].phone, ps->data[i].address); } }}//按姓名排序通讯录内容void SortContact(struct Contact *ps){ if (ps->size <= 0){ printf("通讯录中没有联系人,请添加!/n"); } int i = 0; int j = 0; for (i = 0; i< ps->size - 1; i++) { for (j = 0; j< ps->size - i - 1; j++) { if (strcmp( ps->data[j].name, ( ps->data[j + 1]).name) > 0) { PeoInform tmp; tmp = ps->data[j]; ps->data[j] = ps->data[j + 1]; ps->data[j + 1] = tmp; } } printf("排序成功!/n"); }}void menu(){ printf("*********************************/n"); printf("** 1. 添加联系人 **/n"); printf("** 2. 删除联系人 **/n"); printf("** 3. 查找联系人 **/n"); printf("** 4. 修改联系人 **/n"); printf("** 5. 显示所有联系人 **/n"); printf("** 6. 按姓名排序联系人 **/n"); printf("** 0. exit **/n"); printf("*********************************/n");}int main(){ int input = 0; //创建通讯录 struct Contact con;//con就是通讯录,里面包含:1000个元素的数和size //初始化通讯录 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: MoidfyContact(&con); break; case SHOW: ShowContact(&con); break; case SORT: SortContact(&con); break; case EXIT: printf("退出通讯录/n"); break; default: printf("选择错误/n"); break; } } while (input); return 0;}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119295.html
❤️C语言通讯录管理系统(简易版)❤️ ?一、通讯录?二、菜单实现和用户交互?三、主函数⭐️⭐️1.enum选项⭐️⭐️2.switch判断 ?四、定义联系人和通讯录⭐️⭐️1.定义联系人结构体⭐️⭐️2.定义通讯录结构体⭐️⭐️3.定义结构体变量 ?五、通讯录初始化?六、新增联系人?七、查找联系人?八、删除联系人?九、修改联系人?十、查看所有联系人?十一、清空所有联系人?十二、以名字排序所有...
摘要:之前的通讯录在程序退出后内部的数据就会消失,再次打开程序后只能重新输入数据,为此我们增加了一个保存功能来保存信息。 前言: 由于之前实现的通讯录在存储方面只能支持静态的1000人的存储量,但是如果联系人较少,则会造成较大的内存浪费。而当联系人一旦超过1000时,就不能再继续存储信息了。因...
摘要:那么我们首先来改造储存空间也就是通讯录结构体静态版本人信息存放在数组中统计存放的人数动态版本统计存放的人数有效容量我们将原本的结构体数组改为一个结构体指针,以此来维护用以储存个人信息的空间。 上一期我们编写了一个C语言版本的简易通讯录,但是我们的之前的通讯录是没有记忆功能的,也就是说,一旦关...
摘要:导航前言功能函数结构设定菜单交互主函数通讯录初始化新增联系人查找联系人删除联系人修改联系人查看所有联系人清空所有联系人以名字排序所有联系人结尾语前言本文将实现一个简易的电话簿管理。信息包括名字,性别,电话号码,年龄,住址。 ...
摘要:学单片机多去官网上查资料,下载手册,像我入门的单片机经常去官网,还有学的系列板子,公司的官网的官方例程给的很详细,在英文视角阅读对你大有益处。 目录 1.C语言经典 2.单片机系列 3.Python方面 4.嵌入式LWip协议 5.Android 6.C++经典书籍 7.Linux开发 ...
阅读 2808·2021-10-26 09:48
阅读 1669·2021-09-22 15:22
阅读 4028·2021-09-22 15:05
阅读 608·2021-09-06 15:02
阅读 2606·2019-08-30 15:52
阅读 2106·2019-08-29 18:38
阅读 2753·2019-08-28 18:05
阅读 2332·2019-08-26 13:55