Мои методы Java работают некорректно и приводят к неправильной компиляции моей программы

#java

#java

Вопрос:

Я пишу программу, которая предложит пользователю ввести значение temp в виде целого числа, а затем предложит пользователю выбрать, в каком масштабе находится эта температура: в градусах Фаренгейта, Цельсия или Кельвина. Затем пользователю предлагается выбрать, в какую температуру они хотели бы преобразовать, из 3 вариантов масштаба, затем вычисляет преобразование и отображает конечную температуру. В настоящее время моя программа работает, но неправильно, и я смотрю на это уже пару дней, и я не уверен, почему она компилируется так, как есть. Я все еще новичок в кодировании, это назначение класса, над которым я работал, просто ища несколько советов.

package tempconverter; импорт java.util.*;

открытый класс TempConverter {

 public static void main(String[] args) 
{
    double temp1;
    double convertTo;
    double finalTemp;
    double currScale;
    char cont='E';
    char process='P';
    int scale1=0;
    int scale2=0;

    do
    {
        //input
        getTemp();
        scaleOne(scale1);
        toScale(scale2);

        //process


        System.out.print("Your final temp is: "  convert() toScale(scale2));

    }while(cont=='N');
}   
    private static double getTemp()
    {
         double temp;
         double currentTemp;
         Scanner userIn= new Scanner(System.in);
         System.out.print("Enter a temperature to convert ");
         while(!userIn.hasNextDouble())
         {
          System.out.println("That is not a valid temperature!");
          System.out.print("Re-enter a temperature: ");
          userIn.next();
         }
         temp=userIn.nextDouble();



         return temp;
    }

    private static String scaleOne(int userChoice)
    {

        Scanner userIn= new Scanner(System.in);



        System.out.print("What scale is your temp currently in?" 
                          "1: Fahrenheit"   
                          "2: Celsius"   
                          "3: Kelvin"   
                          "Please enter 1, 2, or 3: ");


        String scale="";

        switch(userChoice)
        {
            case 1:
            {scale= "Fahrenheit";
            break;}

            case 2:
            {scale="Celsius";
            break;}

            case 3:
            {scale="Kelvin";
            break;}

            default:
            {scale= "There was an error in your choice!";}
        }

        return scale;

    }



    private static String toScale(int userChoice)
    {

        Scanner userIn= new Scanner(System.in);



        System.out.print("What scale would you like to convert to?" 
                          "1: Fahrenheit"   
                          "2: Celsius"   
                          "3: Kelvin"   
                          "Please enter 1, 2, or 3: ");


        String scale2="";

        switch(userChoice)
        {
            case 1:
            {scale2= "Fahrenheit";
            break;}

            case 2:
            {scale2="Celsius";
            break;}

            case 3:
            {scale2="Kelvin";
            break;}

            default:
            {scale2= "There was an error in your choice!";}
        }

        return scale2;

    }



    public static double convert()
    {
        double farToKel;
        double farToCel;
        double celToKel;
        double celToFar;
        double kelToFar;
        double kelToCel;
        int scale1=0;
        double converts;

        if(scaleOne(scale1)=="Fahrenheit" amp;amp; toScale(scale1)=="Kelvin")        
        {
         converts=farToKel=(getTemp() 459.67)* 5/9;
        }

        else if(scaleOne(scale1)=="Fahrenheit" amp;amp; toScale(scale1)=="Celsius")
        {
         converts=farToCel=(getTemp()-32)*5/9;
        }

        else if(scaleOne(scale1)=="Celsius" amp;amp; toScale(scale1)=="Kelvin")
        {
         converts=celToKel=getTemp() 273.15;
        }

        else if(scaleOne(scale1)=="Celsius" amp;amp; toScale(scale1)=="Fahrenheit")
        {
         converts=celToFar=getTemp()*9/5 32;
        }

        else if(scaleOne(scale1)=="Kelvin" amp;amp; toScale(scale1)=="Fahrenheit")
        {
         converts=kelToFar=getTemp()*9/5-459.67;
        }

        else
        { 
         converts=kelToCel=getTemp()-276.15;
        }

        return converts;
    }








    }
  

И вот что он компилирует

