Метод не работает со всеми элементами массива

ОБНОВЛЕНО

Мне нужно руководство. Цель состоит в том, чтобы отобразить преобразование температуры. Ввод осуществляется в командной строке, состоящей из символа, либо 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

Вы вызываете свои функции преобразования с помощью i. Неужто это должен быть temperature[i]?

Nick 17.07.2018 09:46

args [0] .equals ("c") && args [0] .equals ("f"): всегда будет ложным. Ничто не может быть равным «c» и «f». И вы игнорируете логическое значение, возвращаемое этим методом, тем самым скрывая ошибку.

JB Nizet 17.07.2018 09:48

Думаю проблема в args[0].equals("c") && args[0].equals("f"). Строка никогда не будет равна c AND до f, вы должны изменить ее на OR. И вы не оцениваете свой возврат getTemps, поэтому вы не знаете, проанализировали ли вы свои значения. После исправления вы получите проблему с синтаксическим анализом первого ввода («c» или «f») до целого числа. Вы должны начать с индекса 1.

Stefan Warminski 17.07.2018 09:49

Спасибо, что указали на логические ошибки. Я ценю его!

user8266781 17.07.2018 10:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Кажется, в вашем коде есть несколько логических ошибок:

В вашем операторе switch вы не вызываете методы celsius() или fahrenheit() с числами, переданными в качестве аргументов, а с индексами цикла (celsius(i)).

Вы всегда переводите 1, 2, 3 ... цельсия в градусы Фаренгейта или наоборот. Используйте входные данные, проанализированные getTemps в массиве temperature[], а затем передайте правильный элемент из этого массива в метод преобразования celsius() или fahrenheit().

Также условия в вашем методе getTemps неверны. Вы, вероятно, хотели использовать оператор || вместо &&, потому что, конечно, строка не может одновременно равняться «c» и «f».

Более того, индекс в цикле, который анализирует целые числа, должен начинаться не с 0, а с 1, поскольку первый элемент - это строка «c» или «f», а не int! Если вы попытаетесь преобразовать нецелую строку в целое число, вы, вероятно, получите NumberFormatException, и ваша программа завершится.

Передавать не весь массив, а конкретный элемент в этом массиве, то есть temperature[i].

am9417 17.07.2018 09:53

Вот твоя проблема: if (! (args[0].equals("c") && args[0].equals("f")) )

Условие никогда не может быть истинным, потому что буква никогда не может быть одновременно "c" и "f". Вместо || должен быть &&.

Из-за этой проблемы код всегда помещается в блок if и никогда не помещает целые числа в массив temperature. Java всегда инициализирует числовые переменные как 0 по умолчанию, поэтому какое бы число вы ни вводили, программа всегда преобразует 0 F в C или наоборот.

Спасибо! Я изменил его, и он до сих пор вызывает у меня головные боли.

user8266781 17.07.2018 09:51

Да, из-за этого метода Фаренгейта и Цельсия значение параметра получает 0.

Germa Vinsmoke 17.07.2018 09:53

@mchlvncntry Что за "головные боли"?

Sufian Latif 17.07.2018 09:56

Спасибо! Я забыл, что args [0] в этом случае по-прежнему является строкой ... Мне просто нужно выяснить, какой цикл for мне нужно отредактировать.

user8266781 17.07.2018 09:58
Ответ принят как подходящий

Кажется, вы слишком усложняете. Учитывая в вашем текущем примере с 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 я следую просьбам о двух методах преобразования градусов Цельсия в Фаренгейт и наоборот.

user8266781 17.07.2018 10:02

Оператор switch - это, по сути, if и else-if, считается ли это?

MajikalExplosions 17.07.2018 10:13

@mchlvncntry Смотрите обновление, теперь это работает для вас? Я только что добавил 2 функции преобразования

Lino 17.07.2018 10:42

«Мне не нужны настоящие строчки кода в качестве ответов»;)

am9417 18.07.2018 10:26

@ am9417 сложнее написать текст, объясняющий все, чем просто использовать фрагменты кода, чтобы подчеркнуть то, что вы имеете в виду;)

Lino 18.07.2018 10:29

Конечно. Но я считаю, что лучше подчеркнуть существующие ошибки, которые OP, возможно, не обнаружил, и то, как их исправить, вместо того, чтобы переписывать ответ, который стирает ошибки. Хотя переписывание программы здесь определенно более разумный выбор, потому что исходное решение слишком сложное.

am9417 18.07.2018 10:38

@ am9417 ну, уже существует два ответа, в которых говорится о проблемах. Добавление третьего просто не имело бы смысла

Lino 18.07.2018 10:41

Другие вопросы по теме