c++ builder podstawy

0

Witam, czasem w c (konsolowo) pisze proste programy do obliczeń, nie jestem programistą ale próbuje zrobić program w środowisku graficznym, jako narzędzie wybrałem c++ builder 6.0 jednak cały czas napotykam na przeciwności ;) aktualnie mam problem ze sprawdzeniem czy w edit zostały wprowadzone liczby, w dodatku z danego zakresu, i nie wiem jak to zrobić ;/ aktualnie kod przycisku wygląda tak:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int liczba=StrToInt(Edit1->Text);
String  para="parzysta";
String  niepara="nieparzysta";
  if(liczba>36)  warn->ShowModal();
 if(liczba%2==0) Label2->Caption = para;
 if(liczba%2==1)   Label2->Caption = niepara;
 Edit1->Text="los";


} 

kolejna sprawa to taka że nie wiem gdzie mam ładować wszystkie operacje występujące w programie - do przycisku, do komponentu który wyświetla wynik, do maina? chodź i tak jako takiej funkcji main nie widzę nigdzie w kodzie ;/ . Jest na forum ktoś skłonny do udzielenia mi paru wskazówek ? :)
prosił bym o powstrzymanie się od komentarzy typu "ucz się od podstaw" bo nauka tego mi się na wiele nie przyda, po prostu chcę pobieżnie poznać to środowisko- można powiedzieć że bardziej z ciekawości ;)

0

tzn wiem jak zrobić to sposobem łopatologicznym, sprawdzając znak po znaku, ale jak sprawdzić czy dany ciąg znaków jest ciągiem liczb całkowitych ?

0
  1. w borland C++ używaj AnsiString zamiast String

  2. to co wyzej zapisales, mozna napisac tak:
    if(liczba%2==0)
    Label2->Caption = "parzysta";
    else
    Label2->Caption = "nieparzysta";

  3. jesli chcesz sprawdzic czy dany tekst jest liczba, to albo sprawdzasz czy kazdy znak tekstu jest liczba albo probujesz konwertwoac na liczbe (tak jak masz w kodzie), z tym ze kod ktory moze wywolac blad opatulasz w try catch:
    int liczba;
    bool blad = false;
    try
    {
    liczba ==StrToInt(Edit1->Text);
    }
    catch(...)
    {
    blad = true;
    ShowMessage("Nie udalo sie skonwertowac!"); // <-- to mozesz wywalic
    }

  4. kod maina jest dostepny, ale w borlandzie najczesciej si go nie edytuje (chyba ze są warunki dla których nie chcesz tworzyć okna, chcesz je ukryc przy wlaczaniu lub cos w tym stylu). mozna go zobaczyc chyba tu: view->units albo cos takiego

  5. aplikacje wizualne najczesciej dzialaja na zasadzie: zdarzenie->reakcja, zatem zaznaczasz komponent ktory ma cos robic, szukasz w properties/events na co ma reagowac, klikasz dwa razy i piszesz co ma sie dziac. jesli potrzebujesz zmienne to albo dopisujesz je w klasie okna w main.h (czy jak tam sobie nazwales plik z klasa okna) albo gdzies na gorze kodu w main.cpp

0
krwq napisał(a)
  1. w borland C++ używaj AnsiString zamiast String

ok :)

krwq napisał(a)
  1. w borland C++ używaj AnsiString zamiast String
  2. to co wyzej zapisales, mozna napisac tak:
    if(liczba%2==0)
    Label2->Caption = "parzysta";
    else
    Label2->Caption = "nieparzysta";

w ten sposób wywalało mi błąd: [C++ Error] Unit1.cpp(26): E2379 Statement missing ;
ale to i tak jest tylko funkcja testowa programu, w zasadzie ma mieć inne działanie ;)

krwq napisał(a)
  1. jesli chcesz sprawdzic czy dany tekst jest liczba, to albo sprawdzasz czy kazdy znak tekstu jest liczba albo probujesz konwertwoac na liczbe (tak jak masz w kodzie), z tym ze kod ktory moze wywolac blad opatulasz w try catch:
    int liczba;
    bool blad = false;
    try
    {
    liczba ==StrToInt(Edit1->Text);
    }
    catch(...)
    {
    blad = true;
    ShowMessage("Nie udalo sie skonwertowac!"); // <-- to mozesz wywalic
    }

spróbowałem tak

 void __fastcall TForm1::Button1Click(TObject *Sender)
{
int liczba;
bool blad = false;

try
{
liczba ==StrToInt(Edit1->Text);

}

catch(...)
{
blad = true;
ShowMessage("zla tekst");

   }
String  para="parzysta";
String  niepara="nieparzysta";
  if(liczba>36)  warn->ShowModal();
 if(liczba%2==0) Label2->Caption = para;
 else (liczba%2==1)   Label2->Caption = niepara;
 Edit1->Text="los";


}

