From ef1519a49ed45e29559b7fa208bc7ded896475b7 Mon Sep 17 00:00:00 2001 From: Songrui <1778280163@qq.com> Date: Thu, 28 May 2026 21:58:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8B=E7=91=9E-202506050301?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- w1/2859457bbace2a2626fd4577e7a1d5f7.png | 0 w2/ReadMe.md | 419 ++++++++++++++++++++++++ 2 files changed, 419 insertions(+) delete mode 100644 w1/2859457bbace2a2626fd4577e7a1d5f7.png create mode 100644 w2/ReadMe.md diff --git a/w1/2859457bbace2a2626fd4577e7a1d5f7.png b/w1/2859457bbace2a2626fd4577e7a1d5f7.png deleted file mode 100644 index e69de29..0000000 diff --git a/w2/ReadMe.md b/w2/ReadMe.md new file mode 100644 index 0000000..40c33f8 --- /dev/null +++ b/w2/ReadMe.md @@ -0,0 +1,419 @@ +# AI 交互记录 - Java 传感器数据清洗处理器 + +## 任务背景 +开发一个传感器数据清洗程序,遍历原始数据数组,过滤异常值并计算有效数据的平均值。 + +--- + +## 需求分析 + +### 核心功能 +1. **数据遍历**:处理传感器原始数据数组 +2. **异常过滤**:识别并处理三种数据类型 + - 致命错误(999):立即终止处理 + - 有效数据(1-100):累加统计 + - 越界数据(0、负数、>100):跳过并警告 +3. **结果计算**:统计有效数据个数、总和、平均值 +4. **流程控制**:使用 `break` 和 `continue` 控制循环 + +### 技术要求 +- 使用增强 for 循环遍历数组 +- 掌握 `break` 和 `continue` 的区别 +- 处理整数除法精度问题 +- 清晰的日志输出 + +--- + +## 开发过程 + +### 第1轮:基础结构搭建 +**用户需求:** +创建主方法,定义传感器数据数组和统计变量 + +**AI 实现:** +```java +void main() { + int[] sensorData = {85, -5, 92, 0, 105, 999, 88, 76}; + int sum = 0; + int count = 0; + + IO.println("=== 传感器数据清洗开始 ==="); +} +``` + + +**设计说明:** +- 使用 `void main()`(Java 21+ 预览特性) +- 初始化统计数据数组 +- `sum` 和 `count` 用于后续计算 + +--- + +### 第2轮:致命错误处理 +**用户需求:** +当检测到 999 时立即终止整个循环 + +**AI 实现:** +```java +for (int data : sensorData) { + // 情况 1: 检查是否为致命错误 (999 代表传感器硬件断开) + if (data == 999) { + IO.println("致命错误:传感器掉线,终止处理"); + break; // 立即终止整个循环 + } + // ... 其他逻辑 +} +``` + + +**关键点:** +- `break` 跳出整个循环 +- 模拟传感器硬件故障场景 +- 后续数据不再处理 + +--- + +### 第3轮:有效数据判断 +**用户需求:** +筛选出 1-100 范围内的有效数据并累加 + +**AI 实现:** +```java +// 情况 2: 检查数据是否在正常范围内 (1 到 100 之间) +if (data >= 1 && data <= 100) { + sum += data; + count++; + IO.println("数据 [" + data + "] 有效,已计入总和"); +} +``` + + +**逻辑说明:** +- 范围判断:`data >= 1 && data <= 100` +- 累加到 `sum` +- 计数器 `count` 自增 +- 输出确认信息 + +--- + +### 第4轮:越界数据处理 +**用户需求:** +处理无效数据(0、负数、>100),跳过但不终止 + +**AI 实现:** +```java +// 情况 3: 数据无效 (0、负数,或大于 100 但不是 999) +else { + IO.println("警告:发现越界数据 [" + data + "],已跳过"); + // continue 可省略,因为这是最后一个分支 +} +``` + + +**break vs continue 对比:** + +| 关键字 | 作用 | 应用场景 | +|--------|------|----------| +| `break` | 终止整个循环 | 遇到 999 致命错误 | +| `continue` | 跳过当前迭代 | 遇到越界数据(可选) | + +--- + +### 第5轮:结果计算与输出 +**用户需求:** +根据有效数据统计结果,计算平均值 + +**AI 实现:** +```java +IO.println("=== 传感器数据清洗结束 ==="); + +if (count > 0) { + // 有有效数据,计算平均值 + double average = (double) sum / count; + IO.println("有效数据个数:" + count); + IO.println("有效数据总和:" + sum); + System.out.printf("有效数据平均值:%.2f%n", average); +} else { + // 没有任何有效数据 + IO.println("无有效数据"); +} +``` + + +**技术要点:** +- **强制类型转换**:`(double) sum` 避免整数除法 +- **精度保留**:`%.2f` 保留两位小数 +- **空数据保护**:`count > 0` 防止除以零 + +--- + +## 执行流程演示 + +### 输入数据 +```java +int[] sensorData = {85, -5, 92, 0, 105, 999, 88, 76}; +``` + + +### 逐行处理过程 + +| 步骤 | 数据 | 判断结果 | 操作 | sum | count | +|------|------|----------|------|-----|-------| +| 1 | 85 | 有效 (1-100) | 累加 | 85 | 1 | +| 2 | -5 | 越界 (<1) | 跳过 | 85 | 1 | +| 3 | 92 | 有效 (1-100) | 累加 | 177 | 2 | +| 4 | 0 | 越界 (=0) | 跳过 | 177 | 2 | +| 5 | 105 | 越界 (>100) | 跳过 | 177 | 2 | +| 6 | 999 | 致命错误 | **break 终止** | 177 | 2 | +| - | 88 | 未处理 | - | - | - | +| - | 76 | 未处理 | - | - | - | + +### 最终输出 +``` +=== 传感器数据清洗开始 === +数据 [85] 有效,已计入总和 +警告:发现越界数据 [-5],已跳过 +数据 [92] 有效,已计入总和 +警告:发现越界数据 [0],已跳过 +警告:发现越界数据 [105],已跳过 +致命错误:传感器掉线,终止处理 +=== 传感器数据清洗结束 === +有效数据个数:2 +有效数据总和:177 +有效数据平均值:88.50 +``` + + +--- + +## 核心技术要点 + +### 1. 增强 for 循环 +```java +for (int data : sensorData) { + // 自动遍历数组每个元素 +} +``` + +**优势:** +- 代码简洁,无需索引 +- 避免越界错误 +- 适合只读遍历 + +--- + +### 2. break 与 continue 的区别 + +**break 示例(本程序):** +```java +if (data == 999) { + break; // 遇到 999 立即停止,88 和 76 不会被处理 +} +``` + + +**如果使用 continue:** +```java +if (data == 999) { + continue; // 跳过 999,继续处理 88 和 76 +} +``` + + +**实际效果对比:** + +| 场景 | break | continue | +|------|-------|----------| +| 遇到 999 | 终止循环 | 跳过当前项 | +| 后续数据 (88, 76) | ❌ 不处理 | ✅ 继续处理 | +| 适用场景 | 致命错误 | 单项异常 | + +--- + +### 3. 整数除法陷阱 + +**错误写法:** +```java +double average = sum / count; // 177 / 2 = 88(丢失小数) +``` + + +**正确写法:** +```java +double average = (double) sum / count; // 177.0 / 2 = 88.5 +``` + + +**原理:** +- `int / int` 结果仍是 `int` +- 需将其中一个操作数转为 `double` + +--- + +### 4. 防御性编程 + +**空数据保护:** +```java +if (count > 0) { + double average = (double) sum / count; + // ... 输出结果 +} else { + IO.println("无有效数据"); +} +``` + + +**避免的问题:** +- 除以零异常 +- 无意义的计算 + +--- + +## 测试用例 + +### 测试1:正常数据 +```java +int[] sensorData = {50, 60, 70}; +``` + +**输出:** +``` +有效数据个数:3 +有效数据总和:180 +有效数据平均值:60.00 +``` + + +--- + +### 测试2:包含致命错误 +```java +int[] sensorData = {50, 999, 70}; +``` + +**输出:** +``` +数据 [50] 有效,已计入总和 +致命错误:传感器掉线,终止处理 +有效数据个数:1 +有效数据总和:50 +有效数据平均值:50.00 +``` + + +--- + +### 测试3:全无效数据 +```java +int[] sensorData = {-5, 0, 105, 999}; +``` + +**输出:** +``` +警告:发现越界数据 [-5],已跳过 +警告:发现越界数据 [0],已跳过 +警告:发现越界数据 [105],已跳过 +致命错误:传感器掉线,终止处理 +无有效数据 +``` + + +--- + +### 测试4:边界值测试 +```java +int[] sensorData = {1, 100, 0, 101}; +``` + +**输出:** +``` +数据 [1] 有效,已计入总和 ← 边界值(最小) +数据 [100] 有效,已计入总和 ← 边界值(最大) +警告:发现越界数据 [0],已跳过 +警告:发现越界数据 [101],已跳过 +有效数据个数:2 +有效数据总和:101 +有效数据平均值:50.50 +``` + + +--- + +## 常见问题与解答 + +### Q1:为什么用 `void main()` 而不是 `public static void main(String[] args)`? +**A:** +- `void main()` 是 Java 21+ 的预览特性(简化版) +- 传统写法更兼容: +```java +public static void main(String[] args) { + // 原有代码 +} +``` + + +--- + +### Q2:`continue` 在 else 分支中是否必要? +**A:** +不必要,因为 else 是最后一个分支,会自动进入下一次循环。但添加注释有助于理解意图: +```java +else { + IO.println("警告:发现越界数据 [" + data + "],已跳过"); + // continue 可省略 +} +``` + + +--- + +### Q3:如果希望 999 也跳过而非终止,如何修改? +**A:** +将 `break` 改为 `continue`: +```java +if (data == 999) { + IO.println("警告:传感器异常读数,已跳过"); + continue; // 继续处理后续数据 +} +``` + + +--- + +## 可扩展方向 + +1. **动态输入**:从文件读取传感器数据 +2. **统计增强**:最大值、最小值、标准差 +3. **多传感器**:二维数组处理多个传感器 +4. **异常分级**:警告、错误、致命三级分类 +5. **数据修复**:用平均值填充缺失数据 + +--- + +## 总结 + +### 代码特性 +- ✓ 三种数据类型处理(有效、越界、致命) +- ✓ `break` 立即终止循环 +- ✓ 整数除法精度处理 +- ✓ 空数据保护 +- ✓ 清晰的日志输出 + +### 技术栈 +- 增强 for 循环 +- 条件判断(if-else) +- 流程控制(break/continue) +- 类型转换(int → double) +- 格式化输出(printf) + +### 学习要点 +1. 理解 `break` 和 `continue` 的执行差异 +2. 掌握整数除法的精度陷阱 +3. 学会防御性编程(空值检查) +4. 熟悉增强 for 循环的使用场景 + +--- + +**完成时间:** 2026年5月28日 +**项目路径:** `D:\Project\java\w2\SensorDataCleaner.java` +**代码行数:** 54 行 \ No newline at end of file