понедельник, 24 августа 2020 г.

Калькулятор консольный на Java

Условие задачи:

Необходимо написать простой консольный калькулятор на 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;
}
}

 


пятница, 7 февраля 2020 г.

Округление в OpenOffice Calc

Округление  в OpenOffice Calc

Для округления в OpenOffice Calc имеются две функции: CEILING(число; приращение; режим), FLOOR(число; точность; режим), которые являются аналогами ОКРУГЛВВЕРХ и ОКРУГЛВНИЗ в Excel . CEILING - округляет число в большую сторону, FLOOR - в меньшую. Параметр режим является необязательным, но для лучшей совместимости с Excel рекомендуется ставить 1. Второй параметр в этих функциях задает точность округления и может быть любой, например: 0,5 - до половины; 0,25 - до четверти; 0,75 - до трех четвертей; 1- до единицы 0,01 до двух знаков после запятой и тд.. 
Также в функции CEILING параметр приращение  еще работает и как  условие:но_не_менее, и CEILING(3,245436674; 5; 1) вернет значение 5.