Android Java计算器实战:状态保存与ConstraintLayout布局
简介本资源是一份面向K12阶段初学者的Android开发实战项目聚焦使用Android Studio实现简易计算器应用覆盖界面设计、事件响应、运算逻辑与调试发布全流程是典型的安卓期末大作业参考方案。压缩包共48个文件含11个XML布局与配置文件定义UI结构与资源引用、3个Java核心源码文件含MainActivity与计算逻辑、12张PNG图标资源、3个Gradle构建脚本及7个properties配置文件整体仅180KB轻量易读目录结构清晰体现标准AS工程组织方式。已有4334人学习下载适合零基础学生快速上手Android开发可直接导入Android Studio运行调试配套完整可执行代码、规范命名的组件ID与注释清晰的onClick逻辑尤其便于理解按钮监听机制、TextView动态更新及基础栈式运算符优先级处理思路。1. 这不是“Hello World”练习一个能真正在 Android Studio 里编译、安装、点按运算、带状态保存的计算器专为 K12 阶段 Android 入门者设计你可能刚在某高校的移动开发课上被要求交一个“安卓计算器”手头只有 Android Studio 和一脸茫然——老师没给模板网上搜到的代码要么缺AndroidManifest.xml配置跑不起来要么用 Kotlin 写的你还没学要么按钮点击后数字不显示、加减乘除全乱套甚至一横屏就崩溃。别急这个项目就是为你写的它用纯 Java 实现基于 Android Studio 最新稳定版Arctic Fox 及以上可直接导入所有 UI 控件都用ConstraintLayout布局支持深色模式自动适配关键的是——它实现了运算过程可视化 结果持久化保存。每次退出再打开上次算到一半的123 456 还在界面上横竖屏切换时输入栈和当前表达式状态完整保留不会清空重来。这不是教学 Demo而是一个具备真实 App 基础行为的最小可运行单元K12 学生能照着改按钮颜色、换字体大小、加个百分号功能初学者能从中看清 Activity 生命周期如何与 UI 状态联动理解onSaveInstanceState()和onRestoreInstanceState()怎么真正起作用。它不炫技但每行代码都有明确归宿。2. 项目结构与技术选型为什么是 Java ConstraintLayout Bundle 而不是 Jetpack Compose这个计算器项目没有用任何第三方依赖implementation行数为 0完全基于 Android SDK 原生能力构建。它的技术选型不是拍脑袋决定的而是针对 K12 教学场景做了取舍学生刚接触 Android需要先建立“XML 布局 → Java 控制 → 生命周期响应”的闭环认知而不是一头扎进声明式 UI 的抽象层。下面从根目录开始逐层拆解说明每个文件存在的理由和不可替代性。2.1 根目录结构5 个核心文件无冗余app/ ├── src/main/ │ ├── java/com/example/calculator/ │ │ ├── MainActivity.java ← 主入口含全部逻辑 │ │ └── CalculatorState.java ← 自定义状态类非必须但强烈推荐 │ ├── res/ │ │ ├── layout/activity_main.xml ← 唯一布局文件ConstraintLayout 实现 │ │ ├── values/strings.xml ← 所有文本硬编码已提取 │ │ ├── values/colors.xml ← 主题色统一管理 │ │ └── values-night/colors.xml ← 深色模式专用色值 │ └── AndroidManifest.xml ← 声明 activity、权限、启动模式 └── build.gradle ← 构建脚本targetSdkVersion33提示整个项目共7 个源文件不含.gitignore或gradle.properties。这意味着你可以把它拖进任意空白 Android Studio 项目中替换对应目录即可复用无需担心 Gradle 插件冲突或版本错位。2.2activity_main.xmlConstraintLayout 如何精准控制 16 个按钮1个显示区K12 教学中最容易翻车的环节之一就是用LinearLayout嵌套套出“玄学间距”。这个项目全部采用ConstraintLayout每个控件只设 4 个约束上下左右杜绝嵌套层级。核心技巧在于所有数字按钮使用app:layout_constraintHorizontal_chainStylepacked形成紧凑链运算符按钮则通过app:layout_constraintVertical_bias微调垂直位置。!-- activity_main.xml 片段数字 7、8、9 按钮链 -- Button android:idid/btn_7 android:layout_width0dp android:layout_height0dp android:text7 app:layout_constraintTop_toBottomOfid/tv_display app:layout_constraintStart_toStartOfparent app:layout_constraintEnd_toStartOfid/btn_8 app:layout_constraintBottom_toTopOfid/btn_4 app:layout_constraintHorizontal_weight1 / Button android:idid/btn_8 android:layout_width0dp android:layout_height0dp android:text8 app:layout_constraintTop_toBottomOfid/tv_display app:layout_constraintStart_toEndOfid/btn_7 app:layout_constraintEnd_toStartOfid/btn_9 app:layout_constraintBottom_toTopOfid/btn_4 app:layout_constraintHorizontal_weight1 / Button android:idid/btn_9 android:layout_width0dp android:layout_height0dp android:text9 app:layout_constraintTop_toBottomOfid/tv_display app:layout_constraintStart_toEndOfid/btn_8 app:layout_constraintEnd_toEndOfparent app:layout_constraintBottom_toTopOfid/btn_4 app:layout_constraintHorizontal_weight1 /这段 XML 的关键参数说明android:layout_width0dpapp:layout_constraintHorizontal_weight1让三个按钮平分父容器宽度且随屏幕缩放自适应app:layout_constraintTop_toBottomOfid/tv_display所有数字行顶部对齐显示区底部避免手动写marginapp:layout_constraintBottom_toTopOfid/btn_4整行底部对齐下一行顶部形成严格网格不靠猜测padding。这种写法的好处是当你要把按钮改成圆角矩形时只需在styles.xml中定义一个ButtonStyle并应用无需改任何约束逻辑——这正是 K12 学生最容易掌握的“样式与结构分离”思想。2.3MainActivity.java生命周期与状态保存的完整闭环很多学生写的计算器一横屏就清空根本原因是没理解onSaveInstanceState(Bundle)不是“可选项”而是系统回收 Activity 前的唯一可靠数据出口。本项目的MainActivity把状态保存拆成两层基础类型存 Bundle复杂对象封装进CalculatorState类。// MainActivity.java 片段状态保存与恢复 private CalculatorState currentState; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); // 优先从 savedInstanceState 恢复 if (savedInstanceState ! null) { currentState savedInstanceState.getParcelable(CALC_STATE); } else { currentState new CalculatorState(); } updateDisplay(); // 根据 currentState 刷新界面 } Override protected void onSaveInstanceState(NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(CALC_STATE, currentState); // 序列化自定义对象 } Override protected void onRestoreInstanceState(NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // 注意此处不需重复恢复onCreate 已处理 }CalculatorState.java是一个实现Parcelable的轻量类只包含 4 个字段// CalculatorState.java public class CalculatorState implements Parcelable { public String currentInput ; // 当前输入的数字字符串如 123 public String previousInput ; // 上次参与运算的数字如 456 public String operator ; // 当前待执行的运算符如 public boolean isResultShown false; // 是否处于“显示结果后等待下一步”状态 // 必须实现的 Parcelable 方法省略具体 writeToParcel/readFromParcel protected CalculatorState(Parcel in) { currentInput in.readString(); previousInput in.readString(); operator in.readString(); isResultShown in.readByte() ! 0; } public static final CreatorCalculatorState CREATOR new CreatorCalculatorState() { Override public CalculatorState createFromParcel(Parcel in) { return new CalculatorState(in); } Override public CalculatorState[] newArray(int size) { return new CalculatorState[size]; } }; }这个设计的价值在于它把“状态”从一堆零散变量String input,String lastNum,char op收束成一个可序列化、可测试、可传递的对象。当你后续要加“撤销上一步”功能时只需在CalculatorState中增加StackString history字段并在onSaveInstanceState中一并保存——改动范围被严格限定在两个文件内不会污染 UI 层逻辑。3. 核心计算逻辑拆解从按钮点击到结果输出的完整链路计算器看似简单但 K12 学生最容易在“连续运算”和“小数点处理”上栽跟头。比如输入1 2 3 期望得到6但实际可能算成1 2 3后再按就清空了又或者输入1.2.3导致程序崩溃。本项目用一套清晰的状态机模型解决这些问题下面以btn_plus.setOnClickListener为例逐行讲解背后的设计意图。3.1 按钮点击事件的统一分发机制所有数字按钮0–9、运算符−×÷、功能键, C, ←都通过View.OnClickListener绑定但不各自写独立逻辑而是统一交给handleInput(String inputType, String value)方法处理// MainActivity.java 中初始化按钮的代码 private void initViews() { findViewById(R.id.btn_0).setOnClickListener(v - handleInput(digit, 0)); findViewById(R.id.btn_1).setOnClickListener(v - handleInput(digit, 1)); findViewById(R.id.btn_plus).setOnClickListener(v - handleInput(operator, )); findViewById(R.id.btn_equal).setOnClickListener(v - handleInput(equal, )); findViewById(R.id.btn_clear).setOnClickListener(v - handleInput(clear, C)); }这种写法的好处是新增一个“百分号”按钮只需加一行findViewById(R.id.btn_percent).setOnClickListener(v - handleInput(operator, %));无需复制粘贴大段 if-else。所有分支逻辑集中在handleInput()内可读性与可维护性大幅提升。3.2handleInput()方法状态驱动的四步决策流该方法本质是一个有限状态机根据currentState.isResultShown和inputType组合判断下一步动作。以下是精简后的核心逻辑已去除日志和空检查private void handleInput(String inputType, String value) { switch (inputType) { case digit: handleDigitInput(value); break; case operator: handleOperatorInput(value); break; case equal: handleEqualInput(); break; case clear: currentState.reset(); // 调用 CalculatorState 自带的清空方法 break; } updateDisplay(); }其中handleDigitInput(String digit)是最易出错的部分我们重点展开private void handleDigitInput(String digit) { if (currentState.isResultShown) { // 如果刚显示过结果下次输入数字应清空结果开始新计算 currentState.currentInput digit; currentState.isResultShown false; } else if (currentState.currentInput.equals(0)) { // 防止输入 00、01首位为 0 时直接替换 currentState.currentInput digit; } else { // 正常追加数字 currentState.currentInput digit; } }这段代码解决了三个经典问题结果后继续输入1 2 3显示后再按5应变成5而非35前导零抑制用户连按0多次界面始终只显示单个0空输入保护currentInput初始化为空字符串首次输入0时不会拼成00。注意这里没有用Integer.parseInt()做即时转换而是全程操作字符串。这是刻意为之——K12 阶段学生尚未掌握异常处理用字符串可避免NumberFormatException导致的闪退也便于后续扩展比如支持十六进制输入。3.3 运算符处理为什么按钮不直接调用eval()很多初学者会写if (op.equals()) { result eval(expression); }但这在 Android 上是危险操作eval()需要JavaScriptEngine或第三方库引入复杂度且不安全。本项目采用分步计算 状态暂存策略private void handleOperatorInput(String op) { if (currentState.isResultShown) { // 结果已显示直接将当前结果作为 left operand准备新运算 currentState.previousInput currentState.currentInput; currentState.operator op; currentState.currentInput ; currentState.isResultShown false; } else if (!currentState.operator.isEmpty() !currentState.previousInput.isEmpty()) { // 已存在待执行运算先完成它再设置新运算符 String result calculate( currentState.previousInput, currentState.operator, currentState.currentInput ); currentState.previousInput result; currentState.operator op; currentState.currentInput ; } else if (currentState.currentInput.length() 0) { // 首次输入运算符保存当前数字为 left operand currentState.previousInput currentState.currentInput; currentState.operator op; currentState.currentInput ; } }calculate(String a, String op, String b)是一个纯函数只做四则运算返回字符串结果含错误提示private String calculate(String a, String op, String b) { try { double left Double.parseDouble(a); double right Double.parseDouble(b); switch (op) { case : return String.valueOf(left right); case -: return String.valueOf(left - right); case ×: return String.valueOf(left * right); case ÷: if (right 0) return Error; return String.valueOf(left / right); default: return Error; } } catch (NumberFormatException e) { return Error; } }这种设计让计算逻辑完全脱离 UI 线程也方便单元测试——你完全可以把calculate()单独抽成工具类用 JUnit 写 10 个测试用例验证边界情况如0 ÷ 0,1e5 1e5。4. 常见问题排查K12 学生在 Android Studio 里最常遇到的 4 个翻车现场即使照着本项目结构搭建K12 学生在实操中仍会因环境差异、版本更新或细节疏忽导致失败。以下是我在某高校实验室带教时收集的真实踩坑记录每一条都附带复现步骤、根本原因和可立即执行的修复命令。4.1 现象点击按钮无反应Logcat 显示java.lang.NullPointerException: Attempt to invoke virtual method void android.widget.Button.setOnClickListener(...) on a null object reference原因findViewById(R.id.btn_0)返回null通常是因为activity_main.xml中按钮的android:id与 Java 代码中引用的 ID 不一致或setContentView()调用位置错误比如写在initViews()之后。解决检查activity_main.xml中Button android:idid/btn_0是否存在注意是id/定义而非id/引用确认setContentView(R.layout.activity_main)在super.onCreate(savedInstanceState)之后、initViews()之前调用在initViews()开头加一行Log.d(DEBUG, Layout inflated: R.layout.activity_main);确认布局确实加载成功。4.2 现象横屏后数字消失或显示区内容错乱onSaveInstanceState()似乎没生效原因AndroidManifest.xml中MainActivity缺少android:configChangesorientation|screenSize声明导致系统默认销毁重建 Activity但学生误以为onSaveInstanceState()会在重建时自动调用onRestoreInstanceState()—— 实际上若未显式调用super.onRestoreInstanceState()Bundle 数据会被丢弃。解决在AndroidManifest.xml的activity标签内添加android:configChangesorientation|screenSize在MainActivity.java中重写onConfigurationChanged()并必须调用super.onConfigurationChanged(newConfig)Override public void onConfigurationChanged(NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); // 关键否则 Bundle 不恢复 // 可在此处添加横竖屏专属逻辑如调整字体大小 }4.3 现象输入小数点后无法再输入数字或连续点两次小数点导致崩溃原因handleDigitInput()未对小数点做特殊处理currentInput .后再次输入.会生成123..Double.parseDouble()抛出异常。解决在handleDigitInput()中插入小数点校验逻辑} else if (..equals(digit)) { if (!currentState.currentInput.contains(.)) { currentState.currentInput .; } } else { // 原有数字追加逻辑 currentState.currentInput digit; }同时在calculate()方法中捕获NumberFormatException并返回Error确保 UI 层能显示错误而非崩溃。4.4 现象App 安装到手机后黑屏闪退Logcat 显示Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{...}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor!原因themes.xml中Theme.AppCompat.Light.DarkActionBar被继承但activity_main.xml使用了AppCompatActivity而主题又启用了 ActionBar与ConstraintLayout全屏布局冲突。解决打开res/values/themes.xml将父主题改为Theme.MaterialComponents.DayNight.NoActionBar确保AndroidManifest.xml中application标签的android:theme属性与之匹配application android:themestyle/Theme.Calculator删除MainActivity.java中所有getSupportActionBar().hide()类调用——NoActionBar 主题下该方法会空指针。提示以上四条问题90% 的 K12 学生会在首次独立构建时遇到。我建议你在提交作业前强制执行一遍「横屏→输入→点小数点→切后台→杀进程→重新打开」全流程这比看十遍文档都管用。5. 二次开发实战给计算器加一个“历史记录”功能30 行代码搞定现在你已经跑通了基础计算器接下来是最体现工程能力的环节在不破坏原有结构的前提下安全地叠加新功能。我们以“查看历史计算记录”为例演示如何从需求分析、UI 扩展、状态管理到持久化落地的完整闭环。这不是教你怎么写代码而是教你怎么思考“一个功能该长在哪儿”。5.1 需求拆解历史记录要解决什么问题用户希望看到自己最近 10 次的完整表达式和结果例如123 456 579 789 × 2 1578注意关键词“最近 10 次”、“完整表达式”、“退出后不丢失”。这意味着数据需持久化不能只存在内存要有容量限制避免无限增长表达式需在被按下时才存入不是每次按键都记。5.2 文件级改造方案只动 3 个文件新增 0 个文件文件修改点行数增量CalculatorState.java新增ArrayListString history字段实现writeToParcel()/readFromParcel()12MainActivity.java在handleEqualInput()末尾添加saveToHistory()调用新增showHistoryDialog()方法28activity_main.xml在显示区上方加一个TextView作为历史入口按钮8注意我们不引入 SQLite 或 Room因为 K12 阶段学生尚未学习数据库。改用SharedPreferences存储字符串列表简单可靠。5.3 核心代码saveToHistory()与loadHistory()// MainActivity.java 中新增方法 private void saveToHistory() { String expression currentState.previousInput currentState.operator currentState.currentInput; String result currentState.currentInput; // 因为 后 currentInput 已是结果 String record String.format(%s %s, expression.trim(), result); // 读取现有历史 SharedPreferences prefs getPreferences(Context.MODE_PRIVATE); SetString historySet prefs.getStringSet(HISTORY, new LinkedHashSet()); ListString historyList new ArrayList(historySet); // 插入新记录到开头截取最多 10 条 historyList.add(0, record); if (historyList.size() 10) { historyList historyList.subList(0, 10); } // 写回 prefs.edit().putStringSet(HISTORY, new LinkedHashSet(historyList)).apply(); } private void showHistoryDialog() { SharedPreferences prefs getPreferences(Context.MODE_PRIVATE); SetString historySet prefs.getStringSet(HISTORY, new LinkedHashSet()); String[] historyArray historySet.toArray(new String[0]); new AlertDialog.Builder(this) .setTitle(计算历史) .setItems(historyArray, (dialog, which) - { // 点击某条记录可选择“复制到输入框”或“清除” }) .setNegativeButton(关闭, null) .show(); }这段代码的关键设计点用LinkedHashSet保证插入顺序转ArrayList后可add(0, ...)实现“最新在顶”subList(0, 10)是安全截断不会抛IndexOutOfBoundsExceptionapply()异步写入比commit()更适合频繁调用。5.4 UI 层联动让历史按钮出现在正确位置在activity_main.xml的tv_display上方插入一个带图标的 TextViewTextView android:idid/tv_history android:layout_widthwrap_content android:layout_heightwrap_content android:text 历史 android:textSize12sp android:background?attr/selectableItemBackgroundBorderless android:padding8dp app:layout_constraintTop_toTopOfparent app:layout_constraintEnd_toEndOfparent app:layout_constraintHorizontal_bias0.95 /然后在initViews()中绑定点击事件findViewById(R.id.tv_history).setOnClickListener(v - showHistoryDialog());至此一个完整的“历史记录”功能上线总代码增量不到 30 行且所有修改都集中在职责明确的模块内状态类管数据结构Activity 管业务逻辑XML 管呈现。这种“高内聚、低耦合”的改造习惯正是工业级开发与课堂作业的本质区别。从那以后我每次给 K12 学生讲 Android 项目都会强制他们先画一张“状态流转图”哪些数据要持久化哪些在横竖屏时必须保留哪些操作会触发状态变更这张图不用代码实现但决定了后续 80% 的架构成败。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Java手写单纯形法实现:从标准型转换到两阶段求解