ale też mi wywaliło błędy
[C++ Error] Unit1.cpp(40): E2379 Statement missing ; nie widze nigdzie żeby mi średnika brakowało ;/
i
[C++ Warning] Unit1.cpp(44): W8004 'blad' is assigned a value that is never used <- a to drugi błąd

krwq napisał(a)
  1. kod maina jest dostepny, ale w borlandzie najczesciej si go nie edytuje (chyba ze są warunki dla których nie chcesz tworzyć okna, chcesz je ukryc przy wlaczaniu lub cos w tym stylu). mozna go zobaczyc chyba tu: view->units albo cos takiego
    Dzięki wielkie - znalazłem, ale nic tam nie ruszam
krwq napisał(a)
  1. aplikacje wizualne najczesciej dzialaja na zasadzie: zdarzenie->reakcja, zatem zaznaczasz komponent ktory ma cos robic, szukasz w properties/events na co ma reagowac, klikasz dwa razy i piszesz co ma sie dziac. jesli potrzebujesz zmienne to albo dopisujesz je w klasie okna w main.h (czy jak tam sobie nazwales plik z klasa okna) albo gdzies na gorze kodu w main.cpp

ok. mniej więcej łapie, tylko jeśli mam program podobny do tego gdzie podaje liczbę, naciskam przycisk, i w labelu dostaje wynik, to akcje prawidlowo przeprowadzam w labelu a za pomocą przycisku przekazuje dane? czy w przycisku i przekazuje tylko wyniki ?
Ale jakieś funkcji operacyjne(przetwarzające tylko dane z działania programu) moge oczywiście dopisać wyżej w programie?

ogolnie to chodzi o taki projekt- kiedys napisalem w c taki prosty wspomagacz gry w ruletke i chciał bym mu dodać jeszcze jeden system obstawiania (fibbonaciego) i zrobić go graficznie .

int fkolor(int los){
    int i ;
    int czerwone[19]={1,3,5,7,9,12,14,16,19,18,21,23,25,27,30,32,34,36};
    int czarne[19]={2,4,6,8,10,11,13,15,17,20,24,26,28,29,31,33,35};
    int k;
    int p=3;
   
    for(i=0;i<18;i++){
                      if((los==czerwone[i])&&(los!=0)) k=1;
                      if((los==czarne[i])&&(los!=0)) k=2;
                                          }
                    return k;
}

int analiza(int tw[6],int tryb){

int p;          /*minimalna ilosc podobnych trafien potrzebna do obstawiania*/
if(tryb==1)p=3;
if(tryb==2)p=4;

/* sprawdzenie warunku obstawiania 
if((tw[0]<=p)&&(tw[1]<=p)&&(tw[2]<=p)&&(tw[3]<=p)&&(tw[4]<=p)&&(tw[5]<=p)){
                                                                           printf("\nzakrec kolem, nie obstawiajac " );
                                      */                                     }
 if(tw[0]>p){
              printf("\npostaw   na czarne"); 
              if(tw[0]>(p+1)) printf(" ,podwoj stawke");
            
              }
else if(tw[1]>p) {
     printf("\npostaw   na czerwone ");
       if(tw[1]>(p+1)) printf(" ,podwoj stawke");
     
     }
 if(tw[2]>p){
             printf("\npostaw    nieparzyste");
             if(tw[2]>(p+1)) printf(", podwoj stawke");
          
              }
 else if(tw[3]>p){
      printf("\npostaw na parzyste");
        if(tw[3]>(p+1)) printf(",podwoj stawke");
    
      }
 if(tw[4]>p){
              printf("\npostaw  na od 19 do 36");
              if(tw[4]>(p+1)) printf(", podwoj stawke");
         
              }
 else if(tw[5]>p){   
     printf("\npostaw na od 1 do 18");
       if(tw[5]>(p+1)) printf(", podwoj stawke");
     
}
}
int main(){
    int tw[6];/* tablica wynikow 0.ilosc powturzen  1.czerwone 2.czarne 3.parzyste 4.nieparzyst 5.od 1 do 18 6.od 19 do 36 */
    system ("color F0");
    int i,j;
    int los;
    int kolor;
    int tryb,ilosc;
    
    printf("Podaj ilosc planowanych gier,\npamietaj nie graj za dlugo i\nnie wygrywaj za wiele bo kasyno \nzablokuje Ci konto: ");scanf("%d",&ilosc);

    printf("\nWybierz rodzaj gry: \t 1.RYZYKOWNY SZYBKI \t|\t 2.PEWNY: ");scanf("%d",&tryb);

    
      for (i=0;i<6;i++) tw[i]=0;
 printf("\nZakrec kolem bez obstawiania\n");
     for(j=0;j<ilosc;j++){
      
                         do{
                             printf("\n\n\n\n podaj wylosowana liczbe: ");
                              scanf("%d",&los);
                              if(los>36) printf("Zla liczba, sproboj jeszcze raz");
                          }while (los>36);
                          if(los==0) printf("\n \t ZERO- jeśli obstawiales podwajaj stawke. ");
                          else
                           kolor=fkolor(los);
                            if (kolor==1){                   
                                           tw[0]++;
                                           tw[1]=0;
                                         }
                            if (kolor==2){                   
                                        tw[0]=0;
                                        tw[1]++;
                                      }
                     
                     
      if((los%2==0)&&(los!=0)){
                   tw[2]++;
                   tw[3]=0;
                   }
      if (los%2==1){
                    tw[2]=0;
                    tw[3]++;
                    } 
      if(los<=18){
                  tw[4]++;
                  tw[5]=0;
                  }
      if(los>=19){
                  tw[4]=0;
                  tw[5]++;
                  }
                 
     
  /*     if(tw[0]>=1)   printf("red x %d \t",tw[0]);
      if(tw[1]>=1)   printf("black x %d \t", tw[1]);
      if(tw[2]>=1)   printf("even x %d \t",tw[2]);
      if(tw[3]>=1)   printf("odd x %d \t",tw[3]);
     if (tw[4]>=1)   printf("od 1 do 18 x %d \n\n",tw[4]);
     if( tw[5]>=1)   printf("od-19-do-36 x %d \n\n",tw[5]); */
    

     
     analiza(tw,tryb);
      
      }

getch();

}
 

wiem, kiepsko zakomentowany, sam się nie mogłem ostatnio w nim połapać ;)

0
krwq napisał(a)
  1. w borland C++ używaj AnsiString zamiast String

  2. to co wyzej zapisales, mozna napisac tak:
    if(liczba%2==0)
    Label2->Caption = "parzysta";
    else
    Label2->Caption = "nieparzysta";

  3. jesli chcesz sprawdzic czy dany tekst jest liczba, to albo sprawdzasz czy kazdy znak tekstu jest liczba albo probujesz konwertwoac na liczbe (tak jak masz w kodzie), z tym ze kod ktory moze wywolac blad opatulasz w try catch:
    int liczba;
    bool blad = false;
    try
    {
    liczba ==StrToInt(Edit1->Text);
    }
    catch(...)
    {
    blad = true;
    ShowMessage("Nie udalo sie skonwertowac!"); // <-- to mozesz wywalic
    }

  4. kod maina jest dostepny, ale w borlandzie najczesciej si go nie edytuje (chyba ze są warunki dla których nie chcesz tworzyć okna, chcesz je ukryc przy wlaczaniu lub cos w tym stylu). mozna go zobaczyc chyba tu: view->units albo cos takiego

  5. aplikacje wizualne najczesciej dzialaja na zasadzie: zdarzenie->reakcja, zatem zaznaczasz komponent ktory ma cos robic, szukasz w properties/events na co ma reagowac, klikasz dwa razy i piszesz co ma sie dziac. jesli potrzebujesz zmienne to albo dopisujesz je w klasie okna w main.h (czy jak tam sobie nazwales plik z klasa okna) albo gdzies na gorze kodu w main.cpp

0

Nie ma takiej konstrukcji w C++ :

 if(liczba%2==0)
 {
    Label2->Caption = para;
 }else(liczba%2==1)
 {
     Label2->Caption = niepara;
 }

Ale jest :

 if(liczba%2==0)
 {
    Label2->Caption = para;
 }else if(liczba%2==1)                    //   <---- if zabrakło
 {
     Label2->Caption = niepara;
 }

Stosuj klamry bo się robi bajzel ...
I po co wykonujesz operacje na liczbie gdy wystąpił błąd w konwertowaniu na int ?

//.....
catch(...)
{
blad = true;
ShowMessage("zla tekst");

  // tu już trzeba w*lać z tej funkcji  
      return ; 
 
   }
String  para="parzysta";
String  niepara="nieparzysta";
  if(liczba>36)  warn->ShowModal();
 if(liczba%2==0) Label2->Caption = para;
 else (liczba%2==1)   Label2->Caption = niepara;
 Edit1->Text="los";
 
 
}

Odwiedz:
http://programowanie.cal.pl/cyfbar/


0