выполнить: Введите температуру для преобразования 100 В каком масштабе в данный момент находится ваша температура?1: Фаренгейт2: Цельсии3: Кельвинпожалуйста, введите 1, 2 или 3: В какой масштаб вы хотели бы преобразовать?1: Fahrenheit2: Celsius 3: Kelvin Пожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент?1: Fahrenheit2: Celsius 3: Kelvin Пожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент? 1: Fahrenheit2: Celsius 3: Kelvin Пожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент?1: Fahrenheit2: Celsius 3: Kelvinпожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент?1: Fahrenheit2: Celsius 3: Kelvinпожалуйста, введите 1, 2 или 3: В каком масштабе находится ваша временная температура в данный момент?1: Fahrenheit2: Celsius 3:: Kelvin Пожалуйста, введите 1, 2 или 3: Введите температуру для преобразования 2 В какую шкалу вы хотели бы преобразовать?1: Фаренгейт2: Цельсии3: Кельвинпожалуйста, введите 1, 2 или 3: ваша конечная температура: -274.15В вашем выборе была ошибка!СБОРКА ВЫПОЛНЕНА УСПЕШНО (общее время: 33 секунды)

Похоже, что он не компилируется в правильном порядке или получает правильную информацию в правильном порядке и получает некоторую информацию снова и снова. Как только вы вводите числовое значение temp, оно запрашивает масштаб, но не только один раз, когда оно выводит его несколько раз, затем вы вводите свой выбор для первого масштаба, и он просто проходит весь путь до завершения без ввода вашего выбора для toScale.

Комментарии:

1. Что вы подразумеваете под неправильным?

2. Извините, я собираюсь отредактировать свой исходный пост, чтобы включить то, что он компилирует.

3. Ну, сначала вы очистили множество локальных переменных внутри метода main, даже не используя их.

4. Вы, очевидно, студент. (Я надеюсь, или, по крайней мере, не программист). Итак, я собираюсь сказать пару вещей, которые, надеюсь, помогут. Ваш дизайн излишне сложен, и пересмотр его поможет прояснить проблемы. В принципе, вам не нужны отдельные методы для сбора пользовательского ввода. Вам также нужно захватить только две части ввода. Это подсказка. Удачи в выполнении домашнего задания.

Ответ №1:

Смотрите Вставленные комментарии и исправления, внесенные в ваш код ниже.

 public class TempConverter {

    // variables that are needed in more than one method must be declared outside the methods
    // (static since the methods are static; not recommended, but let it be for now)
    static double temp1;
    static String scale1;
    static String scale2;

    public static void main(String[] args) {
        // get rid of unused variables
        char cont = 'E';

        do {
            // input
            // save all inputs to variables
            temp1 = getTemp();
            // Java parameters are pass by value, so to get a value out of the method, use the returned value
            // then you don’t need the parameter
            scale1 = scaleOne();
            scale2 = toScale();

            // process
            // don’t call toScale() again, or the user will be prompted again,
            // instead, use the value already stored in scale2
            System.out.print("Your final temp is: "   convert()   ' '   scale2);

            // you should set cont to something if you want the loop to repeat

        } while (cont == 'N');
    }

    private static double getTemp() {
        double temp;
        Scanner userIn = new Scanner(System.in);
        System.out.print("Enter a temperature to convert ");
        while (!userIn.hasNextDouble()) {
            System.out.println("That is not a valid temperature!");
            System.out.print("Re-enter a temperature: ");
            userIn.next();
        }
        temp = userIn.nextDouble();

        return temp;
    }

    private static String scaleOne() {

        Scanner userIn = new Scanner(System.in);

        // n is a line break for readability
        System.out.print("What scale is your temp currently in?" 
                  "n1: Fahrenheit" 
                  "n2: Celsius" 
                  "n3: Kelvin"
                  "nPlease enter 1, 2, or 3: ");

        // read a value from the user
        int userChoice = userIn.nextInt();

        String scale = "";

        switch (userChoice) {
        case 1: {
            scale = "Fahrenheit";
            break;
        }

        case 2: {
            scale = "Celsius";
            break;
        }

        case 3: {
            scale = "Kelvin";
            break;
        }

        default: {
            scale = "There was an error in your choice!";
        }
        }

        return scale;

    }

    private static String toScale() {

        Scanner userIn = new Scanner(System.in);

        System.out.print("What scale would you like to convert to?"   "1: Fahrenheit"   "2: Celsius"   "3: Kelvin"
                  "Please enter 1, 2, or 3: ");

        String scale2 = "";

        int userChoice = userIn.nextInt();

        // ideally should not accept the same scale as scale1 (from scale)
        switch (userChoice) {
        case 1: {
            scale2 = "Fahrenheit";
            break;
        }

        case 2: {
            scale2 = "Celsius";
            break;
        }

        case 3: {
            scale2 = "Kelvin";
            break;
        }

        default: {
            scale2 = "There was an error in your choice!";
        }
        }

        return scale2;

    }

    public static double convert() {
        // need only one variable for result
        double converts;

        // don’t call methods again, use variables
        // don’t use == for comparing strings, use .equals
        // typo: the second scale corrected to scale2
        if (scale1.equals("Fahrenheit") amp;amp; scale2.equals("Kelvin")) {
            // don’t call getTemp() again
            converts = (temp1   459.67) * 5 / 9;
        }

        else if (scale1.equals("Fahrenheit") amp;amp; scale2.equals("Celsius")) {
            converts = (temp1 - 32) * 5 / 9;
        }

        else if (scale1.equals("Celsius") amp;amp; scale2.equals("Kelvin")) {
            converts = temp1   273.15;
        }

        else if (scale1.equals("Celsius") amp;amp; scale2.equals("Fahrenheit")) {
            converts = temp1 * 9 / 5   32;
        }

        else if (scale1.equals("Kelvin") amp;amp; scale2.equals("Fahrenheit")) {
            converts = temp1 * 9 / 5 - 459.67;
        }

        else { // Kelvin to Celsius
            converts = temp1 - 276.15;
        }

        return converts;
    }

}
  

Я считаю, что это в основном работает сейчас.

Комментарии:

1. Мне нравится идея из нескольких других ответов передать scale1 и scale2 в качестве аргументов convert() вместо статических полей, я должен был сделать то же самое, вероятно, и с temp1.

Ответ №2:

 public static void main(String[] args)
{


    String scaleOne;
    String scaleTwo;

    System.out.println("What scale is your temp currently in?n" 
            "1: Fahrenheitn"  
            "2: Celsiusn"  
            "3: Kelvinn"  
            "Please enter 1, 2, or 3: n");

    scaleOne = getScale();

    System.out.println("What scale would you like to convert to?n" 
            "1: Fahrenheitn"  
            "2: Celsiusn"  
            "3: Kelvinn"  
            "Please enter 1, 2, or 3:n ");

    scaleTwo = getScale();
    System.out.print("Your final temp is: "  convert(scaleOne,scaleTwo));


}
private static double getTemp()
{
    double temp;
    Scanner userIn= new Scanner(System.in);
    System.out.print("Enter a temperature to convert ");
    while(!userIn.hasNextDouble())
    {
        System.out.println("That is not a valid temperature!");
        System.out.println("Re-enter a temperature: ");
        userIn.next();
    }
    temp=userIn.nextDouble();

    return temp;
}

private static String getScale()
{

    Scanner userIn= new Scanner(System.in);

    String scale="";

    switch(userIn.nextInt())
    {
        case 1:
            scale= "Fahrenheit";
            break;

        case 2:
            scale="Celsius";
            break;

        case 3:
            scale="Kelvin";
            break;

        default:
            scale= "There was an error in your choice!";
    }

    return scale;

}
  

Соответствующим образом измените функцию main, а также функции scaleone() и toScale() . В вашем коде много проблем, которые невозможно решить по отдельности. Не стесняйтесь запрашивать какие-либо разъяснения по ответу

Ответ №3:

Вы должны верить, что компилятор выполняет свою работу правильно. Ошибка заключается в вашей логике. Я предполагаю, что вы пытаетесь создать программу для преобразования температуры из одного из 3 форматов в другой формат.

  1. При вызове scaleOne(scale1); метода вы указали жестко закодированное значение 0 в качестве аргумента и никогда не меняли его внутри метода. в то же время вы пытаетесь получить ввод от пользователя. Для получения пользовательского ввода вам необходимо добавить int userChoice = userIn.nextInt(); внутри тела вашего метода. Это вернет значение sting, которое вам нужно сохранить в sacle1 переменной в вашем основном методе.

  2. Аналогично для toScale() метода вам нужно сделать его непараметризованным и принимать входные данные от пользователя внутри метода. Это снова вернет значение sting, которое вам нужно сохранить в sacle2 переменной в вашем основном методе.

  3. Теперь при вызове вашего метода convert вам нужно передать scale1 and scale2 в качестве аргументов. Я не понимаю, какова логика повторного вызова scaleOne() и toScale() методов в каждом случае, если условия. Это причина, по которой ваш код снова и снова запрашивает выбор типа температуры. Я удалил их с scale1 scale2 помощью переменных и в своем решении. Всегда помните, никогда не используйте == operator для String сравнения. Всегда используйте equals() equalsEgnoreCase() метод or класса string.

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

     public class TempConverter {
    public static void main(String[] args) 
{
    String scale1;
    String scale2;   
        //input
       scale1 =scaleOne();
       scale2 = toScale();
    //process
    System.out.print("Your final temp is: "  convert(scale1, scale2));
}   
    private static double getTemp()
    {
         double temp;
         Scanner userIn= new Scanner(System.in);
         System.out.print("Enter a temperature to convert ");
         while(!userIn.hasNextDouble())
         {
          System.out.println("That is not a valid temperature!");
          System.out.print("Re-enter a temperature: ");
          userIn.next();
         }
         temp=userIn.nextDouble();
         return temp;
    }

    private static String scaleOne()        {

        Scanner userIn= new Scanner(System.in);
        System.out.print("What scale is your temp currently in?" 
                          "1: Fahrenheit"   
                          "2: Celsius"   
                          "3: Kelvin"   
                          "Please enter 1, 2, or 3: ");
       int userChoice = userIn.nextInt();
        String scale="";
        switch(userChoice)
        {
            case 1:
            {scale= "Fahrenheit";
            break;}
            case 2:
            {scale="Celsius";
            break;}
            case 3:
            {scale="Kelvin";
            break;}
            default:
            {scale= "There was an error in your choice!";}
        }
        return scale;
    }



    private static String toScale(){
        Scanner userIn= new Scanner(System.in);
        System.out.print("What scale would you like to convert to?" 
                          "1: Fahrenheit"   
                          "2: Celsius"   
                          "3: Kelvin"   
                          "Please enter 1, 2, or 3: ");
        String scale2="";
        int userChoice =  userIn.nextInt();
        switch(userChoice)
        {
            case 1:
            {scale2= "Fahrenheit";
            break;}
            case 2:
            {scale2="Celsius";
            break;}
            case 3:
            {scale2="Kelvin";
            break;}
            default:
            {scale2= "There was an error in your choice!";}
        }
        return scale2;
    }

    public static double convert(String scale1, String scale2)
    {       
        double converts;

        if(scale1.equalsIgnoreCase("Fahrenheit") amp;amp; scale2.equalsIgnoreCase("Kelvin"))        
        {
         converts=(getTemp() 459.67)* 5/9;
        }

        else if(scale1.equalsIgnoreCase("Fahrenheit") amp;amp; scale2.equalsIgnoreCase("Celsius"))
        {
         converts=(getTemp()-32)*5/9;
        }

        else if(scale1.equalsIgnoreCase("Celsius") amp;amp; scale2.equalsIgnoreCase("Kelvin"))
        {
         converts=getTemp() 273.15;
        }

        else if(scale1.equalsIgnoreCase("Celsius") amp;amp; scale2.equalsIgnoreCase("Fahrenheit"))
        {
         converts=getTemp()*9/5 32;
        }

        else if(scale1.equalsIgnoreCase("Kelvin") amp;amp; scale1.equalsIgnoreCase("Fahrenheit"))
        {
         converts=getTemp()*9/5-459.67;
        }

        else
        { 
         converts=getTemp()-276.15;
        }

        return converts;
    }} 
  

Ответ №4:

после того, как все сказано и сделано, я завершил его, и он работает правильно и в соответствии с запросом в классе. Спасибо за обратную связь!

     package tempconverter;
import java.util.Scanner;

public class TempConverter 
{
        static double temp1;
        static String scale1;
        static String scale2;
        static double conv;


    public static void main(String[] args) 
    {
        char cont='N';

        do
        {   menueOne();



            menueCatch();

            cont=contOption();




        }while(cont=='Y');
    }   
        private static void menueOne()
        {
            System.out.print("Please make a selection."
                                "n1: Begin"
                                "n2: Exit"
                                "n");
        }

        private static void menueCatch()
        {   
            Scanner userIn= new Scanner(System.in);
            int userChoice=userIn.nextInt();

            String input="";
            switch(userChoice)
            {

                case 1:
                {
                 temp1=getTemp();
                 scale1=scaleOne();
                 scale2=toScale();
                 conv=convert();
                 displayConversion();
                 break;
                }

                case 2:
                {

                 break;
                }
            }
        }

        private static double getTemp()
        {
             double temp;
             double currentTemp;
             Scanner userIn= new Scanner(System.in);
             System.out.print("Enter a temperature to convert as a digit(ex: 100, 32, 10, 0):  ");
             while(!userIn.hasNextDouble())
             {
              System.out.println("That is not a valid temperature!");
              System.out.print("Re-enter a temperature: ");
              userIn.next();
             }
             temp=userIn.nextDouble();



             return temp;
        }

        private static String scaleOne()
        {

            Scanner userIn= new Scanner(System.in);



            System.out.print("What scale is your temp currently in?" 
                              "n1: Fahrenheit"   
                              "n2: Celsius"   
                              "n3: Kelvin"   
                              "nPlease enter 1, 2, or 3: ");

            int userChoice = userIn.nextInt();

            String scale="";

            switch(userChoice)
            {
                case 1:
                {scale= "Fahrenheit";
                break;}

                case 2:
                {scale="Celsius";
                break;}

                case 3:
                {scale="Kelvin";
                break;}

                default:
                {scale= "There was an error in your choice!";}
            }

            return scale;

        }



        private static String toScale()
        {

            Scanner userIn= new Scanner(System.in);



            System.out.print("What scale would you like to convert to?" 
                              "n1: Fahrenheit"   
                              "n2: Celsius"   
                              "n3: Kelvin"   
                              "nPlease enter 1, 2, or 3: ");

            int userChoice = userIn.nextInt();

            String scale2="";

            switch(userChoice)
            {
                case 1:
                {scale2= "Fahrenheit";
                break;}

                case 2:
                {scale2="Celsius";
                break;}

                case 3:
                {scale2="Kelvin";
                break;}

                default:
                {scale2= "There was an error in your choice!";}
            }

            return scale2;

        }



        public static double convert()
        {

            double converts;

            if (scale1.equals("Fahrenheit") amp;amp; scale2.equals("Kelvin")) {

            converts = (temp1   459.67) * (5.0 / 9.0);
        }

        else if (scale1.equals("Fahrenheit") amp;amp; scale2.equals("Celsius")) {
            converts = (temp1 - 32) * (5.0 / 9.0);
        }

        else if (scale1.equals("Celsius") amp;amp; scale2.equals("Kelvin")) {
            converts = temp1   273.15;
        }

        else if (scale1.equals("Celsius") amp;amp; scale2.equals("Fahrenheit")) {
            converts = temp1 * (9.0 / 5.0)   32;
        }

        else if (scale1.equals("Kelvin") amp;amp; scale2.equals("Fahrenheit")) {
            converts = temp1 * (9.0 / 5.0) - 459.67;
        }

        else { // Kelvin to Celsius
            converts = temp1 - 276.15;
        }

        return converts;
        }

        private static void displayConversion()
        {
            System.out.print("Your final temp is: "  conv ' ' scale2 ' ');
        }

         private static char contOption()
        {
            char answer;
        Scanner userIn=new Scanner(System.in);
        System.out.print("nDo you wish to convert another temp?(Y/N): ");
        answer=userIn.next().toUpperCase().charAt(0);

        return answer;
        }    






        }