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

Android开发——实现一个计算器

目录

代码讲解

activity_calculator.xmld代码讲解

1. 根布局(LinearLayout)

2. 显示区域(TextView)

3. 按钮区域(GridLayout)

4. 清除和删除按钮

5. 数字和操作符按钮

6. 其他行的按钮

7. 最后一行

CalculatorActivity.java代码讲解

1. 类和变量声明

2. onCreate 方法

3. 数字按钮处理

4. 操作符按钮处理

5. 执行计算

6. 清除所有内容

7. 删除最后一个字符

8. 更新显示

9. 显示错误提示

​编辑

完整代码

activity_calculator.xml

CalculatorActivity.java

运行效果



代码讲解

activity_calculator.xmld代码讲解

1. 根布局(LinearLayout)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="myapp.CalculatorActivity"android:orientation="vertical"android:padding="8dp">
  • LinearLayout:
    • 根布局是一个垂直方向的线性布局 (android:orientation="vertical"),所有子控件会从上到下依次排列。
  • xmlns:android 和 xmlns:tools:
    • 命名空间声明,支持 Android 的属性和工具属性。
  • android:layout_width 和 android:layout_height:
    • 设置布局的宽度和高度为 match_parent,表示充满整个父容器。
  • tools:context:
    • 指定该布局与哪个 Activity 关联(这里是 CalculatorActivity)。
  • android:padding="8dp":
    • 设置内边距为 8dp,使内容与屏幕边缘保持一定距离。

2. 显示区域(TextView)

<TextViewandroid:id="@+id/tv_display"android:layout_width="match_parent"android:layout_height="100dp"android:gravity="end|center_vertical"android:textSize="32sp"android:background="#EEEEEE"android:padding="16dp"android:text="0"/>
  • TextView:
    • 显示计算器的输入和结果。
  • android:id="@+id/tv_display":
    • 给控件一个唯一标识符,方便在代码中引用。
  • android:layout_width="match_parent" 和 android:layout_height="100dp":
    • 宽度充满父容器,高度固定为 100dp。
  • android:gravity="end|center_vertical":
    • 文本靠右对齐,并在垂直方向居中。
  • android:textSize="32sp":
    • 设置字体大小为 32sp。
  • android:background="#EEEEEE":
    • 设置背景颜色为浅灰色。
  • android:padding="16dp":
    • 设置内边距为 16dp,避免文本紧贴边界。
  • android:text="0":
    • 初始显示内容为“0”。

3. 按钮区域(GridLayout)

<GridLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:columnCount="4"android:rowCount="5">
  • GridLayout:
    • 用于放置计算器的按钮,按网格形式排列。
  • android:columnCount="4":
    • 网格有 4 列。
  • android:rowCount="5":
    • 网格有 5 行。

4. 清除和删除按钮

