(C语言)超市管理系统(测试2版)(指针)(数据结构)(清屏操作)
目录
前言:
源代码:
product.h
product.c
fileio.h
fileio.c
main.c
代码解析:
一、程序结构概述
二、product.c 函数详解
1. 初始化商品列表 Init_products
2. 添加商品 add_product
3. 显示商品 display_products
4. 修改商品 mod_product
三、main.c 主函数详解
1. 主函数 main
2. 辅助函数 clear_screen
四、核心知识点总结
1. 动态内存管理
2. 结构体的使用
3. 输入输出安全
4. 文件操作
五、动手实践建议
前言:
当前这篇博客是测试版,教大家相关添加单个商品,显示所有商品,修改单个商品知识点;
看之前建议先看上篇博客:
(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)-CSDN博客
共6个文件(加上二进制文件);
源代码:
product.h
//product.h
#pragma once //防止头文件重复定义#define NAME_LEN 50 //商品名称最大容量//单个商品结构体
typedef struct {int id;//商品编号char name[NAME_LEN];//商品名字float price;//商品单价int stock;//商品库存
}Product;//商品列表表结构体
typedef struct {Product* Data;//指向单个商品数组的指针int count;//当前商品数量
}ProductList;// 函数原型
void Init_products(ProductList* list);//初始化商品列表结构体
void add_product(ProductList* list,Product* product);//添加单个商品
void display_products(ProductList* list);//显示所有商品
void mod_product(ProductList* list, Product* product);//修改单个商品
product.c
//product.c
#include "product.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//初始化商品列表结构体
void Init_products(ProductList* list) {list->Data = NULL;//指针置空,防止野指针list->count = 0;//商品数量归0
}//添加单个商品
void add_product(ProductList* list,Product* product) {//1.扩展空间Product* listnew_Data = realloc(list->Data, (list->count + 1) * sizeof(Product));if (listnew_Data==NULL) {printf("内存分配失败!\n");exit(EXIT_FAILURE);}list->count++;list->Data = listnew_Data;//依然用老数组表示描述//2.ID自动生成list->Data[list->count - 1].id = list->count;printf("商品ID:%d\n",list->count);//3.商品信息录入printf("请输入商品名称:");scanf("%49s", list->Data[list->count-1].name);printf("请输入单价:");scanf("%f", &list->Data[list->count-1].price);printf("请输入库存:");scanf("%d", &list->Data[list->count-1].stock);printf("添加成功!\n");
}//显示所有商品
void display_products(ProductList* list) {//1.判断列表是否为空if (list->count == 0) {printf("库存为空\n");return;}//2.打印表头printf("\n%5s %-20s %10s %6s\n", "ID", "名称", "单价", "库存");printf("--------------------------------------------\n");//3.打印商品信息for (int i = 0; i < list->count; i++) {printf("%5d %-20s %10.2f %5d\n",list->Data[i].id,list->Data[i].name,list->Data[i].price,list->Data[i].stock);}
}//修改单个商品
void mod_product(ProductList* list, Product* product) {//1.判断列表是否为空if (list->count == 0) {printf("库存为空\n");return;}//2.输入要修改的IDint id_0;printf("请输入要修改的ID:");scanf("%d", &id_0);//3.判断ID是否存在if (id_0 > list->count) {printf("ID不存在!\n");return;}//4.找要修改商品的IDint i=0;for (i; i < list->count; i++) {if (id_0 == list->Data[i].id) {break;}}//5.修改商品printf("\n%5s %-20s %10s %6s\n", "ID", "名称", "单价", "库存");printf("--------------------------------------------\n");printf("%5d %-20s %10.2f %5d\n",list->Data[i].id,list->Data[i].name,list->Data[i].price,list->Data[i].stock);printf("--------------------------------------------\n");printf("修改商品名称:");scanf("%49s", list->Data[i].name);printf("修改单价:");scanf("%f", &list->Data[i].price);printf("修改库存:");scanf("%d", &list->Data[i].stock);printf("修改成功!\n");
}
fileio.h
//fileio.h
#pragma once
#include "product.h"// 文件操作函数原型
void save_to_file(const char* filename, const ProductList* list);
void load_from_file(const char* filename, ProductList* list);
fileio.c
//fileio.c
//引用头文件
#include <stdio.h>
#include <stdlib.h>
#include "product.h"// 保存数据到文件(二进制写入)
void save_to_file(const char* filename, const ProductList* list) {//1.打开文件(二进制写入模式)FILE* fp = fopen(filename, "wb");// "wb":二进制写入模式,会清空原文件内容// 若文件不存在则创建新文件if (!fp) { // fp == NULL 表示打开失败perror("保存失败"); // 输出错误信息(包含具体原因,如权限不足)exit(EXIT_FAILURE); // 终止程序,EXIT_FAILURE 表示异常退出}//2.先写入商品数量(int 类型)fwrite(&list->count,sizeof(int),1,fp);// &list->count:取商品数量的内存地址// sizeof(int):每个元素的大小(4字节)// 1:写入1个元素// fp:文件指针//3.再写入所有商品数据(Product 结构体数组)fwrite(list->Data, sizeof(Product), list->count, fp);// list->Data:商品数组首地址// sizeof(Product):每个商品占用的字节数// list->count:要写入的商品数量//4.关闭文件fclose(fp);
}// 从文件加载数据(二进制读取)
void load_from_file(const char* filename, ProductList* list) {//1.初始化结构体(防御性编程)Init_products(&list);//初始化商品列表结构体//2.尝试打开文件(二进制读取模式)FILE* fp = fopen(filename, "rb");// "rb":二进制读取模式,文件不存在时返回 NULLif (!fp) {//文件打开失败处理return; // 保持 list 的初始状态(count=0, Data=NULL)}//3.读取商品数量(int 类型)fread(&list->count,sizeof(int),1,fp);// 从文件中读取4字节到 list->count//4.根据数量分配内存list->Data = malloc(list->count * sizeof(Product));// 计算总字节数 = 商品数量 × 单个商品大小//检查是否分配成功if (list->Data == NULL) { // list->Data == NULL 表示失败printf("内存分配失败\n");exit(EXIT_FAILURE); // 终止程序}//5.读取所有商品数据fread(list->Data, sizeof(Product), list->count, fp);// 将文件内容直接读入 Data 数组//6.关闭文件fclose(fp);
}
main.c
//mian.c#include <stdio.h>
#include <stdlib.h>
#include "product.h"
#include "fileio.h"#define FILENAME "products.dat"//宏定义文件名//清屏操作
void clear_screen() {//判断是否为Windows系统
#ifdef _WIN32system("cls");//其他系统
#elsesystem("clear");
#endif
}// 显示主菜单(用户界面)
void display_menu() {printf("\n超市管理系统\n");printf("1. 添加商品\n");printf("2. 显示所有商品\n");printf("3. 修改商品信息\n");printf("4. 删除商品\n");printf("5. 搜索商品\n");printf("6. 保存并退出\n");printf("请选择操作:");
}int main() {//1.创建结构体并初始化Product product;//创建单个商品结构体ProductList list;//创建商品列表结构体Init_products(&list);//初始化//2.读文件load_from_file(FILENAME, &list);//读文件//3.选择模块int choice;//选择选项while (1) {display_menu();//显示菜单scanf("%d", &choice);//输入选项switch (choice) {case 1:clear_screen();add_product(&list,&product);printf("--------------------------------------------\n");break;case 2:clear_screen();display_products(&list);printf("--------------------------------------------\n");break;case 3:clear_screen();mod_product(&list,&product);printf("--------------------------------------------\n");break;case 6:save_to_file(FILENAME, &list); // 保存数据free(list.Data); // 释放动态内存printf("系统已退出\n");return 0; // 正确退出default:printf("无效输入\n");}}
}
代码解析:
一、程序结构概述
整个程序分为三个核心模块:
数据管理模块 (
product.c
):处理商品的增删改查文件操作模块 (
fileio.c
):负责数据保存与加载主控模块 (
main.c
):协调程序流程和用户交互
二、product.c 函数详解
1. 初始化商品列表
Init_products
void Init_products(ProductList* list) {list->Data = NULL; // 指针置空,防止野指针list->count = 0; // 商品数量归0 }
功能:
初始化商品列表结构体,确保程序启动时处于干净状态。
实现步骤:
Data = NULL
:将动态数组指针置空,避免指向随机内存。
count = 0
:商品数量初始化为0。为什么这样写:
防御性编程:确保程序启动时没有残留数据。
动态内存安全:
Data
初始为NULL
,realloc
在首次调用时会自动分配内存。如何使用:
ProductList list; // 声明一个商品列表 Init_products(&list); // 初始化列表(必须调用)
2. 添加商品
add_product
void add_product(ProductList* list, Product* product) {// 1. 扩展内存Product* listnew_Data = realloc(list->Data, (list->count + 1) * sizeof(Product));if (listnew_Data == NULL) {printf("内存分配失败!\n");exit(EXIT_FAILURE);}list->count++;list->Data = listnew_Data;// 2. 自动生成IDlist->Data[list->count - 1].id = list->count;printf("商品ID:%d\n", list->count);// 3. 录入商品信息printf("请输入商品名称:");scanf("%49s", list->Data[list->count-1].name);printf("请输入单价:");scanf("%f", &list->Data[list->count-1].price);printf("请输入库存:");scanf("%d", &list->Data[list->count-1].stock);printf("添加成功!\n"); }
功能:
动态扩展内存,添加新商品并自动生成ID。
实现步骤:
内存扩展:使用
realloc
将数组大小增加1个商品位置。错误处理:检查内存是否分配成功,失败则终止程序。
生成ID:新商品ID = 当前商品总数 + 1(例如第一个商品ID=1)。
输入信息:依次输入名称、单价、库存。
为什么这样写:
动态内存管理:
realloc
自动处理内存扩展,无需手动复制数据。简单ID生成:直接使用
count
作为ID,但存在删除商品后ID不连续的问题(后续改进点)。如何使用:
ProductList list; Init_products(&list); add_product(&list, NULL); // 添加第一个商品
输入示例:
请输入商品名称:苹果 请输入单价:5.5 请输入库存:20
注意事项:
输入缓冲区问题:连续使用
scanf
可能导致残留换行符,需清空缓冲区(代码未处理)。名称输入限制:
%49s
防止溢出,但无法输入带空格的名称(如“红富士苹果”)。
3. 显示商品
display_products
void display_products(ProductList* list) {if (list->count == 0) {printf("库存为空\n");return;}printf("\n%5s %-20s %10s %6s\n", "ID", "名称", "单价", "库存");printf("--------------------------------------------\n");for (int i = 0; i < list->count; i++) {printf("%5d %-20s %10.2f %5d\n",list->Data[i].id,list->Data[i].name,list->Data[i].price,list->Data[i].stock);} }
功能:
以表格形式打印所有商品信息,处理空列表情况。
实现步骤:
空列表检查:直接返回提示信息。
打印表头:使用格式化字符串对齐标题。
遍历打印:循环输出每个商品的字段。
为什么这样写:
用户体验:清晰的表格布局提升可读性。
格式控制符:
%5d
:ID占5字符宽度,右对齐。
%-20s
:名称左对齐,占20字符。
%10.2f
:单价保留两位小数,总宽度10。如何使用:
display_products(&list); // 显示当前所有商品
输出示例:
ID 名称 单价 库存 --------------------------------------------1 苹果 5.50 202 香蕉 3.80 15
4. 修改商品
mod_product
void mod_product(ProductList* list, Product* product) {if (list->count == 0) {printf("库存为空\n");return;}int id_0;printf("请输入要修改的ID:");scanf("%d", &id_0);if (id_0 > list->count) {printf("ID不存在!\n");return;}int i=0;for (i; i < list->count; i++) {if (id_0 == list->Data[i].id) {break;}}// 显示原信息并修改printf("\n%5s %-20s %10s %6s\n", "ID", "名称", "单价", "库存");printf("--------------------------------------------\n");printf("%5d %-20s %10.2f %5d\n",list->Data[i].id,list->Data[i].name,list->Data[i].price,list->Data[i].stock);printf("--------------------------------------------\n");printf("修改商品名称:");scanf("%49s", list->Data[i].name);printf("修改单价:");scanf("%f", &list->Data[i].price);printf("修改库存:");scanf("%d", &list->Data[i].stock);printf("修改成功!\n"); }
功能:
根据用户输入的ID查找商品,修改其信息。
实现步骤:
空列表检查:直接返回提示。
输入目标ID:用户指定要修改的商品。
ID存在性检查:错误判断逻辑不严谨(
id_0 > count
可能漏判)。遍历查找:找到对应商品的数组索引。
显示并修改:打印原信息,逐项修改。
为什么这样写:
直观交互:先展示原信息再修改,减少误操作。
直接修改内存:通过指针直接修改数组元素。
问题与改进:
ID检查缺陷:
id_0 > list->count
假设ID连续且等于count,实际可能因删除操作导致ID大于count。未处理未找到ID:循环结束后未检查是否找到有效索引,可能导致越界访问。
如何使用:
mod_product(&list, NULL); // 修改ID为2的商品
输入示例:
请输入要修改的ID:2 ...(显示原信息)... 修改商品名称:香蕉 修改单价:4.5 修改库存:25
三、main.c 主函数详解
1. 主函数
main
int main() {Product product; // 单个商品(未实际使用)ProductList list; // 商品列表Init_products(&list); // 初始化列表load_from_file(FILENAME, &list); // 加载数据int choice;while (1) {display_menu(); // 显示菜单scanf("%d", &choice);switch (choice) {case 1: add_product(&list, &product); break;case 2: display_products(&list); break;case 3: mod_product(&list, &product); break;case 6: save_to_file(FILENAME, &list); // 保存数据free(list.Data); // 释放内存printf("系统已退出\n");return 0;default: printf("无效输入\n");}} }
功能:
程序入口,管理整个生命周期:初始化→加载数据→循环处理用户操作→退出保存。
实现步骤:
初始化:创建商品列表并初始化。
加载数据:从文件读取历史数据。
主循环:
显示菜单,获取用户选择。
调用对应功能函数。
退出处理:保存数据并释放内存。
关键设计:
循环结构:
while(1)
保持程序持续运行。内存释放:退出前必须
free(list.Data)
,否则内存泄漏。模块化调用:通过
switch-case
调用各功能函数。用户交互流程:
graph TD A[启动程序] --> B[加载数据] B --> C{显示菜单} C --> D[用户选择] D -->|1-5| E[执行操作] E --> C D -->|6| F[保存并退出]
2. 辅助函数
clear_screen
void clear_screen() { #ifdef _WIN32system("cls"); // Windows清屏 #elsesystem("clear"); // Linux/Mac清屏 #endif }
功能:
清空控制台屏幕,提升界面整洁度。
为什么这样写:
跨平台兼容:通过预编译指令区分系统。
简单调用:
system
函数直接执行系统命令。如何使用:
clear_screen(); // 清空屏幕后显示新内容
四、核心知识点总结
1. 动态内存管理
realloc
的作用:动态调整内存大小,首次调用时等效于malloc
。错误处理:必须检查返回值是否为
NULL
。内存释放:
free
必须与malloc/realloc
配对使用。
2. 结构体的使用
数据封装:将商品信息打包为
Product
结构体。列表管理:
ProductList
封装动态数组和长度,提升代码可维护性。
3. 输入输出安全
缓冲区溢出防护:
scanf("%49s")
限制输入长度。格式化输出:
printf
的格式控制符对齐数据。
4. 文件操作
二进制模式:
"wb"
和"rb"
确保数据精确存储。数据序列化:直接读写结构体内存,高效但需注意平台兼容性。
五、动手实践建议
添加删除功能:实现
delete_product
函数,练习内存缩减 (realloc
)。增强输入验证:检查价格是否为负数,库存是否为整数。
实现搜索功能:按名称或ID查找商品,练习字符串处理 (
strstr
)。
注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!
相关文章:
(C语言)超市管理系统(测试2版)(指针)(数据结构)(清屏操作)
目录 前言: 源代码: product.h product.c fileio.h fileio.c main.c 代码解析: 一、程序结构概述 二、product.c 函数详解 1. 初始化商品列表 Init_products 2. 添加商品 add_product 3. 显示商品 display_products 4. 修改商品 mo…...
可变形卷积简介(Deformable Convolution)
1. 核心原理 可变形卷积通过动态调整卷积核的采样位置,增强模型对几何形变(如旋转、缩放)的适应能力。其核心改进包括: 偏移量(Offset):为卷积核的每个采样点学习 x / y x/y x/y方向的偏移量 …...
02_Servlet
目录 一、简介二、Servlet入门案例2.1、编写Servlet2.2、配置Servlet2.3、访问Servlet2.4、常见错误 三、Servlet详解3.1、实现Servlet的三种方式3.1.1、实现Servlet接口3.1.2、继承GenericServlet类3.1.3、继承HttpServlet类 3.2、配置Servlet的两种方式3.2.1、web.xml方式3.2…...
stm32之FLASH
目录 1.简介2.闪存模块组织3.基本结构3.1 FPEC3.2 程序存储器3.2.1 标准编程3.2.2 页擦除3.2.3 全擦除 3.3 选项字节3.3.1 编程3.3.2 擦除 4.器件电子签名5.实验-读取内部FLASH 1.简介 STM32F1系列的FLASH内存是一个非常重要的存储区域,它主要由三个部分组成&#…...
第3.4节 调用链路分析服务开发
3.4.1 什么是Code Call Graph(CCG) Code Call Graph(CCG)即业务代码中的调用关系图,是通过静态分析手段分析并构建出的一种描述代码间关系的图。根据精度不同,一般分为类级别、方法级别、控制流级别&#x…...
超详细Docker教程
前言:大家在在Linux上部署mysql及其他软件时,大家想一想自己最大的感受是什么? 我相信,除了个别天赋异禀的人以外,大多数人都会有相同的感受,那就是麻烦。核心体现在三点: 命令太多了ÿ…...
探索AI新领域:生成式人工智能认证(GAI认证)助力职场发展
在数字化时代的大潮中,人工智能(AI)技术以其强大的影响力和广泛的应用前景,正逐步重塑我们的生活与工作方式。随着生成式AI技术的崛起,掌握这一前沿技能已成为职场竞争中的关键优势。那么,如何通过系统的学…...
sql sql复习
虽然之前学习过sql,但由于重在赶学习进度,没有学扎实,导致自己刷题的时候有的地方还是模模糊糊,现在主要是复习,补一补知识点。 今日靶场: NSSCTF 云曦历年考核题 在做题之前先回顾一下sql注入的原理&…...
初探 Skynet:轻量级分布式游戏服务器框架实战
在游戏服务器开发领域,高效、稳定且易于扩展的框架一直是开发者追求的目标。Skynet 作为一款轻量级、高性能的分布式游戏服务器框架,凭借其独特的设计理念和强大的功能,赢得了众多开发者的青睐 一.Skynet底层架构支持 1.Actor erlang 从语言…...
libarchive.so.19丢失
文章目录 绝对路径可以启动,相对路径不可以以绝对路径启动conda环境,运行python3.8(成功) 报错 Error while loading conda entry point: conda-libmamba-solver (libarchive.so.19: cannot open shared object file: No such file or directory) sudo a…...
vue-ganttastic甘特图label标签横向滚动固定方法
这个甘特图之前插件里,没有找到能固定label标签在屏幕上的办法,用css各种办法都没有实现,所以我我直接手写定位,用js监听滚动条滚动的距离,然后同步移动甘特图label标签,造成一种定位的错觉,以下…...
自动化 NuGet 包打包与上传:完整批处理脚本详解(含 SVN 支持)
在大型项目中,我们常常需要定期打包多个 .csproj 项目为 NuGet 包,并上传到私有 NuGet 服务。这篇文章分享一份实战脚本,支持以下自动化流程: 自动读取、更新 .csproj 文件中的 Version、PackageOutputPath 等节点; 自…...
Go语言空白导入的作用与用途
在 Go 语言中,导入包时前面加下划线 _ 是一种特殊的导入方式,称为 “空白导入” 或 “匿名导入”。 作用: 执行包的初始化(init 函数)但不直接使用包中的标识符 import _ "go.uber.org/automaxprocs" 表示你…...
实验六:按键模拟控制实现
FPGA序列检测器实验(远程实验系统) 文章目录 FPGA序列检测器实验(远程实验系统)一、数字电路基础知识1. 时钟与同步2. 按键消抖原理代码讲解:分频与消抖3. 有限状态机(FSM)设计代码讲解:状态机编码与转移4. 边沿检测与信号同步5. 模块化设计二、实验数字电路整体思想三…...
【愚公系列】《Manus极简入门》038-数字孪生设计师:“虚实映射师”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
Linux重定向与缓冲区
目录 文件描述符的分配规则 重定向 使用 dup2 系统调用 FILE 文件描述符的分配规则 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main() {int fd open("myfile", O_RDONLY);if(fd < 0){per…...
经典还原反应解析:Wolff-Kishner机制与黄鸣龙改进法
在有机化学发展史上记载的万余种经典反应中,当论及以科学家命名的标志性转化反应时,Wolff-Kishner-黄鸣龙还原反应必然占据重要地位。在大学《有机化学》课程中,学习还原反应时肯定会提到Wolff-Kishner-黄鸣龙还原反应,这是第一个…...
DataX从Mysql导数据到Hive分区表案例
0、下载DataX并解压到对应目录 DataX安装包,开箱即用,无需配置。 https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz 相关参考文档 https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md 1、Hive分区…...
npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
一、背景 npm 安装依赖报如下错: gyp verb check python checking for Python executable "python2" in the PATH gyp verb which failed Error: not found: python2 一眼看过去都觉得是Python环境问题,其实并不是你python环境问题…...
安装npm:npm未随Node.js一起安装
文章目录 上传至linux服务器/usr/local/目录下 如果npm没有随Node.js一起安装,你可以尝试单独下载并安装npm。但通常情况下,这是不必要的,因为npm是Node.js的一部分。如果确实需要单独安装npm,你可以参考npm的官方安装指南。 npm…...
C++23 ranges::to:范围转换函数 (P1206R7)
文章目录 引言C23 Ranges 概述ranges::to 的定义与功能定义功能 使用场景范围转换为容器简化字符串解析映射转换为向量 ranges::to 的优势代码简洁性提高开发效率与C23的stl容器的范围版本构造函数配合良好 模板参数约束的思考总结 引言 在C的发展历程中,每一个新版…...
openfeign 拦截器实现微服务上下文打通
目录 openfeign 拦截器实现微服务上下文打通需求分析:代码实现:subject 服务:controllerFeign 拦截器:将 Feign 拦截器注册为一个Bean: auth 鉴权服务:全局配置类:登录拦截器:上下文…...
【MySQL】变更缓冲区:作用、主要配置以及如何查看
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
TCP/IP-——C++编程详解
1. TCP/IP 编程基本概念 TCP(传输控制协议):面向连接、可靠的传输层协议,保证数据顺序和完整性。IP(网际协议):负责将数据包路由到目标地址。Socket(套接字):…...
微服务如何实现服务的高可用
背景:微服务分层需要考虑高可用和高并发的问题 微服务如何实现服务的高可用 先说结论:微服务实现高可用主要通过集群冗余故障自动转移来实现的具体可以从底下几种方案来实现。 “端”到“反向代理”的高可用“反向代理”到“站点应用”的高可用“站点…...
微服务调试问题总结
本地环境调试。 启动本地微服务,使用公共nacos配置。利用如apifox进行本地代码调试解决调试问题。除必要的业务微服务依赖包需要下载到本地。使用mvn clean install -DskipTests进行安装启动前选择好profile环境进行启动,启动前记得mvn clean清理项目。…...
egpo进行train_egpo训练时,keyvalueError:“replay_sequence_length“
def execution_plan(workers: WorkerSet, config: TrainerConfigDict) -> LocalIterator[dict]: if config.get(“prioritized_replay”): prio_args { “prioritized_replay_alpha”: config[“prioritized_replay_alpha”], “prioritized_replay_beta”: config[“prior…...
Hadoop的组成
(一)Hadoop的组成 对普通用户来说, Hadoop就是一个东西,一个整体,它能给我们提供无限的磁盘用来保存文件,可以使用提供强大的计算能力。 在Hadoop3.X中,hadoop一共有三个组成部分&#…...
Android锁
引言 🔒 在 Android 应用的开发过程中,随着业务需求的复杂度不断提升,多线程并发场景层出不穷。为了保证数据一致性与线程安全,锁(Lock)成为了不可或缺的工具。本篇博客将深入剖析 Android 中常用的锁机制…...
XD08M3232接近感应单片机的接近感应模块的工作原理
XD08M3232接近感应单片机的接近感应模块基于电容式感应原理,通过硬件电路与软件配置实现对物体接近的检测。以下是其工作原理的详细解析: 一、硬件架构与核心组件 1. 核心电路组成 接近感应模块由三大关键部分构成: 两个轨到轨运算放大器&…...
编程日志5.6
串的习题 1.2236. 判断根结点是否等于子结点之和 - 力扣(LeetCode) /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * Tr…...
量子计算实用化突破:从云端平台到国际竞合,开启算力革命新纪元
在硅谷某生物医药实验室,研究员艾米丽正盯着量子计算模拟界面露出微笑 —— 搭载中电信 "天衍" 量子计算云平台的 880 比特超导量子处理器,用 17 分钟完成了传统超算需 3 个月才能跑完的新型抗生素分子键合模拟。这个场景标志着量子计算正从 &…...
Made with Unity | 拓展“双点”宇宙版图
双点工作室(Two Point Studios)团队成立于2016年,其创立初衷是打造一个完美的游戏IP:构建一个既能持续吸引玩家,又具备足够扩展空间,同时经得起时间考验的虚拟世界。2018年,团队以《双点医院&am…...
3D 数据可视化系统是什么?具体应用在哪方面?
目录 一、3D 数据可视化系统的定义与内涵 (一)基本概念 (二)核心要素 二、3D 数据可视化系统的优势 三、3D 数据可视化系统的应用领域 (一)城市规划与管理 (二)工业制造 &am…...
2025-5-14渗透测试:利用Printer Bug ,NTLMv2 Hash Relay(中继攻击),CVE-2019-1040漏洞复现
python3 printerbug.py test.com/test192.168.186.131 192.168.186.134 sudo python2 MultiRelay.py -t 192.168.186.132 -u ALLPrinter Bug 原理 PrinterBug(CVE-2018-0886)是Windows打印系统服务(Spooler)的一个设计缺陷&…...
OracleLinux7.9-ssh问题
有套rac环境,db1主机无法ssh db1和db1-priv,可以ssh登录 db2和db2-priv [rootdb1 ~]# ssh db1 ^C [rootdb1 ~]# ssh db2 Last login: Wed May 14 18:25:19 2025 from db2 [rootdb2 ~]# ssh db2 Last login: Wed May 14 18:25:35 2025 from db1 [rootdb2…...
《AI大模型应知应会100篇》第64篇:构建你的第一个大模型 Chatbot
第64篇:构建你的第一个大模型 Chatbot 手把手教你从零开始搭建一个基于大模型的聊天机器人 摘要 你是否想过,自己也能构建一个像 ChatGPT 一样能对话、能思考的聊天机器人(Chatbot)?别担心,这并不需要你是…...
鸿蒙OSUniApp 实现精美的用户登录和注册页面#三方框架 #Uniapp
UniApp 实现精美的用户登录和注册页面 前言 在开发鸿蒙APP时,登录注册页面作为用户与应用交互的第一道门槛,其体验与质量往往决定了用户的第一印象。去年我接手了一个电商小程序项目,产品经理特别强调要做一个既美观又实用的登录注册页面。…...
c#中equal方法与gethashcode方法之间有何关联?
文章目录 前言一、对hash运算的深入思考二、equal与gethashcode的关联三、 equal与gethashcode不同步的后果四、 规范的重写gethashcode 前言 大家有没有遇到过,当你重写了c#对象的equal方法之后,编译器会提示你对相应的gethashcode进行重写,…...
查询公网IP地址的方法:查看自己是不是公网ip,附内网穿透外网域名访问方案
本地搭建服务并提供互联网连接时,较为传统的方法是使用公网IP地址。因此,如何查询本地自己是不是公网IP,是必须要掌握的一种技巧。当面对确实无公网IP时,则可以通过内网穿透方案,如nat123网络映射工具,将本…...
【轻松学 C:编程小白的大冒险】— 16 函数的定义与调用
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【轻松学 C:编程小白的大冒险…...
【Tools】CPU 分析
CPU 分析 Windows SDK 本指南提供了可用于调查影响评估指标的中央处理单元 (CPU) 相关问题的详细技术。 特定于评估的分析指南中的各个指标或问题部分确定了需要调查的常见问题。 本指南提供了可用于调查这些问题的技术和工具。 本指南中的技术使用 Windows Performance Too…...
进阶2_1:QT5多线程与定时器共生死
1、在widget.ui中使用 LCD Number控件 注意:若 LCD 控件不是多线程,LCD控件则会瞬间自增到最大的数值,如上图,说明两者都是多线程处理 2、实现方式 1、创建 LCD 控件并修改为 LCD1 2、创建任务类 mytask. h,对任务类…...
ECharts:数据可视化的强大引擎
在当今这个信息爆炸的时代,如何有效地展示和理解复杂的数据成为了每一个开发者和技术爱好者面临的挑战。Apache ECharts 作为一款基于 JavaScript 的开源可视化库,以其强大的功能、丰富的图表类型以及高度的可定制性,迅速成为了数据可视化领域…...
记录 QT 在liunx 下 QFileDialog 类调用问题 ()Linux下QFileDialog没反应)
1. 2025.05.14 踩坑记录 因为QT 在 liunx 文件系统不同导致的 Windows : QString filePath QFileDialog::getOpenFileName(nullptr, "选择文件", ".", "文本文件 (*.txt);所有文件 (*.*)"); 没问题 liunx 下 打不开ÿ…...
通用软件项目技术报告 - 导读III
现在,我们正式进入报告的第六个主要领域:6. 领域六:与第三方服务/API 集成 (含 LLM API)。 连接: 在现代软件开发中,很少有应用程序是完全孤立的。我们经常需要与各种外部的第三方服务或 API 进行集成,以利用它们提供的特定功能(如支付处理、地图服务、社交媒体登录、云…...
Kali Linux 桌面环境安装与配置指南
一、为什么选择 Kali Linux? Kali Linux 由 Offensive Security 维护,集成了数百种安全测试工具(如 Metasploit、Nmap 和 Burp Suite),非常适合安全研究。但需要注意的是,Kali 默认以 root 用户运行&#…...
FFmpeg视频编码的完整操作指南
步骤如下: 安装和准备FFmpeg:确保包含所需编码器(如libx264)。基本命令行编码:使用ffmpeg命令进行转码,设置视频编码器、CRF、预设等。API编码流程(针对开发者): a. 注册…...
【网络协议】TCP、HTTP、MQTT 和 WebSocket 对比
从协议本质、工作原理、特点、应用场景等方面详细对比 TCP、HTTP、MQTT 和 WebSocket。 1. TCP(Transmission Control Protocol,传输控制协议) 本质 协议类型:传输层协议(OSI模型第4层)。核心功能&#x…...
Leetcode数组day1
704 二分查找 注意点,左闭右闭 class Solution { public:int search(vector<int>& nums, int target) {//整数类型的动态数组的引用。int left0;int right nums.size()-1;while (left < right){int middle (rightleft)/2;if (nums[middle]>targ…...