Пишу калькулятор на андроид, но не получается сделать функцию процента и возведения в степень (любого числа к любому), так как после нажатия самой кнопки программа сразу считает (присваивает значение второй переменной 0), а должна подождать ввода второй переменной с кнопок (клавиатуры).
Само собой использую метод Math.pow(a,b) (для возведения в степень) и кнопка buttonExponentiation находится в общем switch/case.
Как сделать эту задержку (чтобы кнопка ждала ввод второй переменной)?
public void onClick(View view) {
switch (view.getId()) {
case R.id.button1:
ClickNumber(1);
break;
case R.id.button2:
ClickNumber(2);
break;
case R.id.button3:
ClickNumber(3);
break;
case R.id.button4:
ClickNumber(4);
break;
case R.id.button5:
ClickNumber(5);
break;
case R.id.button6:
ClickNumber(6);
break;
case R.id.button7:
ClickNumber(7);
break;
case R.id.button8:
ClickNumber(8);
break;
case R.id.button9:
ClickNumber(9);
break;
case R.id.button0:
ClickNumber(0);
break;
case R.id.buttonAdd:
if (flagAction == 0) flagAction = 1;
break;
case R.id.buttonSub:
if (flagAction == 0) flagAction = 2;
break;
case R.id.buttonMult:
if (flagAction == 0) flagAction = 3;
break;
case R.id.buttonDiv:
if (flagAction == 0) flagAction = 4;
break;
case R.id.buttonEq:
switch (flagAction) {
case 1:
result = operand1 + operand2;
showNumber(result);
operand1 = result;
break;
case 2:
result = operand1 - operand2;
showNumber(result);
operand1 = result;
break;
case 3:
result = operand1 * operand2;
showNumber(result);
operand1 = result;
break;
case 4:
result = operand1 / operand2;
showNumber(result);
operand1 = result;
break;
default:
Toast.makeText(this, "Вкажіть дію!", Toast.LENGTH_LONG).show();
}
if (flagAction != 0) {
showNumber(result);
clearVariables_2();
}
break;
case R.id.buttonClean:
clearVariables();
showNumber(operand1);
break;
case R.id.buttonComa:
break;
case R.id.buttonSquare:
if (flagAction == 0) {
result = Math.pow(operand1, 2);
showNumber(result);
// clearVariables_2();
operand1 = result;
} else {
Toast.makeText(this, R.string.other_operation, Toast.LENGTH_LONG).show();
}
break;
case R.id.buttonSqrt:
if (flagAction == 0) {
result = Math.sqrt(operand1);
showNumber(result);
operand1 = result;
} else {
Toast.makeText(this, R.string.other_operation, Toast.LENGTH_LONG).show();
}
break;
case R.id.buttonBack:
// !!!!!!!!!!!!!! NULL WHY ???????????
String Temp = null;
if (flagAction == 0) {
if (operand1 % 1 == 0) {
Temp = Integer.toString((int) operand1);
} else {
Temp = Double.toString(operand1);
}
Temp = Temp.substring(0, Temp.length() - 1);
if (Temp.length() > 0) {
operand1 = Double.parseDouble(Temp);
} else {
operand1 = 0;
}
showNumber(operand1);
} else {
if (flagAction == 0) {
if (operand2 % 1 == 0) {
Temp = Integer.toString((int) operand2);
}
} else {
Temp = Double.toString(operand2);
}
Temp = Temp.substring(0, Temp.length() - 1);
if (Temp.length() > 0) {
operand2 = Double.parseDouble(Temp);
} else {
operand2 = 0;
}
showNumber(operand2);
}
break;
case R.id.buttonOff:
finish();
break;
case R.id.buttonExponentiation:
if (flagAction == 0) {
if(operand1 != 0){
// some code ..................
}
result = Math.pow(operand1, operand2);
showNumber(result);
} else {
Toast.makeText(this, R.string.other_operation, Toast.LENGTH_LONG).show();
}
break;
case R.id.buttonPercent:
result = operand1 * 100 / operand2;
showNumber(result);
break;
}
}
Вам нужно поменять логику возведения в степень (а лучше логику всего калькулятора), например:
case R.id.buttonExponentiation:
if (flagAction == 0) {
// здесь нужно присвоить какой-либо флаг
flag = true;
} else {
Toast.makeText(this, R.string.other_operation, Toast.LENGTH_LONG).show();
}
break;
А проверку и сам код возведения перенести на нажатие цифр, внутрь функции ClickNumber
.....Код присвоения operand1/operand2.....
......
// проверяете присвоенный вами на прошлом шаге флаг и операнды
if(flag && operand1 != null && operand2 != null){
// А здесь уже возводите в степень
result = Math.pow(operand1, operand2);
}
Посмотрел в гугл калькулятор и понял о чем вы. Занулять operand'ы и флаг вам нужно по нажатию клавиш действия (не цифр).
А operand2 вам нужно присваивать примерно так:
if(operand2 == null){
operand2 = keyboardval;
} else {
operand2 *= 10;
operand2 += keyboardval;
}
где keyboardval - значение вашей цифры
То есть: вы вводите число, это ваш operand1, вводите его до тех пор, пока не была нажата какая-либо клавиша действия, запоминаете operand1. После этого запоминаете, какое действие было нажато, присваиваете флаг действия. Если флаг действия был присвоен, то при нажатии цифр, вы уже присваиваете их переменной operand2 (не забывайте проверять, что operand1 != null). Соответственно при каждом нажатии цифры, вы должны пересчитывать значение результата до тех пор, пока снова не будет нажата кнопка действия - в этот самый момент вы выводите результат операции, присваиваете operand1 = result, operand2 = null.
Для простого калькулятора достаточно этого. Если же вы хотите более сложную версию, как у гугла, то вам придется сохранять все введенные числа и операции, а затем выполнять их по приоритетам.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости