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.9 KiB
136 lines
4.9 KiB
import java.io.BufferedReader;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
import java.util.Scanner;
|
|
|
|
/**
|
|
* 温度转换器(增强版)
|
|
* 支持:
|
|
* 1. 交互式输入(原有功能)
|
|
* 2. 命令行参数模式(java TemperatureConverter 36.6 C)
|
|
* 3. 批量文件转换(java TemperatureConverter -f input.txt)
|
|
*/
|
|
public class TemperatureConverter {
|
|
|
|
/**
|
|
* 将摄氏度转换为华氏度
|
|
* @param c 摄氏温度(浮点型)
|
|
* @return 对应的华氏温度(浮点型)
|
|
*/
|
|
public static double celsiusToFahrenheit(double c) {
|
|
return c * 9.0 / 5.0 + 32.0;
|
|
}
|
|
|
|
/**
|
|
* 将华氏度转换为摄氏度
|
|
* @param f 华氏温度(浮点型)
|
|
* @return 对应的摄氏温度(浮点型)
|
|
*/
|
|
public static double fahrenheitToCelsius(double f) {
|
|
return (f - 32.0) * 5.0 / 9.0;
|
|
}
|
|
|
|
/**
|
|
* 核心转换逻辑:解析单个温度字符串并输出结果
|
|
* @param input 温度字符串(格式:数值 单位,如 "36.6 C")
|
|
* @return 转换结果字符串(用于文件批量输出),解析失败返回null
|
|
*/
|
|
public static String convertTemperature(String input) {
|
|
String trimmedInput = input.trim();
|
|
if (trimmedInput.isEmpty()) {
|
|
return "输入为空,跳过转换";
|
|
}
|
|
|
|
String[] parts = trimmedInput.split("\\s+"); // 匹配任意空白符(空格/制表符等)
|
|
try {
|
|
double value = Double.parseDouble(parts[0]);
|
|
String unit = parts.length > 1 ? parts[1].toUpperCase() : "C";
|
|
|
|
if (unit.startsWith("C")) {
|
|
double fahrenheit = celsiusToFahrenheit(value);
|
|
String result = String.format("%.2f °C = %.2f °F", value, fahrenheit);
|
|
System.out.println(result);
|
|
return result;
|
|
} else if (unit.startsWith("F")) {
|
|
double celsius = fahrenheitToCelsius(value);
|
|
String result = String.format("%.2f °F = %.2f °C", value, celsius);
|
|
System.out.println(result);
|
|
return result;
|
|
} else {
|
|
String error = "未知单位,请使用 C 或 F:" + trimmedInput;
|
|
System.out.println(error);
|
|
return error;
|
|
}
|
|
} catch (Exception e) {
|
|
String error = "输入解析失败:" + trimmedInput + "(格式示例:36.6 C)";
|
|
System.out.println(error);
|
|
return error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 批量处理文件中的温度转换
|
|
* @param filePath 输入文件路径
|
|
*/
|
|
public static void processFile(String filePath) {
|
|
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
|
|
String line;
|
|
System.out.println("===== 批量文件转换结果 =====");
|
|
while ((line = br.readLine()) != null) {
|
|
convertTemperature(line); // 复用核心转换逻辑
|
|
}
|
|
System.out.println("===== 文件处理完成 =====");
|
|
} catch (IOException e) {
|
|
System.err.println("文件读取失败:" + e.getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 交互式输入模式(原有功能)
|
|
*/
|
|
public static void interactiveMode() {
|
|
Scanner scanner = new Scanner(System.in);
|
|
System.out.print("请输入要转换的温度与单位(例如 36.6 C 或 97 F):");
|
|
String input = scanner.nextLine();
|
|
convertTemperature(input); // 复用核心转换逻辑
|
|
scanner.close();
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
// 1. 命令行参数模式:优先处理参数
|
|
if (args.length > 0) {
|
|
// 批量文件模式:参数以 -f 开头
|
|
if (args[0].equalsIgnoreCase("-f") && args.length >= 2) {
|
|
processFile(args[1]);
|
|
}
|
|
// 单个温度转换:参数为 数值 单位
|
|
else if (args.length >= 2) {
|
|
String input = args[0] + " " + args[1];
|
|
convertTemperature(input);
|
|
}
|
|
// 参数不合法
|
|
else {
|
|
System.err.println("命令行参数格式错误!");
|
|
printUsage();
|
|
}
|
|
}
|
|
// 2. 无参数:进入交互式模式
|
|
else {
|
|
interactiveMode();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 打印程序使用说明
|
|
*/
|
|
private static void printUsage() {
|
|
System.out.println("\n===== 温度转换器使用说明 =====");
|
|
System.out.println("1. 交互式模式(无参数):");
|
|
System.out.println(" java TemperatureConverter");
|
|
System.out.println("2. 命令行单条转换:");
|
|
System.out.println(" java TemperatureConverter 36.6 C");
|
|
System.out.println("3. 批量文件转换:");
|
|
System.out.println(" java TemperatureConverter -f 温度文件路径.txt");
|
|
System.out.println("==============================");
|
|
}
|
|
}
|