- popin
- Как создать калькулятор на 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 :
Включение привязки данных в проекте
Перед тем, как создать приложение для Андроид с нуля, нужно уяснить, что использование привязки данных помогает напрямую обращаться к виджетам ( 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 .