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

Поиск:

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


Шустрый
*


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

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



нашёл на этом сайте код калькулятора. Хочу добавить к нему тригонометрические функции.
Но при вводе числа он вычесляет,только при повторной попытке.
как сделать так чтобы он вычислял с первого раза 
немного изменённый мною код
Код

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Calculator extends JFrame {
   public Calculator() {
       setTitle("Calculator");
       getContentPane().add(new CalculatorPanel());
   }

   public static void main(String[] args) {
       Calculator frame = new Calculator();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setBounds(500,500,250,200);
       frame.show();
   }
}

class CalculatorPanel extends JPanel {

   private JLabel display;
   private JPanel panel;
   private double result;
   private String lastCommand;
   private boolean start;

   public CalculatorPanel() {
       setLayout(new BorderLayout());

       result = 0;
       lastCommand = "=";
       start = true;
       display = new JLabel("0");

       add(display, BorderLayout.NORTH);

       ActionListener insert = new InsertAction();
       ActionListener command = new CommandAction();

       panel = new JPanel();
       panel.setLayout(new GridLayout(5, 4));

       addButton("sin", command);
       addButton("cos", command);
       addButton("tan", command);
       addButton("sqrt", command);
       

       addButton("7", insert);
       addButton("8", insert);
       addButton("9", insert);
       addButton("/", command);

       addButton("4", insert);
       addButton("5", insert);
       addButton("6", insert);
       addButton("*", command);

       addButton("1", insert);
       addButton("2", insert);
       addButton("3", insert);
       addButton("-", command);

       addButton("0", insert);
       addButton(".", insert);
       addButton("=", command);
       addButton("+", command);


       
        

       add(panel, BorderLayout.SOUTH);
   }

   private void addButton(String label, ActionListener listener) {
       JButton button = new JButton(label);
       button.addActionListener(listener);
       panel.add(button);
   }

   private class InsertAction 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 evt) {
           String command = evt.getActionCommand();

           if (start) {
               if (command.equals("-")) {
                   display.setText(command);
                   start = false;
               } else
                   lastCommand = command;
           } else {
               calculate(Double.parseDouble(display.getText()));
               lastCommand = command;
               start = true;
           }
       }
   }

   public void calculate(double x) {    
   if (lastCommand.equals("+"))
           result += x;
       else if (lastCommand.equals("-"))
           result -= x;
       else if (lastCommand.equals("*"))
           result *= x;
       else if (lastCommand.equals("/"))
           result /= x;

else if (lastCommand.equals("sin"))
              result = Math.sin(x);
          

else if (lastCommand.equals("cos"))
           result = Math.cos(x);
       

else if (lastCommand.equals("tan"))
           result = Math.tan(x);
else if (lastCommand.equals("sqrt"))
           result = Math.sqrt(x);


       else if (lastCommand.equals("=")) result=x;
       display.setText("" + result);
   }
}




с арифметическими действиями всё в порядке 
PM MAIL   Вверх
powerOn
Дата 16.5.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(f999t1 @  16.5.2006,  21:49 Найти цитируемый пост)
Но при вводе числа он вычесляет,только при повторной попытке.

Это как понять? 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
f999t1
Дата 16.5.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



запускаешь калькулятор , жмёш 0 cos (результат  0), жмёшь 0 и cos (результат 1), жмёшь 0 sin (результат 1), жмёшь 0 sin (результат 0) 
PM MAIL   Вверх
powerOn
Дата 16.5.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Хм.. Здесь похоже команда на один шаг отстаёт. Т.е. сначало команду выполняют, а потом определяют что была за команда. Вот что поменяй:

Код

private class CommandAction implements ActionListener {
       public void actionPerformed(ActionEvent evt) {
           String command = evt.getActionCommand();
           if (start) {
               if (command.equals("-")) {
                   display.setText(command);
                   start = false;
               } else
                   lastCommand = command;
           } else {
// Это код будет изменен ------------------------------------------
               calculate(Double.parseDouble(display.getText()));
               lastCommand = command;
//--------------------------------------------------------------------------
               start = true;
           }
       }
   }


на:

Код

private class CommandAction implements ActionListener {
       public void actionPerformed(ActionEvent evt) {
           String command = evt.getActionCommand();
           if (start) {
               if (command.equals("-")) {
                   display.setText(command);
                   start = false;
               } else
                   lastCommand = command;
           } else {
// Это код был изменен ------------------------------------------
               lastCommand = command;  
               calculate(Double.parseDouble(display.getText()));
//--------------------------------------------------------------------------
               start = true;
           }
       }
   }


вроде работать у меня как надо стало...

Добавлено @ 21:17 
СТОП!! Я жестоко наврал: тригонометрические теперь вычисляются,  но  про стые перестали !!!!  smile  

Это сообщение отредактировал(а) MoonCat - 16.5.2006, 21:13


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
powerOn
Дата 16.5.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



уф. Вот в чем проблема: Есть операции унарные (1 аргумент : sin, cos ...), а есть бинарные (2 аргумента  +, -, /, * ...) - это не учитывается.
Этот вариант был заточен только под бинарные операции, поэтому прога запаздывает, а вернее ждет ввода следующего агрумента вместо выполнения унарной операции.
Можно попробовать так исправить, но я склоняюсь к более глубоким изменениям...

Код

private class CommandAction implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
            String command = evt.getActionCommand();
            if (start) {
                if (command.equals("-")) {
                    display.setText(command);
                    start = false;
                } else {
                    lastCommand = command;
                }
            } else {
                if (command.equals("sin") || command.equals("cos") || command.equals("tan") || command.equals("sqrt")) {
                    lastCommand = command;
                    calculate(Double.parseDouble(display.getText()));
                    lastCommand = "=";
                }
                else {
                     calculate(Double.parseDouble(display.getText()));
                     lastCommand = command;
                }
               
                start = true;
            }
        }
    }
 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
f999t1
Дата 16.5.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



только cos sin любого числа получается равным 0

Добавлено @ 22:43 
упс... Это у меня была ошибка.
она действительно вычесляет с первого раза.
а как сделать, что бы она вычисляла sin результата,
(sin того что появилось на экране в результате очередного вычисления),
а не вбивать числа на клавиатуре. 
PM MAIL   Вверх
powerOn
Дата 16.5.2006, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(f999t1 @  16.5.2006,  23:33 Найти цитируемый пост)
а как сделать, что бы она вычисляла sin результата,


там я видел переменную result - результат последней операции, от неё танцевать надо. Но еще раз отмечу ИМХО этот калькулятор заточен под + - * / - бинарные операции. Его дорабывывать до унарных уже с выкрутасами придется. Чесно скажу, я бы калькулятор этот перепроектировал. Создал бы эмуляцию регистров. Определил правила выпонения операций. Но это другой, большой вопрос.
 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
ShamanTrirukiy
Дата 17.5.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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