You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.4 KiB

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.stream.Stream;
/**
* 温度转换器 - 支持摄氏度(C)与华氏度(F)之间互转
* 对应Python原版:TemperatureConverter.py
*
* 功能增强:
* 1. 交互模式:直接运行,提示用户输入
* 2. 命令行参数模式:java TemperatureConverter <数值> <单位>
* 3. 批量文件处理:java TemperatureConverter -f <文件名>
*
* @author 移植自Python示例
*/
public class TemperatureConverter {
/**
* 将摄氏度转换为华氏度。
*
* @param c 摄氏温度 (float)
* @return 对应的华氏温度 (float)
*/
public static float celsiusToFahrenheit(float c) {
return c * 9.0f / 5.0f + 32.0f;
}
/**
* 将华氏度转换为摄氏度。
*
* @param f 华氏温度 (float)
* @return 对应的摄氏温度 (float)
*/
public static float fahrenheitToCelsius(float f) {
return (f - 32.0f) * 5.0f / 9.0f;
}
/**
* 解析并执行单个温度转换(字符串输入)
* @param input 格式如 "36.6 C" 或 "97 F"
* @return 转换结果字符串,或错误信息
*/
public static String convertSingle(String input) {
if (input == null || input.trim().isEmpty()) {
return "输入为空,跳过。";
}
String[] parts = input.trim().split("\\s+");
try {
float value = Float.parseFloat(parts[0]);
String unit = (parts.length > 1) ? parts[1].toUpperCase() : "C";
if (unit.startsWith("C")) {
float f = celsiusToFahrenheit(value);
return String.format("%.2f °C = %.2f °F", value, f);
} else if (unit.startsWith("F")) {
float c = fahrenheitToCelsius(value);
return String.format("%.2f °F = %.2f °C", value, c);
} else {
return "未知单位,请使用 C 或 F。";
}
} catch (NumberFormatException e) {
return "数值解析失败,请确保第一项是数字。";
}
}
/**
* 交互模式:从标准输入读取一行并转换
*/
private static void interactiveMode() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要转换的温度与单位(例如 36.6 C 或 97 F):");
String line = scanner.nextLine();
String result = convertSingle(line);
System.out.println(result);
scanner.close();
}
/**
* 命令行参数模式:直接使用参数转换
* @param args 两个参数:数值 单位
*/
private static void argMode(String[] args) {
if (args.length < 1) {
System.out.println("错误:缺少参数。用法:java TemperatureConverter <数值> [单位]");
return;
}
// 将命令行参数拼接成标准输入格式
String input = String.join(" ", args);
String result = convertSingle(input);
System.out.println(result);
}
/**
* 批量文件模式:读取文件每行,进行转换并输出到控制台
* @param filename 文件名
*/
private static void batchMode(String filename) {
Path path = Paths.get(filename);
if (!Files.exists(path)) {
System.out.println("错误:文件 " + filename + " 不存在。");
return;
}
System.out.println("批量转换文件:" + filename);
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(line -> {
String result = convertSingle(line);
System.out.println("输入: " + line + " -> " + result);
});
} catch (IOException e) {
System.out.println("读取文件时出错: " + e.getMessage());
}
}
/**
* 主程序入口
* 支持三种运行模式:
* 1. 无参数:交互模式
* 2. -f <文件>:批量文件模式
* 3. 其他参数:命令行参数模式
*/
public static void main(String[] args) {
if (args.length == 0) {
// 无参数:交互模式(原Python main行为)
interactiveMode();
} else if (args.length >= 2 && args[0].equals("-f")) {
// -f 文件名:批量文件模式(加分项)
batchMode(args[1]);
} else {
// 其他:视为命令行参数模式(加分项)
argMode(args);
}
}
}