<Buttonandroid:id="@+id/btn_clear"android:layout_columnSpan="2"android:text="C"android:textSize="24sp"android:backgroundTint="#FF5722"/><Buttonandroid:id="@+id/btn_delete"android:text="DEL"android:textSize="24sp"android:backgroundTint="#FF5722"/>
  • btn_clear:
    • 清除按钮,占据两列(android:layout_columnSpan="2"),用于清空输入。
    • 背景色为橙红色(#FF5722)。
  • btn_delete:
    • 删除按钮,用于删除最后一个字符。
    • 背景色同样为橙红色。

5. 数字和操作符按钮

<Button android:id="@+id/btn_7" android:text="7"/>
<Button android:id="@+id/btn_8" android:text="8"/>
<Button android:id="@+id/btn_9" android:text="9"/>
<Buttonandroid:id="@+id/btn_multiply"android:text="×"android:textSize="24sp"android:backgroundTint="#2196F3"/>
  • 数字按钮:
    • 数字按钮(如 btn_7btn_8btn_9)用于输入数字。
  • 操作符按钮:
    • 操作符按钮(如 btn_multiply)用于输入运算符(乘法符号 ×)。
    • 背景色为蓝色(#2196F3)。

6. 其他行的按钮

<Button android:id="@+id/btn_4" android:text="4"/>
<Button android:id="@+id/btn_5" android:text="5"/>
<Button android:id="@+id/btn_6" android:text="6"/>
<Buttonandroid:id="@+id/btn_subtract"android:text="-"android:textSize="24sp"android:backgroundTint="#2196F3"/>
  • 类似于上一行,每行包含三个数字按钮和一个操作符按钮(减号 -)。

7. 最后一行

<Buttonandroid:id="@+id/btn_0"android:layout_columnSpan="2"android:text="0"/><Buttonandroid:id="@+id/btn_dot"android:text="."/><Buttonandroid:id="@+id/btn_equal"android:text="="android:textSize="24sp"android:backgroundTint="#4CAF50"/>
  • btn_0:
    • 数字 0 按钮,占据两列(android:layout_columnSpan="2")。
  • btn_dot:
    • 小数点按钮,用于输入小数。
  • btn_equal:
    • 等号按钮,用于计算结果。
    • 背景色为绿色(#4CAF50)。


CalculatorActivity.java代码讲解

1. 类和变量声明

public class CalculatorActivity extends AppCompatActivity {private TextView tvDisplay;private StringBuilder currentInput = new StringBuilder();private double operand1 = Double.NaN;private String currentOperator = "";
  • CalculatorActivity:
    • 继承自 AppCompatActivity,表示这是一个 Activity。
  • tvDisplay:
    • 用于显示用户输入和计算结果的 TextView
  • currentInput:
    • 使用 StringBuilder 存储当前用户的输入内容。
  • operand1:
    • 存储第一个操作数,默认值为 Double.NaN(表示未初始化)。
  • currentOperator:
    • 存储当前的操作符(如 "+"、"-" 等),默认为空字符串。

2. onCreate 方法

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_calculator);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});tvDisplay = findViewById(R.id.tv_display);// 数字按钮统一处理setNumberButton(R.id.btn_0, "0");setNumberButton(R.id.btn_1, "1");setNumberButton(R.id.btn_2, "2");setNumberButton(R.id.btn_3, "3");setNumberButton(R.id.btn_4, "4");setNumberButton(R.id.btn_5, "5");setNumberButton(R.id.btn_6, "6");setNumberButton(R.id.btn_7, "7");setNumberButton(R.id.btn_8, "8");setNumberButton(R.id.btn_9, "9");setNumberButton(R.id.btn_dot, ".");// 操作符按钮setOperatorButton(R.id.btn_add, "+");setOperatorButton(R.id.btn_subtract, "-");setOperatorButton(R.id.btn_multiply, "×");setOperatorButton(R.id.btn_divide, "/");// 功能按钮findViewById(R.id.btn_equal).setOnClickListener(v -> performCalculation());findViewById(R.id.btn_clear).setOnClickListener(v -> clearAll());findViewById(R.id.btn_delete).setOnClickListener(v -> deleteLastChar());
}
  • EdgeToEdge.enable(this):
    • 启用全面屏模式,使内容可以延伸到屏幕边缘。
  • setContentView(R.layout.activity_calculator):
    • 设置布局文件为 activity_calculator.xml
  • ViewCompat.setOnApplyWindowInsetsListener:
    • 处理系统栏(如状态栏和导航栏)的内边距,确保内容不会被遮挡。
  • findViewById(R.id.tv_display):
    • 将布局中的 TextView 控件与代码中的变量绑定。
  • 数字按钮和操作符按钮:
    • 使用 setNumberButton 和 setOperatorButton 方法统一设置按钮的点击事件。
  • 功能按钮:
    • 为等号、清除和删除按钮分别设置点击事件。

3. 数字按钮处理

