当前位置: 首页 > news >正文

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

在这里插入图片描述

  • 魔王的介绍:😶‍🌫️一名双非本科大一小白。
  • 魔王的目标:🤯努力赶上周围卷王的脚步。
  • 魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥
    在这里插入图片描述
    ❤️‍🔥大魔王与你分享:无人问津也好,技不如人也罢,你都要是安静下来去做自己该做的事,而不是让内心烦躁、焦虑,毁掉你本就不多的热情和定力。

文章目录

  • 一、前言
  • 二、介绍
  • 三、分布实现通讯录
    • 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;
  • 解释:
  1. 我们进行define定义常量是为了以后方便修改,当我们发现某个不合适时,只需要在头文件中修改一下就可以了,也就是方便代码的维护。
  2. 两个结构体都进行重命名是为了在之后应用这个结构体时不再去写struct,比较方便。
  3. 因为不止一个文件要用到结构体,所以创建结构体在头文件进行。

3.初始化通讯录

void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->date, 0, sizeof(pc->date));
}
  • 解释:
  1. 我们首先在测试文件的主函数内部用定义过的结构体创建
  2. 我们在测试时需要创建一个通讯录,创建的时候我们可以直接初始化为0,也可以像这样在创建完成后让通讯录中的值改为我们需要的(还是0,这种方法更好一些,因为可以改为别的值,而不是只能是0)。
  3. 我们这里用到了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");
}
  • 解释:
  1. 首先判断是否满了(也就是我们规定的100人),如果没满,那么就执行后面的添加,如果满了,就退出函数。
  2. 为什么只有第二个加取地址呢,因为其他的都是结构体信息(PeoInfo)里不同类型的首元素地址(因为是数组,所以数组名表示首元素地址),而age的类型为int,表示的不是地址,所以需要取地址符。
  3. 每次添加一个人,结构体成员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);}
}
  • 解释:
  1. \t为水平制表符,也就是会空出来一段距离。
  2. 展示函数会从结构体数组的零下标开始逐个打印出全部人的信息。

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");
} 
  • 解释:
  1. 首先判断是否有成员,如果没有成员,就直接退出函数。
  2. 如果确实存在该成员,该成员的结构体下标会通过FindContact函数返回给ret,然后ret里存放的值就是该结构体数组中对应的下标。
  3. 如果确实存在该成员,我们删除的思路就是从被删除这个结构体下标开始,每个后面的覆盖前面的,最后个数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}{💞评论,你的意见是我进步的财富!}💞评论,你的意见是我进步的财富!

✨请点击下面进入主页关注大魔王
如果感觉对你有用的话,就点我进入主页关注我吧!

相关文章:

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

魔王的介绍&#xff1a;&#x1f636;‍&#x1f32b;️一名双非本科大一小白。魔王的目标&#xff1a;&#x1f92f;努力赶上周围卷王的脚步。魔王的主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王.&#x1f525;&#x1f525;&#x1f525; ❤️‍&#x1…...

腾讯云CVM服务器购买流程手把手方法教程攻略

​购买腾讯云服务器有两种方式。一种是在官方活动中&#xff0c;简单方便&#xff0c;但ECS配置相对固定&#xff1b;另一种是在ECS页面定制购买。配置选项丰富&#xff0c;但地理可用性区域、计费模式、CPU内存实例规格、映像系统、存储系统磁盘、网络带宽和安全组的选择更为复…...

九龙证券|“春季躁动”行情要来?1月新增投资者数大增

新增投资者数量在上一年12月触及多年新低后&#xff0c;2023年1月份开端呈现反弹。 在新增投资者数量之外&#xff0c;近段时刻以来&#xff0c;包含A股商场股票成交额、北向资金净买入额、两融资金规划及成交额在内多个商场目标也呈现回暖的特征&#xff0c;目前A股商场交投氛…...

C语言(按位运算符和位移运算符)

目录 ​编辑 一.按位运算符 1.二进制反码或按位取反&#xff1a;~ 2.按位与&#xff1a;& 3.按位或&#xff1a;| 4.按位异或&#xff1a;^ 二.位移运算符 1.左移&#xff1a; << 2.右移&#xff1a; >> 一.按位运算符 C有四个按位逻辑运算符都用于整…...

删掉的照片怎么恢复?

每一张照片都是生活&#xff0c;留住每一个人的回忆。而这些有意义的照片&#xff0c;我们都会把它保存在我们的手机或电脑上&#xff0c;始终伴随着我们。但无论是手机还是电脑&#xff0c;都是需要时不时清理一下的。如果是清理垃圾图片时&#xff0c;不小心删除了需要的图片…...

【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.背景 深度生成模型因其可以从有限的数量中生成新数据&#xff0c;目前已成功应用于生成…...

全链路异步,让你的 SpringCloud 性能优化10倍+

