结构体熟练掌握--实现通讯录

- 魔王的介绍:😶🌫️一名双非本科大一小白。
- 魔王的目标:🤯努力赶上周围卷王的脚步。
- 魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥
❤️🔥大魔王与你分享:无人问津也好,技不如人也罢,你都要是安静下来去做自己该做的事,而不是让内心烦躁、焦虑,毁掉你本就不多的热情和定力。
文章目录
- 一、前言
- 二、介绍
- 三、分布实现通讯录
- 1.在test.c文件中创建基本格式
- 2.创建结构体类型
- 3.初始化通讯录
- 4.实现AddContact函数
- 5.实现ShowContact函数
- 6.实现FindContact函数
- 7.实现DelContact函数
- 8.实现SearchContact函数
- 9.实现ModifyContact函数
- 10.实现SortContact函数
- 四、总代码
- contact.h
- contact.c
- test.c
- 五、总结
一、前言
学习完结构体,我们一定会好奇它的应用场景,想要熟练掌握一个知识点,就必须让其在现实生活中熟练结合,本篇将通过结构体的灵活运用去实现简单通讯录,可以实现增加删除搜索修改展示排序六大功能。
二、介绍
test.c:测试文件
contact.h:头文件(只进行声明)
contact.c:源文件,进行函数的定义
我们会在contact.h头文件中进行声明,在contact.c源文件中进行定义,然后在test.c源文件中进行测试(也就是直接运用这些函数)。
除了头文件外,另外两个文件都要包含头文件,因为是头文件进行的声明,可以理解为另外两个文件都要用的东西我们会在头文件进行声明,之后只需要在另外两个文件中包含头文件便都可以使用了。
三、分布实现通讯录
1.在test.c文件中创建基本格式
#include "contact.h"void menu()
{printf("**** 1.add 2.del ****\n");printf("**** 3.search 4.modify ****\n");printf("**** 5.show 6.sort ****\n");printf("**** 0.exit ****\n");
}int main()
{int input = 0;do{menu();printf("请选择:> ");scanf("%d", &input);switch (input){case 1://AddContact(&con);break;case 2://DelContact(&con);break;case 3://SearchContact(&con);break;case 4://ModifyContact(&con);break;case 5://ShowContact(&con);break;case 6://SortContact(&con);break;case 0:printf("退出");break;default:printf("输入错误,请重新输入");}} while (input);return 0;
}
我们这时候就可以运行了,虽然什么都没有,不过程序是正确的。
2.创建结构体类型
我们会创建两个结构体类型,一个是存放数据的结构体类型,里面放的是一个用户的基本信息,另一个是我们直接应用的结构体,里面会有两个成员,第一个成员为上个结构体数组,因为我们的通讯录肯定不是只有一个人的信息,第二个成员为结构体数组中的成员个数。
#define NameMax 10
#define SexMax 5
#define AddrMax 10
#define TeleMax 11//定义一个可以存放一个人数据的结构体类型
typedef struct PeoInfo
{char name[NameMax];int age;char sex[SexMax];char addr[AddrMax];char tele[TeleMax];
}PeoInfo;//定义一个我们可以存放多人数据并进行判断和修改的结构体类型
typedef struct Contact
{PeoInfo date[100];int sz;
}Contact;
- 解释:
- 我们进行define定义常量是为了以后方便修改,当我们发现某个不合适时,只需要在头文件中修改一下就可以了,也就是方便代码的维护。
- 两个结构体都进行重命名是为了在之后应用这个结构体时不再去写struct,比较方便。
- 因为不止一个文件要用到结构体,所以创建结构体在头文件进行。
3.初始化通讯录
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->date, 0, sizeof(pc->date));
}
- 解释:
- 我们首先在测试文件的主函数内部用定义过的结构体创建
- 我们在测试时需要创建一个通讯录,创建的时候我们可以直接初始化为0,也可以像这样在创建完成后让通讯录中的值改为我们需要的(还是0,这种方法更好一些,因为可以改为别的值,而不是只能是0)。
- 我们这里用到了memset函数,对应的头文件是<string.h>,这个函数的作用就是让从给定地址开始前多少字节的内容都赋上一个特定的数值。
4.实现AddContact函数
void AddContact(Contact* pc)
{assert(pc);if (pc->sz == 100){printf("人数已满\n");return;}printf("请输入要添加联系人姓名:> ");scanf("%s", pc->date[pc->sz].name);printf("请输入要添加联系人年龄:> ");scanf("%d", &(pc->date[pc->sz].age));printf("请输入要添加联系人性别:> ");scanf("%s", pc->date[pc->sz].sex );printf("请输入要添加联系人地址:> ");scanf("%s", pc->date[pc->sz].addr);printf("请输入要添加联系人电话:> ");scanf("%s", pc->date[pc->sz].tele);pc->sz++;printf("添加成功\n");
}
- 解释:
- 首先判断是否满了(也就是我们规定的100人),如果没满,那么就执行后面的添加,如果满了,就退出函数。
- 为什么只有第二个加取地址呢,因为其他的都是结构体信息(PeoInfo)里不同类型的首元素地址(因为是数组,所以数组名表示首元素地址),而age的类型为int,表示的不是地址,所以需要取地址符。
- 每次添加一个人,结构体成员sz需要加1。
5.实现ShowContact函数
void ShowContact(const Contact* pc)
{assert(pc);printf("%-10s\t%-3s\t%-5s\t%-10s\t%-11s\n", "姓名", "年龄", "性别", "地址", "电话");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n", pc->date[i].name,pc->date[i].age,pc->date[i].sex,pc->date[i].addr,pc->date[i].tele);}
}
- 解释:
- \t为水平制表符,也就是会空出来一段距离。
- 展示函数会从结构体数组的零下标开始逐个打印出全部人的信息。
6.实现FindContact函数
int FindContact(Contact* pc, char* arr)
{int i = 0;for (i = 0; i < pc->sz; i++){int ret = strcmp(arr, pc->date[i].name);if (ret == 0)return i;//找到的话返回结构体的下标}return -1;
}
这个函数并不是六种功能的哪一个,我们之所以要专门分装出这么一个函数,是因为多个功能都需要用到这个函数,所以为了方便其他函数使用,我们把这个部分写成一个函数分离出来。
7.实现DelContact函数
void DelContact(Contact* pc)
{assert(pc);if (pc->sz==0){printf("通讯录中没有信息\n");return;}printf("输入要删除人的姓名:>");char arr[10] = "0";scanf("%s", arr);int ret = FindContact(pc,arr);if (ret== -1){printf("该姓名不存在\n");return;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->date[i] = pc->date[i + 1];}pc->sz--;printf("删除成功\n");
}
- 解释:
- 首先判断是否有成员,如果没有成员,就直接退出函数。
- 如果确实存在该成员,该成员的结构体下标会通过FindContact函数返回给ret,然后ret里存放的值就是该结构体数组中对应的下标。
- 如果确实存在该成员,我们删除的思路就是从被删除这个结构体下标开始,每个后面的覆盖前面的,最后个数sz再减1。
8.实现SearchContact函数
void SearchContact(const Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录中没有信息\n");return;}printf("输入要查找人的姓名:>");char arr[10] = "0";scanf("%s", arr);int ret = FindContact(pc, arr);if (ret == -1){printf("该姓名不存在\n");return;}printf("%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n", pc->date[ret].name,pc->date[ret].age,pc->date[ret].sex,pc->date[ret].addr,pc->date[ret].tele);
}
首先判断是否含有信息,如果没有退出函数。
然后如果有这个人的信息,那个其对应的结构体下标已经通过FindContact函数返回给了ret,我们把该姓名的信息打印出来。
9.实现ModifyContact函数
如果不存在就退出,如果存在,我们将这个人的信息打印出来。
void ModifyContact(Contact* pc)
{assert(pc);if (pc->sz==0){printf("通讯录中没有信息\n");return;}char arr[10] = "0";printf("请输入要修改人的名字:> ");scanf("%s", arr);int ret = FindContact(pc,arr);if (ret == -1){printf("该联系人不存在\n");return;}printf("请输入要修改成的姓名:> ");scanf("%s", pc->date[ret].name);printf("请输入要修改成的年龄:> ");scanf("%d", &(pc->date[ret].age));printf("请输入要修改成的性别:> ");scanf("%s", pc->date[ret].sex);printf("请输入要修改成的地址:> ");scanf("%s", pc->date[ret].addr);printf("请输入要修改成的电话:> ");scanf("%s", pc->date[ret].tele);printf("修改成功\n");return;
}
这个的原理就是把找到的那个人对应的结构体下标返回给ret,然后让该下标的结构体成员重新赋一次值。
10.实现SortContact函数
int cmp(const void* e1, const void* e2)
{assert(e1 && e2);//return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}void SortContact(Contact* pc)
{assert(pc);qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp);}
- 注意:
qsort第二个参数不是传数组能放多少元素,而是放了多少元素,因为如果没使用的位置也算进去,它会将它们这些没放的元素也参加排序。
四、总代码
contact.h
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>#define NameMax 10
#define SexMax 5
#define AddrMax 10
#define TeleMax 11//定义一个可以存放一个人数据的结构体类型
typedef struct PeoInfo
{char name[NameMax];int age;char sex[SexMax];char addr[AddrMax];char tele[TeleMax];
}PeoInfo;//定义一个我们可以存放多人数据并进行判断和修改的结构体类型
typedef struct Contact
{PeoInfo date[100];int sz;
}Contact;//初始化通讯录
void InitContact(Contact* pc);//添加联系人
void AddContact(Contact* pc);//展示添加上的联系人
void ShowContact(const Contact* pc);//删除联系人
void DeleContact(Contact* pc);//查找联系人
void SearchContact(const Contact* pc);//修改联系人
void ModifyContact(Contact* pc);//按名字大小排序
void SortContact(Contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->date, 0, sizeof(pc->date));
}void AddContact(Contact* pc)
{assert(pc);if (pc->sz == 100){printf("人数已满\n");return;}printf("请输入要添加联系人姓名:> ");scanf("%s", pc->date[pc->sz].name);printf("请输入要添加联系人年龄:> ");scanf("%d", &(pc->date[pc->sz].age));printf("请输入要添加联系人性别:> ");scanf("%s", pc->date[pc->sz].sex );printf("请输入要添加联系人地址:> ");scanf("%s", pc->date[pc->sz].addr);printf("请输入要添加联系人电话:> ");scanf("%s", pc->date[pc->sz].tele);pc->sz++;printf("添加成功\n");
}void ShowContact(const Contact* pc)
{assert(pc);printf("%-10s\t%-3s\t%-5s\t%-10s\t%-11s\n", "姓名", "年龄", "性别", "地址", "电话");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n", pc->date[i].name,pc->date[i].age,pc->date[i].sex,pc->date[i].addr,pc->date[i].tele);}
}
int FindContact(Contact* pc, char* arr)
{int i = 0;for (i = 0; i < pc->sz; i++){int ret = strcmp(arr, pc->date[i].name);if (ret == 0)return i;//找到的话返回结构体的下标}return -1;}void DelContact(Contact* pc)
{assert(pc);if (pc->sz==0){printf("通讯录中没有信息\n");return;}printf("输入要删除人的姓名:>");char arr[10] = "0";scanf("%s", arr);int ret = FindContact(pc,arr);if (ret== -1){printf("该姓名不存在\n");return;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->date[i] = pc->date[i + 1];}pc->sz--;printf("删除成功\n");
}void SearchContact(const Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录中没有信息\n");return;}printf("输入要查找人的姓名:>");char arr[10] = "0";scanf("%s", arr);int ret = FindContact(pc, arr);if (ret == -1){printf("该姓名不存在\n");return;}printf("%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n", pc->date[ret].name,pc->date[ret].age,pc->date[ret].sex,pc->date[ret].addr,pc->date[ret].tele);
}void ModifyContact(Contact* pc)
{assert(pc);if (pc->sz==0){printf("通讯录中没有信息\n");return;}char arr[10] = "0";printf("请输入要修改人的名字:> ");scanf("%s", arr);int ret = FindContact(pc,arr);if (ret == -1){printf("该联系人不存在\n");return;}printf("请输入要修改成的姓名:> ");scanf("%s", pc->date[ret].name);printf("请输入要修改成的年龄:> ");scanf("%d", &(pc->date[ret].age));printf("请输入要修改成的性别:> ");scanf("%s", pc->date[ret].sex);printf("请输入要修改成的地址:> ");scanf("%s", pc->date[ret].addr);printf("请输入要修改成的电话:> ");scanf("%s", pc->date[ret].tele);printf("修改成功\n");return;
}int cmp(const void* e1, const void* e2)
{assert(e1 && e2);//return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}void SortContact(Contact* pc)
{assert(pc);qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp);//qsort第二个参数不是传数组能放多少元素,而是放了多少元素,因为如果没使用的位置也算进去,它会将它们这些没放的元素也参加排序
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void menu()
{printf("**** 1.add 2.del ****\n");printf("**** 3.search 4.modify ****\n");printf("**** 5.show 6.sort ****\n");printf("**** 0.exit ****\n");
}int main()
{//创建通讯录Contact con;//初始化通讯录InitContact(&con);int input = 0;do{menu();printf("请选择:> ");scanf("%d", &input);switch (input){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:SearchContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);break;case 0:printf("退出");break;default:printf("输入错误,请重新输入");}} while (input);return 0;
}
五、总结

💘原创不易,还希望各位佬佬支持一下\textcolor{colourful}{💘原创不易,还希望各位佬佬支持一下}💘原创不易,还希望各位佬佬支持一下
💓点赞,你的认可是我创作的动力!\textcolor{red}{💓点赞,你的认可是我创作的动力!}💓点赞,你的认可是我创作的动力!
💕收藏,你的青睐是我努力的方向!\textcolor{orange}{💕收藏,你的青睐是我努力的方向!}💕收藏,你的青睐是我努力的方向!
💞评论,你的意见是我进步的财富!\textcolor{aqua}{💞评论,你的意见是我进步的财富!}💞评论,你的意见是我进步的财富!
✨请点击下面进入主页关注大魔王
如果感觉对你有用的话,就点我进入主页关注我吧!
相关文章:
结构体熟练掌握--实现通讯录
魔王的介绍:😶🌫️一名双非本科大一小白。魔王的目标:🤯努力赶上周围卷王的脚步。魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️…...
腾讯云CVM服务器购买流程手把手方法教程攻略
购买腾讯云服务器有两种方式。一种是在官方活动中,简单方便,但ECS配置相对固定;另一种是在ECS页面定制购买。配置选项丰富,但地理可用性区域、计费模式、CPU内存实例规格、映像系统、存储系统磁盘、网络带宽和安全组的选择更为复…...
九龙证券|“春季躁动”行情要来?1月新增投资者数大增
新增投资者数量在上一年12月触及多年新低后,2023年1月份开端呈现反弹。 在新增投资者数量之外,近段时刻以来,包含A股商场股票成交额、北向资金净买入额、两融资金规划及成交额在内多个商场目标也呈现回暖的特征,目前A股商场交投氛…...
C语言(按位运算符和位移运算符)
目录 编辑 一.按位运算符 1.二进制反码或按位取反:~ 2.按位与:& 3.按位或:| 4.按位异或:^ 二.位移运算符 1.左移: << 2.右移: >> 一.按位运算符 C有四个按位逻辑运算符都用于整…...
删掉的照片怎么恢复?
每一张照片都是生活,留住每一个人的回忆。而这些有意义的照片,我们都会把它保存在我们的手机或电脑上,始终伴随着我们。但无论是手机还是电脑,都是需要时不时清理一下的。如果是清理垃圾图片时,不小心删除了需要的图片…...
【java】40 个 SpringBoot 常用注解(建议收藏)
本文目录一、Spring Web MVC 注解Spring Web MVC 注解RequestMappingRequestBodyGetMappingPostMappingPutMappingDeleteMappingPatchMappingControllerAdviceResponseBodyExceptionHandlerResponseStatusPathVariableRequestParamControllerRestControllerModelAttributeCross…...
【JMC】SMILES‑based deep generative scafold decorator for de‑novo drug design
SMILES-based deep generative scaffold decorator for de-novo drug design 基于SMILES的利用Fragment的分子生成模型 https://github.com/undeadpixel/reinvent-scaffold-decorator 1.背景 深度生成模型因其可以从有限的数量中生成新数据,目前已成功应用于生成…...
全链路异步,让你的 SpringCloud 性能优化10倍+
背景 随着业务的发展,微服务应用的流量越来越大,使用到的资源也越来越多。 在微服务架构下,大量的应用都是 SpringCloud 分布式架构,这种架构,总体是全链路同步模式。 同步编程模式不仅造成了资源的极大浪费&#x…...
131.《router v 5 与 react-router v 6》
文章目录1.什么是路由2.路由分类3.react-router-dom的理解4. react-router-dom相关API5.其他6. react-router5 路由基本使用1.效果2.代码App.js一级路由home.js下的二级路由7.路由传参的三种方式8.react-router6 基本使用1.一级路由2.二级路由3.hooksuseRoutesuseParamsuseSear…...
2023第十届北京老年产业博览会/中国养老护理人才培育计划
CBIAIE北京老博会,打造2023年度唯具参展价值的老年行业盛会; 北京老博会:2011年,我国首场以“老年产业”为主题,一场专注于老年福祉、健康的国际型行业发展盛会,中国(北京)国际老年…...
STM32F407VET6 / BLACK_F407VE开发板间隔0.5秒不断重启
有一块 STM32F407VET6 的故障开发板, 之前的问题是经常无法烧录, 必须reset之后才能连接, 具体查看这篇 STM32F407VET6烧录出现flash download failed target dll has been cancelled. 并且程序运行一段时间后会halt. 这块开发板后来一直搁箱底吃灰了几年. 最近打算把这片 STM…...
什么是圈复杂度
圈复杂度是一种软件度量指标,用于度量程序中的控制流程的复杂性。它是通过计算程序中独立路径的数量来确定的。简单来说,圈复杂度是指在一个函数或模块中有多少个独立的路径,也就是说,有多少个不同的输入序列可以导致不同的执行路…...
Hbase 数据迁移
Hbase 数据迁移 可选方案对比 l 已验证方案操作说明: n Export&import u 导出命令及示例 hbase org.apache.hadoop.hbase.mapreduce.Export “表名” 文件路径 导出至本地文件系统: ./bin/hbase org.apache.hadoop.hbase.mapreduce.Export ‘defa…...
Docker consul的容器服务更新与发现
一、Consul概述(1)什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分…...
数据库关系模型
关系模型简述 形象地说,一个关系就是一个table。 关系模型就是处理table的,它由三个部分组成: 描述DB各种数据的基本结构形式;描述table与table之间所可能发生的各种操作;描述这些操作所应遵循的约束条件࿱…...
你是真的“C”——详解指针知识
你是真的“C”——详解指针知识😎前言🙌1、 指针是什么?🙌2、指针和指针类型🙌2 、1指针-整数2 、 2指针的解引用3、 野指针🙌3、 1野指针成因3、 2如何规避野指针4、指针运算🙌4、1 指针-整数4…...
React/ReactNative面试攻略(偏RN)
useMemo Vs useCallBackuseMemo第一个参数返回的是值,useCallBack返回的是函数useMemo和useCallBack第二个参数都是依赖项useMemo避免组件非依赖项更新时参数的计算useCallback避免父组件非依赖项更新时造成子组件的重复渲染React.memo 使用场景纯prue组件ÿ…...
Leetcode-每日一题1234. 替换子串得到平衡字符串(滑动窗口 + 哈希表)
题目链接:https://leetcode.cn/problems/replace-the-substring-for-balanced-string/description/ 思路 题目意思 这题意思是一个只含有[Q, W, E, R] 四个字符的字符串s且长度一定是 4的倍数, 需要你通过替换子串,使他变成一个「平衡字符…...
linux命令小结-查看日志命令
一、查看日志命令cat查看文件 vi编辑后可以用cat进行查看保存是否成功1)cat -n alert_monitor.log2)cat -n alert_monitor.log | tail -n 100 | head -n 20 //查询100行之后的日志,且在100行之后里再查前20条日志more 可以通过回撤键翻页mor…...
Java知识点细节简易汇总——(8)枚举和注解+Java面向对象高级作业
一、枚举 自定义枚举 当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类, 而且是一个 final 类[如何证明],老师使用 javap 工具来演示传统的 public static final Season2 SPRING new Season2(“春天”, “温暖”); 简化成 SPRING(“春天”, “温暖”)…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

