如何用C语言实现渣男通讯录
注意:纯属玩笑,博大家一乐,切勿当真
📖首先我们要知道一个渣男通讯录有哪些信息要包含哪些功能
1.你的通讯录要装多少个女朋友你得规定吧;
2.每个女朋友的姓名,年龄,电话,爱好这些要有吧
3.这个通讯录也要有以下功能吧:
增加女朋友,删除女朋友,查找女朋友,修改指定女朋友的信息,显示女朋友们的信息,排序女朋友们(按年龄来排序或者按姓名来排序);
❓那我们怎样来实现这个渣男通讯录呢。

首先,我们得在屏幕上打印一个通讯录的菜单呀,那我们写一个叫menu的函数,函数的实现放在:contact.c 这个文件中,函数的声明放在contact.h 这里面。
// 打印通讯录的菜单
void menu(void)
{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");
}菜单打印完了之后,那菜单上面不是有一些选项吗。那我们要根据你所输入的选项来执行相应的功能呀,这个时候我们想到了switch 语句。但是如果你用case1,case2.......这种方式也有弊端,它不容易让我们想到case1 是什么功能,所以要是有 case add 这种形式就好了,我们就知道了add 是增加联系人的那个选项,所以这个时候我们可以用枚举常量:enum来实现我们的目的。
int main()
{int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);enum Option{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,};switch(input){case ADD:break;case DEL:break; case SEARCH:break;case MODIFY:break;case SHOW:break;case SORT:break;case EXIT:break;default:break;}} while (input);📌
好了,这个时候要思考我们该如何处理联系人的信息了,我们之前举例了一个联系人包含了姓名,年龄,电话,爱好这些信息。那我们最好用一个结构体来从存这些信息嘛,
所以我们可以在contact.h这个头文件中定义一个存联系人信息的结构体——PeoInfo
#include<stdio.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_LOVE 20
#define MAX_TELE 12
#define MAX_ADDR 30// 打印通讯录的菜单
void menu(void);
// 定义一个用来存储联系人信息的结构体——PeoInfotypedef struct PeoInfo
{char name[MAX_NAME];int age;char love[MAX_LOVE];char tele[MAX_TELE];char addr[MAX_ADDR];
}PeoInfo;
为了让我们的通讯录可以存放100个女朋友的信息,所以我们要定义一个结构体类型的数组—— PeoInfo data[100]; 但我们也要知道通讯录中实际上有多少个人吧,所以我们可以用一个计数器来记录:int sz = 0;
为了表示方便,我们可以将PeoInfo data[100] 和 sz 整合到一起,即:再定义一个结构体,
// 为了方便表示而封装的一个结构体
typedef struct Contact
{PeoInfo data[MAX];// 存放联系人的信息int sz;// 记录通讯录中有效信息的个数
}Contact;📌
通讯录的形式已经大致弄好了,我们再来定义Contact类型的变量——con,这个时候就和你创造变量要初始化变量一样,我们也要初始化这个Contact类型的变量con;我们可以写一个函数来初始化它,函数的实现放在:contact.c 这个文件中,函数的声明放在contact.h 这里面。起个名字——InitContact
// 初始化通讯录
void InitContact(Contact* pc)
{pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));//用memset将数组的所有元素初始化为0;}📌接下来是对具体通讯录功能的实现;
💡增加女朋友
// 增加联系人
void AddContact(Contact* 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].love);printf("请输入电话:>");scanf("%d", 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("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-10s %-5d %-5s %-5s %-5s\n", pc->data[i].name, pc->data[i].age, pc->data[i].love, pc->data[i].tele, pc->data[i].addr);}}💡删除已经分手的女友
//为了避免代码冗余我们定义一个找名字的函数
int findname(Contact* pc, char name[])
{int i = 0;int pos = 0;// 用一个循环来找你想要找的那个名字for (i = 0; i < pc->sz; i++){if (0 == strcmp(pc->data[i].name, name)){return i;}}//有可能根本没有你要找的名字,所以我们判断一下;if (i == pc->sz){return -1;}
}// 删除联系人
void DELEcontact(Contact* pc)
{char name[MAX_NAME] = {0};if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}//找到你要删除人的位置——就是他的下标printf("输入删除人的名字:>");scanf("%s", name);int pos = findname(pc, name);if (-1 == pos){printf("要删除的人不存在\n");return;}// 删除 - 删除pos位置上的数据int i = 0;for (i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功了\n");}
💡查找明天即将约会的女朋友的信息
//查找联系人
void sercontact(const Contact* pc)
{char name[MAX_NAME] = { 0 };printf("请输入要查找人的名字:>");scanf("%s", name);//查找int pos = findname(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}//打印- - 这次打印的是一个人的信息就不要用循环了printf("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-10s %-5d %-5s %-5s %-5\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].love, pc->data[pos].tele, pc->data[pos].addr);
}
💡修改相关女朋友的信息
// 修改联系人的信息
void modifycontact(Contact* pc)
{char name[MAX_NAME] = { 0 };printf("请输入要修改人的名字:>");scanf("%s", name);//查找int pos = findname(pc, name);if (pos == -1){printf("你要修改的人不存在\n");return;}//修改printf("请输入名字:>");scanf("%s", pc->data[pos].name);printf("请输入年龄:>");scanf("%d", pc->data[pos].age);printf("请输入性别:>");scanf("%s", pc->data[pos].love);printf("请输入电话:>");scanf("%s", pc->data[pos].tele);printf("请输入地址:>");scanf("%s", pc->data[pos].addr);pc->sz++;printf("修改成功!\n");
}
💡将女朋友们排序
//将联系人按名字排序
int cmp_byname(const void* e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sortcontact(Contact* pc)
{qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_byname);
}📖代码汇总
📌test.c
#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"int main()
{int input = 0;Contact con;// 通讯录 int sz = 0; // 用sz来记录我们通讯录中到底有多少个人;// 初始化通讯录InitContact(&con); do{menu();printf("请选择:>");scanf("%d", &input);enum Option{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,};switch(input){case ADD:AddContact(&con);break;case DEL:DELEcontact(&con);break; case SEARCH:sercontact(&con);break;case MODIFY:modifycontact(&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;
}
📌contact.c
#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"// 打印通讯录的菜单
void menu(void)
{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 InitContact(Contact* pc)
{pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));//用memset将数组的所有元素初始化为0;}// 增加联系人
void AddContact(Contact* 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].love);printf("请输入电话:>");scanf("%d", 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("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "爱好", "电话", "地址");// 打印具体信息;for (i = 0; i < pc->sz; i++){printf("%-10s %-5d %-5s %-5s %-5s\n", pc->data[i].name, pc->data[i].age, pc->data[i].love, pc->data[i].tele, pc->data[i].addr);}}//为了避免代码冗余我们定义一个找名字的函数
// static 可以保护findname这个函数,这样的话findname就只能在这个.c文件中使用
static int findname(Contact* pc, char name[])
{int i = 0;int pos = 0;// 用一个循环来找你想要找的那个名字for (i = 0; i < pc->sz; i++){if (0 == strcmp(pc->data[i].name, name)){return i;}}//有可能根本没有你要找的名字,所以我们判断一下;if (i == pc->sz){return -1;}
}// 删除联系人
void DELEcontact(Contact* pc)
{char name[MAX_NAME] = {0};if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}//找到你要删除人的位置——就是他的下标printf("输入删除人的名字:>");scanf("%s", name);int pos = findname(pc, name);if (-1 == pos){printf("要删除的人不存在\n");return;}// 删除 - 删除pos位置上的数据int i = 0;for (i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功了\n");}//查找指定联系人
void sercontact(const Contact* pc)
{char name[MAX_NAME] = { 0 };printf("请输入要查找人的名字:>");scanf("%s", name);//查找int pos = findname(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}//打印- - 这次打印的是一个人的信息就不要用循环了printf("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-10s %-5d %-5s %-5s %-5\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].love, pc->data[pos].tele, pc->data[pos].addr);
}// 修改联系人的信息
void modifycontact(Contact* pc)
{char name[MAX_NAME] = { 0 };printf("请输入要修改人的名字:>");scanf("%s", name);//查找int pos = findname(pc, name);if (pos == -1){printf("你要修改的人不存在\n");return;}//修改printf("请输入名字:>");scanf("%s", pc->data[pos].name);printf("请输入年龄:>");scanf("%d", pc->data[pos].age);printf("请输入性别:>");scanf("%s", pc->data[pos].love);printf("请输入电话:>");scanf("%s", pc->data[pos].tele);printf("请输入地址:>");scanf("%s", pc->data[pos].addr);pc->sz++;printf("修改成功!\n");
}//将联系人按名字排序
int cmp_byname(const void* e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sortcontact(Contact* pc)
{qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_byname);
}
📌contact.h
#pragma once#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_LOVE 20
#define MAX_TELE 12
#define MAX_ADDR 30// 打印通讯录的菜单
void menu(void);// 定义一个用来存储联系人信息的结构体——PeoInfo
typedef struct PeoInfo
{char name[MAX_NAME];int age;char love[MAX_LOVE];char tele[MAX_TELE];char addr[MAX_ADDR];
}PeoInfo;// 为了方便表示而封装的一个结构体
typedef struct Contact
{PeoInfo data[MAX];// 存放联系人的信息int sz;// 记录通讯录中有效信息的个数
}Contact;// 初始化通讯录
void InitContact(Contact* pc);// 增加联系人
void AddContact(Contact* pc);// 显示通讯录
void SHOWcontact(const Contact* pc);// 删除联系人
void DELEcontact(Contact* pc);//查找联系人
void sercontact(const Contact* pc);// 修改联系人的信息
void modifycontact(Contact* pc);//将联系人按名字排序
void Sortcontact(Contact* pc);
相关文章:
如何用C语言实现渣男通讯录
注意:纯属玩笑,博大家一乐,切勿当真📖首先我们要知道一个渣男通讯录有哪些信息要包含哪些功能1.你的通讯录要装多少个女朋友你得规定吧;2.每个女朋友的姓名,年龄,电话,爱好这些要有吧…...
【从零开始的C语言】操作符详解
文章目录前言一、操作符分类二、算术操作符三、移位操作符3.1 左移3.2 右移四、位操作符(重要)五、赋值操作符六、单目操作符七、关系操作符八、逻辑操作符九、条件操作符十、逗号表达式前言 本篇文章开始,我将开设《从零开始的C语言》专栏&…...
黑马在线教育数仓实战1
1. 教育项目的架构说明 项目的架构: 基于cloudera manager大数据统一管理平台, 在此平台之上构建大数据相关的软件(zookeeper,HDFS,YARN,HIVE,OOZIE,SQOOP,HUE...), 除此以外, 还使用FINEBI实现数据报表展示 各个软件相关作用: zookeeper: 集群管理工具, 主要服务于…...
python中pandas模块数据处理小案例
内容目录1. 添加随机日期2. 聚合求和3.聚合求和排序4. 聚合求和排序取前十5. 聚合取极值6. 重新赋值7. 按条件赋值pandas作为数据处理的得力工具,简便了数据开发过程,之前串联了pandas的使用方法,现在用几个小案例巩固一下常用的pandas方法。…...
从 X 入门Pytorch——Tensor的自动微分、计算图,常见的with torch.no_grad()机制
这里写目录标题1 Pytorch计算图和自动微分2 将单个数据从计算图中剥离 .detach3 使用with torch.go_grad(): 包含的代码段不会计算微分1 Pytorch计算图和自动微分 从功能上理解: 计算图就是类似于数据结构中的无环有向图,Pytorch中的计算图就是为了记录…...
三十七、实战演练之接口自动化平台的文件上传
上传文件功能 上传文件功能主要针对需要测试上传文件的接口。原理是,把要测试上传的文件先上传到测试平台,然后把路径写入 用例中,后台真正测试时再将其进行上传。 一、上传文件模型 在testplans/models.py 模块中编写如下模型:…...
菜鸟刷题Day1
菜鸟刷题Day1 一.自守数:自守数_牛客题霸_牛客网 (nowcoder.com) 描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 625,76^2 5776,9376^2 87909376。请求出n(包括n)以内的自守数的个数 解题思路&#x…...
cjson文件格式介绍
cjson是一种轻量级的JSON解析库,它支持将JSON格式的数据转换为C语言中的数据结构,同时也支持将C语言中的数据结构转换为JSON格式的数据。cjson的文件格式是指在使用cjson库时,将JSON格式的数据存储在文件中,然后通过cjson库读取文…...
【Nginx二】——Nginx常用命令 配置文件
Nginx常用命令 配置文件常用命令启动和重启 Nginx配置文件maineventshttp常用命令 安装完成nginx后,输入 nginx -?查询nginx命令行参数 nginx version: nginx/1.22.1 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix][-e filename] [-c filename] [-…...
3月最新!AIGC公司生态地图;开发者实用ChatGPT工具清单;上手必会的SD绘图教程;字幕组全自动化流程大公开 | ShowMeAI日报
👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『光年之外诚邀产品经理加入』古典产品经理的复兴! 光年之外创始人王慧文在社交平台发帖,公布联合创始人团队基…...
python - 递归函数
递归函数 什么是递归 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数 递归函数必须有一个明确的结束条件每进入更深一层的递归时,问题规模相对于上一次递归都应减少相邻两次重复之间有紧密的联系&…...
ring_log环形日志-6M缓冲区_proc接口
文章目录log_tools.clog.cspin_lockseq_putsseq_readseq_writesingle_openmakefiletest.sh测试:运行./test.sh读取日志插入日志echo cat测试参考:log_tools.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #includ…...
Linux内核进程管理几种CPU调度策略
CPU调度我们知道,程序需要获得CPU的资源才能被调度和执行,那么当一个进程由于某种原因放弃CPU然后进入阻塞状态,下一个获得CPU资源去被调度执行的进程会是谁呢?下图中,进程1因为阻塞放弃CPU资源,此时&#…...
SpringBoot整合Flink(施耐德PLC物联网信息采集)
SpringBoot整合Flink(施耐德PLC物联网信息采集)Linux环境安装kafka前情:施耐德PLC设备(TM200C16R)设置好信息采集程序,连接局域网,SpringBoot订阅MQTT主题,消息转至kafka,…...
DFS(深度优先搜索)和BFS(宽度优先搜索)
目录 DFS(深度优先搜索) 全排列的DFS解法 利用DFS递归构建二进制串和递归树的结构剖析 DFS--剪枝 DFS例题--整数划分 BFS(宽度优先搜索) 全排列的BFS解法 DFS(深度优先搜索) 深度优先搜索(Depth First Search&…...
Redis缓存穿透、击穿、雪崩问题及解决方法
系列文章目录 Spring Cache的使用–快速上手篇 分页查询–Java项目实战篇 全局异常处理–Java实战项目篇 完善登录功能–过滤器的使用 上述只是部分文章,对该系列文章感兴趣的可以查看我的主页哦 文章目录系列文章目录前言一、缓存穿透1.1 问题引入1.2 解决方法1.…...
HAL库 STM32 串口通信
一、实验条件将STM32的PA9复用为串口1的TX,PA10复用为串口1的RX。STM32芯片的输出TX和接收RX与CH340的接收RX和发送TX相连(收发交叉且PCB上默认没有相连,所以需要用P3跳线帽进行手动连接),CH340的另一端通过USB口引出与…...
2023-第十四届蓝桥杯冲刺计划!
💬前言 💡本文以目录形式列举大纲,可根据题目点击跳转 🌈冲刺阶段目的:把握高频重点,结合基础算法和常考题型总结,用真题进行模拟练习 根据自己的能力熟练目前已掌握的算法,不会的还可以暴力 ⏳最后三个星期大家一起冲…...
内网渗透基础知识
一、内网概述 内网也指局域网,是指在某一区域内又多台计算机互联成的计算机组。一般是方圆几千米内,局域网可以实现文件管理,应用软件共享,打印机共享,工作组内的历程安排,电子邮件和传真通信服务等功能。…...
鸟哥的Linux私房菜 正则表示法与文件格式化处理
第十一章、正则表示法与文件格式化处理 https://linux.vbird.org/linux_basic/centos7/0330regularex.php 简体版 http://cn.linux.vbird.org/linux_basic/0330regularex.php 11.2.2 grep的一些高级选项 例题一、搜索特定字符串 例题二、利用中括号 [] 来搜寻集合字符 例题四…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
