Не сканируется строка
Подскажите, пожалуйста, есть проблема в двух кейсах:
package com.company;
import java.lang.String;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Введи первое число:");
float a = scanner.nextFloat();
System.out.println("Введи второе число:");
float b = scanner.nextFloat();
System.out.println("Введи арифметическое действие (+, -, *, /).");
String operation = scanner.nextLine();
switch (operation){
case "+":
System.out.println(a + b);
break;
case "-":
System.out.println(a - b);
break;
case "*":
System.out.println(a * b);
break;
case "/":
System.out.println(a / b);
break;
default:
System.out.println("Ты ввел неверную операцю");
}
}
}
а так же при:
package com.company;
import java.lang.String;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
float first, second, result;
String operation;
Scanner num = new Scanner(System.in);
System.out.println("Write first number to the next line:");
first = num.nextFloat();
System.out.println("Write first number to the next line:");
second = num.nextFloat();
System.out.println("What type of operation you want deal?");
System.out.println("1. Write '+' if this addition.");
System.out.println("2. Write '-' if this subtraction.");
System.out.println("3. Write '*' if this multiplication.");
System.out.println("4. Write '/' if this division.");
System.out.println("Write what you want in next line:");
operation = num.nextLine();
if (operation == "+"){
result = first + second;
System.out.println(result);
} else if (operation == "-") {
result = first - second;
System.out.println(result);
} else if (operation == "*") {
result = first * second;
System.out.println(result);
} else if (operation == "/") {
result = first / second;
System.out.println(result);
} else {
System.out.println("You write other char. Please, try again.");
}
}
}
Я ввожу числа, далее код должен меня попросить ввести операцию, в виде строки, но не просит, а сразу пишет else/default.
Ответы (3 шт):
Scanner scanner = new Scanner(System.in);
System.out.println("Введи первое число:");
float a = scanner.nextFloat();
System.out.println("Введи второе число:");
float b = scanner.nextFloat();
System.out.println("Введи арифметическое действие (+, -, *, /).");
scanner.nextLine();
String operation = scanner.nextLine();
switch (operation){
case "+":
System.out.println(a + b);
break;
case "-":
System.out.println(a - b);
break;
case "*":
System.out.println(a * b);
break;
case "/":
System.out.println(a / b);
break;
default:
System.out.println("Ты ввел неверную операцию");
}
}
тут проблема в выборе метода .
nextLine() - считывает конец строки.
замените на метод next()
и во втором примере замените сравнения if (operation == "+")
на if (operation.equals("+")) и т.д.
т.к. через == сравнивают примитивы и адреса ссылок.
Ошибки в первом варианте:
- Использование
nextLineпослеnextFloat: Если при вводе чисел используетсяEnterи они отделяются пустой строкой,nextFloatНЕ считывает символ\n, поэтомуnextLineпервым делом прочитает пустую строку, оставшуюся во входном потоке.
Если же числа отделяются пробелами, аналогичноnextFloatНЕ считывает пробелы, поэтомуnextLineпрочитает эти пробелы вместе с операцией, которая не сможет быть определена в оператореswitch(можно сделать trim())
Для решения этих известных проблем следует унифицировать ввод:
- Заменить
nextLineнаnext, тогда ввод может выглядеть так:
Введи первое число:
1.25 Введи второе число:
8 Введи арифметическое действие (+, -, *, /).
* Операция: 1.25 * 8.0 = 10.0
- Использовать
Float.parseFloat(scanner.nextLine())для ввода чисел, при вводе перевод строки /Enterбудут обязательны, кроме того, в качестве десятичного разделителя будет обрабатываться только точка.
Также недостатком может быть использование типа float, его точность недостаточна для простых операций, и могут возникать ошибки округления:
Введи первое число:
6,22
Введи второе число:
1,483
Введи арифметическое действие (+, -, *, /).
-
Операция: 6.22 - 1.483 = 4.7369995
При замене типа чисел на double точность несколько повысится, но гарантии корректного вывода нет:
Введи первое число:
6,22
Введи второе число:
1,483
Введи арифметическое действие (+, -, *, /).
-
Операция: 6.22 - 1.483 = 4.737
Введи первое число:
6,22
Введи второе число:
3,181
Введи арифметическое действие (+, -, *, /).
-
Операция: 6.22 - 3.181 = 3.0389999999999997
Рабочее решение:
Scanner scanner = new Scanner(System.in);
System.out.print("Введи первое число: ");
double a = Double.parseDouble(scanner.nextLine().replace(',', '.'));
System.out.print("Введи второе число: ");
double b = Double.parseDouble(scanner.nextLine().replace(',', '.'));
System.out.print("Введи арифметическое действие (+, -, *, /): ");
String operation = scanner.nextLine().trim(); // убрать ненужные пробелы
System.out.printf("Операция: %s %s %s = ", a, operation, b);
switch (operation) {
case "+":
System.out.println(a + b);
break;
case "-":
System.out.println(a - b);
break;
case "*":
System.out.println(a * b);
break;
case "/":
System.out.println(a / b);
break;
default:
System.out.println("Неверная операция: " + operation + "!");
}
Возможный вывод:
Введи первое число: 6,22
Введи второе число: 1,117
Введи арифметическое действие (+, -, *, /): -
Операция: 6.22 - 1.117 = 5.103
В варианте с if операторами к существующим проблемам с вводом данных добавились некорректные сравнения строк при помощи оператора ==, который подходит для сравнения char:
char operation = scanner.nextLine().trim().charAt(0);
if ('+' == operation) {
...
} else if ('-' == operation) {
} // etc.