Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Создаю калькулятор! нужна помощь )


Автор: XPyCT 23.7.2008, 19:06
проблема в следующем! если в нормальном калькуляторе ввести с клавы  первое значение 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 24.7.2008, 09:09
мне думается трабла в нажатии на ентер! значение переменной постоянно задается из едита! как с этим боротся!

Автор: 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;
}

Автор: XPyCT 24.7.2008, 19:54
Цитата(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;
}

спс сделал ! закоментировал! проблема все равно осталась

Автор: XPyCT 28.7.2008, 10:09
ау народ!

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

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

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

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

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

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

нужно отследить после + было ли введено в едит значение повторно!
если да то уже работать с двумя значениями двух переменных вот и все суть

Автор: fish9370 28.7.2008, 22:54
< число > < действие > < число > < = > < ответ >
      X1                                       X2

AnsiString X1, X2;

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


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

Автор: mrbrooks 29.7.2008, 07:46
Цитата(fish9370 @ 28.7.2008,  22:54)

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

Ага проще не бывает  smile  особенно радует баг многих самописных калькуляторов на ввод разделителей.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)