Возведение в степень + процент

392
13 января 2017, 08:31

Пишу калькулятор на андроид, но не получается сделать функцию процента и возведения в степень (любого числа к любому), так как после нажатия самой кнопки программа сразу считает (присваивает значение второй переменной 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;
        }
    }
Answer 1

Вам нужно поменять логику возведения в степень (а лучше логику всего калькулятора), например:

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. Для простого калькулятора достаточно этого. Если же вы хотите более сложную версию, как у гугла, то вам придется сохранять все введенные числа и операции, а затем выполнять их по приоритетам.

READ ALSO
Отключение панели Java Swing

Отключение панели Java Swing

Доброго времени сутокСтолкнулся со следующей проблемой:

379
Создание epg тв программы

Создание epg тв программы

ЗдравствуйтеНеобходимо в свою программу добавить поддержку вывода тв программы в формате epg

586
Создание treeview в android (подчинение)

Создание treeview в android (подчинение)

такой вопрос, необходимо сделать что-то в этом роде:

317
Сложные запросы в hibernate

Сложные запросы в hibernate

Что более предпочтительно с точки зрения ресурсоемкости, если нужна выборка из базы со сложными связами (join): один сложный sql-запрос или несколько...

563