Расчеты в программах java

popin

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

Источник

Как создать калькулятор на Java — полное руководство с кодом

В этом руководстве мы расскажем, как создать калькулятор на Java для Android. Если вы новичок в программировании и никогда раньше не создавали приложения, ознакомьтесь с нашим предыдущим руководством по написанию первого приложения для Android:

Предполагается, что у вас есть хотя бы минимальный базовый опыт создания Android – приложений .

Полный исходный код калькулятора, описанного ниже, доступен для использования и изменения на github .

Создание проекта

Первое, что нужно сделать — это создать в Android Studio новый проект: Start a new Android Studio project или File — New — New Project :

Создание проекта

Для этого руководства мы выбрали в панели « Add an Activity to Mobile » опцию « EmptyActivity », для « MainActivity » мы оставили имя по умолчанию – « Activity ». На этом этапе структура должна выглядеть, как показано на рисунке ниже. У вас есть MainActivity внутри пакета проекта и файл activity_main.xml в папке layout :

Создание проекта - 2

Включение привязки данных в проекте

Перед тем, как создать приложение для Андроид с нуля, нужно уяснить, что использование привязки данных помогает напрямую обращаться к виджетам ( Buttons , EditText и TextView ), а не находить их с помощью методов findViewById() . Чтобы включить привязку данных, добавить следующую строку кода в файл build.gradle .

Включение привязки данных в проекте

Разработка макета калькулятора

Для включения привязки данных в файле activity_main.xml требуется еще одно изменение. Оберните сгенерированный корневой тег ( RelativeLayout ) в layout , таким образом сделав его новым корневым тегом.

Как научиться создавать приложения для Андроид? Читайте наше руководство дальше.

Тег layout — это предупреждает систему построения приложения, что этот файл макета будет использовать привязку данных. Затем система генерирует для этого файла макета класс Binding . Поскольку целевой XML-файл называется activity_main.xml , система построения приложения создаст класс ActivityMainBinding , который можно использовать в приложении, как и любой другой класс Java . Имя класса составляется из имени файла макета, в котором каждое слово через подчеркивание будет начинаться с заглавной буквы, а сами подчеркивания убираются, и к имени добавляется слово « Binding ».

Теперь перейдите к файлу MainActivity.java . Создайте закрытый экземпляр ActivityMainBinding внутри вашего класса, а в методе onCreate() удалите строку setContentView () и вместо нее добавьте DataBindingUtil.setContentView() , как показано ниже.

public class MainActivity extends AppCompatActivity < private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); >>

Общие принципы создания виджетов макета

В приложении калькулятора есть четыре основных элемента:

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

TextView — элемент используется для отображения текста. Пользователи не должны взаимодействовать с этим элементом. С помощью TextView отображается результат вычислений.

EditText — похож на элемент TextView, с той лишь разницей, что пользователи могут взаимодействовать с ним и редактировать текст. Но поскольку калькулятор допускает только фиксированный набор вводимых данных, мы устанавливаем для него статус « не редактируемый ». Когда пользователь нажимает на цифры, мы выводим их в EditText .

Button — реагирует на клики пользователя. При создании простого приложения для Андроид мы используем кнопки для цифр и операторов действий в калькуляторе.

Создание макета калькулятора

Создание макета калькулятора

Код макета калькулятора объемный. Это связано с тем, что мы должны явно определять и тщательно позиционировать каждую из кнопок интерфейса. Ниже представлен фрагмент сокращенной версии файла макета activity_main :

Внутренние компоненты калькулятора

Перед тем, как создать приложение на телефон Android , отметим, что valueOne и valueTwo содержат цифры, которые будут использоваться. Обе переменные имеют тип double , поэтому могут содержать числа с десятичными знаками и без них. Мы устанавливаем для valueOne специальное значение NaN ( не число ) — подробнее это будет пояснено ниже.

private double valueOne = Double.NaN; private double valueTwo;

Этот простой калькулятор сможет выполнять только операции сложения, вычитания, умножения и деления. Поэтому мы определяем четыре статических символа для представления этих операций и переменную CURRENT_ACTION , содержащую следующую операцию, которую мы намереваемся выполнить.

private static final char ADDITION = '+'; private static final char SUBTRACTION = '-'; private static final char MULTIPLICATION = '*'; private static final char DIVISION = '/'; private char CURRENT_ACTION;

Затем мы используем класс DecimalFormat для форматирования результата. Конструктор десятичного формата позволяет отображать до десяти знаков после запятой.

decimalFormat = new DecimalFormat("#.##########");

Обработка нажатий на цифры

В нашем создаваемом простом приложении для Андроид всякий раз, когда пользователь нажимает на цифру или точку, нам нужно добавить эту цифру в editText . Пример кода ниже иллюстрирует, как это делается для цифры ноль ( 0 ).

binding.buttonZero.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View view) < binding.editText.setText(binding.editText.getText() + "0"); >>);

Обработка кликов по кнопкам операторов

Обработка кликов по кнопкам операторов

Обработка нажатия кнопок операторов ( действий ) выполняется по-другому. Сначала нужно выполнить все ожидающие в очереди вычисления. Поэтому мы определяем метод computeCalculation . В computeCalculation , если valueOne является допустимым числом, мы считываем valueTwo из editText и выполняем текущие операции в очереди. Если же valueOne является NaN , для valueOne присваивается цифра в editText .

private void computeCalculation() < if(!Double.isNaN(valueOne)) < valueTwo = Double.parseDouble(binding.editText.getText().toString()); binding.editText.setText(null); if(CURRENT_ACTION == ADDITION) valueOne = this.valueOne + valueTwo; else if(CURRENT_ACTION == SUBTRACTION) valueOne = this.valueOne - valueTwo; else if(CURRENT_ACTION == MULTIPLICATION) valueOne = this.valueOne * valueTwo; else if(CURRENT_ACTION == DIVISION) valueOne = this.valueOne / valueTwo; >else < try < valueOne = Double.parseDouble(binding.editText.getText().toString()); >catch (Exception e)<> > >

Продолжаем создавать копию приложения на Андроид . Для каждого оператора мы сначала вызываем computeCalculation() , а затем устанавливаем для выбранного оператора CURRENT_ACTION . Для оператора равно (=) мы вызываем computeCalculation() , а затем очищаем содержимое valueOne и CURRENT_ACTION .

Заключение

Если вы запустите и протестируете данное приложение, то увидите некоторые моменты, которые можно улучшить: 1) возможность нажимать на кнопку оператора, когда editText очищен ( т. е. без необходимости ввода первой цифры ), 2) возможность продолжать вычисления после нажатия кнопки « Равно ».

Полный код примера доступен на github .

Источник

Читайте также:  Input type text in html example
Оцените статью