private void setNumberButton(int buttonId, String value) {findViewById(buttonId).setOnClickListener(v -> {if (currentInput.length() < 15) {// 防止重复小数点if (value.equals(".") && currentInput.toString().contains(".")) return;currentInput.append(value);updateDisplay();}});
}
  • 限制输入长度:
    • 最大允许输入 15 个字符。
  • 防止重复小数点:
    • 如果当前输入中已经包含小数点,则不允许再输入小数点。
  • 更新显示:
    • 调用 updateDisplay() 方法更新 TextView 的内容。

4. 操作符按钮处理

private void setOperatorButton(int buttonId, String operator) {findViewById(buttonId).setOnClickListener(v -> {if (currentInput.length() > 0) {operand1 = Double.parseDouble(currentInput.toString());currentOperator = operator;currentInput.setLength(0);}});
}
  • 保存第一个操作数:
    • 当用户点击操作符按钮时,将当前输入的内容转换为数字并存储到 operand1 中。
  • 保存操作符:
    • 将当前操作符保存到 currentOperator 中。
  • 清空输入:
    • 清空 currentInput,以便用户输入第二个操作数。

5. 执行计算

private void performCalculation() {if (!Double.isNaN(operand1) && currentInput.length() > 0) {double operand2 = Double.parseDouble(currentInput.toString());try {switch (currentOperator) {case "+":operand1 += operand2;break;case "-":operand1 -= operand2;break;case "×":operand1 *= operand2;break;case "/":if (operand2 == 0) throw new ArithmeticException();operand1 /= operand2;break;}currentInput.setLength(0);currentInput.append(operand1 % 1 == 0 ? (int) operand1 : operand1);updateDisplay();} catch (ArithmeticException e) {showError("不能除以零");}currentOperator = "";}
}
  • 检查条件:
    • 确保 operand1 已初始化且当前有输入内容。
  • 执行运算:
    • 根据 currentOperator 的值执行相应的运算(加、减、乘、除)。
  • 处理除以零的情况:
    • 如果除数为零,抛出异常并显示错误提示。
  • 格式化结果:
    • 如果结果是整数(如 10.0),则去掉小数部分。
  • 更新显示:
    • 调用 updateDisplay() 方法更新 TextView 的内容。

6. 清除所有内容

private void clearAll() {currentInput.setLength(0);operand1 = Double.NaN;currentOperator = "";tvDisplay.setText("0");
}
  • 清空输入:
    • 重置 currentInput
  • 重置操作数和操作符:
    • 将 operand1 重置为 Double.NaNcurrentOperator 重置为空字符串。
  • 重置显示:
    • 将 TextView 的内容重置为“0”。

7. 删除最后一个字符

private void deleteLastChar() {if (currentInput.length() > 0) {currentInput.deleteCharAt(currentInput.length() - 1);updateDisplay();}
}
  • 删除字符:
    • 删除 currentInput 的最后一个字符。
  • 更新显示:
    • 调用 updateDisplay() 方法更新 TextView 的内容。

8. 更新显示

private void updateDisplay() {String displayText = currentInput.length() > 0 ? currentInput.toString() : "0";tvDisplay.setText(displayText);
}
  • 显示内容:
    • 如果 currentInput 不为空,则显示其内容;否则显示“0”。

9. 显示错误提示

private void showError(String message) {Toast.makeText(this, message, Toast.LENGTH_SHORT).show();clearAll();
}
  • 弹出提示:
    • 使用 Toast 显示错误信息。
  • 清空内容:
    • 调用 clearAll() 方法重置所有状态。

完整代码

activity_calculator.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="myapp.CalculatorActivity"android:orientation="vertical"android:padding="8dp"><!-- 显示区域 --><TextViewandroid:id="@+id/tv_display"android:layout_width="match_parent"android:layout_height="100dp"android:gravity="end|center_vertical"android:textSize="32sp"android:background="#EEEEEE"android:padding="16dp"android:text="0"/><!-- 按钮区域 --><GridLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:columnCount="4"android:rowCount="5"><!-- 第一行:清除按钮 --><Buttonandroid:id="@+id/btn_clear"android:layout_columnSpan="2"android:text="C"android:textSize="24sp"android:backgroundTint="#FF5722"/><Buttonandroid:id="@+id/btn_delete"android:text="DEL"android:textSize="24sp"android:backgroundTint="#FF5722"/><Buttonandroid:id="@+id/btn_divide"android:text="/"android:textSize="24sp"android:backgroundTint="#2196F3"/><!-- 数字按钮 --><Button android:id="@+id/btn_7" android:text="7"/><Button android:id="@+id/btn_8" android:text="8"/><Button android:id="@+id/btn_9" android:text="9"/><Buttonandroid:id="@+id/btn_multiply"android:text="×"android:textSize="24sp"android:backgroundTint="#2196F3"/><Button android:id="@+id/btn_4" android:text="4"/><Button android:id="@+id/btn_5" android:text="5"/><Button android:id="@+id/btn_6" android:text="6"/><Buttonandroid:id="@+id/btn_subtract"android:text="-"android:textSize="24sp"android:backgroundTint="#2196F3"/><Button android:id="@+id/btn_1" android:text="1"/><Button android:id="@+id/btn_2" android:text="2"/><Button android:id="@+id/btn_3" android:text="3"/><Buttonandroid:id="@+id/btn_add"android:text="+"android:textSize="24sp"android:backgroundTint="#2196F3"/><!-- 最后一行 --><Buttonandroid:id="@+id/btn_0"android:layout_columnSpan="2"android:text="0"/><Buttonandroid:id="@+id/btn_dot"android:text="."/><Buttonandroid:id="@+id/btn_equal"android:text="="android:textSize="24sp"android:backgroundTint="#4CAF50"/></GridLayout>
</LinearLayout>

CalculatorActivity.java

package myapp;import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;import com.example.usthandroidjava.R;public class CalculatorActivity extends AppCompatActivity {private TextView tvDisplay;private StringBuilder currentInput = new StringBuilder();private double operand1 = Double.NaN;private String currentOperator = "";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_calculator);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});tvDisplay = findViewById(R.id.tv_display);// 数字按钮统一处理setNumberButton(R.id.btn_0, "0");setNumberButton(R.id.btn_1, "1");setNumberButton(R.id.btn_2, "2");setNumberButton(R.id.btn_3, "3");setNumberButton(R.id.btn_4, "4");setNumberButton(R.id.btn_5, "5");setNumberButton(R.id.btn_6, "6");setNumberButton(R.id.btn_7, "7");setNumberButton(R.id.btn_8, "8");setNumberButton(R.id.btn_9, "9");setNumberButton(R.id.btn_dot, ".");// 操作符按钮setOperatorButton(R.id.btn_add, "+");setOperatorButton(R.id.btn_subtract, "-");setOperatorButton(R.id.btn_multiply, "×");setOperatorButton(R.id.btn_divide, "/");// 功能按钮findViewById(R.id.btn_equal).setOnClickListener(v -> performCalculation());findViewById(R.id.btn_clear).setOnClickListener(v -> clearAll());findViewById(R.id.btn_delete).setOnClickListener(v -> deleteLastChar());}private void setNumberButton(int buttonId, String value) {findViewById(buttonId).setOnClickListener(v -> {if (currentInput.length() < 15) {// 防止重复小数点if (value.equals(".") && currentInput.toString().contains(".")) return;currentInput.append(value);updateDisplay();}});}private void setOperatorButton(int buttonId, String operator) {findViewById(buttonId).setOnClickListener(v -> {if (currentInput.length() > 0) {operand1 = Double.parseDouble(currentInput.toString());currentOperator = operator;currentInput.setLength(0);}});}private void performCalculation() {if (!Double.isNaN(operand1) && currentInput.length() > 0) {double operand2 = Double.parseDouble(currentInput.toString());try {switch (currentOperator) {case "+":operand1 += operand2;break;case "-":operand1 -= operand2;break;case "×":operand1 *= operand2;break;case "/":if (operand2 == 0) throw new ArithmeticException();operand1 /= operand2;break;}currentInput.setLength(0);currentInput.append(operand1 % 1 == 0 ? (int) operand1 : operand1);updateDisplay();} catch (ArithmeticException e) {showError("不能除以零");}currentOperator = "";}}private void clearAll() {currentInput.setLength(0);operand1 = Double.NaN;currentOperator = "";tvDisplay.setText("0");}private void deleteLastChar() {if (currentInput.length() > 0) {currentInput.deleteCharAt(currentInput.length() - 1);updateDisplay();}}private void updateDisplay() {String displayText = currentInput.length() > 0 ? currentInput.toString() : "0";tvDisplay.setText(displayText);}private void showError(String message) {Toast.makeText(this, message, Toast.LENGTH_SHORT).show();clearAll();}
}

