(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
目录
前言:
源代码:
product.h
product.c
fileio.h
fileio.c
main.c
json_export.h
json_export.c
tasks.json
idex.html
script.js
相关步骤:
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
运行结果:
前言:
当前这篇博客是预告,基于上篇博客超市管理系统基础上来写的网页版,今天只是展示:
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)-CSDN博客
看之前建议先看测试版博客:
(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)-CSDN博客
如果大家对前端(html,js,json)有兴趣,后续可以教大家一些,我也只是略懂一二
共13个文件(加上二进制文件);
源代码:
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); // 修改单个商品
void del_product(ProductList* list); // 删除单个商品
void que_product(ProductList* list); // 查询单个商品
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; // 利用商品当前数量赋值IDprintf("商品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) {// 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) { // 此时的i+1就是当前商品IDbreak;}}// 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");
}// 删除单个商品
void del_product(ProductList* list) {// 1. 显示所有商品display_products(list);printf("--------------------------------------------\n");// 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++) { // 此时的i+1就是当前商品IDif (id_0 == list->Data[i].id) {break;}}// 5. 删除商品for (int j = i; j < list->count - 1; j++) {list->Data[j] = list->Data[j + 1];}printf("删除成功!\n");list->count--; // 商品数量减一// 6. 重新生成商品IDif (list->count == 1) {list->Data[0].id = 1;}else {list->Data[list->count - 1].id = list->Data[list->count - 2].id + 1;}
}// 查询单个商品
void que_product(ProductList* list) {// 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) { // 此时的i+1就是当前商品IDbreak;}}// 5. 显示商品printf("搜索成功!\n");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);
}
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
#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");if (!fp) { // fp == NULL 表示打开失败perror("保存失败"); // 输出错误信息(包含具体原因,如权限不足)exit(EXIT_FAILURE); // 终止程序,EXIT_FAILURE 表示异常退出}// 2. 先写入商品数量(int 类型)fwrite(&list->count, sizeof(int), 1, fp);// 3. 再写入所有商品数据(Product 结构体数组)fwrite(list->Data, sizeof(Product), list->count, fp);// 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->Data = (Product*)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);// 6. 关闭文件fclose(fp);
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "product.h"
#include "fileio.h"
#include "json_export.h"#define FILENAME "products.dat" // 宏定义文件名// 清屏操作
void clear_screen() {
#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("7. 导出为 JSON\n"); // 新增 JSON 导出选项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);printf("--------------------------------------------\n");break;case 4:clear_screen();del_product(&list);printf("--------------------------------------------\n");break;case 5:clear_screen();que_product(&list);printf("--------------------------------------------\n");break;case 6:save_to_file(FILENAME, &list); // 保存数据free(list.Data); // 释放动态内存printf("系统已退出\n");return 0; // 正确退出case 7: {clear_screen();export_products_to_json(&list); // 正确调用导出函数printf("--------------------------------------------\n");break;}default:printf("无效输入\n");}}
}
json_export.h
#pragma once
#include "product.h"// 导出商品列表为 JSON 文件
void export_products_to_json(const ProductList* list);
json_export.c
#include "json_export.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 导出商品列表为 JSON 文件
void export_products_to_json(const ProductList* list) {if (list->count == 0) {printf("当前没有商品数据可导出!\n");return;}// 打开 JSON 文件(覆盖模式)FILE* json_file = fopen("products.json", "w");if (!json_file) {perror("无法创建 JSON 文件");exit(EXIT_FAILURE);}// 写入 JSON 数组开头fprintf(json_file, "[\n");// 遍历所有商品for (int i = 0; i < list->count; i++) {const Product* p = &list->Data[i];// 写入商品对象fprintf(json_file, " {\n");fprintf(json_file, " \"id\": %d,\n", p->id);fprintf(json_file, " \"name\": \"%s\",\n", p->name);fprintf(json_file, " \"price\": %.2f,\n", p->price);fprintf(json_file, " \"stock\": %d\n", p->stock);// 非最后一个商品添加逗号if (i < list->count - 1) {fprintf(json_file, " },\n");} else {fprintf(json_file, " }\n");}}// 写入 JSON 数组结尾fprintf(json_file, "]");fclose(json_file);printf("JSON 文件已生成:products.json\n");
}
tasks.json
{"version": "2.0.0","tasks": [{"label": "编译 C 程序", // 关键:任务名"type": "shell","command": "gcc","args": ["-o","supermarket","main.c","product.c","fileio.c","json_export.c"],"group": {"kind": "build","isDefault": true},"problemMatcher": ["$gcc"]}]
}
idex.html
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>超市商品展示</title><style>body {font-family: Arial, sans-serif;max-width: 800px;margin: 20px auto;padding: 20px;}table {width: 100%;border-collapse: collapse;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}th, td {padding: 12px;text-align: left;border-bottom: 1px solid #e0e0e0;}th {background-color: #f5f5f5;font-weight: 600;}tr:hover {background-color: #f9f9f9;}.no-data {text-align: center;padding: 20px;}</style>
</head>
<body><h1>双叶超市商品列表</h1><table id="productTable"><thead><tr><th>商品 ID</th><th>商品名称</th><th>单价(元)</th><th>库存</th></tr></thead><tbody><!-- 商品数据将在此动态填充 --></tbody></table><script src="script.js"></script>
</body>
</html>
script.js
// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', async () => {try {// 读取本地 JSON 文件(需通过 Live Server 启动才能正常读取)const response = await fetch('products.json');if (!response.ok) throw new Error('文件读取失败');const products = await response.json();renderProducts(products); // 渲染商品表格} catch (error) {const tbody = document.querySelector('#productTable tbody');tbody.innerHTML = `<tr class="no-data"><td colspan="4">${error.message}</td></tr>`;}
});// 渲染商品列表到表格
function renderProducts(products) {const tbody = document.querySelector('#productTable tbody');tbody.innerHTML = ''; // 清空原有内容if (products.length === 0) {tbody.innerHTML = '<tr class="no-data"><td colspan="4">当前没有商品数据</td></tr>';return;}products.forEach(product => {const row = document.createElement('tr');row.innerHTML = `<td>${product.id}</td><td>${product.name}</td><td>¥${product.price.toFixed(2)}</td><td>${product.stock}</td>`;tbody.appendChild(row);});
}
相关步骤:
第一步:
下载VS code:Visual Studio Code - Code Editing. Redefined
第二步:
下载安装后,下载插件(一共九个):
第三步:
建立一个文件夹(主文件夹名字自己起):
第四步:
按照第三步复制代码到文件里,注意文件层次:
supermarket - project/
├──.vscode/
│ └── tasks.json
├── output/
├── fileio.c
├── fileio.h
├── index.html
├── json_export.c
├── json_export.h
├── main.c
├── product.c
├── product.h
├── products.dat(提前自己建立)
├── products.json(自动生成)
├── script.js
└── supermarket.exe(自动生成)
第五步:
1.打开 VS Code 的设置。你可以通过点击菜单栏中的 文件
-> 首选项
-> 设置
来打开设置页面。
在设置页面的搜索框中输入 C_Cpp.default.compilerPath
。
在搜索结果中,找到 C/C++: Default Compiler Path
这个设置项,并确保它的值是你的 GCC 编译器的路径。
点击 “在 settings.json 中编辑”,此时会打开 settings.json
文件。
在 settings.json
文件中添加以下内容(假设 GCC 路径为 C:\mingw64\bin\gcc.exe
,若实际路径不同需调整):
"C_Cpp.default.compilerPath": "C:\\mingw64\\bin\\gcc.exe"
保存 settings.json
文件。按 Ctrl+Shift+P
,输入 Reload Window
(重新加载窗口)。
2.编译超市管理系统,生成takes.json文件:
此时有这些文件就可(当然你粘贴完也不是不行):
按 Ctrl+Shift+P
,输入 Tasks: Open Task File
,选择 tasks.json
(若无则创建粘贴)
3.运行超市管理系统,生成exe文件和products.json
按 Ctrl+Shift+B
,选择 “编译 C 程序”,生成exe文件,在终端输入 supermarket
(或 supermarket.exe
,取决于系统)运行程序(如果不行,直接在文件管理器打开也行),添加些商品,然后选择7,生成json文件
第六步:
复制粘贴html和js文件,在 VS Code 中打开 index.html
,右键点击页面空白处,选择 “Open with Live Server”。浏览器会自动打开 http://localhost:5500
,显示商品列表。
运行结果:
注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!
相关文章:
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
目录 前言: 源代码: product.h product.c fileio.h fileio.c main.c json_export.h json_export.c tasks.json idex.html script.js 相关步骤: 第一步: 第二步: 第三步: 第四步: 第五步…...
uni-app小程序登录后…
前情 最近新接了一个全新项目,是类似商城的小程序项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,其中就有一个用户登录功能,小程序部分页面是需要登录才可以查看的,对于未登录的用户需要引…...
从零开始理解Jetty:轻量级Java服务器的入门指南
目录 一、Jetty是什么?先看一个生活比喻 二、5分钟快速入门:搭建你的第一个Jetty服务 步骤1:Maven依赖配置 步骤2:编写简易Servlet(厨房厨师) 步骤3:组装服务器(餐厅开业准备&am…...
如何免费在线PDF转换成Excel
咱们工作中是不是经常遇到这种头疼事儿?辛辛苦苦从别人那里拿到PDF文件,想改个数据调个格式,结果发现根本没法直接编辑! 数据被困住:PDF表格无法直接计算/筛选,手动录入太反人类! 格式大崩坏&…...
StarRocks MCP Server 开源发布:为 AI 应用提供强大分析中枢
过去,开发者要让大模型(LLM)使用数据库查询数据,往往需要开发专属插件、设计复杂的接口或手动构建 Prompt,这不仅费时费力,而且很难在不同模型之间复用。StarRocks MCP Server 提供了一个“通用适配器”接口…...
Vue百日学习计划Day21-23天详细计划-Gemini版
总目标: 在 Day 21-23 完成 Vue.js 的介绍学习、环境搭建,并成功运行第一个 Vue 3 项目,理解其基本结构。 Day 21: Vue.js 介绍与概念理解 (~3 小时) 本日目标: 理解 Vue.js 是什么、渐进式框架的概念以及选择 Vue 的原因。初步了解 Vite 是什么及其作用…...
JS逆向-某易云音乐下载器
文章目录 介绍下载链接Robots文件搜索功能JS逆向**函数a:生成随机字符串****函数b:AES-CBC加密****函数c:RSA公钥加密** 歌曲下载总结 介绍 在某易云音乐中,很多歌曲听是免费的,但下载需要VIP,此程序旨在“…...
Qt与Hid设备通信
什么是HID? HID(Human Interface Device)是直接与人交互的电子设备,通过标准化协议实现用户与计算机或其他设备的通信,典型代表包括键盘、鼠标、游戏手柄等。 为什么HID要与qt进行通信? 我这里的应…...
QT使用QXlsx读取excel表格中的图片
前言 读取excel表格中的图片的需求比较小众,QXlsx可以操作excel文档,进行图片读取、插入操作,本文主要分享单独提取图片和遍历表格提取文字和图片。 源码下载 github 开发环境准备 把下载的代码中的QXlsx目录,整个拷贝到所创建…...
二叉树进阶
一、二叉搜索树 1.二叉搜索树的概念 二叉搜索树又称二叉排序树,它也可以是一棵空树,或是具备以下性质的树: 1.1 若它的左子树不为空,则它左子树上所有节点的值都小于根节点的值。 1.2 若它的右子树不为空,则它右子…...
腾讯 CodeBuddy 杀入 AI 编程赛道,能否撼动海外工具霸主地位?
在 AI 编程助手领域,海外的 Cursor 等工具风头正劲,如今腾讯带着 CodeBuddy 隆重登场,国产 AI 编程助手能否借其之力崛起?让我们一探究竟。 官网: 腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 实战安装教程 …...
项目QT+ffmpeg+rtsp(二)——海康威视相机测试
文章目录 前言一、验证RTSP地址的有效性1.1 使用VLC播放器验证1.2 使用FFmpeg命令行验证1.3 使用Python代码检查网络连接1.4 检查摄像头Web界面1.5 使用RTSP客户端工具二、关于IPV4的地址2.1 原来2.1.1 原因2.2 解决2.3 显示前言 昨晚拿到一个海康威视的相机,是连接上了交换机…...
vscode用python开发maya联动调试设置
如何在VScode里编写Maya Python脚本_哔哩哔哩_bilibili1 包括1,maya的python全面在vscode支持,2,通过mayacode发送到maya,3同步调试 import maya.cmds as cmds 1、让 maya.cmds编译通过 下载Autodesk_Maya_2018_6_Update_DEVK…...
Postman遇到脚本不支持replaceIn函数
目录: 1、问题现象2、代码处理3、执行结果 1、问题现象 2、代码处理 function replaceVariables(template) {// 获取所有变量(环境变量全局变量)const variables pm.environment.toObject();const globalVars pm.globals.toObject();const…...
精益数据分析(64/126):移情阶段的用户触达策略——从社交平台到精准访谈
精益数据分析(64/126):移情阶段的用户触达策略——从社交平台到精准访谈 在创业的移情阶段,精准找到目标用户并开展深度访谈是验证需求的关键。今天,我们结合《精益数据分析》中的方法论,探讨如何利用Twit…...
turn.js与 PHP 结合使用来实现 PDF 文件的页面切换效果
将 Turn.js 与 PHP 结合使用来实现 PDF 文件的页面切换效果,你需要一个中间步骤将 PDF 转换为 Turn.js 可以处理的格式(如 HTML 页面或图片)。以下是实现这一功能的步骤和示例代码: 步骤 1: 安装必要的库 首先,你需要…...
SQL Server 与 Oracle 常用函数对照表
一、字符串处理函数 SQL Server 函数SQL Server 实例Oracle 函数Oracle 实例输出结果CONCATSELECT CONCAT(A, B, C);CONCATSELECT CONCAT(A, B) FROM DUAL;ABC(SQL) AB(Oracle)SUBSTRINGSELECT SUBSTRING(Hello, 2, 3);SUBSTRSEL…...
数据治理新纪元:全面解读TSDDITAI系列评估规范
在数字化转型的浪潮中,数据已成为驱动业务增长和创新的核心要素。然而,如何确保大数据产品、企业、人才及数据资源的优质与合规,成为了摆在行业面前的重大课题。为此,TSDDITAI系列评估规范应运而生,为大数据产业的健康…...
电子电路:什么是色环电阻器,怎么识别和计算阻值?
识别和计算色环电阻的阻值需要掌握颜色编码规则和基本步骤。以下是具体方法及窍门: 一、色环电阻的基本规则 色环数量: 4环电阻:前2环为有效数字,第3环为倍乘(10ⁿ),第4环为误差。5环电阻:前3环为有效数字,第4环为倍乘,第5环为误差。6环电阻(较少见):前3环为有效数…...
UE中的各种旋转
1 直接修改第三人称玩家的角度 注意不是修改玩家的actor或者pawn,而是修改controller的旋转 这只会修改相机的方向,不会修改角色的方向,因为第三人控制器的根物体不受controller控制,而相机弹簧臂受controller控制 如果修改角色…...
游戏引擎学习第289天:将视觉表现与实体类型解耦
回顾并为今天的工作设定基调 我们正在继续昨天对代码所做的改动。我们已经完成了“脑代码(brain code)”的概念,它本质上是一种为实体构建的自组织控制器结构。现在我们要做的是把旧的控制逻辑迁移到这个新的结构中,并进一步测试…...
NestJS——日志、NestJS-logger、pino、winston、全局异常过滤器
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
list重点接口及模拟实现
list功能介绍 c中list是使用双向链表实现的一个容器,这个容器可以实现。插入,删除等的操作。与vector相比,vector适合尾插和尾删(vector的实现是使用了动态数组的方式。在进行头删和头插的时候后面的数据会进行挪动,时…...
Linux | mdadm 创建软 RAID
注:本文为 “Linux mdadm RAID” 相关文章合辑。 略作重排,未整理去重。 如有内容异常,请看原文。 Linux 下用 mdadm 创建软 RAID 以及避坑 喵ฅ・ﻌ・ฅ Oct 31, 2023 前言 linux 下组软 raid 用 mdadm 命令,multi…...
迁移学习:解锁AI高效学习与泛化能力的密钥
前言 在人工智能(AI)技术日新月异的今天,迁移学习(Transfer Learning)作为一项革命性技术,正深刻改变着机器学习领域的格局。 它不仅让模型能够像人类一样“举一反三”,更在加速模型开发、提升性…...
前端-HTML元素
目录 HTML标签是什么? 什么是HTML元素? HTML元素有哪些分类方法? 什么是HTML头部元素 更换路径 注:本文以leetbook为基础 HTML标签是什么? HTML标签是HTML语言中最基本单位和重要组成部分 虽然它不区分大小写&a…...
STM32之蜂鸣器和按键
一、蜂鸣器的原理与应用 基本概念 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 工作原理 蜂鸣器一般分为两类:有源…...
H3C UIS 超融合管理平台原理解读以及日常运维实操与故障处理
前言:超融合(Hyper-Converged Infrastructure, HCI)是将计算、存储、网络和虚拟化资源整合到统一硬件平台中,并通过软件定义技术实现资源池化与灵活管理的架构。H3C(新华三)和华为作为国内领先的ICT厂商&am…...
【强化学习】#5 时序差分学习
主要参考学习资料:《强化学习(第2版)》[加]Richard S.Suttion [美]Andrew G.Barto 著 文章源文件:https://github.com/INKEM/Knowledge_Base 缩写说明 DP:动态规划GPI:广义策略迭代MC:蒙特卡洛…...
Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先
Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先 236.二叉树的最近共公共祖先 236. 二叉树的最近公共祖先 - 力扣(LeetCode) 思路: 二叉树的最近公共祖先【基础算法精讲 12】_哔哩哔哩_bilibili 首先我们采用后序遍历 递归函数返回值…...
Elasticsearch 性能优化面试宝典
Elasticsearch 性能优化面试宝典 🚀 目录 设计调优 🏗️写入调优 ⚡查询调优 🔍综合设计 💎总结 📝设计调优 🏗️ 面试题1:索引设计优化 题目: 假设需要设计一个电商商品索引,日增数据量1TB,要求支持多维度查询(名称、分类、价格区间)。请说明索引设计的关…...
mysql数据库-中间件MyCat
1. MyCat简介 在整个 IT 系统架构中,数据库是非常重要,通常又是访问压力较大的一个服务,除了在程序开发的本身做优化,如: SQL 语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分…...
制作大风车动画
这个案例的风车旋转应用了图形变换来实现,速度和缩放比例应用slider来实现,其中图片的速度,图片大小的信息通过State来定义变量管理,速度和和缩放比例的即时的值通过Prop来管理。 1. 案例效果截图 2. 案例运用到的知识点 2.1. 核…...
嘉立创EDA成图:文件管理
在 工程 文 件夹 中 新建 一 个以 自 己选 手 编号 后 8 位 命名 的 项目 工 程文 件 按要求名字命名(这里以日期命名) 选择半离线或者全离线 添加路径 1. 新建 图 纸文 件 ,文 件 名为 moban.elibz; 点击保存之后打开文件夹有这…...
Vim编辑器命令模式操作指南
Vim 的命令模式(即 Normal 模式)是 Vim 的核心操作模式,用于执行文本编辑、导航、搜索、保存等操作。以下是命令模式下的常用操作总结: 1. 模式切换 进入命令模式:在任何模式下按 Esc 键(可能需要多次按&a…...
jvm安全点(一)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞
1. 信号处理入口 JVM_HANDLE_XXX_SIGNAL 是 JVM 处理信号的统一入口,负责处理 SIGSEGV、SIGBUS 等信号。javaSignalHandler 是实际注册到操作系统的信号处理函数,直接调用 JVM_HANDLE_XXX_SIGNAL。 2. 安全点轮询页的识别 …...
手机打电话时由对方DTMF响应切换多级IVR语音应答(二)
手机打电话时由对方DTMF响应切换多级IVR语音应答(二) --本地AI电话机器人 一、前言 前面的篇章《手机打电话时由对方DTMF响应切换多级IVR语音应答(一)》中,我们从理论的角度论述了“根据对方按下DTMF值响应多级IVR”…...
【Java ee初阶】HTTP(2)
一、HTTP的方法 方法 说明 支持的HTTP协议版本 GET 获取资源 1.0、1.1 POST 传输实体主体 1.0、1.1 PUT 传输文件 1.0、1.1 HEAD 获得报文首部 1.0、1.1 DELETE 删除文件 1.0、1.1 OPTIONS 询问支持的方法 1.1 TRACE 追踪路径 1.1 CONNECT 要求用隧道…...
计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM-Attention时间序列预测(完整源码和数据)
EMD-SSA-VMD-LSTM-Attention 一、完整代码实现二、代码结构解析三、关键数学公式四、参数调优建议五、性能优化方向六、工业部署建议 以下是用Python实现EMD-SSA-VMD-LSTM-Attention时间序列预测的完整解决方案。该方案结合了四层信号分解技术与注意力增强的深度学习模型&#…...
Java 应用如何实现 HTTPS:加密数据传输的实用指南
Java 应用如何实现 HTTPS:加密数据传输的实用指南 在当今的互联网环境中,数据安全至关重要,HTTPS 作为加密的数据传输协议,为 Java 应用提供了安全通信的保障。本文将深入探讨 Java 应用如何实现 HTTPS,通过详细代码实…...
手机打电话时如何将通话对方的声音在手机上识别成文字
手机打电话时如何将通话对方的声音在手机上识别成文字 --本地AI电话机器人 上一篇:手机打电话时由对方DTMF响应切换多级IVR语音应答(一) 下一篇:手机打电话时由对方DTMF响应切换多级IVR语音应答(二) 一、…...
18.自动化生成知识图谱的多维度质量评估方法论
文章目录 一、结构维度评估1.1 拓扑结构评估1.1.1 基础图论指标1.1.2 层级结构指标 1.2 逻辑一致性评估1.2.1 形式逻辑验证1.2.2 约束满足度 二、语义维度评估2.1 语义一致性评估2.1.1 标签语义分析2.1.2 关系语义评估 2.2 语义表示质量2.2.1 嵌入质量2.2.2 上下文语义评估 三、…...
W5500使用ioLibrary库创建TCP客户端
1、WIZnet全硬件TCP/IP协议栈 WIZnet全硬件TCP/IP协议栈,支持TCP,UDP,IPv4,ICMP,ARP,IGMP以及PPPoE协议。 以太网:支持BSD和WIZCHIP(W5500/W5300/W5200/W5100/W5100S)的SOCKET APIs驱动程序。 互联网: DHCP客户端 DNS客户端 FTP客…...
2025B难题练习
1.启动多任务排序 拓扑排序 每次选入度为0的点 对每次选的点进行排序 package mainimport ("bufio""fmt""os""slices""strings" )func main() {scanner : bufio.NewScanner(os.Stdin)scanner.Scan()text : scanner.Text()…...
20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔
20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔 2025/5/17 17:52 缘起:实测NanoPi NEO core开发板上电之后,后插入的TF卡不认/不支持热插拔。 Ubuntu core16.04.2 Ubuntu core20.04 Ubuntu core16.04.3 用NanoPi NEO core开发板…...
Vue百日学习计划Day19-20天详细计划-Gemini版
重要提示: 番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。动手实践: DevTools 的使用和 Git 命令的掌握都需要大量的实际操作。请务必边学边练。环境准备:…...
Uniapp、Flutter 和 React Native 全面对比
文章目录 前言Uni-app、Flutter 和 React Native 跨平台框架对比报告1. 性能对比2. 跨平台能力3. 学习曲线4. 社区生态与第三方库5. 原生能力扩展6. UI 渲染能力7. 企业支持与典型使用场景8. 开发效率与工具链 前言 将对 Uniapp、Flutter 和 React Native 进行全面对比&#x…...
【Linux笔记】——线程互斥与互斥锁的封装
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——Linux线程封装 🔖流水不争,争的是滔滔不息 一、线程互斥的概念二、互…...
Linux面试题集合(4)
现有压缩文件:a.tar.gz存在于etc目录,如何解压到data目录 tar -zxvf /etc/a.tar.gz -C /data 给admin.txt创建一个软链接 ln -s admin.txt adminl 查找etc目录下以vilinux开头的文件 find /etc -name vilinux* 查找admin目录下以test开头的文件 find admin -name te…...
Java二叉树题目练习
Java二叉题目练习 相同的树对称二叉树平衡二叉树二叉树的最近公共祖先二叉树的层序遍历二叉树层序遍历 ||二叉树遍历 相同的树 二叉树的题目大多数时候就可以采用递归的方法写 因为二叉树是由根左子树和右子树组成,每一棵左子树和右子树又可以被看成一颗完整的树&am…...