4 changed files with 238 additions and 238 deletions
@ -1,238 +1,238 @@ |
|||||
|
|
||||
import java.util.Scanner; |
import java.util.Scanner; |
||||
|
|
||||
/** |
/** |
||||
* 温度转换器 - Java 版本 |
* 温度转换器 - Java 版本 |
||||
* 支持摄氏度(C)与华氏度(F)之间互转 |
* 支持摄氏度(C)与华氏度(F)之间互转 |
||||
* |
* |
||||
*/ |
*/ |
||||
public class TemperatureConverter { |
public class TemperatureConverter { |
||||
|
|
||||
/** |
/** |
||||
* 将摄氏度转换为华氏度 |
* 将摄氏度转换为华氏度 |
||||
* |
* |
||||
* 转换公式:F = C × 9/5 + 32 |
* 转换公式:F = C × 9/5 + 32 |
||||
* |
* |
||||
* @param c 摄氏温度值(float 类型) |
* @param c 摄氏温度值(float 类型) |
||||
* @return 对应的华氏温度值(float 类型) |
* @return 对应的华氏温度值(float 类型) |
||||
*/ |
*/ |
||||
public static float celsiusToFahrenheit(float c) { |
public static float celsiusToFahrenheit(float c) { |
||||
return c * 9.0f / 5.0f + 32.0f; |
return c * 9.0f / 5.0f + 32.0f; |
||||
} |
} |
||||
|
|
||||
/** |
/** |
||||
* 将华氏度转换为摄氏度 |
* 将华氏度转换为摄氏度 |
||||
* |
* |
||||
* 转换公式:C = (F - 32) × 5/9 |
* 转换公式:C = (F - 32) × 5/9 |
||||
* |
* |
||||
* @param f 华氏温度值(float 类型) |
* @param f 华氏温度值(float 类型) |
||||
* @return 对应的摄氏温度值(float 类型) |
* @return 对应的摄氏温度值(float 类型) |
||||
*/ |
*/ |
||||
public static float fahrenheitToCelsius(float f) { |
public static float fahrenheitToCelsius(float f) { |
||||
return (f - 32.0f) * 5.0f / 9.0f; |
return (f - 32.0f) * 5.0f / 9.0f; |
||||
} |
} |
||||
|
|
||||
/** |
/** |
||||
* 解析输入字符串,提取温度值和单位 |
* 解析输入字符串,提取温度值和单位 |
||||
* |
* |
||||
* @param input 用户输入字符串,格式如 "36.6 C" 或 "97 F" |
* @param input 用户输入字符串,格式如 "36.6 C" 或 "97 F" |
||||
* @return 包含温度值和单位的数组,[0] 为数值,[1] 为单位 |
* @return 包含温度值和单位的数组,[0] 为数值,[1] 为单位 |
||||
* @throws IllegalArgumentException 当输入格式不正确时抛出 |
* @throws IllegalArgumentException 当输入格式不正确时抛出 |
||||
*/ |
*/ |
||||
public static float[] parseInput(String input) throws IllegalArgumentException { |
public static float[] parseInput(String input) throws IllegalArgumentException { |
||||
if (input == null || input.trim().isEmpty()) { |
if (input == null || input.trim().isEmpty()) { |
||||
throw new IllegalArgumentException("输入为空"); |
throw new IllegalArgumentException("输入为空"); |
||||
} |
} |
||||
|
|
||||
String[] parts = input.trim().split("\\s+"); |
String[] parts = input.trim().split("\\s+"); |
||||
|
|
||||
if (parts.length < 1) { |
if (parts.length < 1) { |
||||
throw new IllegalArgumentException("输入格式错误,缺少温度值"); |
throw new IllegalArgumentException("输入格式错误,缺少温度值"); |
||||
} |
} |
||||
|
|
||||
float value; |
float value; |
||||
try { |
try { |
||||
value = Float.parseFloat(parts[0]); |
value = Float.parseFloat(parts[0]); |
||||
} catch (NumberFormatException e) { |
} catch (NumberFormatException e) { |
||||
throw new IllegalArgumentException("温度值必须是数字:" + parts[0]); |
throw new IllegalArgumentException("温度值必须是数字:" + parts[0]); |
||||
} |
} |
||||
|
|
||||
// 默认单位为摄氏度
|
// 默认单位为摄氏度
|
||||
String unit = "C"; |
String unit = "C"; |
||||
if (parts.length > 1) { |
if (parts.length > 1) { |
||||
unit = parts[1].toUpperCase(); |
unit = parts[1].toUpperCase(); |
||||
} |
} |
||||
|
|
||||
// 验证单位是否合法
|
// 验证单位是否合法
|
||||
if (!unit.startsWith("C") && !unit.startsWith("F")) { |
if (!unit.startsWith("C") && !unit.startsWith("F")) { |
||||
throw new IllegalArgumentException("未知单位 '" + unit + "',请使用 C 或 F"); |
throw new IllegalArgumentException("未知单位 '" + unit + "',请使用 C 或 F"); |
||||
} |
} |
||||
|
|
||||
return new float[]{value, unit.equals("F") ? 1.0f : 0.0f}; |
return new float[]{value, unit.equals("F") ? 1.0f : 0.0f}; |
||||
} |
} |
||||
|
|
||||
/** |
/** |
||||
* 执行温度转换并返回结果字符串 |
* 执行温度转换并返回结果字符串 |
||||
* |
* |
||||
* @param value 温度数值 |
* @param value 温度数值 |
||||
* @param isFahrenheit true 表示华氏度,false 表示摄氏度 |
* @param isFahrenheit true 表示华氏度,false 表示摄氏度 |
||||
* @return 格式化后的转换结果字符串 |
* @return 格式化后的转换结果字符串 |
||||
*/ |
*/ |
||||
public static String convertAndFormat(float value, boolean isFahrenheit) { |
public static String convertAndFormat(float value, boolean isFahrenheit) { |
||||
if (isFahrenheit) { |
if (isFahrenheit) { |
||||
// 从华氏度转换为摄氏度
|
// 从华氏度转换为摄氏度
|
||||
float celsius = fahrenheitToCelsius(value); |
float celsius = fahrenheitToCelsius(value); |
||||
return String.format("%.2f °F = %.2f °C", value, celsius); |
return String.format("%.2f °F = %.2f °C", value, celsius); |
||||
} else { |
} else { |
||||
// 从摄氏度转换为华氏度
|
// 从摄氏度转换为华氏度
|
||||
float fahrenheit = celsiusToFahrenheit(value); |
float fahrenheit = celsiusToFahrenheit(value); |
||||
return String.format("%.2f °C = %.2f °F", value, fahrenheit); |
return String.format("%.2f °C = %.2f °F", value, fahrenheit); |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
/** |
/** |
||||
* 交互式模式:从标准输入读取用户输入并转换 |
* 交互式模式:从标准输入读取用户输入并转换 |
||||
*/ |
*/ |
||||
public static void interactiveMode() { |
public static void interactiveMode() { |
||||
Scanner scanner = new Scanner(System.in); |
Scanner scanner = new Scanner(System.in); |
||||
|
|
||||
System.out.print("请输入要转换的温度与单位(例如 36.6 C 或 97 F):"); |
System.out.print("请输入要转换的温度与单位(例如 36.6 C 或 97 F):"); |
||||
String input = scanner.nextLine().trim(); |
String input = scanner.nextLine().trim(); |
||||
|
|
||||
if (input.isEmpty()) { |
if (input.isEmpty()) { |
||||
System.out.println("输入为空,程序退出。"); |
System.out.println("输入为空,程序退出。"); |
||||
scanner.close(); |
scanner.close(); |
||||
return; |
return; |
||||
} |
} |
||||
|
|
||||
try { |
try { |
||||
float[] parsed = parseInput(input); |
float[] parsed = parseInput(input); |
||||
float value = parsed[0]; |
float value = parsed[0]; |
||||
boolean isFahrenheit = (parsed[1] == 1.0f); |
boolean isFahrenheit = (parsed[1] == 1.0f); |
||||
|
|
||||
String result = convertAndFormat(value, isFahrenheit); |
String result = convertAndFormat(value, isFahrenheit); |
||||
System.out.println(result); |
System.out.println(result); |
||||
|
|
||||
} catch (IllegalArgumentException e) { |
} catch (IllegalArgumentException e) { |
||||
System.out.println("输入解析失败:" + e.getMessage()); |
System.out.println("输入解析失败:" + e.getMessage()); |
||||
System.out.println("请按示例输入数值与单位,例如:36.6 C"); |
System.out.println("请按示例输入数值与单位,例如:36.6 C"); |
||||
} finally { |
} finally { |
||||
scanner.close(); |
scanner.close(); |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
/** |
/** |
||||
* 命令行参数模式:直接从命令行参数获取温度值并转换 |
* 命令行参数模式:直接从命令行参数获取温度值并转换 |
||||
* |
* |
||||
* @param args 命令行参数,格式:[温度值] [单位] |
* @param args 命令行参数,格式:[温度值] [单位] |
||||
* 例如:java TemperatureConverter 36.6 C |
* 例如:java TemperatureConverter 36.6 C |
||||
*/ |
*/ |
||||
public static void commandLineMode(String[] args) { |
public static void commandLineMode(String[] args) { |
||||
if (args.length < 1) { |
if (args.length < 1) { |
||||
System.out.println("用法:java TemperatureConverter <温度值> [单位]"); |
System.out.println("用法:java TemperatureConverter <温度值> [单位]"); |
||||
System.out.println("示例:java TemperatureConverter 36.6 C"); |
System.out.println("示例:java TemperatureConverter 36.6 C"); |
||||
System.out.println(" java TemperatureConverter 97 F"); |
System.out.println(" java TemperatureConverter 97 F"); |
||||
return; |
return; |
||||
} |
} |
||||
|
|
||||
try { |
try { |
||||
float value = Float.parseFloat(args[0]); |
float value = Float.parseFloat(args[0]); |
||||
String unit = (args.length > 1) ? args[1].toUpperCase() : "C"; |
String unit = (args.length > 1) ? args[1].toUpperCase() : "C"; |
||||
|
|
||||
// 验证单位
|
// 验证单位
|
||||
if (!unit.startsWith("C") && !unit.startsWith("F")) { |
if (!unit.startsWith("C") && !unit.startsWith("F")) { |
||||
throw new IllegalArgumentException("未知单位 '" + unit + "',请使用 C 或 F"); |
throw new IllegalArgumentException("未知单位 '" + unit + "',请使用 C 或 F"); |
||||
} |
} |
||||
|
|
||||
boolean isFahrenheit = unit.startsWith("F"); |
boolean isFahrenheit = unit.startsWith("F"); |
||||
String result = convertAndFormat(value, isFahrenheit); |
String result = convertAndFormat(value, isFahrenheit); |
||||
System.out.println(result); |
System.out.println(result); |
||||
|
|
||||
} catch (NumberFormatException e) { |
} catch (NumberFormatException e) { |
||||
System.out.println("错误:温度值必须是数字,收到:" + args[0]); |
System.out.println("错误:温度值必须是数字,收到:" + args[0]); |
||||
} catch (IllegalArgumentException e) { |
} catch (IllegalArgumentException e) { |
||||
System.out.println("错误:" + e.getMessage()); |
System.out.println("错误:" + e.getMessage()); |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
/** |
/** |
||||
* 批量转换模式:从文件读取多行温度数据并转换 |
* 批量转换模式:从文件读取多行温度数据并转换 |
||||
* |
* |
||||
* @param lines 包含多行温度数据的字符串数组 |
* @param lines 包含多行温度数据的字符串数组 |
||||
*/ |
*/ |
||||
public static void batchConvertMode(String[] lines) { |
public static void batchConvertMode(String[] lines) { |
||||
if (lines == null || lines.length == 0) { |
if (lines == null || lines.length == 0) { |
||||
System.out.println("没有数据需要转换"); |
System.out.println("没有数据需要转换"); |
||||
return; |
return; |
||||
} |
} |
||||
|
|
||||
System.out.println("=== 批量转换开始 ==="); |
System.out.println("=== 批量转换开始 ==="); |
||||
int successCount = 0; |
int successCount = 0; |
||||
int failCount = 0; |
int failCount = 0; |
||||
|
|
||||
for (int i = 0; i < lines.length; i++) { |
for (int i = 0; i < lines.length; i++) { |
||||
String line = lines[i].trim(); |
String line = lines[i].trim(); |
||||
if (line.isEmpty()) { |
if (line.isEmpty()) { |
||||
continue; |
continue; |
||||
} |
} |
||||
|
|
||||
System.out.printf("第 %d 行:", i + 1); |
System.out.printf("第 %d 行:", i + 1); |
||||
try { |
try { |
||||
float[] parsed = parseInput(line); |
float[] parsed = parseInput(line); |
||||
float value = parsed[0]; |
float value = parsed[0]; |
||||
boolean isFahrenheit = (parsed[1] == 1.0f); |
boolean isFahrenheit = (parsed[1] == 1.0f); |
||||
|
|
||||
String result = convertAndFormat(value, isFahrenheit); |
String result = convertAndFormat(value, isFahrenheit); |
||||
System.out.println(result); |
System.out.println(result); |
||||
successCount++; |
successCount++; |
||||
|
|
||||
} catch (IllegalArgumentException e) { |
} catch (IllegalArgumentException e) { |
||||
System.out.println("失败 - " + e.getMessage()); |
System.out.println("失败 - " + e.getMessage()); |
||||
failCount++; |
failCount++; |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
System.out.println("=== 批量转换结束 ==="); |
System.out.println("=== 批量转换结束 ==="); |
||||
System.out.printf("成功:%d 条,失败:%d 条%n", successCount, failCount); |
System.out.printf("成功:%d 条,失败:%d 条%n", successCount, failCount); |
||||
} |
} |
||||
|
|
||||
/** |
/** |
||||
* 程序主入口 |
* 程序主入口 |
||||
* |
* |
||||
* 支持三种运行模式: |
* 支持三种运行模式: |
||||
* 1. 无参数:进入交互式模式 |
* 1. 无参数:进入交互式模式 |
||||
* 2. 有命令行参数:进入命令行参数模式 |
* 2. 有命令行参数:进入命令行参数模式 |
||||
* 3. 特殊参数 --batch:进入批量转换模式(从标准输入读取多行) |
* 3. 特殊参数 --batch:进入批量转换模式(从标准输入读取多行) |
||||
* |
* |
||||
* @param args 命令行参数 |
* @param args 命令行参数 |
||||
*/ |
*/ |
||||
public static void main(String[] args) { |
public static void main(String[] args) { |
||||
// 检查是否为批量转换模式
|
// 检查是否为批量转换模式
|
||||
if (args.length > 0 && "--batch".equals(args[0])) { |
if (args.length > 0 && "--batch".equals(args[0])) { |
||||
System.out.println("进入批量转换模式,请输入多行温度数据(每行格式:数值 单位),输入空行结束:"); |
System.out.println("进入批量转换模式,请输入多行温度数据(每行格式:数值 单位),输入空行结束:"); |
||||
Scanner scanner = new Scanner(System.in); |
Scanner scanner = new Scanner(System.in); |
||||
java.util.List<String> lines = new java.util.ArrayList<>(); |
java.util.List<String> lines = new java.util.ArrayList<>(); |
||||
|
|
||||
while (true) { |
while (true) { |
||||
String line = scanner.nextLine().trim(); |
String line = scanner.nextLine().trim(); |
||||
if (line.isEmpty()) { |
if (line.isEmpty()) { |
||||
break; |
break; |
||||
} |
} |
||||
lines.add(line); |
lines.add(line); |
||||
} |
} |
||||
|
|
||||
scanner.close(); |
scanner.close(); |
||||
batchConvertMode(lines.toArray(new String[0])); |
batchConvertMode(lines.toArray(new String[0])); |
||||
return; |
return; |
||||
} |
} |
||||
|
|
||||
// 根据是否有命令行参数选择模式
|
// 根据是否有命令行参数选择模式
|
||||
if (args.length > 0) { |
if (args.length > 0) { |
||||
// 命令行参数模式
|
// 命令行参数模式
|
||||
commandLineMode(args); |
commandLineMode(args); |
||||
} else { |
} else { |
||||
// 交互式模式
|
// 交互式模式
|
||||
interactiveMode(); |
interactiveMode(); |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
Loading…
Reference in new issue