ОБНОВЛЕНО
Мне нужно руководство. Цель состоит в том, чтобы отобразить преобразование температуры. Ввод осуществляется в командной строке, состоящей из символа, либо 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
args [0] .equals ("c") && args [0] .equals ("f"): всегда будет ложным. Ничто не может быть равным «c» и «f». И вы игнорируете логическое значение, возвращаемое этим методом, тем самым скрывая ошибку.
Думаю проблема в args[0].equals("c") && args[0].equals("f"). Строка никогда не будет равна c AND до f, вы должны изменить ее на OR. И вы не оцениваете свой возврат getTemps, поэтому вы не знаете, проанализировали ли вы свои значения. После исправления вы получите проблему с синтаксическим анализом первого ввода («c» или «f») до целого числа. Вы должны начать с индекса 1.
Спасибо, что указали на логические ошибки. Я ценю его!




Кажется, в вашем коде есть несколько логических ошибок:
В вашем операторе switch вы не вызываете методы celsius() или fahrenheit() с числами, переданными в качестве аргументов, а с индексами цикла (celsius(i)).
Вы всегда переводите 1, 2, 3 ... цельсия в градусы Фаренгейта или наоборот. Используйте входные данные, проанализированные getTemps в массиве temperature[], а затем передайте правильный элемент из этого массива в метод преобразования celsius() или fahrenheit().
Также условия в вашем методе getTemps неверны. Вы, вероятно, хотели использовать оператор || вместо &&, потому что, конечно, строка не может одновременно равняться «c» и «f».
Более того, индекс в цикле, который анализирует целые числа, должен начинаться не с 0, а с 1, поскольку первый элемент - это строка «c» или «f», а не int! Если вы попытаетесь преобразовать нецелую строку в целое число, вы, вероятно, получите NumberFormatException, и ваша программа завершится.
Передавать не весь массив, а конкретный элемент в этом массиве, то есть temperature[i].
Вот твоя проблема: if (! (args[0].equals("c") && args[0].equals("f")) )
Условие никогда не может быть истинным, потому что буква никогда не может быть одновременно "c" и "f". Вместо || должен быть &&.
Из-за этой проблемы код всегда помещается в блок if и никогда не помещает целые числа в массив temperature. Java всегда инициализирует числовые переменные как 0 по умолчанию, поэтому какое бы число вы ни вводили, программа всегда преобразует 0 F в C или наоборот.
Спасибо! Я изменил его, и он до сих пор вызывает у меня головные боли.
Да, из-за этого метода Фаренгейта и Цельсия значение параметра получает 0.
@mchlvncntry Что за "головные боли"?
Спасибо! Я забыл, что args [0] в этом случае по-прежнему является строкой ... Мне просто нужно выяснить, какой цикл for мне нужно отредактировать.
Кажется, вы слишком усложняете. Учитывая в вашем текущем примере с 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.
Спасибо! Я ценю вашу помощь. Но в этом онлайн-руководстве по java я следую просьбам о двух методах преобразования градусов Цельсия в Фаренгейт и наоборот.
Оператор switch - это, по сути, if и else-if, считается ли это?
@mchlvncntry Смотрите обновление, теперь это работает для вас? Я только что добавил 2 функции преобразования
«Мне не нужны настоящие строчки кода в качестве ответов»;)
@ am9417 сложнее написать текст, объясняющий все, чем просто использовать фрагменты кода, чтобы подчеркнуть то, что вы имеете в виду;)
Конечно. Но я считаю, что лучше подчеркнуть существующие ошибки, которые OP, возможно, не обнаружил, и то, как их исправить, вместо того, чтобы переписывать ответ, который стирает ошибки. Хотя переписывание программы здесь определенно более разумный выбор, потому что исходное решение слишком сложное.
@ am9417 ну, уже существует два ответа, в которых говорится о проблемах. Добавление третьего просто не имело бы смысла
Вы вызываете свои функции преобразования с помощью
i. Неужто это должен бытьtemperature[i]?