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

C语言之图像文件的属性


🌟 嗨,我是LucianaiB!

🌍 总有人间一两风,填我十万八千梦。

🚀 路漫漫其修远兮,吾将上下而求索。



图像文件属性提取系统设计与实现

目录

  1. 设计题目
  2. 设计内容
  3. 系统分析
  4. 总体设计
  5. 详细设计
  6. 程序实现
  7. 测试数据和运行结果
  8. 总结与思考
  9. 参考文献

设计题目

图像文件的属性提取


设计内容

题目描述

本项目的目标是编写一个 C 语言程序,能够读取 BMP 格式的图像文件,并提取图像的基本属性,如宽度、高度、颜色深度等。程序需要解析文件格式并提取属性,但不需要对图像进行渲染或处理。

题目要求

  1. 自动判断文件是否为 BMP 格式。
  2. 提取图像的灰度或彩色信息。
  3. 提取图像的宽度和高度(以像素为单位)。
  4. 计算图像所占的字节数。
  5. 将指定矩形区域内的像素值写入到文件。

输入/输出要求

  • 输入
    • 用户通过命令行输入图像文件路径。
    • 程序验证路径是否有效,文件是否存在。
  • 输出
    • 在控制台输出图像属性信息。
    • 若输入无效,输出错误提示信息。

系统分析

本项目旨在实现一个图像文件属性提取工具,能够快速解析 BMP 文件格式并提取关键信息。系统需要具备以下功能:

  1. 文件格式验证。
  2. 属性提取(宽度、高度、颜色深度等)。
  3. 数据持久化(将像素值写入文件)。
  4. 用户友好的交互界面。

总体设计

系统采用模块化设计,主要分为以下几个模块:

  1. 文件解析模块:负责读取 BMP 文件并验证格式。
  2. 属性提取模块:提取图像的基本属性。
  3. 数据处理模块:处理像素数据并写入文件。
  4. 用户界面模块:提供命令行交互界面。

详细设计

3.1 数据结构设计

定义 BMP 文件头和信息头的数据结构:

typedef struct {unsigned char bfType[2];       // 文件类型unsigned int bfSize;           // 文件大小unsigned short bfReserved1;    // 保留字段unsigned short bfReserved2;    // 保留字段unsigned int bfOffBits;        // 像素数据偏移
} BMPFileHeader;typedef struct {unsigned int biSize;           // 信息头大小int biWidth;                   // 图像宽度int biHeight;                  // 图像高度unsigned short biPlanes;       // 平面数unsigned short biBitCount;     // 颜色深度unsigned int biCompression;    // 压缩类型unsigned int biSizeImage;      // 图像数据大小int biXPelsPerMeter;           // 水平分辨率int biYPelsPerMeter;           // 垂直分辨率unsigned int biClrUsed;        // 颜色表大小unsigned int biClrImportant;   // 重要颜色数
} BMPInfoHeader;

3.2 函数功能描述

  1. 读取 BMP 文件

    int readBMP(const char* filename, BMPFileHeader* fileHeader, BMPInfoHeader* infoHeader);
    

    功能:读取 BMP 文件并验证格式。

  2. 提取图像属性

    void extractAttributes(const BMPInfoHeader* infoHeader);
    

    功能:提取图像的宽度、高度、颜色深度等属性。

  3. 写入像素数据

    void writePixelData(const char* outputFilename, const unsigned char* pixelData, int dataSize);
    

    功能:将指定区域的像素值写入文件。

  4. 主函数

    int main(int argc, char* argv[]);
    

    功能:处理用户输入,调用文件解析和属性提取模块。

3.3 主要函数流程图

有效
无效
BMP
非BMP
开始
读取文件路径
验证路径
读取BMP文件
输出错误信息
验证文件格式
提取属性
输出属性信息
写入像素数据
结束

程序实现

4.1 源代码