运行效果

相关文章:

Android开发——实现一个计算器

目录 代码讲解 activity_calculator.xmld代码讲解 1. 根布局&#xff08;LinearLayout&#xff09; 2. 显示区域&#xff08;TextView&#xff09; 3. 按钮区域&#xff08;GridLayout&#xff09; 4. 清除和删除按钮 5. 数字和操作符按钮 6. 其他行的按钮 7. 最后一行…...

23G显存可以跑多大尺寸的Qwen3?

随着阿里Qwen3系列大模型的发布,开发者们对如何在有限显存下部署不同尺寸的模型尤为关注。本文基于Qwen3的技术特性和实际测试数据,探讨在23G显存环境下可运行的模型选择及优化策略。 不过由于咱财力有限,只有一张A100,还不是空的,目前只有23G的显存。 那么这23G显存能跑…...

网络通讯【QTcpServer、QTcpSocket、QAbstractSocket】

目录 QTcpServer class简单描述成员函数和信号 QTcpSocket Class详细描述成员函数和信号 QAbstractSocket Class详细描述成员函数和信号成员函数说明文档 QT实现服务器和客户端通讯服务器端&#xff1a;通讯流程原代码 客户端通信流程原代码 QTcpServer class header: #includ…...

std::functional 类是干什么用的?

author: hjjdebug date: 2025年 04月 29日 星期二 15:54:53 CST description: std::functional 类是干什么用的&#xff1f; 文章目录 1.functional 对象的概念2.functional 对象存在的意义2.1 为什么要把接口再封一层&#xff1f;2.2 c中函数参数可以不用回调函数, 而改用func…...

人事管理系统6

模糊查询 DepartmentMapper.xml &#xff1a; <select id"findDepartmentListByName" resultMap"BaseResultMap"> select <include refid"Base_Column_List"/> from department where dname like %${dname}% /*where dname like con…...

链表的中间节点

这题需要用到快慢指针的思想&#xff0c;快指针叫fast&#xff0c;慢指针是slow&#xff0c;快指针每次往后移两个节点&#xff0c;slow只移动一个节点&#xff0c;这样子fast的速度是slow的两遍&#xff0c;当fast遍历完链表&#xff0c;slow才遍历一半&#xff0c;正好就在中…...

