Условие задачи:
Необходимо написать простой консольный калькулятор на Java.
Для считывания ввода нужно использовать класс Scanner.
Scanner позволяет считывать строки и числа:
Scanner scanner = new Scanner(System.in);
int operand1 = scanner.nextInt(); //считывает число
/* Метод next() класса Scanner считывает строку,
а метод charAt(0) позволяет взять первый символ в этой строке.
так мы получаем операцию, которую нужно выполнить*/
char operation = scanner.next().charAt(0);
Теперь у нас есть первый операнд и операция, которую необходимо выполнить. Осталось считать второй операнд, и выполнить нужное действие в зависимости от того, какая операция была введена.
в конце напечатать результат.
Ответьте на следующие вопросы прежде чем приступить к написанию кода:
1. Какой оператор лучше использовать, чтобы проверить, какую операцию выполнять? (switch)
2. Если пользователь ввёл не поддерживаемую операцию стоит ли ему сообщить об этом? ( проверка ввода .. предупредить об ошибке)
3. Нужна ли дополнительная переменная для второго операнда? А для результата? (operand2 для второго и result для результата)
4. Можно ли написать весь код в одном методе? или вынести код для каждой операции отдельно? (лучше разнести получение одного, второго операнда и знака операции отдельно, и отдельный метод для расчета)
прежде чем решать данную задачу, необходимо разбить задачу на подзадачи. всего есть 3 основных шага:
Шаг №1 вводятся 2 числа ->> метод getInt()
Шаг №2 выбирается операция ->> метод char getOperation()
Шаг №3 Калькулятор считает ->> метод int calc(int operand1, int operand2, char operation)
поэтому в методе int nextInt() мы прописали механику считывания числа с консоли и проверки целочисленное число введено или нет.
public static int nextInt(){
System.out.println("Введите число:");
int operand;
if(scanner.hasNextInt()){
operand = scanner.nextInt();
} else {
System.out.println("Вы допустили ошибку при вводе числа. Попробуйте еще раз.");
scanner.next();//рекурсия
operand = nextInt();
}
return operand;
}
и потом просто в методе main() вызовем 2 раза метод int nextInt(),
потому что пользователь будет вводить 2 числа.
Обратите внимание, что с помощью конструкции if-else мы прописали, что если число целочисленное, тогда присвоить введенное пользователем значение в переменную operand, если же не целочисленное, - вывести в консоль "Вы допустили ошибку при вводе числа. Попробуйте еще раз".
Также обратите внимание, что мы использовали рекурсию в else:
} else {
System.out.println("Вы допустили ошибку при вводе числа. Попробуйте еще раз.");
scanner.next();//рекурсия
operand = nextInt();
}
Выбо операции (+ - * /) мы осуществили с помощью метода char getOperation()
public static char getOperation(){
System.out.println("Введите операцию:");
char operation;
if(scanner.hasNext()){
operation = scanner.next().charAt(0);
} else {
System.out.println("Вы допустили ошибку при вводе операции. Попробуйте еще раз.");
scanner.next();//рекурсия
operation = getOperation();
}
return operation;
}
Как видите, пользователю предлагается ввести операцию. А далее программа должна распознать было ли введеное пользователем значение типа char или нет. Причем нас устроит только, если пользователь введет: + - * или / . Например, если пользователь введет число, нас не устроит. Вероно? Поэтому мы применили небольшую хитрость вот в этих 2 строчках кода:
if(scanner.hasNext()){
operation = scanner.next().charAt(0);
Мы с помощью метода сканера next() считали всю строчку. А далее, поскольку нам не нужна вся строка, а нужен только первый элемент строки, то есть нулевой элемент, поэтому мы вызвали еще и метод charAt(0). И таким образом мы получим только значение 0-го элемента, а не всей строки.
И далее мы прописали сам метод int calc(int operand1, int operand2, int operation):
public static int calc(int operand1, int operand2, char operation){
int result;
switch (operation){
case '+':
result = operand1+operand2;
break;
case '-':
result = operand1-operand2;
break;
case '*':
result = operand1*operand2;
break;
case '/':
result = operand1/operand2;
break;
default:
System.out.println("Операция не распознана. Повторите ввод.");
result = calc(operand1, operand2, getOperation());//рекурсия
}
return result;
}
Как видите, мы использовали конструкцию switch-case. И прописали, что:
если пользователь ввел +, тогда operand1+operand2, то есть суммируем 2 числа, введенных пользователем.
если пользовательввел -, тогда operand1-operand2, то есть из 1-го числа, введенного пользователем вычитаем 2-е число
итд
также обратите внимание, что здесь мы тоже использовали рекурсию.
default:
System.out.println("Операция не распознана. Повторите ввод.");
result = calc(operand1, operand2, getOperation());//рекурсия
и после того как мы прописали все необходимые методы, мы в методе main() прописали следующее:
public static void main(String[] args) {
int operand1 = nextInt();
int operand2 = nextInt();
char operation = getOperation();
int result = calc(operand1,operand2,operation);
System.out.println("Результат операции: "+result);
}
то есть в переменные operand1 и operand2 будут присвоены,
соответственно, 1-е и 2-е число, введенное пользователем.
в переменнную operation будет присвоенна операция, которую ввел пользователь: + - * или /
далее в переменную result будет присвоен рузультат вычислений нашего калькулятора
и после этого результат будет выведен в консоль
ниже приведем весь код калькулятора
import java.util.Scanner;
public class Calculator {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int operand1 = nextInt();
int operand2 = nextInt();
char operation = getOperation();
int result = calc(operand1,operand2,operation);
System.out.println("Результат операции: "+result);
}
public static int nextInt(){
System.out.println("Введите число:");
int operand;
if(scanner.hasNextInt()){
operand = scanner.nextInt();
} else {
System.out.println("Вы допустили ошибку при вводе числа. Попробуйте еще раз.");
scanner.next();//рекурсия
operand = nextInt();
}
return operand;
}
public static char getOperation(){
System.out.println("Введите операцию:");
char operation;
if(scanner.hasNext()){
operation = scanner.next().charAt(0);
} else {
System.out.println("Вы допустили ошибку при вводе операции. Попробуйте еще раз.");
scanner.next();//рекурсия
operation = getOperation();
}
return operation;
}
public static int calc(int operand1, int operand2, char operation){
int result;
switch (operation){
case '+':
result = operand1+operand2;
break;
case '-':
result = operand1-operand2;
break;
case '*':
result = operand1*operand2;
break;
case '/':
result = operand1/operand2;
break;
default:
System.out.println("Операция не распознана. Повторите ввод.");
result = calc(operand1, operand2, getOperation());//рекурсия
}
return result;
}
}
1 комментарий:
Спасибо, всё очень понятно!
Отправить комментарий