以下是实现 BMP 文件属性提取的完整代码:
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define BMP_HEADER_SIZE 54typedef struct {unsigned char bfType[2];unsigned int bfSize;unsigned short bfReserved1;unsigned short bfReserved2;unsigned int bfOffBits;
} BMPFileHeader;typedef struct {unsigned int biSize;int biWidth;int biHeight;unsigned short biPlanes;unsigned short biBitCount;unsigned int biCompression;unsigned int biSizeImage;int biXPelsPerMeter;int biYPelsPerMeter;unsigned int biClrUsed;unsigned int biClrImportant;
} BMPInfoHeader;int readBMP(const char* filename, BMPFileHeader* fileHeader, BMPInfoHeader* infoHeader) {FILE* file = fopen(filename, "rb");if (!file) {printf("文件打开失败。\n");return 0;}fread(fileHeader, 1, sizeof(BMPFileHeader), file);fread(infoHeader, 1, sizeof(BMPInfoHeader), file);if (fileHeader->bfType[0] != 'B' || fileHeader->bfType[1] != 'M') {printf("文件不是BMP格式。\n");fclose(file);return 0;}fclose(file);return 1;
}void extractAttributes(const BMPInfoHeader* infoHeader) {printf("图像宽度:%d像素\n", infoHeader->biWidth);printf("图像高度:%d像素\n", infoHeader->biHeight);printf("颜色深度:%d位\n", infoHeader->biBitCount);printf("图像数据大小:%d字节\n", infoHeader->biSizeImage);
}int main(int argc, char* argv[]) {if (argc != 2) {printf("用法:%s <BMP文件路径>\n", argv[0]);return 1;}BMPFileHeader fileHeader;BMPInfoHeader infoHeader;if (readBMP(argv[1], &fileHeader, &infoHeader)) {extractAttributes(&infoHeader);}return 0;
}

4.2 测试数据和运行结果

测试数据

输入文件路径:example.bmp

运行结果
图像宽度:800像素
图像高度:600像素
颜色深度:24位
图像数据大小:1440000字节

总结与思考

优点

  1. 功能完整:程序能够准确解析 BMP 文件并提取关键属性。
  2. 用户友好:通过命令行交互,用户可以轻松使用程序。

改进方向

  1. 支持更多格式:扩展程序以支持其他图像格式(如 JPEG、PNG)。
  2. 错误处理:增加更详细的错误提示和异常处理。
  3. 性能优化:优化文件读取和处理速度。

参考文献

  1. C语言从入门到项目实战
  2. BMP 文件格式解析
  3. C语言课程设计案例

附录代码

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_MENU 100  // 定义菜单项的最大数量#define MAX_ORDER 100 // 定义订单的最大数量// 定义菜单项结构体typedef struct {int id;            // 菜品IDchar name[50];     // 菜品名称float price;       // 菜品价格} MenuItem;// 定义订单结构体typedef struct {int order_id;      // 订单IDchar customer_phone[20];  // 顾客电话char customer_name[50];    // 顾客姓名char address[100];         // 顾客地址char order_time[20];       // 订单时间MenuItem items[MAX_MENU]; // 订单包含的菜品列表int items_count;           // 订单中菜品的数量float total_amount;        // 订单总金额} Order;// 定义全局变量MenuItem menu[MAX_MENU] = {0};Order orders[MAX_ORDER] = {0};int menu_count = 0;int order_count = 0;// 函数声明void addMenuItem();                // 添加菜单项void modifyMenuItem(int id);       // 修改菜单项void displayMenu();                // 显示菜单void placeOrder();                  // 下订单void cancelOrder(int order_id);     // 取消订单void searchOrderByID(int order_id); // 通过订单ID搜索订单void searchOrderByPhone(const char *phone); // 通过电话号码搜索订单void statistics();                  // 统计信息void applyDiscount(float *amount);  // 应用折扣void printOrder(const Order *order); // 打印订单详情void clearOrder(Order *order);      // 清除订单数据// 主函数int main() {int choice;do {printf("\n1. 添加/修改菜单项\n2. 下订单\n3. 取消订单\n4. 搜索订单\n5. 统计信息\n6. 退出\n");printf("输入你的选择: ");scanf("%d", &choice);switch (choice) {case 1:addMenuItem();break;case 2:placeOrder();break;case 3:printf("输入要取消的订单ID: ");scanf("%d", &choice);cancelOrder(choice);break;case 4:printf("通过 (1) 订单ID 或 (2) 电话号码搜索: ");scanf("%d", &choice);if (choice == 1) {int order_id;printf("输入订单ID: ");scanf("%d", &order_id);searchOrderByID(order_id);} else if (choice == 2) {char phone[20];printf("输入电话号码: ");scanf("%s", phone);searchOrderByPhone(phone);}break;case 5:statistics();break;case 6:printf("退出系统.\n");break;default:printf("无效选择,请重新输入.\n");}} while (choice != 6);return 0;}// 添加菜单项void addMenuItem() {if (menu_count >= MAX_MENU) {printf("菜单已满,无法添加更多菜品。\n");return;}printf("输入菜品ID,名称和价格: ");scanf("%d %49s %f", &menu[menu_count].id, menu[menu_count].name, &menu[menu_count].price);menu_count++;}// 修改菜单项void modifyMenuItem(int id) {for (int i = 0; i < menu_count; i++) {if (menu[i].id == id) {printf("输入新的名称和价格: ");scanf("%49s %f", menu[i].name, &menu[i].price);return;}}printf("未找到菜品。\n");}// 显示菜单void displayMenu() {printf("菜单:\n");for (int i = 0; i < menu_count; i++) {printf("%d. %s - $%.2f\n", menu[i].id, menu[i].name, menu[i].price);}}// 下订单void placeOrder() {if (order_count >= MAX_ORDER) {printf("订单数量已达上限,无法下新订单。\n");return;}int item_id;float total = 0;orders[order_count].items_count = 0;displayMenu();printf("输入顾客的电话、姓名、地址和下单时间: ");scanf("%19s %49s %99s %19s", orders[order_count].customer_phone, orders[order_count].customer_name, orders[order_count].address, orders[order_count].order_time);while (1) {printf("输入菜品ID(0结束): ");scanf("%d", &item_id);if (item_id == 0) break;for (int i = 0; i < menu_count; i++) {if (menu[i].id == item_id) {if (orders[order_count].items_count < MAX_MENU) {orders[order_count].items[orders[order_count].items_count++] = menu[i];total += menu[i].price;} else {printf("一个订单中不能添加超过 %d 个菜品。\n", MAX_MENU);break;}}}}applyDiscount(&total);orders[order_count].total_amount = total;orders[order_count].order_id = order_count + 1; // 简单的订单ID生成逻辑printf("订单成功创建。订单ID: %d\n", orders[order_count].order_id);order_count++;}// 取消订单void cancelOrder(int order_id) {for (int i = 0; i < order_count; i++) {if (orders[i].order_id == order_id) {printf("订单 %d 已取消。\n", order_id);clearOrder(&orders[i]); // 清除订单数据for (int j = i; j < order_count - 1; j++) {memcpy(&orders[j], &orders[j + 1], sizeof(Order));}order_count--;return;}}printf("未找到订单。\n");}// 通过订单ID搜索订单void searchOrderByID(int order_id) {int found = 0; // 用于标记是否找到订单for (int i = 0; i < order_count; i++) {if (orders[i].order_id == order_id) {printOrder(&orders[i]);found = 1; // 标记找到订单break;}}if (!found) {printf("没有找到订单。\n");}}// 通过电话号码搜索订单void searchOrderByPhone(const char *phone) {int found = 0; // 用于标记是否找到订单for (int i = 0; i < order_count; i++) {if (strcmp(orders[i].customer_phone, phone) == 0) {printOrder(&orders[i]);found = 1; // 标记找到订单}}if (!found) {printf("没有找到该电话号码的订单。\n");}}// 统计信息void statistics() {// 示例统计信息 - 可以根据实际需求扩展int order_count_per_item[MAX_MENU] = {0};float total_revenue = 0;for (int i = 0; i < order_count; i++) {total_revenue += orders[i].total_amount;for (int j = 0; j < orders[i].items_count; j++) {int item_id = orders[i].items[j].id;order_count_per_item[item_id]++;}}printf("今日总收入: %.2f\n", total_revenue);for (int i = 0; i < menu_count; i++) {if (order_count_per_item[menu[i].id] > 0) {printf("%s 被订购了 %d 次。\n", menu[i].name, order_count_per_item[menu[i].id]);}}}// 应用折扣void applyDiscount(float *amount) {if (*amount > 300) *amount *= 0.85f;else if (*amount > 200) *amount *= 0.9f;else if (*amount > 100) *amount *= 0.95f;}// 打印订单详情void printOrder(const Order *order) {if (order == NULL) {printf("订单为空。\n");return;}// 打印订单头部信息printf("订单ID: %d\n", order->order_id);printf("顾客电话: %s\n", order->customer_phone);printf("顾客姓名: %s\n", order->customer_name);printf("地址: %s\n", order->address);printf("下单时间: %s\n", order->order_time);// 检查是否有订单项if (order->items_count == 0) {printf("该订单没有包含任何菜品。\n");} else {printf("订单项:\n");for (int i = 0; i < order->items_count; i++) {// 打印每个订单项的名称和价格printf(" - %s ($%.2f)\n", order->items[i].name, order->items[i].price);}}// 打印订单总金额printf("总金额: $%.2f\n", order->total_amount);}// 清除订单数据void clearOrder(Order *order) {memset(order, 0, sizeof(Order));}


嗨,我是LucianaiB。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉LucianaiB ,获取最新动态,⚡️ 让信息传递更加迅速。

相关文章:

C语言之图像文件的属性

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 图像文件属性提取系统设计与实现 目录 设计题目设计内容系统分析总体设计详细设计程序实现…...

Java链表反转方法详解

一、理解链表结构 假设链表节点定义为&#xff1a; class ListNode {int val;ListNode next;ListNode(int x) { val x; } } 二、迭代法反转链表 核心思路 逐步反转每个节点的指针方向&#xff0c;最终使整个链表反向。 步骤拆解 初始化三个指针&#xff1a; prev&#xf…...

lmm-r1开源程序是扩展 OpenRLHF 以支持 LMM RL 训练,用于在多模态任务上重现 DeepSeek-R1

一、软件介绍 文末提供程序和源码下载学习 lmm-r1开源程序是扩展 OpenRLHF 以支持 LMM RL 训练&#xff0c;用于在多模态任务上重现 DeepSeek-R1。 二、简介 小型 3B 大型多模态模型&#xff08;LMMs&#xff09;由于参数容量有限以及将视觉感知与逻辑推理相结合的固有复杂性…...

Java学习笔记(数组,方法)

一&#xff0c;数组 1.数组初始化 1.1动态初始化 格式&#xff1a;数据类型[] 数组名 new 数据类型[数组长度]; int[] arr new int[3]; // 定义长度为3的int数组&#xff0c;元素默认值为0 double[] scores new double[5]; // 长度5&#xff0c;元素默认0.0 String[…...

嵌入式---零点漂移(Zero Drift)

一、零点漂移的定义与本质 零点漂移&#xff08;简称“零漂”&#xff09;指传感器在输入信号为零&#xff08;或理论上应输出固定零值&#xff09;时&#xff0c;输出信号随时间、温度、环境等因素变化而偏离初始零点的现象。 核心特征&#xff1a;无输入时输出非零且缓慢变…...

健身房管理系统设计与实现(springboot+ssm+vue+mysql)含万字详细文档

健身房管理系统设计与实现(springbootssmvuemysql)含万字详细文档 健身房管理系统是一个全面的解决方案&#xff0c;旨在帮助健身房高效管理日常运营。系统主要功能模块包括个人中心、会员管理、员工管理、会员卡管理、会员卡类型管理、教练信息管理、解聘管理、健身项目管理、…...

C语言if

一、题目引入 如果从键盘输入58,则以下程序输出的结果是多少? 二、运行结果 三、题目分析 因为这道题中的多个if是并列结构 所以只要条件满足都会执行 这一题58满足所有的条件 所以可以运行出来 也就是说每个if里面的条件都满足 所以都会打印出来 而下面的这种情况就是 if e…...

XSS学习1之http回顾

1. HTTP的基本结构与工作流程 HTTP是一个请求-响应协议&#xff0c;基于客户端与服务器之间的交互。每次用户通过浏览器请求某个资源时&#xff0c;HTTP协议都会完成一系列的步骤。 HTTP请求&#xff1a; HTTP请求由以下几个部分构成&#xff1a; 请求行&#xff1a; 请求方…...

