Моя программа калькулятора не будет работать.Проблема со строковой переменной - PullRequest
2 голосов
/ 12 сентября 2011

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

import java.util.Scanner;
class apples {
    public static void main(String args[]){
    Scanner input = new Scanner(System.in);
    double first, second, answer;
    String op = "";
    System.out.print("Enter first num: ");
    first = input.nextDouble();
    System.out.print("Enter second num: ");
    second = input.nextDouble();
    System.out.print("Enter operator: ");
    op = input.nextLine();

    if(op.equals("-")){
        answer = first-second;
        System.out.println(answer);
    }else if(op.equals("+")){
        answer = first+second;
        System.out.println(answer);
    }else if(op.equals("*")){
        answer = first*second;
        System.out.println(answer);
    }else if(op.equals("/")){
        answer = first/second;
        System.out.println(answer);
    }else{
        System.out.println("crap");
    }   
}
}

Ответы [ 3 ]

3 голосов
/ 12 сентября 2011

Никогда не сравнивайте строки с ==. Вместо этого используйте метод equals (...) или equalsIgnoreCase (...).

Причина, по которой это важно, заключается в том, что == проверяет, являются ли два упомянутых объекта одним и тем же, и вам все равно, если stringVariable1 ссылается на тот же объект, что и stringVariable2. Скорее, вы хотите знать, имеют ли две переменные строки, содержащие одинаковые символы в одном и том же порядке, и именно для этого предназначены эти методы: первый, если вам не нужна капитализация, и второй, если вы это сделаете.

Ваш код будет выглядеть примерно так:

if (op.equals("-")){
  answer = first-second;
  System.out.println(answer);
} else if (op.equals("+")){
  answer = first + second;
  System.out.println(answer);
}
//... etc...

Редактировать
Проблема номер два - обработка маркера конца строки. При использовании методов сканера nextInt (), nextDouble () или next () вы должны позаботиться о том, чтобы обрабатывать маркеры конца строки, если достигнут конец строки, чтобы не перепутаться при следующем вызове nextLine ().

Так, например, если пользователь вводит «10», возвращает эту строку кода

second = input.nextDouble();

хорошо, получите 10, но не будете "глотать" маркер конца строки, который остается висящим. Итак, когда эта строка кода называется:

op = input.nextLine();

переменная op получит маркер конца строки, и пользователь даже не сможет ввести код операции "+". Решение состоит в том, чтобы позаботиться о том, чтобы проглотить маркер конца строки, если он достигнут при использовании метода Scanner, который не заканчивается на «Line ()».

Так что после nextDouble () вызовите nextLine () ;. Например, вот так:

  String op = "";
  System.out.print("Enter first num: ");
  first = input.nextDouble();
  input.nextLine(); // *** add this to "swallow" the end of line token ***
  System.out.print("Enter second num: ");
  second = input.nextDouble();
  input.nextLine(); // *** add this to "swallow" the end of line token ***

  System.out.print("Enter operator: ");
  op = input.nextLine();
2 голосов
/ 12 сентября 2011

Scanner.nextLine() не работает так, как вы (или я в этом отношении) ожидали.Вместо этого используйте next().

import java.util.Scanner;

class Apples {
    public static void main(String args[]){
        Scanner input = new Scanner(System.in);
        double first, second, answer;
        String op = "";
        System.out.print("Enter first num: ");
        first = input.nextDouble();
        System.out.print("Enter second num: ");
        second = input.nextDouble();
        System.out.print("Enter operator: ");
        op = input.next();

        if(op.equals("-")){
            answer = first-second;
            System.out.println(answer);
        }else if(op.equals("+")){
           answer = first+second;
           System.out.println(answer);
        }else if(op.equals("*")){
            answer = first*second;
            System.out.println(answer);
        }else if(op.equals("/")){
            answer = first/second;
            System.out.println(answer);
        }else{
            System.out.println("oops");
        }
        }
    }

I / O

Enter first num: 1.2
Enter second num: 2.3
Enter operator: *
2.76
Press any key to continue . . .
0 голосов
/ 12 сентября 2011

Разве Java не сравнивает строки с .equals (), а не ==? Я думаю == тест на идентичность, а не на равную ценность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...