Kalkulator w C++ Builder.

0

Witam

Długo naszukałem się porządnego forum o programowaniu, aż w końcu trafiłem do was :)
Mój mały skromy problem polega na tym, że potrzebuję pomocy w napisaniu kalkulatora w C++ Builder. Kalkulator ma być graficzny rzecz jasna. A więc przejdźmy do rzeczy - kalkulator graficznie już zrobiłem. Posiada on przyciski od 0 do 9, znaki + - / * i znak równości =, oraz przecinek. Tyle w tym kalkulatorze mi wystarczy. Przyciski numeryczne mam oprogramowane (myślę, że dobrze ), oraz znaki działań (bez znaku równa się =). Nie wiem, jak mam oprogramować przyciski w ten sposób, aby podanie dwóch liczb pokazało wynik po kliknięciu na znak równości. Podaję kod mojego kalkulatora, tyle ile udało mi się zrobić. Jeśli ktoś potrafi, prosiłbym o pomoc w rozwinięciu tego kodu tak, żeby ten kalkulator działał. Proszę o pomoc i podaję kod:

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

#include <vcl.h>
#pragma hdrstop

#include "Kalk1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button17Click(TObject *Sender)
{
Edit1->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'1';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'2';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'3';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'4';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'5';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'6';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'7';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'8';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'9';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button10Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'0';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button15Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'+';
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button14Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'-';
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button13Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'/';
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button12Click(TObject *Sender)
{
Edit1->Text=Edit1->Text+'*';
}
//---------------------------------------------------------------------------
0

Obejrzyj sobie jak działa normalny kalkulator.

0

No to tak. Stwórz dwie zmienne. Tymczasową i długotrwałą. W tymczasowej trzymaj tylko i wyłącznie liczbę, którą właśnie podaje użytkownik, długoterminową zamieniaj wedle poleceń. Jeśli to pierwsza podawana liczba - zamień jej wartość, jeśli to któraś z kolei - wykonaj działanie takie, na jakie wskazuje wcześniej wciśnięty przycisk i zapamiętaj jaki jest teraz wciskany. Po naciśnięciu przycisku przetrzymuj informacje o tym, jaki przycisk został naciśnięty a po naciśnięciu kolejnego (nie cyfry) wykonuj nakazaną operację. W przypadku, gdy zostanie naciśnięty przycisk z znakiem równości, po prostu wrzuć do okienka wyświetlającego tekst zmienną długoterminową i zeruj stan kalkulatora (poza okienkiem lub okienkiem i kilkoma innymi zmiennymi). Możesz dodać różne dodatki, typu "jeśli naciśniesz po znaku równości nie cyfrę to dalej operujesz na uzyskanej już liczbie", albo "log wyników, czy działań".
Poza tym, jako zerowy stan kalkulatora nierozbudowanego można przyjąć "1 *" i wtedy nie będzie trzeba pisać dodatkowych linijek "do pierwszej liczby", wszystko jest zależne od Twoich chęci.
Powodzenia :)

0

Dzięki kolego za wyczerpującą wypowiedź, ale jestem kompletnie zielony. Pomógłbyś rozbudować ten kod, nakierować mnie ? Proszę i dziękuję :)

0

To potrafisz mi pomóc go przerobić? Na prawdę jestem kompletnym laikiem i dlatego piszę w Newbie.

0

Ja moge Ci "pomóc" za 100 zł.

0

No to po co jest to forum, jak nikt nawet nie potrafi nakierować? I odpowiadajcie normalnie, a nie coś dopisujecie bo się domyślać trzeba.

0

Dobra dobra, nie musicie mnie od razu wyzywać. Nie chcę gotowca - jutro przysiąde do tego, tak jak to mówiłem Tacetowi. I o ewentualnych problemach będę się was pytać.

0

Nie zedytowałem tych buttonów, ponieważ tak mnie nauczono w szkole, aby trzymać się nazw takich, jakie są. Dlaczego? Dlatego, aby później przy edycji nie mieć problemów z przyciskami. Tak nam tłumaczono. Proszę zrozum mnie :)

0

Dlatego, aby później przy edycji nie mieć problemów z przyciskami.