小迪抓包技术算法加密(6-9天)

抓包技术 https://blog.csdn.net/2301_81015455/article/details/147014382 算法加密入门&#xff08;了解&#xff09; 在实际测试中安全性高一些得采用得都是AES等高安全加密&#xff0c;遇到这种&#xff0c;放弃你啥都不知道测个毛啊,所以直接run!!! 大部分解密时碰撞式…...

Tkinter与ttk模块对比:构建现代 Python GUI 的进化之路

在 Python GUI 开发中&#xff0c;标准库 tkinter 及其子模块 ttk&#xff08;Themed Tkinter&#xff09;常被同时使用。本文通过功能对比和实际案例&#xff0c;简单介绍这两个模块的核心差异。 1. 区别 Tkinter&#xff1a;Python 标准 GUI 工具包&#xff08;1994年集成&…...

【数据结构入门训练DAY-18】信息学奥赛一本通T1331-后缀表达式的值

文章目录 前言一、题目二、解题思路总结 前言 本次训练内容&#xff1a; 栈的复习。栈模拟四则运算计算问题的练习。训练解题思维。 一、题目 从键盘读入一个后缀表达式&#xff08;字符串&#xff09;&#xff0c;只含有0-9组成的运算数及加&#xff08;&#xff09;、减…...

时序预测 | Transformer-LSTM-SVM时间序列预测(Matlab完整源码和数据,适合基础小白研究)

时序预测 | Transformer-LSTM-SVM时间序列预测&#xff08;Matlab完整源码和数据&#xff0c;适合基础小白研究&#xff09; 目录 时序预测 | Transformer-LSTM-SVM时间序列预测&#xff08;Matlab完整源码和数据&#xff0c;适合基础小白研究&#xff09;效果一览基本介绍代码…...

【HarmonyOS 5】makeObserved接口详解

【HarmonyOS 5】makeObserved接口详解 一、makeObserved接口是什么&#xff1f; makeObserved 接口&#xff08;API version 12 起可用&#xff09;用于将非观察数据转为可观察数据&#xff0c;适用于三方包类、Sendable 装饰的类、JSON.parse 返回的对象、collections.Array…...

色谱图QCPColorMap

一、QCPColorMap 概述 QCPColorMap 是 QCustomPlot 中用于绘制二维颜色图的类&#xff0c;可以将矩阵数据可视化为颜色图&#xff08;热力图&#xff09;&#xff0c;支持自定义色标和插值方式。 二、主要属性 属性类型描述dataQCPColorMapData存储颜色图数据的对象interpol…...

【数据结构_12】二叉树(4)

一、二叉树的层序遍历 思路&#xff1a;可以按照先序的方式来遍历这个树&#xff0c;递归的时候&#xff0c;给递归方法&#xff0c;加上辅助的参数&#xff0c;level表示当前层数&#xff0c;递归过程中&#xff0c;根据level的值&#xff0c;决定当前整个节点要放到哪个list中…...

HCIA-Datacom高阶:vlan、vlanif、单臂路由、静态路由、ospf综合实验

本实验拓扑图如下&#xff1a;实验包含 AR1、AR2、AR3 路由器&#xff0c;LSW1&#xff08;三层交换机&#xff09;、LSW2、LSW3 交换机&#xff0c;以及 PC1-4 和 Server1。AR1 与 LSW2 通过单臂路由连接&#xff0c;AR2 与 AR3、LSW1 构成 OSPF 网络&#xff0c;AR1 与 AR2 间…...

HTTP 1.0 和 2.0 的区别

HTTP 1.0 和 2.0 的核心区别体现在性能优化、协议设计和功能扩展上&#xff0c;以下是具体对比&#xff1a; 一、核心区别对比 特性HTTP 1.0HTTP 2.0连接方式非持久连接&#xff08;默认每次请求新建 TCP 连接&#xff09;持久连接&#xff08;默认保持连接&#xff0c;可复用…...

如何一键批量删除多个 Word 文档中的页眉和页脚

