4 changed files with 903 additions and 0 deletions
@ -0,0 +1,19 @@ |
|||||
|
/*kimi k2.5*/ |
||||
|
P(prompt): |
||||
|
将上述 Python 程序完整移植为 Java 程序,文件名为 `TemperatureConverter.java`。 |
||||
|
- 在 Java 源码中保留与扩展注释,解释每个方法的功能与参数(中文注释可接受)。 |
||||
|
A(AI Answer): |
||||
|
*Java程序 |
||||
|
*关键语法对照说明 |
||||
|
/*claude haiku 4.5*/ |
||||
|
P: |
||||
|
可选加分项: |
||||
|
|
||||
|
支持命令行参数模式(例如 java TemperatureConverter 36.6 C)。 |
||||
|
支持批量转换(从文件读取多行温度并输出结果) |
||||
|
将代码修改以符合以上加分项 |
||||
|
A: |
||||
|
*修改过的Java程序 |
||||
|
*README.md |
||||
|
*temperatures.txt /*测试文件*/ |
||||
|
*测试 |
||||
@ -0,0 +1,512 @@ |
|||||
|
# 温度转换器 - 完整使用指南 |
||||
|
|
||||
|
## 📋 目录 |
||||
|
|
||||
|
1. [概述](#概述) |
||||
|
2. [特性](#特性) |
||||
|
3. [使用方法](#使用方法) |
||||
|
4. [交互模式智能纠正](#交互模式智能纠正) |
||||
|
5. [编译与运行](#编译与运行) |
||||
|
6. [示例](#示例) |
||||
|
7. [技术细节](#技术细节) |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 概述 |
||||
|
|
||||
|
温度转换器是一个功能完整的Java程序,支持摄氏度(Celsius)和华氏度(Fahrenheit)之间的互相转换。 |
||||
|
|
||||
|
**支持三种工作模式**: |
||||
|
1. **命令行参数模式** - 直接在命令行传入温度和单位 |
||||
|
2. **批量转换模式** - 从文件读取温度数据进行批量处理 |
||||
|
3. **交互式模式** - 实时输入温度数据,获得智能纠正提示 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 特性 |
||||
|
|
||||
|
### ✨ 核心功能 |
||||
|
|
||||
|
- ✅ 摄氏度 ↔ 华氏度 双向转换 |
||||
|
- ✅ 精确到小数点后两位 |
||||
|
- ✅ 三种灵活的使用模式 |
||||
|
- ✅ 智能的错误诊断和纠正建议 |
||||
|
|
||||
|
### 🎯 转换公式 |
||||
|
|
||||
|
| 方向 | 公式 | |
||||
|
|-----|------| |
||||
|
| 摄氏 → 华氏 | F = C × 9/5 + 32 | |
||||
|
| 华氏 → 摄氏 | C = (F - 32) × 5/9 | |
||||
|
|
||||
|
### 🚀 加分项(已实现) |
||||
|
|
||||
|
1. **✅ 命令行参数模式** |
||||
|
- 支持 `java TemperatureConverter 36.6 C` |
||||
|
- 自动识别粘连格式(如 `36.6c`) |
||||
|
|
||||
|
2. **✅ 批量转换模式** |
||||
|
- 从文件读取多行温度数据 |
||||
|
- 支持注释行和空行 |
||||
|
- 提供转换统计 |
||||
|
|
||||
|
3. **✅ 交互模式智能纠正** |
||||
|
- 自动识别和修复粘连单位 |
||||
|
- 缺少单位时给出具体提示 |
||||
|
- 无效输入时指出问题所在 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 使用方法 |
||||
|
|
||||
|
### 1️⃣ 命令行参数模式 |
||||
|
|
||||
|
**最快速的使用方式** - 单行转换,无需等待 |
||||
|
|
||||
|
#### 语法 |
||||
|
|
||||
|
```bash |
||||
|
java TemperatureConverter <温度> <单位> |
||||
|
``` |
||||
|
|
||||
|
#### 示例 |
||||
|
|
||||
|
```bash |
||||
|
# 标准格式(有空格) |
||||
|
java TemperatureConverter 36.6 C |
||||
|
# 输出:36.60 °C = 97.88 °F |
||||
|
|
||||
|
# 粘连格式(无空格) |
||||
|
java TemperatureConverter 36.6c |
||||
|
# 输出:36.60 °C = 97.88 °F |
||||
|
|
||||
|
# 华氏到摄氏 |
||||
|
java TemperatureConverter 98.6 F |
||||
|
# 输出:98.60 °F = 37.00 °C |
||||
|
``` |
||||
|
|
||||
|
#### 特点 |
||||
|
|
||||
|
- 快速高效,适合脚本编程 |
||||
|
- 自动处理粘连格式 |
||||
|
- 三种模式中最简洁 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
### 2️⃣ 批量转换模式 |
||||
|
|
||||
|
**为数据处理设计** - 处理多行温度数据 |
||||
|
|
||||
|
#### 语法 |
||||
|
|
||||
|
```bash |
||||
|
java TemperatureConverter <文件路径> |
||||
|
``` |
||||
|
|
||||
|
#### 文件格式 |
||||
|
|
||||
|
每行一条数据,格式:`<温度值> <单位>` |
||||
|
|
||||
|
``` |
||||
|
# 示例:temperatures.txt |
||||
|
# 常见体温 |
||||
|
36.6 C |
||||
|
37.5 C |
||||
|
|
||||
|
# 常见环境温度 |
||||
|
25 C |
||||
|
30 C |
||||
|
|
||||
|
# 华氏度 |
||||
|
98.6 F |
||||
|
77 F |
||||
|
|
||||
|
# 特殊温度 |
||||
|
0 C |
||||
|
100 C |
||||
|
32 F |
||||
|
212 F |
||||
|
``` |
||||
|
|
||||
|
#### 运行示例 |
||||
|
|
||||
|
```bash |
||||
|
java TemperatureConverter temperatures.txt |
||||
|
``` |
||||
|
|
||||
|
#### 输出 |
||||
|
|
||||
|
``` |
||||
|
从文件读取温度数据:temperatures.txt |
||||
|
======================================== |
||||
|
第 4 行:36.60 °C = 97.88 °F |
||||
|
第 5 行:37.50 °C = 99.50 °F |
||||
|
第 8 行:25.00 °C = 77.00 °F |
||||
|
... |
||||
|
======================================== |
||||
|
处理完成:共处理 21 行,成功转换 10 条。 |
||||
|
``` |
||||
|
|
||||
|
#### 特点 |
||||
|
|
||||
|
- 支持注释行(以 `#` 开头) |
||||
|
- 支持空行(自动跳过) |
||||
|
- 显示处理统计信息 |
||||
|
- 适合批量数据导入/导出 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
### 3️⃣ 交互式模式(推荐) |
||||
|
|
||||
|
**用户友好的交互方式** - 实时输入,即时反馈 |
||||
|
|
||||
|
#### 启动 |
||||
|
|
||||
|
```bash |
||||
|
java TemperatureConverter |
||||
|
``` |
||||
|
|
||||
|
#### 功能说明 |
||||
|
|
||||
|
**自动纠正粘连单位** |
||||
|
|
||||
|
当输入数值和单位直接相连时(如 `100f`),程序会自动识别并显示纠正提示: |
||||
|
|
||||
|
``` |
||||
|
> 100f |
||||
|
✓ 已自动纠正输入:'100f' → '100 F' |
||||
|
100.00 °F = 37.78 °C |
||||
|
``` |
||||
|
|
||||
|
支持的粘连格式: |
||||
|
- `100f`, `100F` → 自动转换为 `100 F` |
||||
|
- `36.6c`, `36.6C` → 自动转换为 `36.6 C` |
||||
|
|
||||
|
**智能缺少单位提示** |
||||
|
|
||||
|
缺少温度单位时,程序会拒绝转换并给出具体建议: |
||||
|
|
||||
|
``` |
||||
|
> 100 |
||||
|
⚠️ 缺少温度单位! |
||||
|
请指定 C(摄氏度)或 F(华氏度) |
||||
|
示例:100 C 或 100 F |
||||
|
``` |
||||
|
|
||||
|
**无效单位诊断** |
||||
|
|
||||
|
不支持的单位会被立即识别并告知: |
||||
|
|
||||
|
``` |
||||
|
> 100 K |
||||
|
❌ 不支持的温度单位:'K' |
||||
|
支持的单位:C(摄氏度)或 F(华氏度) |
||||
|
示例:100 C 或 100 F |
||||
|
``` |
||||
|
|
||||
|
**无效数值诊断** |
||||
|
|
||||
|
数值格式不正确时会给出清晰提示: |
||||
|
|
||||
|
``` |
||||
|
> abc C |
||||
|
❌ 温度值不是有效的数字:'abc' |
||||
|
请输入数值(如 36.6, 100 等) |
||||
|
示例:36.6 C |
||||
|
``` |
||||
|
|
||||
|
**标准格式直接转换** |
||||
|
|
||||
|
格式正确时直接显示结果: |
||||
|
|
||||
|
``` |
||||
|
> 36.6 C |
||||
|
36.60 °C = 97.88 °F |
||||
|
|
||||
|
> 98.6 F |
||||
|
98.60 °F = 37.00 °C |
||||
|
``` |
||||
|
|
||||
|
**退出程序** |
||||
|
|
||||
|
``` |
||||
|
> quit |
||||
|
程序退出。 |
||||
|
|
||||
|
或者 |
||||
|
|
||||
|
> exit |
||||
|
程序退出。 |
||||
|
``` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 交互模式智能纠正 |
||||
|
|
||||
|
### 纠正功能详解 |
||||
|
|
||||
|
| 错误类型 | 输入示例 | 程序行为 | 输出 | |
||||
|
|--------|--------|--------|------| |
||||
|
| **粘连单位** | `100f` | 自动纠正并转换 | `✓ 已自动纠正输入:'100f' → '100 F'`<br/>`100.00 °F = 37.78 °C` | |
||||
|
| **有空格粘连** | `100 f` | 直接识别并转换 | `100.00 °F = 37.78 °C` | |
||||
|
| **缺少单位** | `100` | 拒绝并提示 | `⚠️ 缺少温度单位!`<br/>` 示例:100 C 或 100 F` | |
||||
|
| **无效单位** | `100 K` | 拒绝并说明原因 | `❌ 不支持的温度单位:'K'`<br/>` 示例:100 C 或 100 F` | |
||||
|
| **无效数值** | `abc C` | 拒绝并给出示例 | `❌ 温度值不是有效的数字:'abc'`<br/>` 示例:36.6 C` | |
||||
|
| **标准正确** | `36.6 C` | 直接转换 | `36.60 °C = 97.88 °F` | |
||||
|
|
||||
|
### 完整交互示例 |
||||
|
|
||||
|
``` |
||||
|
======================================== |
||||
|
温度转换器 - 交互式模式 |
||||
|
======================================== |
||||
|
请输入要转换的温度与单位(例如 36.6 C 或 97 F) |
||||
|
输入 'quit' 或 'exit' 退出程序 |
||||
|
======================================== |
||||
|
|
||||
|
> 36.6 C |
||||
|
36.60 °C = 97.88 °F |
||||
|
|
||||
|
> 100f |
||||
|
✓ 已自动纠正输入:'100f' → '100 F' |
||||
|
100.00 °F = 37.78 °C |
||||
|
|
||||
|
> 100 f |
||||
|
100.00 °F = 37.78 °C |
||||
|
|
||||
|
> 100 |
||||
|
⚠️ 缺少温度单位! |
||||
|
请指定 C(摄氏度)或 F(华氏度) |
||||
|
示例:100 C 或 100 F |
||||
|
|
||||
|
> 100 K |
||||
|
❌ 不支持的温度单位:'K' |
||||
|
支持的单位:C(摄氏度)或 F(华氏度) |
||||
|
示例:100 C 或 100 F |
||||
|
|
||||
|
> abc C |
||||
|
❌ 温度值不是有效的数字:'abc' |
||||
|
请输入数值(如 36.6, 100 等) |
||||
|
示例:36.6 C |
||||
|
|
||||
|
> quit |
||||
|
程序退出。 |
||||
|
``` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 编译与运行 |
||||
|
|
||||
|
### 前置要求 |
||||
|
|
||||
|
- Java JDK 8 或更高版本 |
||||
|
- 命令行/终端访问权限 |
||||
|
|
||||
|
### 编译 |
||||
|
|
||||
|
```bash |
||||
|
# 进入项目目录 |
||||
|
cd d:\VisualStudioProgram\VSCodePrograms\JavaLearningProject |
||||
|
|
||||
|
# 编译源代码 |
||||
|
javac TemperatureConverter.java |
||||
|
``` |
||||
|
|
||||
|
编译成功后会生成 `TemperatureConverter.class` 文件。 |
||||
|
|
||||
|
### 运行 |
||||
|
|
||||
|
#### 模式选择 |
||||
|
|
||||
|
```bash |
||||
|
# 1. 交互式模式(推荐) |
||||
|
java TemperatureConverter |
||||
|
|
||||
|
# 2. 命令行参数模式 |
||||
|
java TemperatureConverter 36.6 C |
||||
|
|
||||
|
# 3. 批量转换模式 |
||||
|
java TemperatureConverter temperatures.txt |
||||
|
|
||||
|
# 4. 显示帮助信息 |
||||
|
java TemperatureConverter -h |
||||
|
java TemperatureConverter --help |
||||
|
``` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 示例 |
||||
|
|
||||
|
### 各种场景的使用 |
||||
|
|
||||
|
#### 场景1:快速查询单个温度 |
||||
|
|
||||
|
```bash |
||||
|
$ java TemperatureConverter 37 C |
||||
|
37.00 °C = 98.60 °F |
||||
|
``` |
||||
|
|
||||
|
#### 场景2:处理粘连格式 |
||||
|
|
||||
|
```bash |
||||
|
$ java TemperatureConverter 37c |
||||
|
37.00 °C = 98.60 °F |
||||
|
``` |
||||
|
|
||||
|
#### 场景3:医学应用 - 正常体温 |
||||
|
|
||||
|
```bash |
||||
|
$ java TemperatureConverter 36.5 C |
||||
|
36.50 °C = 97.70 °F |
||||
|
|
||||
|
$ java TemperatureConverter 98.6 F |
||||
|
98.60 °F = 37.00 °C |
||||
|
``` |
||||
|
|
||||
|
#### 场景4:物理学应用 - 相变点 |
||||
|
|
||||
|
```bash |
||||
|
$ java TemperatureConverter 0 C |
||||
|
0.00 °C = 32.00 °F |
||||
|
|
||||
|
$ java TemperatureConverter 100 C |
||||
|
100.00 °C = 212.00 °F |
||||
|
``` |
||||
|
|
||||
|
#### 场景5:批量处理数据 |
||||
|
|
||||
|
创建 `test.txt`: |
||||
|
|
||||
|
``` |
||||
|
# 测试数据 |
||||
|
25 C |
||||
|
30 C |
||||
|
35 C |
||||
|
96.8 F |
||||
|
104 F |
||||
|
``` |
||||
|
|
||||
|
运行: |
||||
|
|
||||
|
```bash |
||||
|
$ java TemperatureConverter test.txt |
||||
|
从文件读取温度数据:test.txt |
||||
|
======================================== |
||||
|
第 2 行:25.00 °C = 77.00 °F |
||||
|
第 3 行:30.00 °C = 86.00 °F |
||||
|
第 4 行:35.00 °C = 95.00 °F |
||||
|
第 5 行:96.80 °F = 36.00 °C |
||||
|
第 6 行:104.00 °F = 40.00 °C |
||||
|
======================================== |
||||
|
处理完成:共处理 6 行,成功转换 5 条。 |
||||
|
``` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 技术细节 |
||||
|
|
||||
|
### 程序结构 |
||||
|
|
||||
|
``` |
||||
|
TemperatureConverter.java |
||||
|
├── 转换方法 |
||||
|
│ ├── celsiusToFahrenheit() - C → F |
||||
|
│ └── fahrenheitToCelsius() - F → C |
||||
|
│ |
||||
|
├── 智能诊断方法 |
||||
|
│ ├── extractAdjacent() - 提取粘连格式 |
||||
|
│ ├── analyzeAndSuggestFix() - 错误分析与建议 |
||||
|
│ └── convertWithValidatedInput() - 执行转换 |
||||
|
│ |
||||
|
├── 交互方法 |
||||
|
│ ├── interactiveMode() - 交互式模式 |
||||
|
│ └── convertSingleTemperature() - 单个转换(命令行/文件) |
||||
|
│ |
||||
|
├── 数据处理方法 |
||||
|
│ ├── convertFromFile() - 批量文件处理 |
||||
|
│ └── showUsage() - 使用说明 |
||||
|
│ |
||||
|
└── 入口点 |
||||
|
└── main() - 程序入口,模式选择 |
||||
|
``` |
||||
|
|
||||
|
### 粘连单位识别 |
||||
|
|
||||
|
**正则表达式**:`^(\d+(?:\.\d+)?)\s*([CcFf])$` |
||||
|
|
||||
|
- `\d+` - 一个或多个数字 |
||||
|
- `(?:\.\d+)?` - 可选的小数部分 |
||||
|
- `\s*` - 零个或多个空白字符 |
||||
|
- `[CcFf]` - 单位字母(C/c/F/f) |
||||
|
|
||||
|
**支持的格式**: |
||||
|
- `100f` → ["100", "F"] |
||||
|
- `36.6c` → ["36.6", "C"] |
||||
|
- `100 f` → ["100", "F"](允许空格) |
||||
|
- `36.6 c` → ["36.6", "C"](允许空格) |
||||
|
|
||||
|
### 三种模式的差异 |
||||
|
|
||||
|
| 特性 | 交互模式 | 命令行模式 | 文件模式 | |
||||
|
|-----|--------|---------|--------| |
||||
|
| **启用粘连识别** | ✅ 是 | ✅ 是 | ✅ 是 | |
||||
|
| **显示纠正提示** | ✅ 是 | ❌ 否 | ❌ 否 | |
||||
|
| **缺少单位处理** | ❌ 拒绝 | ✅ 默认C | ✅ 默认C | |
||||
|
| **错误详细提示** | ✅ 是 | ❌ 否 | ❌ 否 | |
||||
|
| **单/多行处理** | 多行循环 | 单行 | 多行批处理 | |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 常见问题 |
||||
|
|
||||
|
**Q: 如何让程序接受更多的温度单位(如K、R)?** |
||||
|
|
||||
|
A: 修改 `analyzeAndSuggestFix()` 方法中的单位验证逻辑,添加新的单位判断条件和转换公式。 |
||||
|
|
||||
|
**Q: 如何修改输出精度(目前是两位小数)?** |
||||
|
|
||||
|
A: 更改 `System.out.printf()` 中的格式字符串,例如 `%.2f` 改为 `%.3f` 表示三位小数。 |
||||
|
|
||||
|
**Q: 批量模式中,某一行出错会影响整个文件处理吗?** |
||||
|
|
||||
|
A: 不会。程序会跳过无效行,继续处理后续行,最后显示成功和失败的统计。 |
||||
|
|
||||
|
**Q: 能否在命令行模式中显示纠正提示?** |
||||
|
|
||||
|
A: 可以。修改 `convertSingleTemperature()` 方法中对 `extractAdjacent()` 的调用,改为调用 `analyzeAndSuggestFix()` 并传入 `true` 参数。 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 文件列表 |
||||
|
|
||||
|
| 文件 | 说明 | |
||||
|
|-----|------| |
||||
|
| `TemperatureConverter.java` | 源代码文件 | |
||||
|
| `TemperatureConverter.class` | 编译后的字节码 | |
||||
|
| `temperatures.txt` | 示例数据文件 | |
||||
|
| `README_增强版.md` | 原始功能说明(已合并到本文档) | |
||||
|
| `交互模式改进说明.md` | 交互模式详细说明(已合并到本文档) | |
||||
|
| `粘连单位修复总结.md` | 修复说明(已合并到本文档) | |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 版本信息 |
||||
|
|
||||
|
- **程序版本**:2.0 |
||||
|
- **功能扩展**:3项加分项 + 交互模式智能纠正 |
||||
|
- **最后更新**:2026年03月 |
||||
|
- **Java版本要求**:JDK 8+ |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 总结 |
||||
|
|
||||
|
这个温度转换器程序演示了以下编程概念: |
||||
|
|
||||
|
1. **正则表达式** - 灵活的模式匹配和数据提取 |
||||
|
2. **异常处理** - 文件IO和数据验证 |
||||
|
3. **模式设计** - 多种工作模式的统一管理 |
||||
|
4. **用户交互** - 友好的错误提示和智能建议 |
||||
|
5. **代码组织** - 清晰的方法划分和职责分离 |
||||
|
|
||||
|
祝你使用愉快! 🎉 |
||||
@ -0,0 +1,338 @@ |
|||||
|
import java.util.Scanner; |
||||
|
import java.io.File; |
||||
|
import java.io.FileNotFoundException; |
||||
|
|
||||
|
/** |
||||
|
* 温度转换器示例程序(Java) |
||||
|
* 支持摄氏度(C)与华氏度(F)之间互转 |
||||
|
* 增强版本:支持命令行参数和文件批量转换 |
||||
|
*/ |
||||
|
public class TemperatureConverter_PytoJava { |
||||
|
|
||||
|
/** |
||||
|
* 将摄氏度转换为华氏度。 |
||||
|
* |
||||
|
* 换算公式:F = C × 9/5 + 32 |
||||
|
* |
||||
|
* @param c 摄氏温度(浮点数) |
||||
|
* @return 对应的华氏温度(浮点数) |
||||
|
*/ |
||||
|
public static double celsiusToFahrenheit(double c) { |
||||
|
return c * 9.0 / 5.0 + 32.0; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 将华氏度转换为摄氏度。 |
||||
|
* |
||||
|
* 换算公式:C = (F - 32) × 5/9 |
||||
|
* |
||||
|
* @param f 华氏温度(浮点数) |
||||
|
* @return 对应的摄氏温度(浮点数) |
||||
|
*/ |
||||
|
public static double fahrenheitToCelsius(double f) { |
||||
|
return (f - 32.0) * 5.0 / 9.0; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 从粘连格式中提取数值和单位。 |
||||
|
* 例如:100f → ["100", "F"],36.6c → ["36.6", "C"],100 f → ["100", "F"] |
||||
|
* 支持单位前的空格。 |
||||
|
* |
||||
|
* @param input 粘连格式的输入 |
||||
|
* @return 包含数值和单位的数组,如果无法提取则返回 null |
||||
|
*/ |
||||
|
public static String[] extractAdjacent(String input) { |
||||
|
String trimmed = input.trim(); |
||||
|
// 使用正则表达式匹配粘连格式,允许单位前有空格
|
||||
|
// 格式:数字(可选小数) + 可选空格 + C或F
|
||||
|
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("^(\\d+(?:\\.\\d+)?)\\s*([CcFf])$"); |
||||
|
java.util.regex.Matcher matcher = pattern.matcher(trimmed); |
||||
|
|
||||
|
if (matcher.matches()) { |
||||
|
String value = matcher.group(1); |
||||
|
String unit = matcher.group(2).toUpperCase(); |
||||
|
return new String[]{value, unit}; |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 分析并提供错误诊断和建议。 |
||||
|
* 在交互模式中使用此方法进行智能纠正。 |
||||
|
* |
||||
|
* @param input 用户输入 |
||||
|
* @param isInteractiveMode 是否为交互模式 |
||||
|
* @return 如果输入有效返回true,否则返回false并打印诊断信息 |
||||
|
*/ |
||||
|
public static boolean analyzeAndSuggestFix(String input, boolean isInteractiveMode) { |
||||
|
input = input.trim(); |
||||
|
|
||||
|
// 1. 检查粘连单位模式(如 100f)
|
||||
|
String[] adjacent = extractAdjacent(input); |
||||
|
if (adjacent != null) { |
||||
|
// 判断是否真正是粘连格式(数值和单位直接相连,无空格)
|
||||
|
boolean isDirectlyAdjacent = input.matches("^\\d+(?:\\.\\d+)?[CcFf]$"); |
||||
|
if (isDirectlyAdjacent && isInteractiveMode) { |
||||
|
System.out.println("✓ 已自动纠正输入:'" + input + "' → '" + adjacent[0] + " " + adjacent[1] + "'"); |
||||
|
} |
||||
|
// 进行转换
|
||||
|
return convertWithValidatedInput(Double.parseDouble(adjacent[0]), adjacent[1]); |
||||
|
} |
||||
|
|
||||
|
// 2. 分割输入
|
||||
|
String[] parts = input.split("\\s+"); |
||||
|
|
||||
|
// 3. 检查缺少单位模式(如 100)
|
||||
|
if (parts.length == 1) { |
||||
|
try { |
||||
|
Double.parseDouble(parts[0]); |
||||
|
// 能解析为数字,但缺少单位
|
||||
|
if (isInteractiveMode) { |
||||
|
System.out.println("⚠️ 缺少温度单位!"); |
||||
|
System.out.println(" 请指定 C(摄氏度)或 F(华氏度)"); |
||||
|
System.out.println(" 示例:" + parts[0] + " C 或 " + parts[0] + " F"); |
||||
|
} |
||||
|
return false; |
||||
|
} catch (NumberFormatException e) { |
||||
|
// 既不是数字也不是正确格式
|
||||
|
if (isInteractiveMode) { |
||||
|
System.out.println("❌ 温度值不是有效的数字:'" + parts[0] + "'"); |
||||
|
System.out.println(" 请输入数值(如 36.6, 100 等)"); |
||||
|
System.out.println(" 示例:36.6 C"); |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 4. 验证数值有效性
|
||||
|
try { |
||||
|
double value = Double.parseDouble(parts[0]); |
||||
|
String unit = parts[1].toUpperCase(); |
||||
|
|
||||
|
// 5. 验证单位有效性
|
||||
|
if (!unit.startsWith("C") && !unit.startsWith("F")) { |
||||
|
if (isInteractiveMode) { |
||||
|
System.out.println("❌ 不支持的温度单位:'" + unit + "'"); |
||||
|
System.out.println(" 支持的单位:C(摄氏度)或 F(华氏度)"); |
||||
|
System.out.println(" 示例:" + parts[0] + " C 或 " + parts[0] + " F"); |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// 转换成功
|
||||
|
return convertWithValidatedInput(value, unit); |
||||
|
|
||||
|
} catch (NumberFormatException e) { |
||||
|
if (isInteractiveMode) { |
||||
|
System.out.println("❌ 温度值不是有效的数字:'" + parts[0] + "'"); |
||||
|
System.out.println(" 请输入数值(如 36.6, 100 等)"); |
||||
|
System.out.println(" 示例:36.6 C"); |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 使用验证过的数值和单位进行转换。 |
||||
|
* 这是真正的转换逻辑,不包含错误处理。 |
||||
|
* |
||||
|
* @param value 温度值 |
||||
|
* @param unit 单位(C 或 F) |
||||
|
* @return 始终返回 true(如果调用说明数据有效) |
||||
|
*/ |
||||
|
public static boolean convertWithValidatedInput(double value, String unit) { |
||||
|
if (unit.startsWith("C")) { |
||||
|
double f = celsiusToFahrenheit(value); |
||||
|
System.out.printf("%.2f °C = %.2f °F%n", value, f); |
||||
|
} else if (unit.startsWith("F")) { |
||||
|
double c = fahrenheitToCelsius(value); |
||||
|
System.out.printf("%.2f °F = %.2f °C%n", value, c); |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 处理单个温度转换(命令行/文件模式用,宽松验证)。 |
||||
|
* |
||||
|
* @param input 温度输入字符串,格式:"数值 单位",例如 "36.6 C" |
||||
|
* @return 转换成功返回true,失败返回false |
||||
|
*/ |
||||
|
public static boolean convertSingleTemperature(String input) { |
||||
|
input = input.trim(); |
||||
|
|
||||
|
// 检查输入是否为空
|
||||
|
if (input.isEmpty()) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// 检查粘连单位并自动分离
|
||||
|
String[] adjacent = extractAdjacent(input); |
||||
|
if (adjacent != null) { |
||||
|
try { |
||||
|
return convertWithValidatedInput(Double.parseDouble(adjacent[0]), adjacent[1]); |
||||
|
} catch (NumberFormatException e) { |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 按空白字符分割输入字符串
|
||||
|
String[] parts = input.split("\\s+"); |
||||
|
|
||||
|
try { |
||||
|
double value = Double.parseDouble(parts[0]); |
||||
|
// 如果没有单位,在命令行/文件模式中仍然尝试转换(宽松模式)
|
||||
|
// 但在交互模式中会被 analyzeAndSuggestFix 拒绝
|
||||
|
String unit = (parts.length > 1) ? parts[1].toUpperCase() : "C"; |
||||
|
|
||||
|
if (unit.startsWith("C")) { |
||||
|
double f = celsiusToFahrenheit(value); |
||||
|
System.out.printf("%.2f °C = %.2f °F%n", value, f); |
||||
|
} else if (unit.startsWith("F")) { |
||||
|
double c = fahrenheitToCelsius(value); |
||||
|
System.out.printf("%.2f °F = %.2f °C%n", value, c); |
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
return true; |
||||
|
|
||||
|
} catch (NumberFormatException e) { |
||||
|
return false; |
||||
|
} catch (Exception e) { |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 从文件中批量读取温度数据并进行转换。 |
||||
|
* 文件中每一行包含一个温度及其单位。 |
||||
|
* |
||||
|
* @param filename 文件路径 |
||||
|
*/ |
||||
|
public static void convertFromFile(String filename) { |
||||
|
File file = new File(filename); |
||||
|
|
||||
|
if (!file.exists()) { |
||||
|
System.out.println("文件不存在:" + filename); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
Scanner fileScanner = new Scanner(file); |
||||
|
int lineNum = 0; |
||||
|
int successCount = 0; |
||||
|
|
||||
|
System.out.println("从文件读取温度数据:" + filename); |
||||
|
System.out.println("========================================"); |
||||
|
|
||||
|
while (fileScanner.hasNextLine()) { |
||||
|
lineNum++; |
||||
|
String line = fileScanner.nextLine(); |
||||
|
|
||||
|
// 跳过空行和注释行(以#开头)
|
||||
|
if (line.trim().isEmpty() || line.trim().startsWith("#")) { |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
System.out.print("第 " + lineNum + " 行:"); |
||||
|
if (convertSingleTemperature(line)) { |
||||
|
successCount++; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
System.out.println("========================================"); |
||||
|
System.out.println("处理完成:共处理 " + lineNum + " 行,成功转换 " + successCount + " 条。"); |
||||
|
|
||||
|
fileScanner.close(); |
||||
|
|
||||
|
} catch (FileNotFoundException e) { |
||||
|
System.out.println("无法打开文件:" + filename); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 交互式模式:提示用户输入温度进行转换,使用智能诊断。 |
||||
|
*/ |
||||
|
public static void interactiveMode() { |
||||
|
Scanner scanner = new Scanner(System.in); |
||||
|
|
||||
|
System.out.println("========================================"); |
||||
|
System.out.println("温度转换器 - 交互式模式"); |
||||
|
System.out.println("========================================"); |
||||
|
System.out.println("请输入要转换的温度与单位(例如 36.6 C 或 97 F)"); |
||||
|
System.out.println("输入 'quit' 或 'exit' 退出程序"); |
||||
|
System.out.println("========================================"); |
||||
|
|
||||
|
while (true) { |
||||
|
System.out.print("> "); |
||||
|
String input = scanner.nextLine(); |
||||
|
|
||||
|
if (input.equalsIgnoreCase("quit") || input.equalsIgnoreCase("exit")) { |
||||
|
System.out.println("程序退出。"); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
// 在交互模式中使用智能诊断
|
||||
|
if (!analyzeAndSuggestFix(input, true)) { |
||||
|
// 诊断方法已经打印了具体的错误信息
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
scanner.close(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 显示使用说明。 |
||||
|
*/ |
||||
|
public static void showUsage() { |
||||
|
System.out.println("温度转换器 - 使用说明"); |
||||
|
System.out.println("========================================"); |
||||
|
System.out.println("用法1(命令行参数模式):"); |
||||
|
System.out.println(" java TemperatureConverter_PytoJava <温度> <单位>"); |
||||
|
System.out.println(" 例如:java TemperatureConverter_PytoJava 36.6 C"); |
||||
|
System.out.println(); |
||||
|
System.out.println("用法2(批量转换模式):"); |
||||
|
System.out.println(" java TemperatureConverter_PytoJava <文件路径>"); |
||||
|
System.out.println(" 例如:java TemperatureConverter_PytoJava temperatures.txt"); |
||||
|
System.out.println(" 文件格式:每行一条温度数据,格式为 '温度 单位'"); |
||||
|
System.out.println(); |
||||
|
System.out.println("用法3(交互式模式):"); |
||||
|
System.out.println(" java TemperatureConverter_PytoJava"); |
||||
|
System.out.println(" 然后按提示输入温度数据"); |
||||
|
System.out.println("========================================"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 程序入口主方法。 |
||||
|
* 支持三种模式: |
||||
|
* 1. 命令行参数模式:java TemperatureConverter_PytoJava 36.6 C |
||||
|
* 2. 文件批量转换:java TemperatureConverter_PytoJava temperatures.txt |
||||
|
* 3. 交互式模式:java TemperatureConverter_PytoJava |
||||
|
* |
||||
|
* @param args 命令行参数 |
||||
|
*/ |
||||
|
public static void main(String[] args) { |
||||
|
if (args.length == 0) { |
||||
|
// 交互式模式
|
||||
|
interactiveMode(); |
||||
|
} else if (args.length == 1) { |
||||
|
// 检查是否为文件路径(包含.txt或其他扩展名,或者是一个存在的文件)
|
||||
|
File file = new File(args[0]); |
||||
|
if (file.exists() && file.isFile()) { |
||||
|
// 文件批量转换模式
|
||||
|
convertFromFile(args[0]); |
||||
|
} else if (args[0].equalsIgnoreCase("-h") || args[0].equalsIgnoreCase("--help")) { |
||||
|
// 显示帮助信息
|
||||
|
showUsage(); |
||||
|
} else { |
||||
|
// 可能是单个温度但缺少单位,默认使用摄氏度
|
||||
|
System.out.println("处理输入:" + args[0]); |
||||
|
convertSingleTemperature(args[0]); |
||||
|
} |
||||
|
} else if (args.length == 2) { |
||||
|
// 命令行参数模式:温度和单位
|
||||
|
convertSingleTemperature(args[0] + " " + args[1]); |
||||
|
} else { |
||||
|
showUsage(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
请输入数值(如 36.6, 100 等) |
||||
|
示例:36.6 C |
||||
|
> 36.6c |
||||
|
? 已自动纠正输入:'36.6c' → '36.6 C' |
||||
|
36.60 °C = 97.88 °F |
||||
|
> 36.6f |
||||
|
? 已自动纠正输入:'36.6f' → '36.6 F' |
||||
|
36.60 °F = 2.56 °C |
||||
|
> 36.6 |
||||
|
?? 缺少温度单位! |
||||
|
请指定 C(摄氏度)或 F(华氏度) |
||||
|
示例:36.6 C 或 36.6 F |
||||
|
> 36.6 C |
||||
|
36.60 °C = 97.88 °F |
||||
|
> 97f |
||||
|
? 已自动纠正输入:'97f' → '97 F' |
||||
|
97.00 °F = 36.11 °C |
||||
|
> 97 f |
||||
|
97.00 °F = 36.11 °C |
||||
|
PS D:\VisualStudioProgram\VSCodePrograms\JavaLearningProject> java TemperatureConverter temperatures.txt |
||||
|
从文件读取温度数据:temperatures.txt |
||||
|
======================================== |
||||
|
第 6 行:36.60 °C = 97.88 °F |
||||
|
第 7 行:37.50 °C = 99.50 °F |
||||
|
第 10 行:25.00 °C = 77.00 °F |
||||
|
第 11 行:30.00 °C = 86.00 °F |
||||
|
第 14 行:98.60 °F = 37.00 °C |
||||
|
第 15 行:77.00 °F = 25.00 °C |
||||
|
第 18 行:0.00 °C = 32.00 °F |
||||
|
第 19 行:100.00 °C = 212.00 °F |
||||
|
第 20 行:32.00 °F = 0.00 °C |
||||
|
第 21 行:212.00 °F = 100.00 °C |
||||
|
======================================== |
||||
|
处理完成:共处理 21 行,成功转换 10 条。 |
||||
Loading…
Reference in new issue