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

【C++】通讯录的基本实现,附有源码分享


目录

1、运行环境

2、系统实现功能

2.1菜单功能

2.2退出通讯录功能

2.3添加联系人功能

2.4显示联系人功能

2.5删除联系人功能

2.6查找联系人功能

2.7修改联系人功能

2.8清空联系人功能

2.9动态扩容功能

2.10选择优化功能

2.11文件操作

3、源码分享


1、运行环境

运行环境为:Visual Studio 2022

2、系统实现功能

  • 菜单功能:简单的人机交互菜单
  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人信息
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有信息
  • 退出通讯录:退出当前使用的通讯录
  • 动态扩容:动态扩容通讯录保存的上限人数
  • 选择优化:使用枚举常量优化switch
  • 文件操作:文件保存数据,读取文件数据

实现各种功能之前需要提供关于通讯录的结构体定义,该系统提出人的信息包括姓名,性别,年龄,联系电话和家庭住址,根据上述要求就可以定义出下面相关的结构体,数据大小使用宏定义定义,定义后的结构体用typedef关键字重命名,这样实现看起来更规范一点:

#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30typedef struct PeoInFo
{char name[MAX_NAME];char sex[MAX_SEX];int age;char tele[MAX_TELE];char addr[MAX_ADDR];
}PeoInFo;

有了通讯录人的结构体之后,还需要一个管理结构体,这个管理结构体需要包含人的信息,通讯录当前的个数,通讯录的最大容量:

typedef struct Contact
{PeoInFo *data;		//指向动态申请的空间,用来存放联系人的信息int sz;				//记录的是当前通讯录中有效信息的个数int capacity;		//记录当前通讯录的最大容量
}Contact;

2.1菜单功能

百度百科的解释:

菜单最初指餐馆提供的列有各种菜肴的清单。现引申指电子计算机程序进行中出现在显示屏上的选项列表,也指各种服务项目的清单等,含义更为广泛。广义的菜单是指餐厅中一切与该餐饮企业产品、价格及服务有关的信息资料,它不仅包含各种文字图片资料、声像资料以及模型与实物资料,甚至还包括顾客点菜后服务员所写的点菜单。狭义的菜单则指的是餐饮企业为便于顾客点菜订餐而准备的介绍该企业产品、服务与价格等内容的各种印刷品。

菜单功能:为了方便人去选择功能使用

//1、显示菜单界面
void menu()
{cout << "***********************" << endl;cout << "*****1、添加联系人*****" << endl;cout << "*****2、显示联系人*****" << endl;cout << "*****3、删除联系人*****" << endl;cout << "*****4、查找联系人*****" << endl;cout << "*****5、修改联系人*****" << endl;cout << "*****6、清空联系人*****" << endl;cout << "*****0、退出通讯录*****" << endl;cout << "***********************" << endl;
}

2.2退出通讯录功能

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择0时候,执行退出,选择其他先不做操作,也不会退出程序

	int input = 0;do{menu();cout << "请输入:>";cin >> input;switch (input){case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;case 0:cout << "退出通讯录" << endl;break;default:cout << "选择错误, 重新选择" << endl;break;}} while (input);

2.3添加联系人功能

功能描述: 向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭地址)最多记录4人

实现步骤:设计初始化通讯录函数,主函数初始化通讯录,设计添加联系人功能,在循环中的对应case下使用该函数

//初始化通讯录功能
void InitContact(Contact* pc)
{pc->data = (PeoInFo*)malloc(DEFAULT_SZ * sizeof(PeoInFo));if (pc->data == NULL){return;}pc->sz = 0;pc->capacity = DEFAULT_SZ;
}//添加联系人功能
void AddContact(Contact* pc)
{if (pc->sz == MAX){cout << "通讯录已满,无法添加" << endl;return;}//增加一个人的信息cout << "请输入名字:>" << endl;cin >> pc->data[pc->sz].name;cout << "请输入年龄:>" << endl;cin >> pc->data[pc->sz].age;cout << "请输入性别:>" << endl;cin >> pc->data[pc->sz].sex;cout <<  "请输入电话:>" << endl;cin >> pc->data[pc->sz].tele;cout <<  "请输入地址:>" << endl;cin >> pc->data[pc->sz].addr;pc->sz++;printf("增加成功\n");
}

 