在工作中&#xff0c;许多 Word 文档的页眉页脚中包含公司名称、Logo、电话等信息&#xff0c;用于对外宣传。但有时我们需要批量删除这些页眉页脚信息&#xff0c;尤其当信息有误时&#xff0c;手动逐个删除会增加工作量&#xff0c;导致效率低下。本文将介绍一种便捷的方法&a…...

关于编译树莓派内核系统的总结

1.首先获取官方的内核系统源码&#xff1a; 然后在源码根目录执行命令&#xff1a; &#x1f31f;ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- KERNELkernel8 make bcm2712_defconfig &#xff08;注意这里的是树莓派5的64位的&#xff09; &#x1f31f;ARCHarm CROSS_COM…...

AIGC赋能插画创作:技术解析与代码实战详解

文章目录 一、技术架构深度解析二、代码实战&#xff1a;构建AIGC插画生成器1. 环境配置与依赖安装2. 模型加载与文本提示词构建3. 图像生成与参数调优4. 风格迁移与多模型融合 三、进阶技巧&#xff1a;参数调优与效果增强四、应用场景代码示例1. 游戏角色设计2. 广告海报生成…...

平衡二叉树(leetcode刷题)

题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 &#xff08;平衡二叉树 是指该树所有节点的左右子树的高度相差不超过 1。&#xff09; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1…...

【数据结构 · 初阶】- 带环链表

目录 一.基本结构 二.判断一个单链表带不带环 三.2个问题 1.为什么 slow 走 1 步&#xff0c;fast 走 2 步&#xff0c;他们会相遇&#xff0c;会不会错过&#xff1f;请证明。 2.为什么 slow 走 1 步&#xff0c;fast 走 X 步 ( X > 3 )&#xff0c;他们会相遇&#x…...

ClickHouse简介

OLAP与ClickHouse的定位 OLAP的核心概念 OLTP&#xff1a;服务于高并发、低延迟的短事务操作&#xff08;如银行转账、订单支付&#xff09;&#xff0c;强调数据的增删改查&#xff08;CRUD&#xff09;和事务一致性&#xff08;ACID&#xff09;。 OLAP&#xff1a;专注于大…...

强制重装及验证onnxruntime-gpu是否正确工作

#工作记录 我们经常会遇到明明安装了onnxruntime-gpu或onnxruntime后&#xff0c;无法正常使用的情况。 一、强制重新安装 onnxruntime-gpu 及其依赖 # 强制重新安装 onnxruntime-gpu 及其依赖 pip install --force-reinstall --no-cache-dir onnxruntime-gpu1.18.0 --extra…...

分布自定义shell脚本(详写)附带全代码

涉及知识全排列 常见指令 小知识点 操作系统 什么是进程 进程控制 步骤 1&#xff1a;项目准备 在开始编写代码之前&#xff0c;你需要创建一个新的项目文件夹&#xff0c;并在其中创建一个 .cpp 文件&#xff0c;例如 my_shell.cpp。同时&#xff0c;确保你已经安装了 C…...

windows拷贝文件脚本

1、新建脚本文件xxx.bat&#xff0c;名字任意&#xff0c;后缀未.bat即可&#xff0c;将以下内容拷贝进去&#xff0c;修改src和des为自己文件的目录即可。 echo off :: 设置字符集为UTF-8&#xff0c;命令窗口能正确显示中文字符。 chcp 65001 rem 读取当前目录并进入当前目…...

Arduino编译和烧录STM32——基于J-link SWD模式

一、安装Stm32 Arduino支持 在arduino中添加stm32的开发板地址&#xff1a;https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json 安装stm32开发板支持 二、安装STM32CubeProgrammer 从stm32网站中安装&#xff1a;https://ww…...

Java表达式2.0

1 .数据类型转换 自动类型转换的规则 自动类型转换遵循一定的规则&#xff0c;这些规则确保了转换的合理性和安全性。以下是自动类型转换的主要规则&#xff1a; 容量小的类型自动转换为容量大的类型 Java中&#xff0c;数据类型的容量从小到大依次为&#xff1a;byte → shor…...

【概率论,算法】排列的峰值期望