Zmienisz zdanie po napotkaniu Button582 i próby zorientowania się, do czego on służy...

0

Gdy będę miał dużą liczbę buttonów to oczywiście zmienię ich nazwy. Ale tutaj jest ich bardzo mało.

Nazwy zostały zmienione. Czy teraz ktoś potrafi stwierdzić, dlaczego ten kalkulator liczy nie tak, jak powinien?

0
```cpp void __fastcall TForm1::Mnozenie(TObject *Sender) { if (Edit1->Text!="") { Label1->Caption=((TButton*)Sender)->Caption; b=true; } } ```

Na mój gust tu masz błąd. Bez tego ifa powinno być dobrze.

void __fastcall TForm1::Mnozenie(TObject *Sender)
{
  Label1->Caption=((TButton*)Sender)->Caption;
  b=true;
}

Sorry mój błąd.

void __fastcall TForm1::Mnozenie(TObject *Sender)
{
 if (Edit1->Text!="")
{
Label1->Caption=((TButton*)Sender)->Caption;
b=true;
Edit1->Text="";
  }
}

To już powinno działać.

Chociaż nie wiem czemu używasz labeli do przechowywania jakichkolwiek informacji. Label powinien być od wyświetlania takowych.

I spróbuj wpisać do swojego kalkulatora liczbę 2.31

0

Co do przecinków to zmienne x i y daj typu float i poszukaj czegoś na kształt StrToFloat.

0

Tam gdzie deklarujesz zmienne (jeśli nie wiesz co to deklaracja to poczytaj jakiś kurs) to masz prawdopodobnie

int x;
int y;

zmień na

float x;
float y;

i funkcję

void __fastcall TForm1::Cyfra7(TObject *Sender)
{
if (b==false)
{
Edit1->Text=Edit1->Text+((TButton*)Sender)->Caption;
x=StrToInt(Edit1->Text);
}
else
{
Edit1->Text=Edit1->Text+((TButton*)Sender)->Caption;
y=StrToInt(Edit1->Text);
}
}

zmień na

void __fastcall TForm1::Cyfra7(TObject *Sender)
{
if (b==false)
{
Edit1->Text=Edit1->Text+((TButton*)Sender)->Caption;
x=StrToFloat(Edit1->Text);
}
else
{
Edit1->Text=Edit1->Text+((TButton*)Sender)->Caption;
y=StrToFloat(Edit1->Text);
}
}

Z tym, że nie wiem czy w c++ builder istnieje funkcja StrToFloat. Ale jeśli takowej nie ma to możesz poszukać odpowiednika w google.

0

Witam was ponownie

Mam taki mały problem z moim "urządzonkiem". Mianowicie zmieniłem trochę kod równości na case i wygląda to tak:

b = StrToFloat(Edit1->Text);
AnsiString c = 0;
switch (znak)    //wybór znaku
{
case '+' : c = FloatToStr(x+y); break; 
case '-' : c = FloatToStr(x-y); break;
case '*' : c = FloatToStr(x*y); break;
case '/' :c = FloatToStr(x/y); break;

}
Edit1->Text = c;

Działanie równości wykonywane jest poprawnie, lecz chciałbym, aby to wszystko było było zastąpione poleceniem "if" zamiast "case. Dodatkowo mam drugi problem - nie zmienia mi znaku działania na inny, gdy go wcisnę. Dla przykładu: wpisuję 2+ i teraz nie chcę dodawać, tylko zmienić wybór np na odejmowanie. Wciskam klawisz innego działania to się wykrzacza. Następnie nie potrafię dojść do tego, jak ma zapamiętywać mi działania. Dla przykładu. Dodaję 2*6 i nie daję równa się, teraz chcę np podzielić przez 3 to nie trzymam w wyniku 4, tylko zupełnie inny wynik. Potraficie nakierować na właściwą drogę?

0

pokaz cały kod

0

Potraficie nakierować na właściwą drogę?

ONP.

0