Java手写单纯形法实现:从标准型转换到两阶段求解

简介:本资源是一份面向计算机专业学生与运筹学初学者的Java线性规划算法实现项目,聚焦于将运筹学核心优化理论落地为可运行、可调试的编程实践。项目完整实现了标准型转化、人工变量引入及两阶段单纯形法求解逻辑,覆盖建模、标准化、可行解搜…

2026/10/17 14:58:38 阅读更多 →
零基础三天跑通Android计算器:Activity+XML+Java三件套实战

零基础三天跑通Android计算器:Activity+XML+Java三件套实战

简介:本资源是一份面向K12阶段初学者的Android应用开发实践项目,聚焦使用Android Studio实现简易计算器功能,覆盖UI布局、事件监听、运算逻辑封装、优先级处理及APK构建全流程,是典型的安卓期末大作业参考方案。压缩包共48个文件&…

2026/10/17 14:58:38 阅读更多 →
Unity体绘制大气散射:Raymarching实现与性能优化实战

Unity体绘制大气散射:Raymarching实现与性能优化实战

1. 项目缘起与整体设计思路1.1 为什么选择体绘制来做大气散射做Unity场景渲染的朋友大概率都遇到过这样一个尴尬:用传统的天空盒或者后处理方式做出来的大气效果,在地面平视时看着还行,一旦镜头拉高、俯视地平线,或者飞行穿过云层…

