Пишу калькулятор на андроид, но не получается сделать функцию процента и возведения в степень (любого числа к любому), так как после нажатия самой кнопки программа сразу считает (присваивает значение второй переменной 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
.
Для простого калькулятора достаточно этого. Если же вы хотите более сложную версию, как у гугла, то вам придется сохранять все введенные числа и операции, а затем выполнять их по приоритетам.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
ЗдравствуйтеНеобходимо в свою программу добавить поддержку вывода тв программы в формате epg
Что более предпочтительно с точки зрения ресурсоемкости, если нужна выборка из базы со сложными связами (join): один сложный sql-запрос или несколько...