Dzięki serdeczne za pomoc:) teraz tak wygląda ten przycisk ;)

 {
  int liczba ;
  bool blad = false;

  try{
 liczba==StrToInt(Edit1->Text);
             }
   catch(...){
                 blad = true;
                 warn->ShowModal();
                 return ;
              }
// jesli nie dodaje tej linijki to nie wyskakuje mi warn jak l>36 ?   liczba=StrToInt(Edit1->Text);

String  para="parzysta";
String  niepara="nieparzysta";

        if(liczba>36)    warn->ShowModal();
        if(liczba%2==0)   Label2->Caption = para;
        else if(liczba%2==1)   Label2->Caption = niepara;

 Edit1->Text="los";


}

zwraca takiego warna [C++ Warning] Unit1.cpp(44): W8004 'blad' is assigned a value that is never used
Ale to chyba nic złego? Ogólnie to "program działa zgodnie z założeniami"

jeszcze raz dzięki serdeczne za pomoc, ale mam jeszcze w kilka chyba banalnych pytań, które mi bardzo ułatwią prace

  1. Jeśli chcę zrobić funkcje przetwarzające dane, to czy dopisuje je po prostu od góry np. w kodzie w formularza?
  2. Czy w takim wypadku funkcje muszą gdzieś być zdeklarowana ?
  3. Może zabrzmi głupio ale chyba warto zapytać, czy mogę nazywać funkcje jak chce np. "int kolory(tab[6])" ? ;)
  4. Czy w takiej funkcji normalnie przesyłam i odbieram dane - czyli np. jeśli chce wyświetlić wynik to pisze np. "Label2->Caption = "moj teks";" itd... ? <-wiem, tez brzmi dość głupio, ale chciał bym wiedzieć ;)
  5. jeszcze odnośnie RadioButtona, jak mam pobierać z czy jest true czy false do innej funkcji ?

i to by było na tyle ;)

0

@1.Można różnie , możesz zrobić funkcję jako globalną lub jako metodę klasy TForm1 ( wtedy dopisujesz deklarację tej fun w Unit1.h -> Otwierasz unit1.cpp
i Ctrl+F6).
Różnica będzie w dostępie do składników klasy obiektu wskazywanego przez Form1* .

Unit1.h:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TEdit *Edit1;
private:	// User declarations

  int  FunDane_2(int a);   // dodana deklaracja

public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cpp:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
int FunDane(int a)   // funkcja globalna do składników Form1 trzeba się odwołać poprzez wskaźnik
{
  int x;
   x =a + 1 ;
   Form1->Edit1->Text = x ;
   return x ;
}
//---------------------------------------------------------------------------
int TForm1::FunDane_2(int a)
{
  int x;
   x =a + 1 ;
   Edit1->Text = x ;
   return x ;
}
//---------------------------------------------------------------------------

Podstawy C++ ..... rusz trochę programów na konsolę i klas .

@2.Normalnie jak w C musi być znana deklaracja lub def. przed pierwszym użyciem fun w kodzie .
@3.Tak jak w C , dowolnie ale tak aby nie powodowało konfliktu nazw np. ze zmiennymi lub słowami kluczowymi języka
@4. Czy w takiej funkcji normalnie przesyłam i odbieram dane .
Różnie zależnie od tego czy fun jest globalna , czy składnikiem klasy (patrz @1.)
@5. np:

bool czy_zaznaczony = false ;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   czy_zaznaczony =  RadioButton1->Checked ;

   if(czy_zaznaczony)
   {
      ShowMessage("Zaznaczony");
   }
}
//---------------------------------------------------------------------------

Wybierasz radiobuttona na formularzu -> naciskasz F1 -> Wyświetla się Help , tam masz opis danej klasy i przykłady kodu ...

0

jakieś tam podstawowe podstawy znam ;) programistą ogólnie nie jestem czasem sobie coś tam strugne żeby ułatwić sobie życie:) . aktualnie czytam cyfrowego barona trochę , ogólnie sporo poradników przeglądałem ale ten jest zaiste uwagi godny ;) .Na razie wszystko mi działa jak powinno, a Twoje wskazówki bardzo mi pomogły za co Ci bardzo dziękuje :)W sumie wydaje mi się że z aktualnym stanem wiedzy powinienem napisać to co chce ;) ale i tak jeszcze troszkę poczytam. musze w sumie jeszcze te radiobuttony rozkminic ;) Pozdrawiam

0

miałeś racje, trzeba sięgnąć trochę do podstaw bo nie mogę sobie poradzić z przerzucaniem informacji. Nie mogę tak przesyłać tablicy z funkcji do każdej innej (jak to robiłem w kodzie c który jest parę postów wyżej) i wychodzą mi przekłamane dane ;/

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