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

数据结构——通讯录(顺序表的实战项目)

(—).通讯录的功能

大家应该都十分了解通讯录的功能吧,无非就是对联系人的增添删除,还有信息的修改,并且联系人信息要包含名字,电话,性别,地址等。我把通讯录的功能总结如下:

1)⾄少能够存储100个⼈的通讯信息

2)能够保存⽤⼾信息:名字、性别、年龄、电话、地址等

3)增加联系⼈信息

4)删除指定联系⼈

5)查找制定联系⼈

6)修改指定联系⼈

7)显⽰联系⼈信息

接下来我们就根据以上信息进行代码的实现。

(二).通讯录的代码实现

2.1定义结构体

//通讯录头文件
#define NAME_MAX 20
#define GENDER_MAX 10
#define AGE_MAX 100
#define TEL_MAX 20
#define ADDRESS_MAX 20//定义联系人数据结构
//名字 性别 年龄 电话 地址
typedef struct personInfo 
{char name[NAME_MAX];char gender[GENDER_MAX];int  age;char tel[TEL_MAX];char address[ADDRESS_MAX];}peoInfo;

2.2通讯录的初始化

//通讯录的初始化,实际上就是顺序表的初始化,这里的con就是sl
void ContactInit(Contact* con)
{SLInit(con);
}//这里通讯录的初始化实际上就是顺序表的初始化
//顺序表初始化
void SLInit(SL* s)
{s->arr = NULL;s->size = s->capacity = 0;
}

2.3通讯录的销毁

//通讯录的销毁
void ContactDestory(Contact* con)
{SLDestroy(con);
}//同样这里通讯录的销毁实际上就是顺序表的销毁//顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->size = 0;
}

2.4通讯录的添加数据

//通讯录的添加数据
void ContactAdd(Contact* con)
{//获取用户输入的内容:名字 性别 年龄 电话 地址peoInfo Info;printf("请输入要添加的联系人的名字:\n");scanf("%s", Info.name);printf("请输入要添加的联系人的性别:\n");scanf("%s", Info.gender);printf("请输入要添加的联系人的年龄:\n");scanf("%d", &Info.age);printf("请输入要添加的联系人的电话:\n");scanf("%s", Info.tel);printf("请输入要添加的联系人的地址:\n");scanf("%s", Info.address);//往通讯录中添加联系人数据SLPushBack(con, Info);}void SLPushBack(SL* ps, SLDataType x)
{//首先要判断空间够不够assert(ps);//断言ps不为空指针SLCheckcapacity(ps);/*ps->arr[ps->size] = x;ps->size++;*/ps->arr[ps->size++] = x;
}//判断内存空间够不够
void SLCheckcapacity(SL* ps)
{if (ps->size == ps->capacity){//三目表达式int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//对顺序表进行成倍的扩充SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("ralloc fail!");return 1;}ps->arr = tmp;ps->capacity = newcapacity;}
}

 当然这里进行通讯录数据的添加我们使用顺序表的头插,尾插,在任意位置插入都是可以的,这里我选择的尾插。

2.5通讯录的删除数据

//通讯录的删除数据
void ContactDel(Contact* con)
{//要删除的信息必须要存在,才能进行删除操作char name[NAME_MAX];printf("请输入要删除联系人姓名:");scanf("%s", name);int Find=Findbyname(con, name);if (Find < 0){printf("要删除的信息不存在!\n");return;}SLErase(con, Find);printf("删除成功!\n");}
//在任意位置删除
void SLErase(SL* ps, int pos){assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

2.6通讯录的修改

//通讯录的修改
void ContactModify(Contact* con)
{char name[NAME_MAX];printf("请输入要修改用户名的名字:\n");scanf("%s", name);int Find = Findbyname(con, name);if (Find < 0){printf("要删除的信息不存在!\n");return;}printf("请输入新的名字:\n");scanf("%s", con->arr[Find].name);printf("请输入新的性别:\n");scanf("%s", con->arr[Find].gender);printf("请输入新的年龄:\n");scanf("%d", &con->arr[Find].age);printf("请输入新的电话:\n");scanf("%s", con->arr[Find].tel);printf("请输入新的地址:\n");scanf("%s", con->arr[Find].address);}Findbyname(Contact* con,char name[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].name, name)){return i;}}return -1;}

2.7通讯录的查找

Findbyname(Contact* con,char name[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].name, name)){return i;}}return -1;}//通讯录的查找
void ContactFind(Contact* con)
{char name[NAME_MAX];printf("请输入要查找联系人的名字:\n");scanf("%s", name);int Find = Findbyname(con, name);if (Find < 0){printf("要删除的信息不存在!\n");return;}printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%3s %5s %4d %4s %4s\n",con->arr[Find].name,con->arr[Find].gender,con->arr[Find].age,con->arr[Find].tel,con->arr[Find].address);}

2.8展示通讯录数据

//展示通讯录数据
void ContactShow(Contact* con)
{printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");for (int i = 0; i < con->size; i++){printf("%3s %5s %4d %4s %4s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].address);}
}