Surtr1 的珂学难题 题目链接:https://ac.nowcoder.com/acm/contest/107965/E 给定一个长度为 n n n 的排列 p p p&#xff0c;排列中任一位置如果满足以下条件&#xff0c;则称该位置为 峰值&#xff1a; 位置 1&#xff1a;若存在元素&#xff0c;满足 p [ 1 ] > p […...

清理C盘组合拳:最高释放空间80GB+

分享一套系统化的C盘清理方案&#xff0c;涵盖从基础清理到深度优化的8个关键步骤&#xff0c;结合安全性与效率&#xff0c;可快速释放5-50GB空间&#xff1a; 一、精准定位空间占用源&#xff08;必备工具&#xff09; 空间可视化分析 使用 TreeSize Free 或 WizTree 扫描C…...

容器中的对象切片问题

C 容器&#xff08;如 std::vector、std::list 等&#xff09; 通常存储对象的副本&#xff0c;而非指向对象的指针。因此&#xff0c;当与继承结合使用时&#xff0c;可能导致 切片&#xff08;Object Slicing&#xff09; 问题&#xff0c;即仅存储基类部分&#xff0c;丢失派…...

SpringBoot编写单元测试

pom.xml引入单元测试的坐标 <!--单元测试坐标--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>编写单元测试类 测试类…...

二、在springboot 中使用 AIService

在上一篇文章中&#xff0c;我们介绍了如何使用langchain4j实现简单的问答功能&#xff0c;本篇文章我们将介绍如何在springboot中使用AIService。 1.实现原理 先看下AiService注解所在的依赖langchain4j-spring-boot-starter中包含什么内容&#xff1a; 1.1 event.AiServi…...

拼多多面经,暑期实习Java一面

项目中的设计模式 mysql连接过程&#xff0c;索引&#xff0c;分库分表场景&#xff0c;路由策略 redis使用场景&#xff0c;分片集群怎么搭建与路由&#xff0c;数据一致性 分布式锁怎么用的&#xff0c;具体使用参数 线程池怎么用的&#xff0c;过程 sql having 分布式事务 如…...

Function calling LLMs 的 MCP:AI开发的双剑合璧

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创AI未来! 🚀 在 MCPs 成为主流(或者像现在这样火得一塌糊涂)之前,大多数 AI …...

数字系统与编码

1. 数字系统&#xff08;Number Systems&#xff09; 1.1 常见数字系统 系统基数符号集示例应用场景二进制20, 11010计算机底层电路、数据存储八进制80-717Unix文件权限&#xff08;如chmod 755&#xff09;十进制100-942日常计算十六进制160-9, A-F0x1F内存地址、颜色编码&a…...

Pytorch实战

1、安装 安装 conda, Python工具大全&#xff0c;方便管理多个 Python 环境&#xff0c;必须选择跟自己环境配套的版本。 https://www.anaconda.com 网速慢的&#xff0c;可以参考国内源&#xff0c;也可以去这里看看&#xff1a; torch PyPI Index of /anaconda/miniconda…...

如何高效利用呼叫中心系统和AI语音机器人

要更好地使用呼叫中心系统和语音机器人&#xff0c;需要结合两者的优势&#xff0c;实现自动化、智能化、高效率的客户服务与业务运营。以下是优化策略和具体实践方法&#xff1a; 一、呼叫中心系统优化 1. 智能路由与IVR优化 智能ACD&#xff08;自动呼叫分配&#xff09; …...

LeetCode[232]用栈实现队列

思路&#xff1a; 一道很简单的题&#xff0c;就是栈是先进后出&#xff0c;队列是先进先出&#xff0c;用两个栈底相互对着&#xff0c;这样一个队列就产生了&#xff0c;右栈为空的情况&#xff0c;左栈栈底就是队首元素&#xff0c;所以我们需要将左栈全部压入右栈&#xff…...

using用法整理

using 的极简新手教程&#xff0c;用最直白的语言和代码解释&#xff1a; 美图美图 一、核心作用&#xff1a;给类型起别名 目的&#xff1a;让复杂类型名变短、变好记。 例子&#xff1a; // 原名&#xff1a;std::vector<std::string> // 起个别名就叫 StringList…...

《猎豹夕阳》

