Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создаю калькулятор! нужна помощь ), Создаю калькулятор! на основе класса 
:(
    Опции темы
XPyCT
Дата 23.7.2008, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



проблема в следующем! если в нормальном калькуляторе ввести с клавы  первое значение 10 потом нажать минус 1 а потом ентер то с каждым нажатием ентера результирующее значение уменьшается на 1! А у меня ток один раз а потом  либо  0 либо результирующее значение
привожу код:

размещение класса
ClassCalc.H
Код

//---------------------------------------------------------------------------

#ifndef ClassCalkH
#define ClassCalkH

//---------------------------------------------------------------------------
class TCalcPressKey
{
 public:
 
 char SIMVOL;
 float PERVOE_ZNACHENIE,VTOROE_ZNACHENIE,TOTAL,TEMP_BUUF;
 int COUNT_PRESS_BUTTON_NUMBER, COUNT_PRESS_SIMVOL_NUMBER;
 CalcPressKey();


 float  KALKULATOR(char SIMVOL, float PERVOE_ZNACHENIE,float VTOROE_ZNACHENIE,float TOTAL,float TEMP_BUUF);
};

//---------------------------------------------------------------------------
#endif



размещение методов
ClassCalc.cpp
Код

//---------------------------------------------------------------------------


#pragma hdrstop

#include "ClassCalk.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

//---------------------------------------------------------------------------
float TCalcPressKey::KALKULATOR(char SIMVOL, float PERVOE_ZNACHENIE,
                  float VTOROE_ZNACHENIE,float TOTAL,float TEMP_BUUF)
{
TEMP_BUUF = PERVOE_ZNACHENIE;
      switch(SIMVOL)
{
case '-':TOTAL = PERVOE_ZNACHENIE - VTOROE_ZNACHENIE; break;  // Minus
case '+':TOTAL = PERVOE_ZNACHENIE + VTOROE_ZNACHENIE; break;
case '*':TOTAL = PERVOE_ZNACHENIE * VTOROE_ZNACHENIE; break;
case '/':TOTAL = PERVOE_ZNACHENIE / VTOROE_ZNACHENIE; break;
}
    return TOTAL;
}
TCalcPressKey::CalcPressKey()
{
  PERVOE_ZNACHENIE = 0;
  VTOROE_ZNACHENIE = 0;
  TOTAL = 0;
  COUNT_PRESS_BUTTON_NUMBER = 0;
  COUNT_PRESS_SIMVOL_NUMBER = 0;
  SIMVOL = ' ';
}




заголовочный файл главной формы

Код

--------------------------------------------------------------------------

//---------------------------------------------------------------------------

#ifndef CalcUnitH
#define CalcUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <XPMan.hpp>
#include "ClassCalk.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TEdit *Edit1;
    TButton *BT0;
    TButton *BTPoint;
    TButton *BTEgal;
    TButton *BT1;
    TButton *BT2;
    TButton *BT3;
    TButton *BT4;
    TButton *BT5;
    TButton *BT6;
    TButton *BT7;
    TButton *BT8;
    TButton *BT9;
    TButton *BTPlus;
    TButton *BTDelenie;
    TButton *BTMP;
    TButton *BTMinus;
    TButton *BTUmnuj;
    TButton *BTClear;
    TXPManifest *XPManifest1;
    void __fastcall Edit1Change(TObject *Sender);
    void __fastcall Edit1KeyPress(TObject *Sender, char &Key);
    void __fastcall Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
//=========MyClass Declaration====Start=================================
 TCalcPressKey CalcPressKey();
 TCalcPressKey  MY_CALK;
 float  KALKULATOR(char SIMVOL, float PERVOE_ZNACHENIE,float VTOROE_ZNACHENIE,float TOTAL,float TEMP_BUUF);

 //=========MyClass Declaration====End =================================


};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif




Срр файл главной формы

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<winuser.h>  SysUtils.hpp
#include "SysUtils.hpp"


#include "CalcUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
TForm1* CalcPressKey();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
MY_CALK.COUNT_PRESS_BUTTON_NUMBER=1;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{



//-----------------najatie ravno----------------end

if ((Key >= '0') && (Key <= '9'))
{

 return ;
}
else
 Key = 0;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
//-----------------Najatie +,-,*,/, ----------------Start
if(Key == 189)
   {
   MY_CALK.COUNT_PRESS_BUTTON_NUMBER = 2;
   MY_CALK.SIMVOL = '-';
   MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
   Edit1->Text=' ';
   }
//-------------------------------------------------
   if(Key == 187)
   {
   MY_CALK.COUNT_PRESS_BUTTON_NUMBER = 2;
   MY_CALK.SIMVOL = '+';
   MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
   Edit1->Text=' ';
   }
//-------------------------------------------------
   if(Key == 191)
   {
   MY_CALK.COUNT_PRESS_BUTTON_NUMBER = 2;
   MY_CALK.SIMVOL = '/';
   MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
   Edit1->Text=' ';

   }
//-------------------------------------------------
   if(Key == 56)
   {
   MY_CALK.COUNT_PRESS_BUTTON_NUMBER = 2;
   MY_CALK.SIMVOL = '*';
   MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
   Edit1->Text=' ';
   }
//-----------------Najatie +,-,*,/, ------------End

//<-------------------------------------------------------------------->

//-----------------najatie ravno--------------start
if(Key ==13)
  {

   int count=1;
   if(MY_CALK.COUNT_PRESS_BUTTON_NUMBER ==1 && count==1)
      {

        MY_CALK.VTOROE_ZNACHENIE= StrToFloat(Edit1->Text);
        MY_CALK.TEMP_BUUF = MY_CALK.VTOROE_ZNACHENIE;
        MY_CALK.TOTAL=MY_CALK.KALKULATOR(MY_CALK.SIMVOL,MY_CALK.PERVOE_ZNACHENIE,MY_CALK.VTOROE_ZNACHENIE,
                                            MY_CALK.TOTAL,MY_CALK.TEMP_BUUF);

        Edit1->Text= FloatToStr(MY_CALK.TOTAL);
        MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
        MY_CALK.VTOROE_ZNACHENIE = MY_CALK.TEMP_BUUF;
        ShowMessage("Srabotal IF");
        count=2;
      }
       if(MY_CALK.COUNT_PRESS_BUTTON_NUMBER ==1 && count==2)
      {
         ShowMessage("Srabotal else");
          MY_CALK.VTOROE_ZNACHENIE = MY_CALK.TEMP_BUUF;
          MY_CALK.TOTAL=MY_CALK.KALKULATOR(MY_CALK.SIMVOL,MY_CALK.PERVOE_ZNACHENIE,MY_CALK.VTOROE_ZNACHENIE,
                                            MY_CALK.TOTAL,MY_CALK.TEMP_BUUF);
          Edit1->Text= FloatToStr(MY_CALK.TOTAL);
          MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
          count = 1;
      }
      }



}
//---------------------------------------------------------------------------