2.9通讯录代码实现汇总

SqList.h:

#pragma once
//SeqList.h进行顺序表结构的声明
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"
//创建结构体
//静态结构体
//struct seqlist 
//{
//	int arr[100];
//	int size;
//};typedef peoInfo SLDataType;
//动态结构体
typedef struct SeqList
{SLDataType* arr;int size;//有效数据的个数int capacity;//顺序表的大小
}SL;//初始化顺序表
void SLInit(SL* ps);
//销毁顺序表
void SLDestroy(SL* ps);
//打印代码
void SLPrint(SL ps);//头部插⼊删除 / 尾部插⼊删除//尾部插入
void SLPushBack(SL* ps, SLDataType x);
//头部插入
void SLPushFront(SL* ps, SLDataType x);//头部删除
void SLPopFront(SL* ps);
//尾部删除
void SLPopBack(SL* ps);
//任意位置插入
void SLInsert(SL* ps, int pos, SLDataType x);
//任意位置删除
void SLErase(SL* ps, int pos);
//查找数据
int SLFind(SL* ps, SLDataType x);

Contact.h:

#pragma once
//通讯录头文件
#define NAME_MAX 20
#define GENDER_MAX 10
#define AGE_MAX 100
#define TEL_MAX 20
#define ADDRESS_MAX 20//定义联系人数据结构
//名字 性别 年龄 电话 地址
typedef struct personInfo 
{char name[NAME_MAX];char gender[GENDER_MAX];int  age;char tel[TEL_MAX];char address[ADDRESS_MAX];}peoInfo;//要用到顺序表的相关方法,对通讯录的操作实际上是对顺序表进行操作
//给顺序表起个名字叫通讯录
typedef struct SeqList Contact;//重新对顺序表起名叫通讯录//通讯录实现的方法//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDestory(Contact* con);
//通讯录的添加数据
void ContactAdd(Contact* con);
//通讯录的删除数据
void ContactDel(Contact* con);
//通讯录的修改
void ContactModify(Contact* con);
//通讯录的查找
void ContactFind(Contact* con);
//展示通讯录数据
void ContactShow(Contact* con);

SqList.c:

//进行顺序表的实现
#include"SeqList.h";
//顺序表初始化
void SLInit(SL* s)
{s->arr = NULL;s->size = s->capacity = 0;
}
//顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->size = 0;
}//判断内存空间够不够
void SLCheckcapacity(SL* ps)
{if (ps->size == ps->capacity){//三目表达式int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//对顺序表进行成倍的扩充SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("ralloc fail!");return 1;}ps->arr = tmp;ps->capacity = newcapacity;}
}//尾插
void SLPushBack(SL* ps, SLDataType x)
{//首先要判断空间够不够assert(ps);//断言ps不为空指针SLCheckcapacity(ps);/*ps->arr[ps->size] = x;ps->size++;*/ps->arr[ps->size++] = x;
}//头插
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckcapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}
//打印
//void SLPrint(SL ps)
//{
//	for (int i = 0; i < ps.size; i++)
//	{
//		printf("%d ", ps.arr[i]);
//	}
//	printf("\n");
//}
//尾删
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);/*ps->arr[ps->size - 1] = -1;*/--ps->size;
}//头删
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}//任意位置插入
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckcapacity(ps);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;}//在任意位置删除
void SLErase(SL* ps, int pos){assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//查找数据
//int SLFind(SL* ps, SLDataType x)
//{
//	assert(ps);
//	for (int i = 0; i < ps->size; i++)
//	{
//		if (ps->arr[i] == x)
//		{
//			return i;
//		}
//	}
//	return -1;
//}

 Contact.c:

#define _CRT_SECURE_NO_WARNINGS 1#include"SeqList.h"
#include"Contact.h"//通讯录的初始化,实际上就是顺序表的初始化,这里的con就是sl
void ContactInit(Contact* con)
{SLInit(con);
}//通讯录的销毁
void ContactDestory(Contact* con)
{SLDestroy(con);
}//通讯录的添加数据
void ContactAdd(Contact* con)
{//获取用户输入的内容:名字 性别 年龄 电话 地址peoInfo Info;printf("请输入要添加的联系人的名字:\n");scanf("%s", Info.name);printf("请输入要添加的联系人的性别:\n");scanf("%s", Info.gender);printf("请输入要添加的联系人的年龄:\n");scanf("%d", &Info.age);printf("请输入要添加的联系人的电话:\n");scanf("%s", Info.tel);printf("请输入要添加的联系人的地址:\n");scanf("%s", Info.address);//往通讯录中添加联系人数据SLPushBack(con, Info);}Findbyname(Contact* con,char name[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].name, name)){return i;}}return -1;}
//通讯录的删除数据
void ContactDel(Contact* con)
{//要删除的信息必须要存在,才能进行删除操作char name[NAME_MAX];printf("请输入要删除联系人姓名:");scanf("%s", name);int Find=Findbyname(con, name);if (Find < 0){printf("要删除的信息不存在!\n");return;}SLErase(con, Find);printf("删除成功!\n");}//展示通讯录数据
void ContactShow(Contact* con)
{printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");for (int i = 0; i < con->size; i++){printf("%3s %5s %4d %4s %4s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].address);}
}//通讯录的修改
void ContactModify(Contact* con)
{char name[NAME_MAX];printf("请输入要修改用户名的名字:\n");scanf("%s", name);int Find = Findbyname(con, name);if (Find < 0){printf("要删除的信息不存在!\n");return;}printf("请输入新的名字:\n");scanf("%s", con->arr[Find].name);printf("请输入新的性别:\n");scanf("%s", con->arr[Find].gender);printf("请输入新的年龄:\n");scanf("%d", &con->arr[Find].age);printf("请输入新的电话:\n");scanf("%s", con->arr[Find].tel);printf("请输入新的地址:\n");scanf("%s", con->arr[Find].address);}
//通讯录的查找
void ContactFind(Contact* con)
{char name[NAME_MAX];printf("请输入要查找联系人的名字:\n");scanf("%s", name);int Find = Findbyname(con, name);if (Find < 0){printf("要删除的信息不存在!\n");return;}printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%3s %5s %4d %4s %4s\n",con->arr[Find].name,con->arr[Find].gender,con->arr[Find].age,con->arr[Find].tel,con->arr[Find].address);}

test.c:

#define _CRT_SECURE_NO_WARNINGS 1#include"SeqList.h"
#include"Contact.h"//通讯录的初始化,实际上就是顺序表的初始化,这里的con就是sl
void ContactInit(Contact* con)
{SLInit(con);
}//通讯录的销毁
void ContactDestory(Contact* con)
{SLDestroy(con);
}//通讯录的添加数据
void ContactAdd(Contact* con)
{//获取用户输入的内容:名字 性别 年龄 电话 地址peoInfo Info;printf("请输入要添加的联系人的名字:\n");scanf("%s", Info.name);printf("请输入要添加的联系人的性别:\n");scanf("%s", Info.gender);printf("请输入要添加的联系人的年龄:\n");scanf("%d", &Info.age);printf("请输入要添加的联系人的电话:\n");scanf("%s", Info.tel);printf("请输入要添加的联系人的地址:\n");scanf("%s", Info.address);//往通讯录中添加联系人数据SLPushBack(con, Info);}Findbyname(Contact* con,char name[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].name, name)){return i;}}return -1;}
//通讯录的删除数据
void ContactDel(Contact* con)
{//要删除的信息必须要存在,才能进行删除操作char name[NAME_MAX];printf("请输入要删除联系人姓名:");scanf("%s", name);int Find=Findbyname(con, name);if (Find < 0){printf("要删除的信息不存在!\n");return;}SLErase(con, Find);printf("删除成功!\n");}//展示通讯录数据
void ContactShow(Contact* con)
{printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");for (int i = 0; i < con->size; i++){printf("%3s %5s %4d %4s %4s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].address);}
}//通讯录的修改
void ContactModify(Contact* con)
{char name[NAME_MAX];printf("请输入要修改用户名的名字:\n");scanf("%s", name);int Find = Findbyname(con, name);if (Find < 0){printf("要删除的信息不存在!\n");return;}printf("请输入新的名字:\n");scanf("%s", con->arr[Find].name);printf("请输入新的性别:\n");scanf("%s", con->arr[Find].gender);printf("请输入新的年龄:\n");scanf("%d", &con->arr[Find].age);printf("请输入新的电话:\n");scanf("%s", con->arr[Find].tel);printf("请输入新的地址:\n");scanf("%s", con->arr[Find].address);}
//通讯录的查找
void ContactFind(Contact* con)
{char name[NAME_MAX];printf("请输入要查找联系人的名字:\n");scanf("%s", name);int Find = Findbyname(con, name);if (Find < 0){printf("要删除的信息不存在!\n");return;}printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%3s %5s %4d %4s %4s\n",con->arr[Find].name,con->arr[Find].gender,con->arr[Find].age,con->arr[Find].tel,con->arr[Find].address);}

 好了,各位大佬们,以上就是我对通讯录知识的全部讲解,如果有什么不对的地方还请各位大佬们指出,如果觉得小编写的还不错的话,您的免费一键三连将是对小编最大的支持!谢谢大家!后面我也一定会持续更新为大家提供更加高质量的作品!

相关文章:

数据结构——通讯录(顺序表的实战项目)

&#xff08;—&#xff09;.通讯录的功能 大家应该都十分了解通讯录的功能吧&#xff0c;无非就是对联系人的增添删除&#xff0c;还有信息的修改&#xff0c;并且联系人信息要包含名字&#xff0c;电话&#xff0c;性别&#xff0c;地址等。我把通讯录的功能总结如下&#x…...

数据库-Redis(14)

目录 66.Redis为什么主从全量复制使用RDB而不是使用AOF? 67.Redis为什么还有无磁盘复制模式? 68.Redis为什么还会有从库的从库设计?...

Thinkphp5.0命令行创建验证器validate类

前言 最近接手了个用FastAdmin&#xff08;基于tp5&#xff09;写的项目&#xff0c;发现命令行只提供生成controller和model的命令&#xff0c;没有提供make:validate命令&#xff0c;而5.1及以上版本是有的&#xff0c;对于使用tp5.0框架或者基于tp5.0的第三框架&#xff08…...

人民网至顶科技:《开启智能新时代:2024中国AI大模型产业发展报告发布》

​3月26日&#xff0c;人民网财经研究院与至顶科技联合发布《开启智能新时代&#xff1a;2024年中国AI大模型产业发展报告》。该报告针对AI大模型产业发展背景、产业发展现状、典型案例、挑战及未来趋势等方面进行了系统全面的梳理&#xff0c;为政府部门、行业从业者以及社会公…...

AI大模型探索之路-应用篇13:企业AI大模型选型指南

目录 前言 一、概述 二、有哪些主流模型&#xff1f; 三、模型参数怎么选&#xff1f; 四、参数有什么作用&#xff1f; 五、CPU和GPU怎么选&#xff1f; 六、GPU和显卡有什么关系&#xff1f; 七、GPU主流厂商有哪些&#xff1f; 1、NVIDIA芯片怎么选&#xff1f; 2、…...

【安全】查杀linux上c3pool挖矿病毒xmrig

挖矿平台&#xff1a;猫池 病毒来源安装脚本 cat /root/c3pool/config.jsoncrontab -r cd /root/c3poolcurl -s -L http://download.c3pool.org/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALLen_US.UTF-8 bash -s 44SLpuV4U7gB6RNZMCweHxWug7b1YUir4jLr3RBaVX33Qxj…...

车载测试:UDS之BootLoader刷写

BootLoader刷写 本文章是花费3小时结合多个项目实践总结和整体出来的&#xff0c;欢迎大家交流&#xff01; BootLoader刷写章节 ①&#xff1a;预编程步骤流程流程图 1.1 概述 1.2 流程步骤描述 1&#xff09;整车ECU进入扩展会话 2&#xff09;刷…...

OpenHarmony实战开发-MpChart图表实现案例。

介绍 MpChart是一个包含各种类型图表的图表库&#xff0c;主要用于业务数据汇总&#xff0c;例如销售数据走势图&#xff0c;股价走势图等场景中使用&#xff0c;方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示&#xf…...

brpc: bthread使用

使用bthread并发编程 #include <gflags/gflags.h> #include <butil/logging.h> #include <bthread/bthread.h>static void* func(void* args) {std::string* num static_cast<std::string*>(args);for(int i 0; i < 5; i) {LOG(INFO) << *…...

H.265视频直播点播录像EasyPlayer.js流媒体播放器用户常见问题及解答

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…...

蓝桥杯杂题选做

海盗分金币 题目链接&#xff1a;1.海盗分金币 - 蓝桥云课 (lanqiao.cn) 题解&#xff1a;海盗分金币-Cheery的代码 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a;倒着想就行。 等腰三角形 题目链接&#xff1a;1.等腰三角形 - 蓝桥云课 (lanqiao.cn) 题解&#xff1a;等腰三…...

【HTML】简单制作一个分形动画

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;其中HTML的文件名改为[index.html]&a…...

JVM修炼之路【11】- 解决内存溢出、内存泄漏 以及相关案例

前面的10篇 都是基础的知识&#xff0c;包括类加载的过程 类加载的细节&#xff0c;jvm内存模型 垃圾回收 等等&#xff0c; 这一篇我们开始实战了解一下 各种疑难杂症&#xff1a;怎么监控 怎么发现 怎么解决 内存溢出 内存泄漏 这两个概念在垃圾回收器里面已经讲过了&#…...

Java面试题:描述Java 17中的密封接口及其用途

Java 17是继Java 11和Java 16之后的又一个长期支持&#xff08;LTS&#xff09;版本&#xff0c;它于2021年9月发布。在Java 17中&#xff0c;一个重要的新特性是密封接口&#xff08;Sealed Interfaces&#xff09;&#xff0c;这是对Java接口的增强&#xff0c;它允许接口有更…...

C++11的新特性

C11是由C标准委员会指定的语言规范。相比于C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140 个新特性&#xff0c;以及对C03标准中约600个缺陷的修正&#xff0c;C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全&#xff0c;…...

【C语言__动态内存管理__复习篇6】

目录 前言 一、动态内存管理 二、动态内存函数 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL 3.2 越界访问动态内存空间 3.3 对非动态开辟的内存使用free释放 3.4 使用free只释放了…...

C语言 | Leetcode C语言题解之第30题串联所有单词的子串

题目&#xff1a; 题解&#xff1a; typedef struct {char key[32];int val;UT_hash_handle hh; } HashItem;int* findSubstring(char * s, char ** words, int wordsSize, int* returnSize){ int m wordsSize, n strlen(words[0]), ls strlen(s);int *res (int *)mall…...

大数据dolphinscheduler 本地容器化安装

Minio 容器安装 docker run -p 9000:9000 -p 9090:9090 --name minio -d -e "MINIO_ACCESS_KEYminioadmin" -e "MINIO_SECRET_KEYminioadmin" -v D:\SF\DOCKER\minio\data:/data -v D:\SF\DOCKER\minio\config:/root/.minio minio/minio server /da…...

简单的车牌号识别

目录 处理流程与界面各接口编写时遇到的一些问题上传图片识别结果标签显示中文 处理流程与界面 首先点击“上传图片”按钮&#xff0c;可以选择文件夹中含有汽车车牌的图片&#xff0c;并显示在“图片框”中。 点击“检测车牌”按钮&#xff0c;会先对“图片框”中即含有汽车车…...

openGauss学习笔记-261 openGauss性能调优-使用Plan Hint进行调优-将部分Error降级为Warning的Hint

文章目录 openGauss学习笔记-261 openGauss性能调优-使用Plan Hint进行调优-将部分Error降级为Warning的Hint261.1 功能描述261.2 语法格式261.3 示例261.3.1 忽略非空约束261.3.2 忽略唯一约束261.3.3 忽略分区表无法匹配到合法分区261.3.4 更新/插入值向目标列类型转换失败 o…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...