已更新
我需要指导。目的是显示温度的转换。输入是在命令行中输入的,由一个字符组成,既可以是f(代表华氏度)也可以是c,其后是一系列整数(例如f 100 250 98),然后将它们存储在一个整数数组中。
输出应为“将整数转换为摄氏x y z”。我下面的内容无法正确转换整数(位于命令行args [1],args [2],...)。我输入了命令行参数“ f 1500”,显示的结果是“ 1整数转换为摄氏:-17.2”。 -17摄氏度是0华氏度,这显然是错误的。
我想要有关我做错事情的指导。我不需要实际的代码行作为答案本身,而只是将我引向正确的方向。
import java.util.Scanner;
public class Cel2Far
{
public static void main(String[] args)
{
int[] temperature = new int[args.length];
callAndDisplay(args,temperature);
} // main
private static void callAndDisplay(String[] args, int[] temperature)
{
getTemps(args,temperature);
switch(args[0]) {
case "f":
System.out.printf("%,d %s converted to Celsius: ",
(temperature.length-1),(temperature.length-1) > 1 ?
"temperatures" : "temperature");
for (int i = 1; i < temperature.length; i++) {
System.out.printf("%,.1f ", celsius(temperature[i]) );
}
break;
case "c":
System.out.printf("%,d %s converted to Fahrenheit: ",
(temperature.length-1),(temperature.length-1) > 1 ?
"temperatures" : "temperature");
for (int i = 1; i < temperature.length; i++) {
System.out.printf("%,.1f ", fahrenheit(temperature[i]) );
}
break;
}
System.out.println();
}
private static boolean getTemps(String[] args, int[] temperature)
{
boolean message = false;
if (! (args[0].equals("c") || args[0].equals("f")) ) {
message = false;
} else {
for (int i = 0; i < args.length; i++) {
temperature[i] = Integer.parseInt(args[i]);
message = true;
}
}
return message;
}
private static double celsius(int f)
{
double c = 5.0 / 9.0 * (f - 32.0);
return c;
}
private static double fahrenheit(int c)
{
double f = 9.0/5.0 * c + 32.0;
return f;
}
} // class
答案 0 :(得分:1)
您似乎使事情复杂化了。在当前示例中,有2个输入(第一个输入为c
/ f
格式,第二个为实际值),您可以使用以下功能:
private static double convert(String format, double temperature){
switch(format){
case "f":
return toCelsius(temperature);
case "c":
return toFahrenheit(temperature);
default:
throw new UnsupportedOperationException();
}
}
private static double toCelsius(double f){
return 5. / 9. * (f - 32.);
}
private static double toFahrenheit(double c){
return 9./5. * c + 32.;
}
然后从您的主要方法轻松调用它:
public static void main(String[] args){
System.out.println(convert(args[0], Double.parseDouble(args[1]));
}
如果您想一次支持多个输入,也可以轻松扩展此范围。具有1种格式和多种温度(f 20 53 63 74
):
public static void main(String[] args){
String format = args[0];
for(int i = 1; i < args.length; i++){
System.out.println(convert(args[0], Double.parseDouble(args[i]));
}
}
或采用交替转换(c 56 f 734 f 547 c 598
):
public static void main(String[] args){
for(int i = 0; i < args.length; i++){
System.out.println(convert(args[i], Double.parseDouble(args[i+1]));
}
}
当然,在所有这些解决方案中,您都必须确保将输入参数提供给程序。例如。通过检查args
数组的长度。
答案 1 :(得分:0)
您的代码中似乎存在一些逻辑错误:
在您的switch
语句中,您不是用传递的数字作为参数来调用celsius()
或fahrenheit()
方法,而是循环索引(celsius(i)
)。
您总是将1、2、3 ...摄氏度转换为华氏度,反之亦然。使用数组getTemps
中temperature[]
解析的输入,然后将正确的项目从该数组传递给转换的celsius()
或fahrenheit()
方法。
您的getTemps
方法中的条件也是错误的。您可能打算使用||
运算符而不是&&
,因为-当然-字符串不能同时等于“ c”和“ f”。
此外,解析整数的循环中的索引不应从0
开始,而应从1
开始,因为第一项是字符串“ c”或“ f”而不是int
!如果尝试将非整数字符串解析为整数,则可能会得到NumberFormatException
,并且程序将退出。
答案 2 :(得分:0)
这是您的问题:if (! (args[0].equals("c") && args[0].equals("f")) )
该条件永远不能为真,因为字母不能同时为“ c”和“ f”。应该是||
而不是&&
。
由于这个问题,代码总是进入if
块,并且永远不会将整数放入数组temperature
中。 Java始终默认将数字变量初始化为0
,因此,无论输入什么数字,程序总是将0 F转换为C,反之亦然。