за ранее прошу не  пинать! ток начал изучать классы




Это сообщение отредактировал(а) XPyCT - 23.7.2008, 19:07
PM MAIL Skype   Вверх
XPyCT
Дата 24.7.2008, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мне думается трабла в нажатии на ентер! значение переменной постоянно задается из едита! как с этим боротся!
PM MAIL Skype   Вверх
petlyura
Дата 24.7.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(XPyCT @ 24.7.2008,  09:09)
мне думается трабла в нажатии на ентер! значение переменной постоянно задается из едита! как с этим боротся!

Глянул на вскидку. Попробуй убрать строку: 
float TCalcPressKey::KALKULATOR(char SIMVOL, float PERVOE_ZNACHENIE,
                  float VTOROE_ZNACHENIE,float TOTAL,float TEMP_BUUF)
{
//TEMP_BUUF = PERVOE_ZNACHENIE; // закомментируй
      switch(SIMVOL)
{
case '-':TOTAL = PERVOE_ZNACHENIE - VTOROE_ZNACHENIE; break;  // Minus
case '+':TOTAL = PERVOE_ZNACHENIE + VTOROE_ZNACHENIE; break;
case '*':TOTAL = PERVOE_ZNACHENIE * VTOROE_ZNACHENIE; break;
case '/':TOTAL = PERVOE_ZNACHENIE / VTOROE_ZNACHENIE; break;
}
    return TOTAL;
}
PM MAIL   Вверх
XPyCT
Дата 24.7.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(petlyura @ 24.7.2008,  17:52)
Цитата(XPyCT @ 24.7.2008,  09:09)
мне думается трабла в нажатии на ентер! значение переменной постоянно задается из едита! как с этим боротся!

Глянул на вскидку. Попробуй убрать строку: 
float TCalcPressKey::KALKULATOR(char SIMVOL, float PERVOE_ZNACHENIE,
                  float VTOROE_ZNACHENIE,float TOTAL,float TEMP_BUUF)
{
//TEMP_BUUF = PERVOE_ZNACHENIE; // закомментируй
      switch(SIMVOL)
{
case '-':TOTAL = PERVOE_ZNACHENIE - VTOROE_ZNACHENIE; break;  // Minus
case '+':TOTAL = PERVOE_ZNACHENIE + VTOROE_ZNACHENIE; break;
case '*':TOTAL = PERVOE_ZNACHENIE * VTOROE_ZNACHENIE; break;
case '/':TOTAL = PERVOE_ZNACHENIE / VTOROE_ZNACHENIE; break;
}
    return TOTAL;
}

спс сделал ! закоментировал! проблема все равно осталась
PM MAIL Skype   Вверх
XPyCT
Дата 28.7.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ау народ!
PM MAIL Skype   Вверх
mrbrooks
Дата 28.7.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Замечание с ходу - для математики лучше использовать тип double вместо float а так надо переварить что ты тут навоял  smile 
PM MAIL   Вверх
XPyCT
Дата 28.7.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrbrooks @ 28.7.2008,  12:46)
Замечание с ходу - для математики лучше использовать тип double вместо float а так надо переварить что ты тут навоял  smile

да это я знаю! не суть  щас это

вот к предположим что на форме ток 1 едит и все!
как сэметировать  например ввод первого значения потом нажатие одного из символов например + и нажатее ентер

к примеру если в виндовском калькуляторе  с клаввы ввести 10 потом нажать +  и потом ентер то получим 20 еще раз ентер  и будет 30!

вот это я и просил! но

нужно отследить после + было ли введено в едит значение повторно!
если да то уже работать с двумя значениями двух переменных вот и все суть
PM MAIL Skype   Вверх
fish9370
Дата 28.7.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



< число > < действие > < число > < = > < ответ >
      X1                                       X2

AnsiString X1, X2;

if(X2 == "")
         < ответ > = X1.ToInt() < действие > X1.ToInt();
else
         < ответ > = X1.ToInt() < действие > X2.ToInt();


ps. на самом деле стандартный калькулятор это очень просто - не нужно проверять наличие всех скобок, нет приоритетов.. когда закончишь попробуй сделать калькулятор для сложных выражений..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
mrbrooks
Дата 29.7.2008, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(fish9370 @ 28.7.2008,  22:54)

ps. на самом деле стандартный калькулятор это очень просто - не нужно проверять наличие всех скобок, нет приоритетов.. когда закончишь попробуй сделать калькулятор для сложных выражений..

Ага проще не бывает  smile  особенно радует баг многих самописных калькуляторов на ввод разделителей.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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