2.4显示联系人功能

功能描述:显示通讯录中已有的联系人信息

在每个功能写完之后,我们都需要测试该功能是否实现,这个时候就需要写出显示函数来查看我们的执行操作和功能函数是否正确运行了:

//显示通讯录功能
void PrintContact(const Contact* pc)
{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//打印数据for (i = 0; i < pc->sz; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}

2.5删除联系人功能

功能描述:按照姓名进行删除指定联系人

实现步骤:添加一些联系人后,删除指定联系人,利用显示联系人功能函数测试该功能是否正确实现

//删除通讯录信息功能
void DelectContact(Contact* pc)
{char name[MAX_NAME] = { 0 };if (pc->sz == 0){printf("通讯录为空!\n");return;}cout << "请输入要删除的人的名字:>";cin >> name;int pos = -1;for (int i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){pos = i;break;}}if (pos == -1){cout << "要删除的人不存在!" << endl;return;}else{int i = 0;for (i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}}pc->sz--;cout << "删除成功!" << endl;
}

其中可以把查找名字的部分代码封装成找下标的函数:

//查找通讯录指定联系人下标功能
int FindByContact(Contact* pc, char name[])
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}

2.6查找联系人功能

功能描述:按照姓名查看指定联系人信息

实现步骤:设计查找联系人函数,然后测试该功能的作用是否正确实现

//查找通讯录联系人功能
void SeacherContact(Contact* pc)
{char name[MAX_NAME] = { 0 };cout << "请输入要查找的人的名字:>" << endl;cin >> name;int pos = FindByContact(pc, name);if (pos == -1){cout << "要查找的人不存在!" << endl;return;}else{printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//打印数据printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[pos].name, pc->data[pos].age,pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);}
}

2.7修改联系人功能

功能描述:按照姓名重新修改指定联系人

实现步骤:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人

//更改通讯录联系人信息
void ModifyContact(Contact* pc)
{char name[MAX_NAME] = { 0 };cout << "请输入要修改的人的名字:>";cin >> name;int pos = FindByContact(pc, name);if (pos == -1){cout << "要修改的人不存在!" << endl;return;}else{cout << "请输入名字:>" << endl;cin >>  pc->data[pos].name;cout << "请输入年龄:>" << endl;cin >> pc->data[pos].age;cout << "请输入性别:>" << endl;cin >> pc->data[pos].sex;cout << "请输入电话:>" << endl;cin >> pc->data[pos].tele;cout << "请输入地址:>" << endl;cin >> pc->data[pos].addr;cout << "修改成功!" << endl;}
}

2.8清空联系人功能

功能描述:销毁通讯录

//销毁通讯录
void DestoryContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->sz = 0;pc->capacity = 0;
}

2.9动态扩容功能

由于,第一次初始化的时候规定了通讯录的上限人数,但这样有可能会出现人数超过的极端情况,而且在少数联系人的时候会浪费开辟的内存空间,不如改成动态开辟内存空间来的方便和有益:

void CheckContact(Contact* pc)
{if (pc->sz == pc->capacity){PeoInFo* ptr = (PeoInFo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInFo));if (ptr != NULL){pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功!\n");}else{return;}}
}//添加联系人功能
void AddContact(Contact* pc)
{//增容CheckContact(pc);if (pc->sz == MAX){cout << "通讯录已满,无法添加" << endl;return;}//增加一个人的信息cout << "请输入名字:>" << endl;cin >> pc->data[pc->sz].name;cout << "请输入年龄:>" << endl;cin >> pc->data[pc->sz].age;cout << "请输入性别:>" << endl;cin >> pc->data[pc->sz].sex;cout << "请输入电话:>" << endl;cin >> pc->data[pc->sz].tele;cout << "请输入地址:>" << endl;cin >> pc->data[pc->sz].addr;pc->sz++;printf("增加成功\n");
}

2.10选择优化功能

学了枚举之后,枚举常量可以用在switch语句中

enum Option
{EXIT,ADD,PRINT,DEL,SEARCH,MODIFY,DESTORYAVE
};switch (input){case ADD://增加人的信息AddContact(&con);break;case PRINT://显示人的信息PrintContact(&con);break;case DEL://删除人的信息DelectContact(&con);break;case SEARCH://查找人的信息SeacherContact(&con);break;case MODIFY://更改人的信息ModifyContact(&con);break;case DESTORY://清空通讯录信息SaveContact(&con);break;case 0:cout << "退出通讯录" << endl;break;default:cout << "选择错误, 重新选择" << endl;break;}

2.11文件操作

如果没有文件操作,那么我们每次运行程序都需要重新输入数据,这未免太麻烦了。我们可以把我们输入的数据输出到文件里面保存起来,每次运行程序之后都从保存数据的文件读取出所有通讯录数据:

//保存通讯录到文件功能
void SaveContact(Contact* pc)
{FILE* pf;if (fopen_s(&pf, "contact.txt", "w")){return;}int i = 0;for (i = 0; i < pc->sz; i++){fwrite(pc->data + i, sizeof(PeoInFo), 1, pf);}fclose(pf);pf = NULL;
}//读取通讯录文件内容
void LoadContact(Contact* pc)
{FILE* pf; if (fopen_s(&pf, "contact.txt", "r")){return;}PeoInFo tmp = { 0 };while (fread(&tmp, sizeof(PeoInFo), 1, pf)){//检测容量CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL;
}

3、源码分享

//test.cpp
#include "Contact.h"
int main(void)
{int input = 0;char name[1024] = { 0 };//创建通讯录Contact con;InitContact(&con);LoadContact(&con);do{menu();cout << "请输入:>";cin >> input;switch (input){case ADD://增加人的信息AddContact(&con);break;case PRINT://显示人的信息PrintContact(&con);break;case DEL://删除人的信息DelectContact(&con);break;case SEARCH://查找人的信息SeacherContact(&con);break;case MODIFY://更改人的信息ModifyContact(&con);break;case DESTORY://清空通讯录信息SaveContact(&con);DestoryContact(&con);break;case 0:SaveContact(&con);cout << "退出通讯录" << endl;break;default:cout << "选择错误, 重新选择" << endl;break;}} while (input);SaveContact(&con);return 0;
}
#pragma once
#include <iostream>
#include <cstdio>
#include <fstream>
#include <string>
using namespace std;#define DEFAULT_SZ 3
#define INC_SZ 2
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30typedef struct PeoInFo
{char name[MAX_NAME];char sex[MAX_SEX];int age;char tele[MAX_TELE];char addr[MAX_ADDR];
}PeoInFo;typedef struct Contact
{PeoInFo* data;		//指向动态申请的空间,用来存放联系人的信息int sz;				//记录的是当前通讯录中有效信息的个数int capacity;		//记录当前通讯录的最大容量
}Contact;enum Option
{EXIT,ADD,PRINT,DEL,SEARCH,MODIFY,DESTORY
};void menu();void InitContact(Contact* pc);void PrintContact(const Contact* pc);void DelectContact(Contact* pc);int FindByContact(Contact* pc, char name[]);void SeacherContact(Contact* pc);void ModifyContact(Contact* pc);void DestoryContact(Contact* pc);void CheckContact(Contact* pc);void AddContact(Contact* pc);void SaveContact(Contact* pc);void LoadContact(Contact* pc);
#include "Contact.h"//显示菜单界面
void menu()
{cout << "***********************" << endl;cout << "*****1、添加联系人*****" << endl;cout << "*****2、显示联系人*****" << endl;cout << "*****3、删除联系人*****" << endl;cout << "*****4、查找联系人*****" << endl;cout << "*****5、修改联系人*****" << endl;cout << "*****6、清空联系人*****" << endl;cout << "*****0、退出通讯录*****" << endl;cout << "***********************" << endl;
}//初始化通讯录功能
void InitContact(Contact* pc)
{pc->data = (PeoInFo*)malloc(DEFAULT_SZ * sizeof(PeoInFo));if (pc->data == NULL){return;}pc->sz = 0;pc->capacity = DEFAULT_SZ;
}//添加联系人功能
//void AddContact(Contact* pc)
//{
//	if (pc->sz == MAX)
//	{
//		cout << "通讯录已满,无法添加" << endl;
//		return;
//	}
//	//增加一个人的信息
//	cout << "请输入名字:>" << endl;
//	cin >> pc->data[pc->sz].name;
//	cout << "请输入年龄:>" << endl;
//	cin >> pc->data[pc->sz].age;
//	cout << "请输入性别:>" << endl;
//	cin >> pc->data[pc->sz].sex;
//	cout <<  "请输入电话:>" << endl;
//	cin >> pc->data[pc->sz].tele;
//	cout <<  "请输入地址:>" << endl;
//	cin >> pc->data[pc->sz].addr;
//
//	pc->sz++;
//	printf("增加成功\n");
//}//显示通讯录功能
void PrintContact(const Contact* pc)
{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//打印数据for (i = 0; i < pc->sz; i++){printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}//删除通讯录信息功能
void DelectContact(Contact* pc)
{char name[MAX_NAME] = { 0 };if (pc->sz == 0){printf("通讯录为空!\n");return;}cout << "请输入要删除的人的名字:>";cin >> name;int pos = -1;for (int i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){pos = i;break;}}if (pos == -1){cout << "要删除的人不存在!" << endl;return;}else{int i = 0;for (i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}}pc->sz--;cout << "删除成功!" << endl;
}//查找通讯录指定联系人下标功能
int FindByContact(Contact* pc, char name[])
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}//查找通讯录联系人功能
void SeacherContact(Contact* pc)
{char name[MAX_NAME] = { 0 };cout << "请输入要查找的人的名字:>" << endl;cin >> name;int pos = FindByContact(pc, name);if (pos == -1){cout << "要查找的人不存在!" << endl;return;}else{printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//打印数据printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n", pc->data[pos].name, pc->data[pos].age,pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);}
}//更改通讯录联系人信息
void ModifyContact(Contact* pc)
{char name[MAX_NAME] = { 0 };cout << "请输入要修改的人的名字:>";cin >> name;int pos = FindByContact(pc, name);if (pos == -1){cout << "要修改的人不存在!" << endl;return;}else{cout << "请输入名字:>" << endl;cin >> pc->data[pos].name;cout << "请输入年龄:>" << endl;cin >> pc->data[pos].age;cout << "请输入性别:>" << endl;cin >> pc->data[pos].sex;cout << "请输入电话:>" << endl;cin >> pc->data[pos].tele;cout << "请输入地址:>" << endl;cin >> pc->data[pos].addr;cout << "修改成功!" << endl;}
}//销毁通讯录
void DestoryContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->sz = 0;pc->capacity = 0;
}void CheckContact(Contact* pc)
{if (pc->sz == pc->capacity){PeoInFo* ptr = (PeoInFo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInFo));if (ptr != NULL){pc->data = ptr;pc->capacity += INC_SZ;cout << "增容成功!" << endl;}else{return;}}
}//添加联系人功能
void AddContact(Contact* pc)
{//增容CheckContact(pc);if (pc->sz == MAX){cout << "通讯录已满,无法添加" << endl;return;}//增加一个人的信息cout << "请输入名字:>" << endl;cin >> pc->data[pc->sz].name;cout << "请输入年龄:>" << endl;cin >> pc->data[pc->sz].age;cout << "请输入性别:>" << endl;cin >> pc->data[pc->sz].sex;cout << "请输入电话:>" << endl;cin >> pc->data[pc->sz].tele;cout << "请输入地址:>" << endl;cin >> pc->data[pc->sz].addr;pc->sz++;printf("增加成功\n");
}//保存通讯录到文件功能
void SaveContact(Contact* pc)
{FILE* pf;if (fopen_s(&pf, "contact.txt", "w")){return;}int i = 0;for (i = 0; i < pc->sz; i++){fwrite(pc->data + i, sizeof(PeoInFo), 1, pf);}fclose(pf);pf = NULL;
}//读取通讯录文件内容
void LoadContact(Contact* pc)
{FILE* pf; if (fopen_s(&pf, "contact.txt", "r")){return;}PeoInFo tmp = { 0 };while (fread(&tmp, sizeof(PeoInFo), 1, pf)){//检测容量CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL;
}

相关文章:

【C++】通讯录的基本实现,附有源码分享

目录 1、运行环境 2、系统实现功能 2.1菜单功能 2.2退出通讯录功能 2.3添加联系人功能 2.4显示联系人功能 2.5删除联系人功能 2.6查找联系人功能 2.7修改联系人功能 2.8清空联系人功能 2.9动态扩容功能 2.10选择优化功能 2.11文件操作 3、源码分享 1、运行环境 …...

UI 自动化测试 —— selenium的简单介绍和使用

selenium 是 web 应用中基于 UI 的自动化测试框架&#xff0c;支持多平台、多浏览器、多语言。 提到 UI 自动化就先了解什么是自动化测试&#xff1f; 目录 1. 自动化测试 2. UI 自动化 2.1 UI 自动化的特点 2.2 UI 自动化测试的优缺点 2.3 UI 自动化测试的使用对象 2.4…...

mybatisPlus中apply的使用以进行联表等复杂sql语句

在 MyBatis-Plus 中&#xff0c;apply() 方法可以用于添加任意的 SQL 片段&#xff0c;包括联表查询。因此&#xff0c;你可以使用 apply() 方法来处理各种类型的联表查询。 使用 apply() 方法的好处是可以在查询条件中直接添加原生的 SQL 片段&#xff0c;而不受 MyBatis-Plu…...

自学Python技术的方法

目录 一、Python技术介绍 二、学习前的准备工作 三、学习时的具体操作 四、如何巩固学习 Python是一种高级编程语言&#xff0c;被广泛用于软件开发、数据分析、人工智能和科学计算等领域。它于1991年由Guido van Rossum创建&#xff0c;并且其简洁、易读的语法以及丰富的标…...

python熟悉python基础语法,了解html网络结构,了解json格式数据,含有字符串

前言 Python网络爬虫是利用Python编写的程序&#xff0c;通过自动化地访问网页、解析html或json数据&#xff0c;并提取所需信息的技术。下面将详细介绍一些与Python网络爬虫相关的重要知识点。 1、Python基础语法&#xff1a; 变量和数据类型&#xff1a;学习如何声明变量以及…...

linux mail -s发送邮件异常解决

异常&#xff1a; Error initializing NSS: Unknown error -8015. "/root/dead.letter" 11/301 . . . message not sent. 出现此问题&#xff0c;大概率是和证书相关。如果没有安装证书&#xff0c;请先安装&#xff1a; 1&#xff0c;下载 yum -y install mailx …...

Netty核心技术七--Google Protobuf

1.编码和解码的基本介绍 编写网络应用程序时&#xff0c;因为数据在网络中传输的都是二进制字节码数据&#xff0c;在发送数据时就需要编码&#xff0c;接收数据时就需要解码 codec(编解码器) 的组成部分有两个&#xff1a;decoder(解码器)和encoder(编码器)。encoder 负责把…...

【Docker】Docker常用命令总结

文章目录 一、帮助命令二、镜像命令三、容器命令四、常用的其他命令 在开发过程中&#xff0c;经常涉及到 docker 的相关操作&#xff0c;本文对常用的指令进行汇总。 一、帮助命令 docker version # 显示docker版本信息 docker info # 显示docker系统信息&#xff…...

React 对比class与Effect Hook优化响应式数据更新监听,感受useEffect真正的强大

还是之前写过的一个组件 import React from "react"export default class index extends React.Component{constructor(props){super(props);this.state {name: "小猫猫"}}componentDidMount ()>{document.title this.state.name;}componentDidUpda…...

AWS Lambda 介绍

计算服务的演进 EC2------Container-------Lambda 虚拟机---容器--------------serverless无服务器架构 什么是AWS Lambda&#xff1f; AWS lambda的核心是事件驱动&#xff0c;驱动可能来自&#xff0c;Alexa,SNS&#xff0c;DynamoDB&#xff0c;S3&#xff0c;Kinesis等&…...

linux之权限管理

目录 1.一.基本小语句 2.文件权限操作chmod 1.一.基本小语句 ls - a 查看此文件夹所有和隐藏内容 ls - l 查看此文件夹权限 chown 改变文所有者 2.文件权限操作chmod chmod 参数 文件名 文件的权限主要针对三类对象进行定义   owner 属主, u:针对前三个部分的权限修改   …...

【设计模式与范式:行为型】61 | 策略模式(下):如何实现一个支持给不同大小文件排序的小程序?

上一节课&#xff0c;我们主要介绍了策略模式的原理和实现&#xff0c;以及如何利用策略模式来移除 if-else 或者 switch-case 分支判断逻辑。今天&#xff0c;我们结合“给文件排序”这样一个具体的例子&#xff0c;来详细讲一讲策略模式的设计意图和应用场景。 除此之外&…...

【C++】auto_ptr为何被唾弃?以及其他智能指针的学习

搭配异常可以让异常的代码更简洁 文章目录 智能指针 内存泄漏的危害 1.auto_ptr(非常不建议使用) 2.unique_ptr 3.shared_ptr 4.weak_ptr总结 智能指针 C中为什么会需要智能指针呢&#xff1f;下面我们看一下样例&#xff1a; int div() {int a, b;cin >&g…...

数据结构练习题1:基本概念

练习题1&#xff1a;基本概念 1 抽象数据类型概念分析2. 逻辑结构与存储结构概念分析3.综合选择题4.综合判断题5.时间复杂度相关习题6 时间复杂度计算方法&#xff08;一、二、三层循环&#xff09; 1 抽象数据类型概念分析 1.可以用&#xff08;抽象数据类型&#xff09;定义…...

如何消除Msxml2.XMLHTTP组件的缓存

之前使用这个组件&#xff0c;是每隔十分钟取数据&#xff0c;没有遇到这个缓存问题&#xff0c; 这次使用它是频繁访问接口&#xff0c;就出现了一直不变的问题。觉得是缓存没有清除的问题。 网上搜了一些方案。最好的方案就是给url地址末尾给一个随机参数。用于让组件觉得是…...

深入理解Java虚拟机jvm-运行时数据区域(基于OpenJDK12)

运行时数据区域 运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的…...

(OpenCV) 基础demo

文章目录 前言Demo图片录制播放人脸识别 END 前言 OpenCV - Open Computer Vision Library OpenCV的名声想必不用多说了。 本文介绍4个基础使用demo。分别为&#xff0c;显示图片&#xff0c;录制视频&#xff0c;播放视频和一个基于开源算法库的人脸识别小demo。 只要环境…...

using 的使用

作者: 苏丙榅 链接: https://subingwen.cn/cpp/using/ 在 C 中 using 用于声明命名空间&#xff0c;使用命名空间也可以防止命名冲突。在程序中声明了命名空间之后&#xff0c;就可以直接使用命名空间中的定义的类了。在 C11 中赋予了 using 新的功能&#xff0c;让C变得更年轻…...

Websocket、Socket、HTTP之间的关系

Websocket、Socket、HTTP之间的关系 ★ Websocket是什么&#xff1f;★ Websocket的原理★ websocket具有以下特点&#xff1a;★ webSocket可以用来做什么?★ websocket与socket区别&#xff1a;★ WebSocket与HTTP区别 ★ Websocket是什么&#xff1f; ● Websocket是HTML5下…...

hustoj LiveCD版系统在局域网虚拟机安装和配置

root权限 打开terminal命令行输入sudo su输入初始密码freeproblemsetmysql数据库的密码的位置&#xff0c;如何登陆数据库 数据库账号密码存放在两个配置文件中&#xff1a; /home/judge/etc/judge.conf/home/judge/src/web/include/db_info.inc.php 新版本中&#xff0c;快…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...