Member 14048021 Ответов: 2

Проблема с получением вменения от пользователя и сравнением его (очистить и выйти из вариантов в простом калькуляторе)


    public class Lab05c
    {
       public static void main( String[] args)
       {
          Scanner scan = new Scanner( System.in);

          // constants

          // variables
          double currentResult;
          String userEntry;
          char sum;
          char subtraction;
          char multiplication;
          char division;
          double enteredNumber;
          char operation;
          String userEntryUntouched;
          
          // program code
     
          currentResult = 0 ;
          sum = '+';    
          subtraction = '-';
          multiplication = '*';
          division = '/';
           
          System.out.println("Welcome to Simple Calculator!");
             
          do
          {
          System.out.println(currentResult);
          System.out.println("+,-,*,/ value") ;
          System.out.println("Clear") ;
          System.out.println("Quit") ;
          System.out.println("Select: ") ;
          userEntry = scan.nextLine() ;            
          userEntryUntouched = userEntry ;   
          operation = userEntry.charAt(0); 
          userEntry = userEntry.replaceAll("\\D+","");  
          enteredNumber = Double.parseDouble( userEntry ) ;
        
          if ( userEntryUntouched == "Clear" || userEntryUntouched == "C" || userEntryUntouched == "c" )
          {
             currentResult = 0 ;
          }
          

          if ( operation == sum )
          {
             currentResult = currentResult + enteredNumber ; 
          }
          if ( operation == subtraction )
          {
             currentResult = currentResult - enteredNumber ;     
          }
          if ( operation == multiplication )
          {
             currentResult = currentResult * enteredNumber ;    
          }
          if ( operation == division )
          {
             currentResult = currentResult / enteredNumber ;     
          }
                 
          } while (userEntryUntouched != "Quit" )  ;
       }

    } // end class

<!-- end snippet -->

This is my code for a simple calculator. When I type Clear or Quit i get the error : 

java.lang.NumberFormatException: empty String
	at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
	at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
	at java.lang.Double.parseDouble(Unknown Source)
	at Lab05c.main(Lab05c.java:48)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:267)

but it does the calculations correctly. Although I tried so hard to find what's wrong, I was not able to find it. Why i get a error when i type Quit and Clear?
Thank you very much for your helps... ( I also tried running this code with .equals() code but still didn't work)


Что я уже пробовал:

Я попробовал другой код .equalsto (), но он тоже не сработал.

2 Ответов

Рейтинг:
13

Richard MacCutchan

Если пользователь вводит "выход", вы все еще проходите этапы расчета, но значения там, скорее всего, не будут действительными. Вам нужно еще раз взглянуть на свою логику.

1. Get the user option.
1.1. If "Quit" then terminate the application
1.3. If "Clear" then set the total to zero
1.2. If "Select" then :
    2.1 Get the operator and values, do the calculations etc.


Member 14048022

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

Richard MacCutchan

Да, он действительно проходит через этапы расчета, и именно поэтому вы получаете ошибку. Сначала вам нужно проверить выбор входного сигнала, а не просто проверить "очистить".

Member 14048022

Я не понимаю. Зачем ему проходить стадии расчета? Ни одно из утверждений if не является правильным. Кстати, большое вам спасибо за ваш ответ.

Richard MacCutchan

Посмотри на свой код. Что происходит после того, как пользователь вводит "выйти"? Вы пытаетесь прочитать операцию и число, вместо того чтобы завершить цикл.

Member 14048022

Я исправил свой код вот так:

импорт java.util.Сканер;


Lab05c открытый класс
{
публичный статический пустота главный( строка[] аргументы)
{
Scanner scan = новый сканер( System.in);

// константы

// переменные параметры
двойной currentResult;
String userEntry;
чар сумму;
вычитание символов;
умножение символов;
деление на обугленные части;
двойной введенный номер;
операция char;



// программный код

currentResult = 0 ;
сумма = '+';
вычитание = '-';
умножение = '*';
деление = '/';

System.out.println("Добро пожаловать в простой калькулятор!");

делать
{
Системы.из.код println(currentResult);
System.out.println("+,-,*,/ value") ;
System.out.println("очистить") ;
Системы.из.код println("бросить") ;
System.out.println("выберите: ") ;
userEntry = scan.nextLine() ;

если (userEntry != "Ясно" и усилитель; & userEntry != "Бросить" )
{
operation = userEntry.charAt(0);
userEntry = userEntry.replaceAll("\\D+","");
enteredNumber = Double.parseDouble( userEntry ) ;

если ( операция == сумма )
{
currentResult = currentResult + введенный номер ;
}
если ( операция == вычитание )
{
currentResult = currentResult - введенный номер ;
}
если ( операция == умножение )
{
currentResult = currentResult * введенный номер ;
}
если ( операция == деление )
{
currentResult = currentResult / enteredNumber ;
}
}

if (userEntry == "очистить")
{
currentResult = 0;
}

} while (userEntry != "Quit" ) ;
}

} // конец класса



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

Richard MacCutchan

Вы используете == и != для сравнения строк, но это работает только в том случае, если оба объекта являются одним и тем же объектом. Для сравнения строк вам необходимо использовать .equals() метод. Поэтому вам нужно изменить свой код таким образом:

// after getting the input
      if (!userEntry.equals("Clear") && !userEntry.equals("Quit"))

// and at the end of the block
      if (userEntry.equals("Clear"))
      {
         currentResult = 0;
      }
             
      } while (!userEntry.equals("Quit")) ;

Member 14048022

Я сделал это, и в конце концов это сработало. Я не знаю, как вас благодарить. Желаю вам счастливого дня :) .

Richard MacCutchan

Это всегда хорошая идея, чтобы добавить печать/журнал регистрации заявлений, чтобы ваш код, чтобы увидеть, что же именно происходит, как это работает. Что я только что и сделал. А также не забывайте, что онлайн-документация и учебные пособия помогут вам.

Member 14048022

Я сделаю то, что ты скажешь. Спасибо еще раз.

Рейтинг:
1

CPallini

Java-это ООП (игрушечный) язык, не так ли? Попробуй

class Calc
{
  private double result;

  public Calc(){clear();}
  public void clear(){result = 0;}
  public double getResult(){return result;}

  public double compute( char operator, double operand)
  {
    switch( operator )
    {
      case '+': result  += operand; break;
      case '-': result  -= operand; break;
      case '*': result  *= operand; break;
      case '/': result  /= operand; break;
    }
    return result;
  }

  public static void menu()
  {
    System.out.println("+,-,*,/ value") ;
    System.out.println("Clear") ;
    System.out.println("Quit") ;
    System.out.println("Select: ") ;
  }

  public static void main(String args[])
  {
    java.util.Scanner scan = new java.util.Scanner( System.in);
    Calc calc = new Calc();
    System.out.println("Welcome to Simple Calculator!");
    while ( true )
    {
      System.out.println("Current result is " + calc.getResult());
      menu();
      String line = scan.nextLine();
      if ( line.contains("Quit"))
        break;
      else if ( line.contains("Clear") )
        calc.clear();
      else
      {
        char operator = line.charAt(0);
        double operand = Double.parseDouble(line.substring(1));
        calc.compute( operator, operand);
      }
    }
  }
}


Member 14048022

Большое вам спасибо, но я еще не научился этим вещам. :)