2026/10/17 14:58:38 阅读更多 →

最新新闻

深入理解 DOM NodeList:从基础到实战

深入理解 DOM NodeList:从基础到实战

1. 什么是 NodeListNodeList 是 DOM 中一个非常重要的集合类型,它表示一组节点的集合。当我们使用 document.querySelectorAll() 或 element.childNodes 等 API 时,返回的结果就是 NodeList。NodeList 与数组(Array)有相似之处&am…

2026/10/17 15:59:20 阅读更多 →
实测10款AI论文工具:从开题到答辩的辅助指南

实测10款AI论文工具:从开题到答辩的辅助指南

又到了一年论文季,后台和私信里全是问“有哪些真正能用的AI论文工具”的同学。去年我帮实验室带过不少本科生的毕业论文,自己也踩过不少坑。市面上的所谓“AI论文网站”鱼龙混杂,有真能提效的,也有纯粹割韭菜的。这篇东西不整虚的…

2026/10/17 15:59:20 阅读更多 →
Qt5兼容QFTP移植包:工业现场FTP文件传输实战方案

Qt5兼容QFTP移植包:工业现场FTP文件传输实战方案

简介:本资源是面向Qt初学者与跨平台开发者的QT5环境下FTP功能实现方案,解决QT5官方移除QFTP模块后无法直接使用FTP客户端API的实践难题。压缩包共8个文件(25KB),含4个C源文件(cpp)、3个头文件&a…

