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.
134 lines
4.4 KiB
134 lines
4.4 KiB
import java.io.BufferedReader;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
import java.util.Scanner;
|
|
|
|
/**
|
|
* 温度转换器示例程序(Java) - 增强版
|
|
* 支持摄氏度(C) ↔ 华氏度(F) 互转
|
|
* 支持三种使用方式:
|
|
* 1. 交互模式(不带参数)
|
|
* 2. 单次命令行参数模式:java TemperatureConverter 36.6 C
|
|
* 3. 批量文件模式:java TemperatureConverter input.txt
|
|
*/
|
|
public class TemperatureConverter {
|
|
|
|
/**
|
|
* 将摄氏度转换为华氏度
|
|
* 公式:F = C × 9/5 + 32
|
|
*
|
|
* @param c 摄氏温度
|
|
* @return 华氏温度
|
|
*/
|
|
public static float celsiusToFahrenheit(float c) {
|
|
return c * 9.0f / 5.0f + 32.0f;
|
|
}
|
|
|
|
/**
|
|
* 将华氏度转换为摄氏度
|
|
* 公式:C = (F - 32) × 5/9
|
|
*
|
|
* @param f 华氏温度
|
|
* @return 摄氏温度
|
|
*/
|
|
public static float fahrenheitToCelsius(float f) {
|
|
return (f - 32.0f) * 5.0f / 9.0f;
|
|
}
|
|
|
|
/**
|
|
* 解析单行温度字符串并返回转换结果(字符串形式)
|
|
*
|
|
* @param line 一行输入,例如 "36.6 C" 或 "98.6" 或 "99 F"
|
|
* @return 转换结果字符串,或错误信息
|
|
*/
|
|
public static String convertLine(String line) {
|
|
if (line == null || line.trim().isEmpty()) {
|
|
return null;
|
|
}
|
|
|
|
String[] parts = line.trim().split("\\s+");
|
|
float value;
|
|
String unit = "C"; // 默认摄氏
|
|
|
|
try {
|
|
value = Float.parseFloat(parts[0]);
|
|
if (parts.length > 1) {
|
|
unit = parts[1].trim().toUpperCase();
|
|
}
|
|
} catch (NumberFormatException e) {
|
|
return "格式错误: " + line;
|
|
}
|
|
|
|
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 "未知单位: " + line;
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
// 1. 命令行单次转换模式
|
|
if (args.length == 2) {
|
|
String input = args[0] + " " + args[1];
|
|
String result = convertLine(input);
|
|
if (result != null) {
|
|
System.out.println(result);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 2. 批量文件模式
|
|
if (args.length == 1) {
|
|
String filename = args[0];
|
|
System.out.println("正在处理文件: " + filename);
|
|
System.out.println("----------------------------------------");
|
|
|
|
try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
|
|
String line;
|
|
int lineNum = 0;
|
|
while ((line = br.readLine()) != null) {
|
|
lineNum++;
|
|
String result = convertLine(line);
|
|
if (result != null) {
|
|
System.out.printf("第 %2d 行: %s%n", lineNum, result);
|
|
}
|
|
}
|
|
System.out.println("----------------------------------------");
|
|
System.out.println("处理完成,共读取 " + lineNum + " 行");
|
|
} catch (IOException e) {
|
|
System.err.println("无法读取文件: " + filename);
|
|
System.err.println(e.getMessage());
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 3. 交互模式(无参数)
|
|
Scanner scanner = new Scanner(System.in);
|
|
System.out.println("温度转换器(支持 C / F)");
|
|
System.out.println("输入格式示例:36.6 C 或 98.6 F 或 23.5(默认C)");
|
|
System.out.println("输入空行或 Ctrl+C 退出\n");
|
|
|
|
while (true) {
|
|
System.out.print("> ");
|
|
String line = scanner.nextLine().trim();
|
|
|
|
if (line.isEmpty()) {
|
|
System.out.println("再见!");
|
|
break;
|
|
}
|
|
|
|
String result = convertLine(line);
|
|
if (result != null) {
|
|
System.out.println(result);
|
|
} else {
|
|
System.out.println("(已跳过空行)");
|
|
}
|
|
}
|
|
|
|
scanner.close();
|
|
}
|
|
}
|