背景 随着业务的发展&#xff0c;微服务应用的流量越来越大&#xff0c;使用到的资源也越来越多。 在微服务架构下&#xff0c;大量的应用都是 SpringCloud 分布式架构&#xff0c;这种架构&#xff0c;总体是全链路同步模式。 同步编程模式不仅造成了资源的极大浪费&#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北京老博会&#xff0c;打造2023年度唯具参展价值的老年行业盛会&#xff1b; 北京老博会&#xff1a;2011年&#xff0c;我国首场以“老年产业”为主题&#xff0c;一场专注于老年福祉、健康的国际型行业发展盛会&#xff0c;中国&#xff08;北京&#xff09;国际老年…...

STM32F407VET6 / BLACK_F407VE开发板间隔0.5秒不断重启

有一块 STM32F407VET6 的故障开发板, 之前的问题是经常无法烧录, 必须reset之后才能连接, 具体查看这篇 STM32F407VET6烧录出现flash download failed target dll has been cancelled. 并且程序运行一段时间后会halt. 这块开发板后来一直搁箱底吃灰了几年. 最近打算把这片 STM…...

什么是圈复杂度

圈复杂度是一种软件度量指标&#xff0c;用于度量程序中的控制流程的复杂性。它是通过计算程序中独立路径的数量来确定的。简单来说&#xff0c;圈复杂度是指在一个函数或模块中有多少个独立的路径&#xff0c;也就是说&#xff0c;有多少个不同的输入序列可以导致不同的执行路…...

Hbase 数据迁移

Hbase 数据迁移 可选方案对比 l 已验证方案操作说明&#xff1a; n Export&import u 导出命令及示例 hbase org.apache.hadoop.hbase.mapreduce.Export “表名” 文件路径 导出至本地文件系统&#xff1a; ./bin/hbase org.apache.hadoop.hbase.mapreduce.Export ‘defa…...

Docker consul的容器服务更新与发现

一、Consul概述&#xff08;1&#xff09;什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分…...

数据库关系模型

关系模型简述 形象地说&#xff0c;一个关系就是一个table。 关系模型就是处理table的&#xff0c;它由三个部分组成&#xff1a; 描述DB各种数据的基本结构形式&#xff1b;描述table与table之间所可能发生的各种操作&#xff1b;描述这些操作所应遵循的约束条件&#xff1…...

你是真的“C”——详解指针知识

你是真的“C”——详解指针知识&#x1f60e;前言&#x1f64c;1、 指针是什么&#xff1f;&#x1f64c;2、指针和指针类型&#x1f64c;2 、1指针-整数2 、 2指针的解引用3、 野指针&#x1f64c;3、 1野指针成因3、 2如何规避野指针4、指针运算&#x1f64c;4、1 指针-整数4…...

React/ReactNative面试攻略(偏RN)

useMemo Vs useCallBackuseMemo第一个参数返回的是值&#xff0c;useCallBack返回的是函数useMemo和useCallBack第二个参数都是依赖项useMemo避免组件非依赖项更新时参数的计算useCallback避免父组件非依赖项更新时造成子组件的重复渲染React.memo 使用场景纯prue组件&#xff…...

Leetcode-每日一题1234. 替换子串得到平衡字符串(滑动窗口 + 哈希表)

题目链接&#xff1a;https://leetcode.cn/problems/replace-the-substring-for-balanced-string/description/ 思路 题目意思 这题意思是一个只含有[Q, W, E, R] 四个字符的字符串s且长度一定是 4的倍数&#xff0c; 需要你通过替换子串&#xff0c;使他变成一个「平衡字符…...

linux命令小结-查看日志命令

一、查看日志命令cat查看文件 vi编辑后可以用cat进行查看保存是否成功1&#xff09;cat -n alert_monitor.log2&#xff09;cat -n alert_monitor.log | tail -n 100 | head -n 20 //查询100行之后的日志&#xff0c;且在100行之后里再查前20条日志more 可以通过回撤键翻页mor…...

Java知识点细节简易汇总——(8)枚举和注解+Java面向对象高级作业

一、枚举 自定义枚举 当我们使用 enum 关键字开发一个枚举类时&#xff0c;默认会继承 Enum 类, 而且是一个 final 类[如何证明],老师使用 javap 工具来演示传统的 public static final Season2 SPRING new Season2(“春天”, “温暖”); 简化成 SPRING(“春天”, “温暖”)…...

快速上手JVM- Java Virtual Machine面试不用慌

一、JVM的定义 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后&#xff0c;J…...

安警官的IP地址是怎样定位到莽村附近的?

要说最近大火的电视剧非《狂飙》莫属。电视剧《狂飙》自开播以来&#xff0c;一举超过《三体》《去有风的地方》等先播电视剧&#xff0c;收视率一路“狂飙”&#xff0c;牢牢占据近期的收视冠军。 在剧中&#xff0c;张译扮演一名坚持公平、正义与理想的人民警察“安欣”&…...

STL中重要容器vector总结

你要尽全力保护你的梦想。那些嘲笑你的人&#xff0c;他们必定会失败&#xff0c;他们想把你变成和他们一样的人。如果你有梦想的话&#xff0c;就要努力去实现。 ——《当幸福来敲门》引言&#xff1a;C中STL里面的容器用法很巧妙&#xff0c;可以解决很多复杂的模型&#xff…...

11_会话原理与实现流程