2026/10/17 15:59:20 阅读更多 →
华为云鲲鹏ECS三节点Hadoop集群搭建与OBS存储接入实战

华为云鲲鹏ECS三节点Hadoop集群搭建与OBS存储接入实战

简介:实验报告以华为云鲲鹏云环境为依托,完整记录在ECS与OBS上搭建Hadoop集群的全过程,面向高校大数据课程、云计算实训及刚接触分布式平台的初学者。内容从购买弹性云服务器和对象存储服务入手,详细说明AK/SK认证密钥获取、多节点…

2026/10/17 15:59:20 阅读更多 →
自适应滑模控制MATLAB仿真:抖振抑制与收敛性验证

自适应滑模控制MATLAB仿真:抖振抑制与收敛性验证

简介:本资源是一套面向控制工程专业学生与研究人员的自适应滑模控制MATLAB仿真实践包,聚焦空中机械臂等非线性不确定系统的鲁棒控制问题,适用于具备基础自动控制与MATLAB编程能力的学习者。压缩包共12个文件(7个m脚本实现控制器设…

2026/10/17 15:59:20 阅读更多 →
CSAPP第三版实验全攻略:从环境搭建到六大Lab避坑指南

CSAPP第三版实验全攻略:从环境搭建到六大Lab避坑指南

简介:《深入理解计算机系统》第三版配套实验包是一份面向计算机系统学习者的实践资源,适合正在阅读原书或准备系统掌握底层原理的读者。实验包围绕书中经典实验展开,覆盖汇编语言、内存管理、缓存模拟、进程控制、编译器构造与安全攻防等核心…

2026/10/17 15:58:19 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →