Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Калькулятор, Действия кнопок 
:(
    Опции темы
leyla89
Дата 1.11.2013, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.8.2013

Репутация: нет
Всего: нет



Доброго времени суток. Помогите, пожалуйста, правильно реализовать действие для кнопок "sqrt"(вычисление квадратного корня), "pow(x,2)"(вторая степень), "c"(общий сброс) и "<"(удаление последнего символа). Дело в том, что сразу после вычисления квадратного корня получившийся результат не возводится в степень, а после общего сброса бывает вообще неразбериха.
Код
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyCalc extends JFrame {
    private JButton display;
    private double result;
    private String lastCom;
    private boolean start;

    private void addButton(String name, ActionListener listener, int x, int y,
            int width, int height) {
        JButton button = new JButton(name);
        button.setBounds(x, y, width, height);
        button.addActionListener(listener);
        getContentPane().add(button);
    }

    public MyCalc() {
        getContentPane().setLayout(null);
        setTitle("Мой калькулятор");
        setBounds(200, 200, 203, 242);
        getContentPane().setBackground(new Color(100, 149, 237));

        ActionListener output = new OutputAction();
        ActionListener command = new CommandAction();

        result = 0;
        lastCom = "=";
        start = true;

        display = new JButton("0");
        display.setEnabled(false);
        getContentPane().add(display);
        display.setBounds(5, 10, 177, 30);

        addButton("7", output, 5, 50, 41, 20);
        addButton("8", output, 50, 50, 41, 20);
        addButton("9", output, 95, 50, 41, 20);
        addButton("/", command, 140, 50, 41, 20);
        

        addButton("4", output, 5, 75, 41, 20);
        addButton("5", output, 50, 75, 41, 20);
        addButton("6", output, 95, 75, 41, 20);
        addButton("*", command, 140, 75, 41, 20);
        

        addButton("1", output, 5, 100, 41, 20);
        addButton("2", output, 50, 100, 41, 20);
        addButton("3", output, 95, 100, 41, 20);
        addButton("-", command, 140, 100, 41, 20);
        

        addButton("0", output, 5, 125, 41, 20);
        addButton(".", output, 50, 125, 41, 20);
        addButton("=", command, 95, 125, 41, 20);
        addButton("+", command, 140, 125, 41, 20);
        
        addButton("с", command, 5, 150, 85, 20);
        addButton("<", command, 95, 150, 85, 20);
        
        addButton("sqrt", command, 5, 175, 85, 20);
        addButton("pow(x,2)", command, 95, 175, 85, 20);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        TextEvent t = new TextEvent(getContentPane(), 1);
    }

    private class OutputAction implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            String input = event.getActionCommand();
            if (start) {
                display.setText("");
                start = false;
            }
            display.setText(display.getText() + input);
        }
    }

    private class CommandAction implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            String command = event.getActionCommand();
            if (start) {
                if (command.equals("-")) {
                    display.setText(command);
                    start = false;
                } else {
                    lastCom = command;
                }
            }else if (command.equals("sqrt")) {
                display.setText("" + Math.sqrt(Double.parseDouble(display.getText())));
                start = true;
            } else if (command.equals("pow(x,2)")) {
                display.setText("" + Math.pow(Double.parseDouble(display.getText()), 2));
                start = true;
            }else if (command.equals("с")) {
                display.setText("");
                start = true;
            }else if (command.equals("<")) {
                //???
            } else {
                calculate(Double.parseDouble(display.getText()));
                lastCom = command;
                start = true;
            }
        }
    }

    public void calculate(double x) {
        if (lastCom.equals("+")) {
            result += x;
            display.setText("" + result);
        } else if (lastCom.equals("-")) {
            result -= x;
            display.setText("" + result);
        } else if (lastCom.equals("*")) {
            result *= x;
            display.setText("" + result);
        } else if (lastCom.equals("/")) {
            if (x == 0) {
                display.setText("Деление на ноль");
            } else {
                result /= x;
                display.setText("" + result);
            }
        } else if (lastCom.equals("=")) {
            result = x;
            display.setText("" + result);
        }
    }
    public static void main(String[] args) {
        new MyCalc();
    }
}

PM MAIL   Вверх
Mirkes
Дата 2.11.2013, 23:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



У Вас очень странная обработка комманд
Код

            String command = event.getActionCommand();
            if (start) {
                if (command.equals("-")) {
                    display.setText(command);
                    start = false;
                } else {
                    lastCom = command;
                }

Посему в состоянии "start" обрабатывается только унарный минус.
Отследите логику в данной части программы

На первый взгляд тупая перестановка двух if дала нужный результат. Привожу только измененный метод
Код

    private class CommandAction implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            String command = event.getActionCommand();
            if (command.equals("-")) {
                if (start) {
                    display.setText(command);
                    start = false;
                } else {
                    lastCom = command;
                }
            } else if (command.equals("sqrt")) {
                display.setText("" + Math.sqrt(Double.parseDouble(display.getText())));
                start = true;
            } else if (command.equals("pow(x,2)")) {
                display.setText("" + Math.pow(Double.parseDouble(display.getText()), 2));
                start = true;
            } else if (command.equals("?")) {
                display.setText("");
                start = true;
            } else if (command.equals("<")) {
                //???
            } else {
                calculate(Double.parseDouble(display.getText()));
                lastCom = command;
                start = true;
            }
        }
    }



Это сообщение отредактировал(а) Mirkes - 2.11.2013, 23:50


--------------------
Mirkes
PM MAIL   Вверх
jelum
Дата 16.11.2013, 03:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Можно так:
Код

    private class CommandAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent event) {
            String command = event.getActionCommand();
            if (command.equals("pow(x,2)")) {
                result = Math.pow(Double.parseDouble(display.getText()), 2);
                display.setText("" + result);
                lastCom = "=";
                start = true;
            } else if (command.equals("sqrt")) {
                result = Math.sqrt(Double.parseDouble(display.getText()));
                display.setText("" + result);
                lastCom = "=";
                start = true;
            } else if (command.equals("с")) {
                lastCom = "=";
                result = 0.0;
                display.setText("0");
                start = true;
            } else if (command.equals("<")) {
                String fullNumber = display.getText();
                display.setText(fullNumber.substring(0, fullNumber.length() - 1));
            } else {
                double second = Double.parseDouble(display.getText());
                if (lastCom == null) {
                    display.setText("" + second);
                    result = second;
                } else {
                    calculate(second);
                }
                start = true;
                if (!command.equals("=")) {
                    lastCom = command;
                }
            }
        }
    }
    public void calculate(double x) {
        if (lastCom == null) {
            result = x;
            display.setText("" + result);
            return;
        }
        switch (lastCom) {
            case "+":
                result += x;
                display.setText("" + result);
                break;
            case "-":
                result -= x;
                display.setText("" + result);
                break;
            case "*":
                result *= x;
                display.setText("" + result);
                break;
            case "/":
                if (x == 0) {
                    display.setText("Деление на ноль");
                } else {
                    result /= x;
                    display.setText("" + result);
                }
                break;
            case "=":
                result = x;
                display.setText("" + result);
                break;
        }
        lastCom = "=";
    }


Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0713 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.