【学习学学】城市群与都市圈是什么?怎么

城市群与都市圈是什么&#xff1f;怎么发展 这些年城市群&#xff0c;都市圈的概念被逐渐提了出来&#xff0c;也是未来我国即将重点发展的对象之一。 因此&#xff0c;身边有一些朋友在问&#xff0c;城市群与都市圈有什么区别&#xff1f;哪个对城市发展影响更大&#xff1f…...

【深度学习与大模型基础】第14章-分类任务与经典分类算法

Part 1&#xff1a;什么是分类任务&#xff1f; 1.1 分类就是“贴标签” 想象你有一堆水果&#xff0c;有苹果&#x1f34e;、橘子&#x1f34a;、香蕉&#x1f34c;&#xff0c;你的任务是让机器学会自动判断一个新水果属于哪一类——这就是分类&#xff08;Classification&…...

第十五章:预训练大语言模型

目录 15.1 数据准备 15.1.1 数据预处理 15.1.2 数据调度 15.2 模型架构 15.2.1 主流架构 一、编码器架构&#xff08;Encoder-only&#xff0c;以 BERT 为代表&#xff09; 核心特点&#xff1a; 代表模型&#xff1a;BERT、RoBERTa、ALBERT 典型应用&#xff1a; 二…...

万象生鲜配送系统代码2025年4月29日更新日志

亲爱的用户&#xff1a;万象生鲜配送系统始终致力于为您提供更优质、高效的服务体验。经过我们技术团队的不懈努力&#xff0c;万象生鲜配送系统在 2025 年 4 月迎来了一次重大更新。本次更新涵盖了多个方面&#xff0c;包括功能新增、性能优化以及问题修复&#xff0c;旨在进一…...

Mac 创建QT按钮以及一些操作

在创建QT项目好 后我们打开mainwindow.cpp&#xff0c;下面所示的代码都是在这个cpp文件里面因为它是窗口的入口函数 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QPushButton>//按钮的头文件MainWindow::MainWindow(QWidget *pa…...

C++学习之shell高级和正则表达式

目录 1.正则表达式 2.C中使用正则 3.复习 4.sort命令 5.uniq命令 6.wc命令 7.grep命令 8.find命令 9.xargs命令 10.sed命令 11.awk命令 12.crontab 1.正则表达式 1 管道 使用| 将多个命令拼接在一起 原理&#xff0c;就是将前一个命令的标准输出作为后一个…...

SpringBoot获取用户信息常见问题(密码屏蔽、驼峰命名和下划线命名的自动转换)

文章目录 一、不返回password字段二、返回的createTime和updateTime为空原因解决&#xff1a;开启驼峰命名和下划线命名的自动转换 一、不返回password字段 在字段上面添加JsonIgnore注解即可 JsonIgnore // 在把对象序列化成json字符串时&#xff0c;忽略该字段 private Str…...

优化PCB Via Stub系列(2) – 运用U-Turn Via设计破解阻抗匹配困境,改善信号完整性

在PCB设计中&#xff0c;往往透过制程改善如背钻、盲孔或埋孔&#xff0c;来消除不必要的Via stub&#xff0c;可是多出来的制造成本会压低产品的毛利&#xff0c;可是又有什么办法可以不透过制程改善以缩小Via stub带来的SI困扰呢&#xff1f; 本周我们来讲从Layout布局的角度…...

飞鸟游戏模拟器 1.0.3 | 完全免费无广告,内置大量经典童年游戏,重温美好回忆

飞鸟游戏模拟器是一款专为安卓用户设计的免费游戏模拟器&#xff0c;内置了大量经典的童年游戏。该模拟器拥有丰富的游戏资源&#xff0c;目前已有约20,000款游戏&#xff0c;包括多种类型如冒险、动作、角色扮演等。用户可以直接搜索查找想要玩的游戏进行下载并启动。游戏库中…...

​钓鱼网页散播银狐木马,远控后门威胁终端安全

在当今网络环境下&#xff0c;许多人都有通过搜索引擎下载应用程序的习惯&#xff0c;虽然这种方式简单又迅速&#xff0c;但这也可能被不法分子所利用&#xff0c;通过设置钓鱼网站来欺骗用户。这些钓鱼网站可能会通过各种方式吸引用户点击&#xff0c;从而进行病毒的传播&…...

一文读懂 JavaScript 中的深浅拷贝

在 JavaScript 编程里&#xff0c;深浅拷贝是处理数据时极为关键的概念。理解它们的差异&#xff0c;能帮我们规避许多数据操作上的 “陷阱”。今天&#xff0c;咱们就借助简单的 “abc” 相关示例&#xff0c;深入探索深浅拷贝的奥秘&#xff0c;并且通过在浏览器控制台输出结…...

5G技术在工业4.0中的应用:连接未来,驱动智能制造

5G技术在工业4.0中的应用&#xff1a;连接未来&#xff0c;驱动智能制造 引言 工业4.0&#xff0c;作为第四次工业革命的核心&#xff0c;已经在全球范围内掀起了智能制造的浪潮。它不仅包括了自动化生产、智能物流、云计算和大数据的应用&#xff0c;更是融合了互联网、物联网…...

驱动开发硬核特训 · Day 25 (附加篇):从设备树到驱动——深入理解Linux时钟子系统的实战链路

一、前言 在嵌入式Linux开发中&#xff0c;无论是CPU、外设控制器&#xff0c;还是简单的GPIO扩展器&#xff0c;大多数硬件模块都离不开时钟信号的支撑。 时钟子系统&#xff08;Clock Subsystem&#xff09;&#xff0c;作为Linux内核中基础设施的一部分&#xff0c;为设备…...

数据结构---单链表的增删查改

前言&#xff1a; 经过了几个月的漫长岁月&#xff0c;回头时年迈的小编发现&#xff0c;数据结构的内容还没有写博客&#xff0c;于是小编赶紧停下手头的活动&#xff0c;补上博客以洗清身上的罪孽 目录 前言 概念&#xff1a; 单链表的结构 我们设定一个哨兵位头节点给链…...

【codeforces 2104D,E】欧拉筛,字符串上dp

【codeforces 2104D&#xff0c;E】欧拉筛&#xff0c;字符串上dp Problem - D - Codeforces 题意&#xff1a; 给定一个长度为 n n n的数组 a 1 , a 2 , . . . , a n a_1, a_2, ... , a_n a1​,a2​,...,an​&#xff0c;其中 2 ≤ a i ≤ 1 0 9 2 \leq a_i \leq 10^9 2≤…...

UEC++第15天|番茄插件、实现跳跃、实现背景运动

这是flyBird的第二天&#xff0c;做了一些简单的功能&#xff0c;明天继续更新 vs的番茄插件 在visual stdudio里使用可以帮助代码补全&#xff0c;这一篇博客写的不错&#xff0c;大家可以参考一下。VS2019 安装番茄助手&#xff08;Visual Assist x 插件&#xff09;攻略_vs…...

论文笔记-基于多层感知器(MLP)的多变量桥式起重机自适应安全制动与距离预测

《IET Cyber-Systems and Robotics》出版山东大学 Tenglong Zhang 和 Guoliang Liu 团队的研究成果&#xff0c;文章题为“Adaptive Safe Braking and Distance Prediction for Overhead Cranes With Multivariation Using MLP”。 摘要 桥式起重机的紧急制动及其制动距离预测是…...

[论文阅读]Adversarial Semantic Collisions

Adversarial Semantic Collisions Adversarial Semantic Collisions - ACL Anthology Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing (EMNLP) 对抗样本是相似的输入但是产生不同的模型输出&#xff0c;而语义冲突是对抗样本的逆…...

Redis Sentinel 和 Redis Cluster 各自的原理、优缺点及适用场景是什么?

我们来详细分析下 Redis Sentinel (哨兵) 和 Redis Cluster (集群) 这两种方案的原理和使用场景。 Redis Sentinel (哨兵) 原理: Sentinel 本身是一个或一组独立于 Redis 数据节点的进程。它的核心职责是监控一个 Redis 主从复制 (Master-Slave) 架构。多个 Sentinel 进程协同…...

面向人工智能、量子科技、人形机器人等产业,山东启动制造业创新中心培育认定

从山东省工业和信息化厅了解到&#xff0c;2025年山东省制造业创新中心培育和认定已启动&#xff0c;重点面向全省传统优势产业、新兴产业及未来产业等领域&#xff0c;鼓励具备条件的龙头企业牵头创建省制造业创新中心。 今年&#xff0c;山东重点面向全省冶金、化工、轻工、…...

无锡哲讯科技:SAP财务系统——赋能企业智慧财务管理

数字化时代&#xff0c;财务管理的新挑战 在全球化竞争和数字经济快速发展的背景下&#xff0c;企业财务管理正面临前所未有的挑战。传统的财务核算方式效率低下、数据孤岛严重、决策滞后&#xff0c;难以满足现代企业高效运营的需求。如何实现财务数据的实时整合&#xff1…...

Linux命令使用记录(自用)

