4 changed files with 405 additions and 0 deletions
@ -0,0 +1,405 @@ |
|||||
|
# AI 交互记录 - Java 温度转换器开发 |
||||
|
|
||||
|
## 任务背景 |
||||
|
开发一个支持摄氏度(C)与华氏度(F)互转的 Java 程序,要求具备多种运行模式和完善的异常处理。 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 需求分析 |
||||
|
|
||||
|
### 核心功能 |
||||
|
1. **温度转换**:实现 C↔F 双向转换 |
||||
|
2. **多模式运行**:支持交互式、命令行参数、批量转换三种模式 |
||||
|
3. **输入解析**:智能识别温度值和单位 |
||||
|
4. **异常处理**:处理非法输入、格式错误等场景 |
||||
|
|
||||
|
### 技术要求 |
||||
|
- 使用模块化设计,每个功能独立方法 |
||||
|
- 完整的中文注释(Javadoc 风格) |
||||
|
- 遵循 Java 代码规范 |
||||
|
- 友好的用户提示 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 开发过程 |
||||
|
|
||||
|
### 第1轮:基础转换方法实现 |
||||
|
**用户需求:** |
||||
|
实现摄氏度与华氏度的互相转换 |
||||
|
|
||||
|
**AI 实现:** |
||||
|
```java |
||||
|
public static float celsiusToFahrenheit(float c) { |
||||
|
return c * 9.0f / 5.0f + 32.0f; |
||||
|
} |
||||
|
|
||||
|
public static float fahrenheitToCelsius(float f) { |
||||
|
return (f - 32.0f) * 5.0f / 9.0f; |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
**技术要点:** |
||||
|
- 使用 `float` 类型保证精度 |
||||
|
- 浮点数运算使用 `9.0f` 避免整数除法 |
||||
|
- 静态方法便于直接调用 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
### 第2轮:输入解析功能 |
||||
|
**用户需求:** |
||||
|
解析用户输入字符串,提取温度值和单位 |
||||
|
|
||||
|
**AI 实现:** |
||||
|
```java |
||||
|
public static float[] parseInput(String input) { |
||||
|
// 1. 空值检查 |
||||
|
if (input == null || input.trim().isEmpty()) { |
||||
|
throw new IllegalArgumentException("输入为空"); |
||||
|
} |
||||
|
|
||||
|
// 2. 分割字符串 |
||||
|
String[] parts = input.trim().split("\\s+"); |
||||
|
|
||||
|
// 3. 解析数值 |
||||
|
float value = Float.parseFloat(parts[0]); |
||||
|
|
||||
|
// 4. 解析单位(默认 C) |
||||
|
String unit = parts.length > 1 ? parts[1].toUpperCase() : "C"; |
||||
|
|
||||
|
// 5. 验证单位合法性 |
||||
|
if (!unit.startsWith("C") && !unit.startsWith("F")) { |
||||
|
throw new IllegalArgumentException("未知单位 '" + unit + "'"); |
||||
|
} |
||||
|
|
||||
|
return new float[]{value, unit.equals("F") ? 1.0f : 0.0f}; |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
**设计决策:** |
||||
|
- 返回 `float[]` 数组:`[0]` 存储数值,`[1]` 用 0/1 标识单位 |
||||
|
- 使用正则 `\\s+` 分割,兼容多个空格 |
||||
|
- 默认单位为摄氏度,提升用户体验 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
### 第3轮:格式化输出 |
||||
|
**用户需求:** |
||||
|
将转换结果格式化为易读的字符串 |
||||
|
|
||||
|
**AI 实现:** |
||||
|
```java |
||||
|
public static String convertAndFormat(float value, boolean isFahrenheit) { |
||||
|
if (isFahrenheit) { |
||||
|
float celsius = fahrenheitToCelsius(value); |
||||
|
return String.format("%.2f °F = %.2f °C", value, celsius); |
||||
|
} else { |
||||
|
float fahrenheit = celsiusToFahrenheit(value); |
||||
|
return String.format("%.2f °C = %.2f °F", value, fahrenheit); |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
**技术亮点:** |
||||
|
- 使用 `String.format()` 统一格式化 |
||||
|
- 保留两位小数 `%.2f` |
||||
|
- 包含单位符号 `°C` / `°F` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
### 第4轮:交互式模式 |
||||
|
**用户需求:** |
||||
|
从标准输入读取用户输入并转换 |
||||
|
|
||||
|
**AI 实现:** |
||||
|
```java |
||||
|
public static void interactiveMode() { |
||||
|
Scanner scanner = new Scanner(System.in); |
||||
|
System.out.print("请输入要转换的温度与单位(例如 36.6 C 或 97 F):"); |
||||
|
String input = scanner.nextLine().trim(); |
||||
|
|
||||
|
if (input.isEmpty()) { |
||||
|
System.out.println("输入为空,程序退出。"); |
||||
|
scanner.close(); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
float[] parsed = parseInput(input); |
||||
|
float value = parsed[0]; |
||||
|
boolean isFahrenheit = (parsed[1] == 1.0f); |
||||
|
String result = convertAndFormat(value, isFahrenheit); |
||||
|
System.out.println(result); |
||||
|
} catch (IllegalArgumentException e) { |
||||
|
System.out.println("输入解析失败:" + e.getMessage()); |
||||
|
} finally { |
||||
|
scanner.close(); |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
**异常处理策略:** |
||||
|
- `try-catch-finally` 确保资源释放 |
||||
|
- 捕获 `IllegalArgumentException` 提供友好提示 |
||||
|
- 空输入提前返回,避免无效计算 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
### 第5轮:命令行参数模式 |
||||
|
**用户需求:** |
||||
|
支持通过命令行参数直接传入温度值 |
||||
|
|
||||
|
**AI 实现:** |
||||
|
```java |
||||
|
public static void commandLineMode(String[] args) { |
||||
|
if (args.length < 1) { |
||||
|
System.out.println("用法:java TemperatureConverter <温度值> [单位]"); |
||||
|
System.out.println("示例:java TemperatureConverter 36.6 C"); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
float value = Float.parseFloat(args[0]); |
||||
|
String unit = (args.length > 1) ? args[1].toUpperCase() : "C"; |
||||
|
|
||||
|
if (!unit.startsWith("C") && !unit.startsWith("F")) { |
||||
|
throw new IllegalArgumentException("未知单位 '" + unit + "'"); |
||||
|
} |
||||
|
|
||||
|
boolean isFahrenheit = unit.startsWith("F"); |
||||
|
String result = convertAndFormat(value, isFahrenheit); |
||||
|
System.out.println(result); |
||||
|
} catch (NumberFormatException e) { |
||||
|
System.out.println("错误:温度值必须是数字,收到:" + args[0]); |
||||
|
} catch (IllegalArgumentException e) { |
||||
|
System.out.println("错误:" + e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
**使用示例:** |
||||
|
```bash |
||||
|
java TemperatureConverter 36.6 C |
||||
|
java TemperatureConverter 97 F |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
--- |
||||
|
|
||||
|
### 第6轮:批量转换模式 |
||||
|
**用户需求:** |
||||
|
从多行输入中批量转换温度数据 |
||||
|
|
||||
|
**AI 实现:** |
||||
|
```java |
||||
|
public static void batchConvertMode(String[] lines) { |
||||
|
System.out.println("=== 批量转换开始 ==="); |
||||
|
int successCount = 0; |
||||
|
int failCount = 0; |
||||
|
|
||||
|
for (int i = 0; i < lines.length; i++) { |
||||
|
String line = lines[i].trim(); |
||||
|
if (line.isEmpty()) continue; |
||||
|
|
||||
|
System.out.printf("第 %d 行:", i + 1); |
||||
|
try { |
||||
|
float[] parsed = parseInput(line); |
||||
|
float value = parsed[0]; |
||||
|
boolean isFahrenheit = (parsed[1] == 1.0f); |
||||
|
String result = convertAndFormat(value, isFahrenheit); |
||||
|
System.out.println(result); |
||||
|
successCount++; |
||||
|
} catch (IllegalArgumentException e) { |
||||
|
System.out.println("失败 - " + e.getMessage()); |
||||
|
failCount++; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
System.out.println("=== 批量转换结束 ==="); |
||||
|
System.out.printf("成功:%d 条,失败:%d 条%n", successCount, failCount); |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
**设计特点:** |
||||
|
- 统计成功/失败数量 |
||||
|
- 逐行显示转换结果 |
||||
|
- 单行失败不影响其他行处理 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
### 第7轮:主入口整合 |
||||
|
**用户需求:** |
||||
|
整合三种运行模式到 `main()` 方法 |
||||
|
|
||||
|
**AI 实现:** |
||||
|
```java |
||||
|
public static void main(String[] args) { |
||||
|
// 批量转换模式 |
||||
|
if (args.length > 0 && "--batch".equals(args[0])) { |
||||
|
Scanner scanner = new Scanner(System.in); |
||||
|
java.util.List<String> lines = new java.util.ArrayList<>(); |
||||
|
|
||||
|
while (true) { |
||||
|
String line = scanner.nextLine().trim(); |
||||
|
if (line.isEmpty()) break; |
||||
|
lines.add(line); |
||||
|
} |
||||
|
|
||||
|
scanner.close(); |
||||
|
batchConvertMode(lines.toArray(new String[0])); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
// 根据参数选择模式 |
||||
|
if (args.length > 0) { |
||||
|
commandLineMode(args); |
||||
|
} else { |
||||
|
interactiveMode(); |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
**模式切换逻辑:** |
||||
|
- 无参数 → 交互式模式 |
||||
|
- 有参数(非 `--batch`)→ 命令行参数模式 |
||||
|
- `--batch` 参数 → 批量转换模式 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 最终代码结构 |
||||
|
|
||||
|
| 方法名 | 功能 | 行数 | |
||||
|
|--------|------|------| |
||||
|
| `celsiusToFahrenheit()` | 摄氏转华氏 | 3 | |
||||
|
| `fahrenheitToCelsius()` | 华氏转摄氏 | 3 | |
||||
|
| `parseInput()` | 解析输入字符串 | 30 | |
||||
|
| `convertAndFormat()` | 格式化输出结果 | 10 | |
||||
|
| `interactiveMode()` | 交互式模式 | 26 | |
||||
|
| `commandLineMode()` | 命令行参数模式 | 26 | |
||||
|
| `batchConvertMode()` | 批量转换模式 | 34 | |
||||
|
| `main()` | 程序入口 | 28 | |
||||
|
|
||||
|
**总计:** 238 行(含注释和空行) |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 核心技术要点 |
||||
|
|
||||
|
### 1. 模块化设计 |
||||
|
- 每个功能独立为静态方法 |
||||
|
- 方法职责单一,易于测试和维护 |
||||
|
- 复用 `parseInput()` 和 `convertAndFormat()` 避免重复代码 |
||||
|
|
||||
|
### 2. 异常处理机制 |
||||
|
- **输入验证**:空值检查、格式验证 |
||||
|
- **数值解析**:捕获 `NumberFormatException` |
||||
|
- **业务逻辑**:抛出 `IllegalArgumentException` |
||||
|
- **资源管理**:`finally` 块确保 Scanner 关闭 |
||||
|
|
||||
|
### 3. 用户友好性 |
||||
|
- 详细的错误提示信息 |
||||
|
- 支持默认单位(C) |
||||
|
- 批量模式提供统计信息 |
||||
|
- 使用示例清晰明了 |
||||
|
|
||||
|
### 4. 代码规范 |
||||
|
- Javadoc 风格注释(类、方法、参数) |
||||
|
- 驼峰命名法 |
||||
|
- 合理的缩进和空行 |
||||
|
- 魔法数字提取为常量(可选优化) |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 测试用例 |
||||
|
|
||||
|
### 测试1:交互式模式 |
||||
|
``` |
||||
|
输入:36.6 C |
||||
|
输出:36.60 °C = 97.88 °F |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
### 测试2:命令行参数模式 |
||||
|
```bash |
||||
|
$ java TemperatureConverter 97 F |
||||
|
输出:97.00 °F = 36.11 °C |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
### 测试3:批量转换模式 |
||||
|
``` |
||||
|
输入: |
||||
|
36.6 C |
||||
|
97 F |
||||
|
abc X |
||||
|
100 C |
||||
|
|
||||
|
输出: |
||||
|
=== 批量转换开始 === |
||||
|
第 1 行:36.60 °C = 97.88 °F |
||||
|
第 2 行:97.00 °F = 36.11 °C |
||||
|
第 3 行:失败 - 温度值必须是数字:abc |
||||
|
第 4 行:100.00 °C = 212.00 °F |
||||
|
=== 批量转换结束 === |
||||
|
成功:3 条,失败:1 条 |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
### 测试4:异常处理 |
||||
|
``` |
||||
|
输入:abc C |
||||
|
输出:输入解析失败:温度值必须是数字:abc |
||||
|
请按示例输入数值与单位,例如:36.6 C |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 遇到的问题与解决方案 |
||||
|
|
||||
|
| 问题 | 解决方案 | |
||||
|
|------|----------| |
||||
|
| 浮点数精度丢失 | 使用 `float` 类型和 `9.0f` 后缀 | |
||||
|
| 输入格式多样 | 使用正则 `\\s+` 灵活分割 | |
||||
|
| 单位大小写不一 | 统一转为大写 `toUpperCase()` | |
||||
|
| 资源泄漏风险 | `finally` 块确保关闭 Scanner | |
||||
|
| 批量模式中断 | 单行异常不影响其他行处理 | |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 可扩展方向 |
||||
|
|
||||
|
1. **文件读写**:从文件读取批量数据 |
||||
|
2. **更多温标**:支持开尔文(K)、兰氏度(R) |
||||
|
3. **图形界面**:使用 Swing/JavaFX |
||||
|
4. **国际化**:多语言支持 |
||||
|
5. **历史记录**:保存转换历史 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 总结 |
||||
|
|
||||
|
### 代码特性 |
||||
|
- ✓ 三种运行模式(交互式、命令行、批量) |
||||
|
- ✓ 完整的异常处理和输入验证 |
||||
|
- ✓ 模块化设计,高内聚低耦合 |
||||
|
- ✓ 详细的中文注释 |
||||
|
- ✓ 用户友好的提示信息 |
||||
|
|
||||
|
### 技术栈 |
||||
|
- Java SE(Scanner、String.format、ArrayList) |
||||
|
- 异常处理(try-catch-finally) |
||||
|
- 正则表达式(`\\s+` 分割) |
||||
|
- 集合框架(List、Array) |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
**完成时间:** 2026年5月28日 |
||||
|
**项目路径:** `D:\Project\java\w1\TemperatureConverter.java` |
||||
|
**代码行数:** 238 行 |
||||
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 14 KiB |
Loading…
Reference in new issue