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.
142 lines
6.5 KiB
142 lines
6.5 KiB
import java.io.File;
|
|
import java.util.Scanner;
|
|
|
|
|
|
public class TemperatureConverter {
|
|
|
|
/*
|
|
* 摄氏度转华氏度。
|
|
* 参数:c 表示摄氏温度
|
|
* 返回转换后的华氏温度
|
|
*/
|
|
public static double celsiusToFahrenheit(double c) {
|
|
return c * 9.0 / 5.0 + 32.0;
|
|
}
|
|
|
|
/*
|
|
* 华氏度转摄氏度。
|
|
* 参数:f 表示华氏温度
|
|
* 返回转换后的摄氏温度
|
|
*/
|
|
public static double fahrenheitToCelsius(double f) {
|
|
return (f - 32.0) * 5.0 / 9.0;
|
|
}
|
|
|
|
/*
|
|
* 程序入口。
|
|
* 参数:args 为命令行参数,用于选择运行模式:
|
|
* 1) 无参数:交互式输入
|
|
* 2) 两个参数:命令行模式(数值 + 单位)
|
|
* 3) --batch 文件名:批量模式
|
|
*/
|
|
public static void main(String[] args) {
|
|
// 无参数:交互式(从控制台读一行:数值 单位)
|
|
if (args.length == 0) {
|
|
// 创建控制台输入对象
|
|
Scanner sc = new Scanner(System.in);
|
|
System.out.print("请输入要转换的温度与单位(例如 36.6 C 或 97 F):");
|
|
String input = sc.nextLine().trim();
|
|
if (input.isEmpty()) {
|
|
System.out.println("输入为空,程序退出。");
|
|
sc.close();
|
|
return;
|
|
}
|
|
// 按空格切分:parts[0] 为数值,parts[1]
|
|
String[] parts = input.split("\\s+");
|
|
try {
|
|
// 解析温度数值
|
|
double value = Double.parseDouble(parts[0]);
|
|
// 没写单位时默认按 C 处理
|
|
String unit = parts.length > 1 ? parts[1].toUpperCase() : "C";
|
|
if (unit.startsWith("C")) {
|
|
double f = celsiusToFahrenheit(value);
|
|
// 左边显示用户原始输入,右边保留两位小数
|
|
System.out.printf("%s °C = %.2f °F%n", parts[0], f);
|
|
} else if (unit.startsWith("F")) {
|
|
double c = fahrenheitToCelsius(value);
|
|
// 左边显示用户原始输入,右边保留两位小数
|
|
System.out.printf("%s °F = %.2f °C%n", parts[0], c);
|
|
} else {
|
|
// 单位不认识就提示
|
|
System.out.println("未知单位,请使用 C 或 F。");
|
|
}
|
|
} catch (Exception e) {
|
|
// 输入不是“数字 + 单位”的格式,或数字解析失败,就给出提示
|
|
System.out.println("输入解析失败,请按示例输入数值与单位,例如:36.6 C");
|
|
}
|
|
sc.close();
|
|
return;
|
|
}
|
|
|
|
// --batch 文件名:批量转换(从文件逐行读取,每行:数值 单位)
|
|
if (args.length == 2 && args[0].equals("--batch")) {
|
|
try {
|
|
// 打开文件并逐行读取
|
|
Scanner fileSc = new Scanner(new File(args[1]));
|
|
int lineNum = 0;
|
|
while (fileSc.hasNextLine()) {
|
|
lineNum++;
|
|
String line = fileSc.nextLine().trim();
|
|
// 跳过空行、注释行
|
|
if (line.isEmpty() || line.startsWith("#"))
|
|
continue;
|
|
String[] p = line.split("\\s+");
|
|
try {
|
|
// 解析每行的温度数值与单位
|
|
double val = Double.parseDouble(p[0]);
|
|
String u = p.length > 1 ? p[1].toUpperCase() : "C";
|
|
if (u.startsWith("C")) {
|
|
// 左边显示文件中的原始数值文本,右边保留两位小数
|
|
System.out.printf("%s °C = %.2f °F%n", p[0], celsiusToFahrenheit(val));
|
|
} else if (u.startsWith("F")) {
|
|
// 左边显示文件中的原始数值文本,右边保留两位小数
|
|
System.out.printf("%s °F = %.2f °C%n", p[0], fahrenheitToCelsius(val));
|
|
} else {
|
|
// 单位不对:提示并跳过该行
|
|
System.out.println("第" + lineNum + "行单位错误,已跳过");
|
|
}
|
|
} catch (Exception e) {
|
|
// 某一行格式不对:提示并跳过,不影响后续行
|
|
System.out.println("第" + lineNum + "行格式错误,已跳过:" + line);
|
|
}
|
|
}
|
|
// 文件读取完成后关闭 Scanner
|
|
fileSc.close();
|
|
} catch (Exception e) {
|
|
// 文件打不开/找不到等情况:提示原因
|
|
System.out.println("读取文件失败:" + e.getMessage());
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 两个参数:命令行模式(直接从 args 读:数值 + 单位)
|
|
if (args.length == 2) {
|
|
try {
|
|
// 解析第一个参数为温度数值
|
|
double value = Double.parseDouble(args[0]);
|
|
// 第二个参数为单位
|
|
String unit = args[1].toUpperCase();
|
|
if (unit.startsWith("C")) {
|
|
// 左边显示命令行原始参数,右边保留两位小数
|
|
System.out.printf("%s °C = %.2f °F%n", args[0], celsiusToFahrenheit(value));
|
|
} else if (unit.startsWith("F")) {
|
|
// 左边显示命令行原始参数,右边保留两位小数
|
|
System.out.printf("%s °F = %.2f °C%n", args[0], fahrenheitToCelsius(value));
|
|
} else {
|
|
// 单位不认识就提示
|
|
System.out.println("未知单位,请使用 C 或 F。");
|
|
}
|
|
} catch (Exception e) {
|
|
// 参数解析失败:给出用法提示
|
|
System.out.println("参数格式错误,用法:java TemperatureConverter 36.6 C");
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 参数不对:输出帮助信息
|
|
System.out.println("用法:");
|
|
System.out.println(" 交互式:java TemperatureConverter");
|
|
System.out.println(" 命令行:java TemperatureConverter 36.6 C");
|
|
System.out.println(" 批量: java TemperatureConverter --batch temperatures.txt");
|
|
}
|
|
}
|
|
|