阿里开源镜像站:https://developer.aliyun.com/mirror/?spma2c6h.13651102.0.0.6c2a1b11I9pmUD&serviceTypemirror&tag top命令 top [选项] -p 只显示某个进程的信息 -d 设置刷新时间&#xff0c;默认是5s -c 显示产生进程的完整命令&#xff0c;默认是进程…...

Spring Security 的 CSRF 防护机制

CSRF&#xff1a;跨站请求伪造&#xff08;Cross-Site Request Forgery&#xff09; Spring Security 中的 .csrf() 是用来开启或配置这种保护机制&#xff0c;防止恶意网站“冒充用户”向你的网站发起请求。 一、CSRF 攻击原理简要 CSRF 的典型攻击场景如下&#xff1a; 用…...

跨平台项目部署全攻略:Windows后端+Mac前端在服务器的协同实战

当你的后端(Flask+MySQL,Windows开发)与前端(Vue,Mac开发)需要统一部署到服务器并实现交互时,完全可以通过「跨平台适配+反向代理」方案实现。本文将分步骤讲解如何在 Linux服务器(推荐)或 Windows服务器 上部署,并解决跨平台兼容性、跨域请求等核心问题。 一、技术…...

第八章 磁盘管理未完待续

1.磁盘管理 磁盘简介 名词&#xff1a;磁盘/硬盘/disk 存储设备类型从工作原理区分 机械 机械硬盘即是传统普通硬盘&#xff0c;主要由&#xff1a;盘片&#xff0c;磁头&#xff0c;盘片转轴及 控制电机&#xff0c;磁头控制器&#xff0c;数据转换器&#xff0c;接口&…...

杰理AC79-WiFi 的 AP、STA 和 Monitor 模式

WiFi 的 AP、STA 和 Monitor 模式是无线网卡的不同工作模式&#xff0c;它们的区别如下&#xff1a; AP 模式&#xff08;Access Point 模式&#xff0c;接入点模式&#xff09; 功能&#xff1a;将有线网络转换为无线网络&#xff0c;允许其他无线设备连接到该网络&#xff…...

MAC安装unar并解压.rar文件

MAC上默认解压.zip文件&#xff0c;对.rar文件进行解压需要安装专门对软件。本文记录如何在命令行安装unar并对.rar文件进行解压。 命令行安装 brew install unar打印如下log则安装成功 使用brew list unar检查是否安装成功 brew list unar使用unar解压 unar 文件名.rar...

`nmi_watchdog` 与 `softlockup_panic` 的区别与关系

1. 功能区别 参数作用触发条件影响nmi_watchdog启用 NMI&#xff08;不可屏蔽中断&#xff09;看门狗检测 CPU 是否长时间不执行调度&#xff08;软死锁&#xff09;仅记录警告&#xff08;默认&#xff09;&#xff0c;需配合 softlockup_panic 才会触发 panicsoftlockup_pan…...

【Bash】可以请您解释性地说明一下“2>1”这个语法吗?

Qwen3-235B 当然可以&#xff01;我们一步步拆解 2>&1 的含义&#xff0c;用生活化的例子来理解它&#xff1a; &#x1f9e0; 前提知识&#xff1a;三个“水流通道” 在 Linux/Unix 系统中&#xff0c;程序运行时有三种默认的“水流通道”&#xff1a; 标准输入&…...

打造美观 API 文档:Spring Boot + Swagger 实战指南

目录 打造美观 API 文档&#xff1a;Spring Boot Swagger 实战指南导语一、Swagger 简介二、Spring Boot 2 集成 Swagger1. 添加依赖2. 配置 Swagger3. 访问 Swagger UI 三、Spring Boot 3 集成 Swagger1. 添加依赖2. 配置 Swagger3. 访问 Swagger UI 四、多种接口文档风格展示…...

如何在 Android 上恢复已删除的照片?:简短指南

没有什么比不小心从 Android 智能手机中删除所有照片更糟糕的了。这样&#xff0c;除非您在重置之前已经备份了数据&#xff0c;否则您的所有照片都会消失。如果您忘记备份照片&#xff0c;您仍然可以按照一些简单的技术在 Android 设备上恢复已删除的照片。 如何在 Android 上…...

第十六届蓝桥杯大赛网安组--几道简单题的WP

目录 1. ezEvtx 2.flowzip 3.Enigma 4.星际XML解析器 1. ezEvtx 题目内容 EVTX文件是Windows操作系统生成的事件日志文件&#xff0c;用于记录系统、应用程序和安全事件。(本题需要选手找出攻击者访问成功的一个敏感文件&#xff0c;提交格式为flag{文件名}&#xff0c;其中…...

Element:Cheack多选勾选效果逻辑判断

