Как создать калькулятор на java
Зная некоторые основы компоновки и такие элементы как TextView, EditText и Button, уже можно составить более менее полноценное приложение. В данном случае мы сделаем простенький калькулятор.
Для этого создадим новый проект и определим в файле activity_main.xml следующий интерфейс:
В итоге весь интерфейс будет выглядеть следующим образом:

Корневой контейнер компоновки представляет элемент ConstraintLayout . Сверху в нем определены два текстовых поля TextView: одно для вывода результата вычислений и одно для вывода текущего знака операции.
Затем идет элемент EditText, предназначенный для ввода чисел.
И далее расположены четыре элемента LinearLayout с горизонтальными рядами кнопок. Чтобы все кнопки занимали равное пространство внутри контейнера, для них установлены атрибуты android:layout_weight=»1″ и android:layout_width=»0dp» .
Для каждой кнопки установлен идентификатор, чтобы в коде можно было прикрепить к ней определенный обработчик нажатия.
Теперь изменим класс MainActivity :
package com.metanit.calculator; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < TextView resultField; // текстовое поле для вывода результата EditText numberField; // поле для ввода числа TextView operationField; // текстовое поле для вывода знака операции Double operand = null; // операнд операции String lastOperation = "="; // последняя операция @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // получаем все поля по id из activity_main.xml resultField = findViewById(R.id.resultField); numberField = findViewById(R.id.numberField); operationField = findViewById(R.id.operationField); findViewById(R.id.add).setOnClickListener((view)->onOperationClick("+")); findViewById(R.id.sub).setOnClickListener((view)->onOperationClick("-")); findViewById(R.id.mul).setOnClickListener((view)->onOperationClick("*")); findViewById(R.id.div).setOnClickListener((view)->onOperationClick("/")); findViewById(R.id.eq).setOnClickListener((view)->onOperationClick("=")); findViewById(R.id.n0).setOnClickListener((view)->onNumberClick("0")); findViewById(R.id.n1).setOnClickListener((view)->onNumberClick("1")); findViewById(R.id.n2).setOnClickListener((view)->onNumberClick("2")); findViewById(R.id.n3).setOnClickListener((view)->onNumberClick("3")); findViewById(R.id.n4).setOnClickListener((view)->onNumberClick("4")); findViewById(R.id.n5).setOnClickListener((view)->onNumberClick("5")); findViewById(R.id.n6).setOnClickListener((view)->onNumberClick("6")); findViewById(R.id.n7).setOnClickListener((view)->onNumberClick("7")); findViewById(R.id.n8).setOnClickListener((view)->onNumberClick("8")); findViewById(R.id.n9).setOnClickListener((view)->onNumberClick("9")); findViewById(R.id.comma).setOnClickListener((view)->onNumberClick(",")); > // сохранение состояния @Override protected void onSaveInstanceState(Bundle outState) < outState.putString("OPERATION", lastOperation); if(operand!=null) outState.putDouble("OPERAND", operand); super.onSaveInstanceState(outState); >// получение ранее сохраненного состояния @Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) < super.onRestoreInstanceState(savedInstanceState); lastOperation = savedInstanceState.getString("OPERATION"); operand= savedInstanceState.getDouble("OPERAND"); resultField.setText(operand.toString()); operationField.setText(lastOperation); >// обработка нажатия на числовую кнопку public void onNumberClick(String number) < numberField.append(number); if(lastOperation.equals("=") && operand!=null)< operand = null; >> // обработка нажатия на кнопку операции public void onOperationClick(String op)< String number = numberField.getText().toString(); // если введенно что-нибудь if(number.length()>0)< number = number.replace(',', '.'); try< performOperation(Double.valueOf(number), op); >catch (NumberFormatException ex) < numberField.setText(""); >> lastOperation = op; operationField.setText(lastOperation); > private void performOperation(Double number, String operation) < // если операнд ранее не был установлен (при вводе самой первой операции) if(operand ==null)< operand = number; >else < if(lastOperation.equals("="))< lastOperation = operation; >switch(lastOperation) < case "=": operand =number; break; case "/": if(number==0)< operand =0.0; >else < operand /=number; >break; case "*": operand *=number; break; case "+": operand +=number; break; case "-": operand -=number; break; > > resultField.setText(operand.toString().replace('.', ',')); numberField.setText(""); > >
Разберем этот код. Вначале в методе onCreate() получаем все поля из activity_main.xml, текст которых будет изменяться:
resultField = findViewById(R.id.resultField); numberField = findViewById(R.id.numberField); operationField = findViewById(R.id.operationField);
Далее для каждой кнопки назначаем определенный обработчик нажатия — в зависимости от типа кнопки это либо метод onNumberClick , в который передается нажатое число, либо onOperationClick , в который передается знак операции.
Результат операции будет попадать в переменную operand, которая представляет тип Double, а знак операции — в переменную lastOperation:
Double operand = null; String lastOperation = " brush:java;"> numberField.append(number); if(lastOperation.equals(" равно"), то мы сбрасываем переменную operand. В методе onOperationClick происходит обработка нажатия на кнопку со знаком операции:
String number = numberField.getText().toString(); if(number.length()>0)< number = number.replace(',', '.'); try< performOperation(Double.valueOf(number), op); >catch (NumberFormatException ex) < numberField.setText(""); >> lastOperation = op; operationField.setText(lastOperation);
Здесь получаем ранее введенное число и введенную операцию и передаем их в метод performOperation() . Так как в метод передается не просто строка, а число Double, то нам надо преобразовать строку в чсло. И поскольку теоретически могут быть введены нечисловые символы, то для отлова исключения, которое может возникнуть при преобразовании используется конструкция try. catch.
Кроме того, так как разделителем целой и дробной части в Double в java является точка, то нам надо заменить запятую на точку, так как предполагается, что мы используем в качестве разделителя запятую.
А методе performOperation() выполняем собственно операцию. При вводе первой операции, когда операнд еще не установлен, мы просто устанавливаем операнд:
if(operand ==null)
При вводе второй и последующих операций применяем предыдущую операцию, знак которой хранится в переменной lastOperation, к операнду operand и второму числу, которое было введено в числовое поле. Полученный результат операции сохраняем в переменной operand.
консольный калькулятор на java
сразу выдавал ответ а не требовал запуска программы листинг моего калькулятора.
import java.util.Scanner; public class calculator < private static Scanner read; public static void main (String[] args)< read = new Scanner(System.in); double first; double second; String operator; System.out.print(">> "); first = read.nextDouble(); operator = read.next(); second = read.nextDouble(); if (operator.equals("*")) < System.out.println("= " + (first * second)); >if (operator.equals("/")) < System.out.println("= " + (first / second)); >if (operator.equals("+")) < System.out.println("= " + (first + second)); >if (operator.equals("-")) < System.out.println(" "; String str2 = ""; String operator = ""; char charTmp = ' '; int count = 0; int countFirsDigit = 0; int countSecondDigit= 0; double x = 0; double y = 0; while (count < ch.length - 1)< char c = ch[countFirsDigit]; if(Character.isDigit(c))/проверка является ли символ числом String strTmp = Character.toString(c);//преобразование char в String str1 = str1.concat(strTmp);//склеивание последовательности символов x = Double.parseDouble(str1);//преобразование строки чисел в double countFirsDigit++;//счетчик первого числа count++;//общий счетчик countSecondDigit++;//счетчик второго числа >else < countSecondDigit++; count = countSecondDigit; charTmp = c;//определяем оператор operator = Character.toString(charTmp); char c2 = ch[countSecondDigit]; if(Character.isDigit(c2))< String strTmp = Character.toString(c2); str2 = str2.concat(strTmp); y = Double.parseDouble(str2); >> > if (operator.equals("*")) < System.out.println("= " + (x * y)); >if (operator.equals("/")) < System.out.println("= " + (x / y)); >if (operator.equals("+")) < System.out.println("= " + (x + y)); >if (operator.equals("-")) < System.out.println(" mt24 mb12">javaкалькулятор