Artus2007 17 minut temu
Dzięki za szybką odpowiedź. Pozwól, że kod wyślę Ci na priv? Nie chcę, aby był dostępny w sieci, sam rozumiesz.

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

    include <vcl.h>
    pragma hdrstop



    include "kalkulator1.h"


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

    pragma package(smart_init)
    pragma resource "*.dfm"


TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra0(TObject *Sender)
{
   Edit1->Text=Edit1->Text+0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra1(TObject *Sender)
{
Edit1->Text=Edit1->Text+1;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra2(TObject *Sender)
{
 Edit1->Text=Edit1->Text+2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::mnoz(TObject *Sender)
{
przecinek=false; //po dodaniu tej funkcji będę mógł dodac od nowa przecinek po wyczyszczeniu Edita
x=StrToFloat(Edit1->Text); //StrToFloat zamieni tekst na liczbę,przypisują do x podany znak (tutaj *)
znak='*';
Edit1->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::suma(TObject *Sender)
{
y = StrToFloat(Edit1->Text); //StrToFloat zamieni tekst na liczbę
AnsiString z = 0;
switch (znak)    //wybór znaku
{
case '+' : z = FloatToStr(x+y); break;  //funkcja case pozwala dokona wyboru (czy chcę dodac, odjąc, podzielic lub pomnożyc)
case '-' : z = FloatToStr(x-y); break;
case '*' : z = FloatToStr(x*y); break;
case '/' : z = FloatToStr(x/y); break;

}
Edit1->Text = z;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra3(TObject *Sender)
{
 Edit1->Text=Edit1->Text+3;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra4(TObject *Sender)
{
 Edit1->Text=Edit1->Text+4;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra5(TObject *Sender)
{
 Edit1->Text=Edit1->Text+5;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra6(TObject *Sender)
{
 Edit1->Text=Edit1->Text+6;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra7(TObject *Sender)
{
 Edit1->Text=Edit1->Text+7;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra8(TObject *Sender)
{
 Edit1->Text=Edit1->Text+8;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cyfra9(TObject *Sender)
{
 Edit1->Text=Edit1->Text+9;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::dziel(TObject *Sender)
{
przecinek=false;
x=StrToFloat(Edit1->Text);  //StrToFloat zamieni tekst na liczbę
znak='/';
Edit1->Text="";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::dodaj(TObject *Sender)
{
przecinek=false;
x=StrToFloat(Edit1->Text);
znak='+';
Edit1->Text="";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::odejmuj(TObject *Sender)
{
przecinek=false;
x=StrToFloat(Edit1->Text);
znak='-';
Edit1->Text="";
}
//---------------------------------------------------------------------------



void __fastcall TForm1::czysc(TObject *Sender)
{
przecinek=false;
x,y,z=0;
Edit1->Clear();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::przecinek(TObject *Sender)
{
if (!przecinek)
{
AnsiString moja_cyfra=Edit1->Text;  //AnsiString przechowa dany znak lub liczbę (tutaj przecinek,)
moja_cyfra +=',';
Edit1->Text=moja_cyfra;
przecinek=true;  //uaktywni przecinek
}
}

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

moje zmienne w pliku .h to:

  float x,y ;  
  float z ;    
  char znak;  
  bool przecinek ;

Nie nie rozumiem czemu nie chcesz by był dostępny w sieci.

0

To teraz potrafiłbyś mi pomóc ?

0

Panowie poradziłem już sobie z tymi przyciskami, brakuje mi tylko jednej rzeczy - jak zaprogramowac przycisk C aby czyścił zmienne ? bo on zapamietuje ostatnie dzialanie po wpisaniu nowego. np 2+2 = 8, wykasuje C i zapamieta ta 8, że jak dam 2*2 to mnoze jeszcze razy to 8

0

Dobra kalkulator mam już zrobiony. Podałem kod, w sumie babubabu musiał go podać (nie wiem czemu ?) ale to nie istotne, bo kod i tak przerobiłem, dodałem kilka zmiennych i kilka warunków do znaków i wszystko działa prawidłowo. OD wczoraj nikt nie chciał pomóc mimo, iż prawie cały gotowiec był na forum, więc kodu już nie podam. Dzieki i pozdro

1 użytkowników online, w tym zalogowanych: 0, gości: 1