年少时很喜欢的一篇文章&#xff0c;曾和挚友一遍又一遍的记诵&#xff0c;今天又偶然遇到他&#xff0c;转载如下&#xff1a; 我第一次见到它&#xff0c;是在风雪的夜里。我不会抱怨这种天气&#xff0c;因为我是个优秀的登山探险者&#xff0c;我必须在这种天气下工作。我…...

【AI训练环境搭建】在Windows11上搭建WSL2+Ubuntu22.04+Tensorflow+GPU机器学习训练环境

一、安装Ubuntu 拿到该文件Ubuntu-22.04.tar 通过wsl导入该虚拟机镜像&#xff0c;然后查看wsl虚拟机列表。 wsl --import Ubuntu-22.04-tensorflow D:\wsl-data\Ubuntu-22.04-tensorflow D:\wsl-data\temp\Ubuntu-22.04.tarwsl -l 进入虚拟机 wsl -d Ubuntu-22.04-tensorfl…...

如何轻松实现用户充值系统的API自动化测试

在现代软件开发中&#xff0c;API&#xff08;应用程序编程接口&#xff09;作为连接不同系统和模块的关键组件&#xff0c;其重要性日益凸显。随着软件应用的互联性不断增强&#xff0c;API的数量和复杂度也在不断增加。传统的API测试方法面临着诸多挑战&#xff1a; 1.手动测…...

Python 一等函数( 高阶函数)

高阶函数 接受函数为参数&#xff0c;或者把函数作为结果返回的函数是高阶函数&#xff08;higherorder function&#xff09;。map 函数就是一例&#xff0c;如示例 5-2 所示。此外&#xff0c;内置函 数 sorted 也是&#xff1a;可选的 key 参数用于提供一个函数&#xff0c…...

用于手部康复设备的TinyML语音分类嵌入式人工智能模块

论文标题 英文标题&#xff1a;TinyML Speech Classification Embedded AI Module for Hand Rehabilitation Device 中文标题&#xff1a;用于手部康复设备的 TinyML 语音分类嵌入式人工智能模块 作者信息 Arkorn Numsomran&#xff1a;Triam Udom Suksa Pattanakarn Suvarna…...

【HarmonyOS 5】VisionKit人脸活体检测详解

【HarmonyOS 5】VisionKit人脸活体检测详解 一、VisionKit人脸活体检测是什么&#xff1f; VisionKit是HamronyOS提供的场景化视觉服务工具包。 华为将常见的解决方案&#xff0c;通常需要三方应用使用SDK进行集成。华为以Kit的形式集成在HarmoyOS系统中&#xff0c;方便三方…...

Linux操作系统--进程的创建和终止

目录 1.进程创建 1.1fork()函数初识 1.2写时拷贝 1. 提升系统效率 2. 隔离错误影响 3. 支持并行计算 2.进程终止&#xff1a; 2.1进程退出场景&#xff1a; 2.2进程常见退出方法&#xff1a; 2.3_exit()系统调用接口 2.4exit函数 2.5return退出 1.进程创建 1.1for…...

算法分析传输加密数据格式密文存储代码混淆逆向保护

代码混淆 一.基本概念java的bytecode很容易通过JAD等反编译工具还原出源代码。这样势必不满足安全的定义。如何一定程度上保护需要防止被反编译的源代码呢&#xff1f;混淆&#xff08;obfuscate&#xff09;技术注意&#xff1a;用obfuscate防盗版是根本不可能&#xff0c;连汇…...

从事计算机视觉需要掌握哪些知识

目录 基础数学知识 计算机科学基础 传统计算机视觉知识 机器学习与深度学习知识 其他知识 计算机视觉是一门让计算机从图像或视频中获取有意义信息的跨学科领域&#xff0c;从事该领域需要掌握多方面的知识&#xff0c;以下详细介绍&#xff1a; 基础数学知识 线性代数 &…...

Android Studio 中 Drawable 详细全解

文章目录 一、Drawable 概述二、Drawable 类型详解1. 位图 Drawable (BitmapDrawable)2. 矢量 Drawable (VectorDrawable)3. 形状 Drawable (ShapeDrawable)4. 图层 Drawable (LayerDrawable)5. 状态列表 Drawable (StateListDrawable)6. 级别列表 Drawable (LevelListDrawable…...