效果展示 取消子级勾选&#xff0c;父级的勾选效果 代码合集 &#xff08;1&#xff09;组件代码 fromlist.cheackType 类型&#xff0c;permissio表示是权限. fromlist:[{id:1,children:[{...}]},...]传递的数据大致结构 <!-- 操作权限 --><template v-if"…...

从摄像头到 RAW 数据:MJPEG 捕获与验证

从摄像头捕获 MJPEG 原始数据&#xff1a;完整指南与验证方法 &#x1f50d; 引言 MJPEG&#xff08;Motion JPEG&#xff09;是一种常见的视频压缩格式&#xff0c;广泛应用于摄像头、监控系统和嵌入式设备。在某些场景下&#xff0c;我们需要直接从摄像头获取 MJPEG 原始数据…...

【展位预告】正也科技将携营销精细化管理解决方案出席中睿营销论坛

在医药行业面临政策深化、技术迭代、全球化竞争的多重挑战下&#xff0c;第二届中睿医药健康生态生长力峰会暨第三十五届中睿医药营销论坛将于广州盛大启幕。5月19-20日本次峰会以“聚焦政策变革、把握产业趋势、构建生态共赢”为核心&#xff0c;旨在通过全产业链资源整合与创…...

记录 Flink jdbc、mysql-cdc 连接 mysql8 碰到的适配问题

前言 记录 Flink jdbc、mysql-cdc 连接 mysql8 碰到的小问题 版本 Flink 1.15.3mysql-cdc 2.3.0MySQL 8.0.27 cdc_mysql2mysql MySQL5 之前主要用 MySQL5 &#xff0c;下面是 MySQL5 的 sql ,具体见 Flink MySQL CDC 使用总结 set yarn.application.namecdc_mysql2mysql;…...

TCP概念+模拟tcp服务器及客户端

目录 一、TCP基本概念 二、ser服务器代码 三、cil客户端代码 一、TCP基本概念 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议。以下是TCP的一些基本概念&#xff1a; 面向连接&…...

高翔《视觉SLAM十四讲》第七章视觉里程计3d-2d位姿估计代码详解与理论解析

高翔《视觉SLAM十四讲》第七章代码详解与理论解析 一、三维空间位姿估计核心算法实现 在视觉SLAM领域,3D - 2D位姿估计是确定相机在三维空间中位置和姿态的关键技术。本部分将详细解析其工程实现框架,同时说明代码模块的划分逻辑。 代码整体结构清晰,各模块分工明确,主要…...

Elasticsearch 内存使用指南

作者&#xff1a;来自 Elastic Valentin Crettaz 探索 Elasticsearch 的内存需求以及不同类型的内存统计信息。 Elasticsearch 拥有丰富的新功能&#xff0c;帮助你为你的使用场景构建最佳搜索解决方案。浏览我们的示例笔记本了解更多信息&#xff0c;开始免费云试用&#xff0…...

【Stable Diffusion】原理详解:从噪声到艺术的AI魔法

引言 Stable Diffusion是 stability.ai 开源的图像生成模型&#xff0c;是近年来AI生成内容&#xff08;AIGC&#xff09;领域最具突破性的技术之一。它通过将文本描述转化为高分辨率图像&#xff0c;实现了从“文字到视觉”的创造性跨越。其开源特性与高效的生成能力&#xff…...

并发设计模式实战系列(9):消息传递(Message Passing)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第九章消息传递&#xff08;Message Passing&#xff09;&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 消息传递架构 2. 并发…...

【MCP Node.js SDK 全栈进阶指南】高级篇(3):MCP 安全体系建设

背景 随着MCP协议在企业和个人应用中的广泛采用,安全性已成为MCP系统设计和开发中不可忽视的核心要素。一个健壮的MCP安全体系不仅能保护敏感数据和用户隐私,还能确保AI模型与外部工具交互的可靠性和完整性。本文将深入探讨MCP TypeScript-SDK的安全体系建设,帮助开发者构建…...

C++智能指针

智能指针是C中用于自动管理动态分配内存的类模板&#xff0c;它们通过在适当的时机自动释放内存来帮助防止内存泄漏。C11引入了以下几种主要的智能指针&#xff1a; 1. std::unique_ptr 独占所有权的智能指针&#xff0c;同一时间只能有一个unique_ptr指向特定对象。 #inclu…...

基于STM32、HAL库的ATECC608B安全验证及加密芯片驱动程序设计

一、简介: ATECC608B是Microchip公司生产的一款安全加密芯片,提供以下主要特性: 基于硬件的高安全性加密算法 ECC P-256加密引擎 SHA-256哈希算法 AES-128加密 真随机数生成器(TRNG) 16KB安全存储空间 IC接口(最高1MHz) 低功耗设计,适合物联网应用 二、硬件接口: ATECC60…...