1、会话的基本知识 # 会话## 1.会话是什么&#xff1f;客户端与服务器之间的对话交流## 2.为什么需要会话&#xff1f;-http 协议是无状态的&#xff08;六亲不认&#xff09;-同一用户多次访问同一网站&#xff0c;对网站来说&#xff0c;每次都是全新的-网站不能识别用户身份…...

Java测试——junit的使用(2)

排序 我们同一个类下的多个用例的执行顺序是不确定的&#xff0c;如果需要指定固定的顺序&#xff0c;则需要在类上加这个注解 TestMethodOrder(MethodOrderer.OrderAnnotation.class)然后在想要第一个执行的用例上加上 Order(1)第二个执行的用例上注解&#xff1a; Order(…...

数据库(六): MySQL的主从复制和读写分离

文章目录一、为什么要使用主从复制和读写分离二、主从复制的原理三、如何实现主从复制3.1 master配置3.2 slave配置3.3 测试主从复制四、读写分离五、缺点一、为什么要使用主从复制和读写分离 注意到主从复制和读写分离一般是一起使用的。目的很简单&#xff0c;就是提高数据库…...

编程思想-0x00架构

产生架构的原因&#xff1f; 1、代码均摊 将不同的代码进行分块&#xff0c;然后简历联系&#xff0c;低耦合、高内聚&#xff1b; 原则上&#xff1a;合理的App架构应该是合理分配每个类、结构体、方法、变量的存在都应该遵循单一职责的原则 2、便于测试 测试确保代码质量&…...

QCon演讲实录(上):多云环境下应用管理与交付实践

作者&#xff1a;阿里云大数据基础工程技术团队——郭耀星 大家上午好&#xff01;我是来自阿里云大数据基础工程技术团队的郭耀星&#xff0c;花名雪尧。今天我很高兴能够来到QCon&#xff0c;与大家分享我的经验和心得。在当前的多云环境中&#xff0c;作为运维支撑团队&…...

async thunk 解决 API 调用的依赖问题

async thunk 解决 API 调用的依赖问题 一句话节省看下面一堆内容的时间就是&#xff1a; async thunk 中可以使用 async/await 锁住其他的 action 操作 一般 API 之间存在三种情况&#xff1a; A 和 B 之间没有依赖关系 这样的情况下&#xff0c;A 和 B 可以各调用各的&#x…...

java 黑马头条 day3 实名认证分布式事务问题 seata

1 完善实名认证功能 1.1 实名认证分布式事务问题 1.1.1 问题分析 在昨天的实名认证代码中&#xff0c;审核完毕后添加 id5的演示异常&#xff0c;重新使用postman进行测试, 会发现 出现异常后 本地方法因为有 Transactional注解 对ap_user ap_user_realname的操作会回滚 而…...

旅游网站的设计的前提/上海有什么seo公司

一、背景服务器上放了很多MySQL数据库&#xff0c;为了安全&#xff0c;现在需要做Master/Slave方案&#xff0c;因为操作系统是Window的&#xff0c;所以没有办法使用keepalived这个HA工具&#xff0c;但是我们可以接受人工进行切换&#xff0c;有什么好的方案呢&#xff1f;二…...

网站开发技术方案与设施/优化推广网站推荐

字面量创建 var girlFriend1 {"name":"如花","age":80,"height":150,"weight":150} console.log(girlFriend1); console.log(girlFriend1.name);优点&#xff1a;直观 缺点&#xff1a;代码冗余&#xff0c;适合创建单个对…...

广州白云区疫情/商丘seo外包

在网站中嵌入动画已成为近年来的一个设计趋势&#xff0c;许多公司都已开始转向并拥抱HTML5、CSS3和JavaScript这个技术“三人组”。尽管这些技术还不能制作一些非常复杂的动画&#xff08;像flash所实现的&#xff09;&#xff0c;但是如果拥有好的想法及创造性思维&#xff0…...

公司网站建设维护/百度收录查询工具

安装JUnit 使用快捷键 ctrl shift s 或点击 File->Settings 点击 Plugins 查看插件 点击下方 Browse repositories… 查找插件 在搜索栏输入 JUnitGenerator V2.0&#xff0c;点击 install 安装 &#xff0c;如果没有 install 按钮证明你已经安装过了&#xff0c;可以在…...

江苏网站建设渠道/汉中网络推广

涉及的知识点 css实现元素背景色从左侧滑动到右侧 :root、var原声JS操作class 介绍 展示由若干个节点组成的步骤进度条&#xff0c;可以进入上一节点或者返回上一节点&#xff0c;切换时相应节点样式会发生改变。 代码 html: <div id"step-container">&…...

怎么做公司网站需要什么科目/网店如何推广

2017年开始&#xff0c;NVMe协议M.2固态硬盘产品大量出现&#xff0c;逐渐取代了SATA协议固态硬盘&#xff0c;成为众多装机用户的首选存储方案。同时&#xff0c;随着硬盘产品价格回落&#xff0c;大容量固态硬盘的价格逐渐来到合理价位&#xff0c;再加上现如今用户对于存储容…...