ein paar (für euch wohl einfache) Aufgaben mit dem c++-builder(borland)



  • Aufgaben:

    1. Alarmgeber
    Benutzeroberfläche: ein Button, ein Label, ein Edit-Feld, ein Timer
    das Label hat zunächst die Farbe Grün, im Edit-Feld ist die Zahl 0 zu sehen. wenn man ins Edit-Feld ne Zahl eingibt, die größer als 10 isch, soll des Label die AUfschrift "Alarm" anzeigen und die Farbe wechseln(zwischen rot und schwarz) und des im zeitlichen Abstand von 0,2s.

    int x,t;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Edit1->Text = 0;
    Timer1->Enabled = false;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    x = StrToInt(Edit1->Text);   //bei Eingabe größer 10: Alarm & Label blinken
    t = 0;
    if(x>10)           //Label soll blinken
       {
       Label1->Caption = "Alarm";
       Timer1->Enabled = true;
       while(t < 10)
          {
          Label1->Color = clRed;
          t++;
          }
       while(t > 10)
          {
          Label1->Color = clBlack;
          t++;
          if(t < 10)
             {
             t = 0;
             }
          }
       }
    
    if(x < 10)
       {
       Label1->Caption = "";
       Timer1->Enabled = false;
       Label1->Color = clLime;
       }
    
    }
    //---------------------------------------------------------------------------
    

    es funktioniert nicht...
    zeigt komischerweise auch in der zeile mit dem letzen "if"(also wenn x<10 isch) nen Fehler an.. den versteh ich überhaupt ned

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

    zur Aufgabe mit der größeren zahl:(unter 50 Zahlen)
    hier würde ich normalerweise mit einem if-befehl die größte rausfinden lassen, also if Zahl größer Zahl 2 tu se in des Label, und des ganze würde ich halt 50 mal machn... weiß end, vielleicht geht des au irgendwie mit ner while-schleife?

    aber die aufgabe isch ned soo wichtig, die krieg ich schon irgendwie hin - aufgabe 1 wäre mir wichtiger, weil mim timr komm ich ned soo gut klar.

    Danke!
    AnNi



  • Hallo

    es funktioniert nicht...

    Was sich in welcher Weise bemerkbar macht?

    zeigt komischerweise auch in der zeile mit dem letzen "if"(also wenn x<10 isch) nen Fehler an..

    Wer zeigt zu welcher Zeit was für einen Fehler an, der in Zusammenhang mit dieser Zeile stehet?

    Aus deinem Code-Ausschnitt sehe ich, das du dich nochmal mit dem Ereigniss TTimer:OnTimer beschäftigen must.

    BCB_Hilfe schrieb:

    Mit dem Ereignis OnTimer können Sie eine Behandlungsroutine schreiben, die in bestimmten Zeitabschnitten eine Aktion ausführt.

    Die Eigenschaft Interval des Zeitgebers legt fest, wie häufig das Ereignis OnTimer auftritt. Das Ereignis OnTimer tritt nach jedem Ablauf des festgelegten Zeitabschnitts ein.

    Denn dort hinein gehört dein Quellcode zum Wechseln der Farbe.

    hier würde ich normalerweise mit einem if-befehl die größte rausfinden lassen, also if Zahl größer Zahl 2 tu se in des Label, und des ganze würde ich halt 50 mal machn... weiß end, vielleicht geht des au irgendwie mit ner while-schleife?

    Welche Schleife du nimmst, ist egal.

    bis bald
    akari



  • Hi,
    mal sehen:

    AnNi schrieb:

    int x,t;
    

    Schreib das am besten mit in die Funktion rein, in der du die Variablen benötigst. Also in die Button1Click Funktion. Stichwort: Gloable Variablen sind böse! 😉

    AnNi schrieb:

    while(t < 10)
    {
      Label1->Color = clRed;
      t++;
    }
    

    Die Zeitmessung macht der Timer für dich, da brauchst nicht's selber machen mit irgendwelchen while Schleifen. Klick einfach mal die Timerkomonente in der Komponentenpalette an, drück F1 und schau dir da besonders die Eigenschaft Interval und das Ereignis OnTimer an.

    AnNi schrieb:

    while(t > 10)
    {
        Label1->Color = clBlack;
        t++;
        if(t < 10)
        {
            t = 0;
        }
    }
    

    Mhh irgendwie ist da auch btw. ein logischer Fehler drine.
    Solange wie t großer als 10 is, soll er t um eins erhöhen und die Farbe des Labels auf schwarz setzen. Sollte t kleiner 10 sein, soll er t aus 0 setzen.
    Mal davon abgesehen, dass t in der Schleife nie 0 wird, terminiert die Schleife wenn t beim Schleifenbeginn größer als 10 war, nie.

    AnNi schrieb:

    es funktioniert nicht...
    zeigt komischerweise auch in der zeile mit dem letzen "if"(also wenn x<10 isch) nen Fehler an.. den versteh ich überhaupt ned

    Fehlermeldung?

    MfG

    Alexander Sulfrian



  • Aus deinem Code-Ausschnitt sehe ich, das du dich nochmal mit dem Ereigniss TTimer:OnTimer beschäftigen must.

    aber wie benutze ich OnTimer?! kannst du mal ein einfaches Beispiel oder so zeigen?

    AnNi



  • Sers!

    danke, für deien Hilfe!

    mein Problem isch, dass ich keine Ahnung hab wie ich des Ereignis OnTimer verwende...in der Hilfe find ich da au nix zu..

    die Variablen deklarier ich eich meistens oben - unser Lehrer meinte des wär übersichtlicher

    den logischen Fehler hab ich behoben, danke!
    Fehler zeigt er jetzt au keine mehr an

    des einzige Problem: des Label blinkt noch nicht...

    Timer1->Enabled = true;
       while(t < 10)
          {
          Label1->Color = clRed;
          t++;
          }
       while(t > 10)
          {
          Label1->Color = clBlack;
          t++;
          if(t == 9)
             {
             t = 0;
             }
          }
    

    AnNi



  • AnNi schrieb:

    mein Problem isch, dass ich keine Ahnung hab wie ich des Ereignis OnTimer verwende...in der Hilfe find ich da au nix zu..

    Drücke in CBuilder F1 und gebe das im Index ein "OnTimer,Beispiel".



  • AnNi schrieb:

    while(t > 10)
          {
          Label1->Color = clBlack;
          t++;
          if(t == 9)
             {
             t = 0;
             }
          }
    

    Hi,
    eigentlich ist das ja total unwichtig für dein Vorhaben, allerdings möcht ich nochmal deine Logik in Frage stellen. Wenn t größer als 10 ist und dann immer größer wird, wann kann t dann 9 sein? Gibt es etwa eine Zahl die gleichzeigt größer als 10 und gleich 9 ist? Wenn dem so ist, möchte ich diese bitte erfahren 😉

    MfG

    Alexander Sulfrian



  • mhh.. joa - die haben da schon ein Beispiel - aber wie stell ich da ein, dasses nach 2s die farbe in die eine udn nach 2 sekunden wieder in die andre Farbe wechselt?
    ich mein, wenn ich des beim Timer reinschreib

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    x = StrToInt(Edit1->Text);
    while(x > 10);
     {
     //farbe wechseln
     }
    }
    

    da hab ich doch danns gleiche Problem??

    AnNi


  • Mod

    Hallo

    was macht denn der Timer so
    (2s)

    in Timer1Timer machst du dann was du willst
    einmal Farbe = xxx
    dann Farbe = yyy

    schau dir mal das mit den Timern genau an
    (wurde dir doch schonmal geraten oder)

    Mfg
    Klaus



  • Hast du dir eigentlich mal irgendwie die Hilfe durchgelesen?

    Beschreibung

    Die Eigenschaft Interval legt fest, wie häufig das Ereignis OnTimer auftritt. Das Ereignis tritt nach jedem Ablauf des festgelegten Zeitabschnitts ein.

    Mit dieser Eigenschaft können Sie die Zeitabschnitte zwischen OnTimer-Ereignissen angeben. Der Vorgabewert ist 1000 (eine Sekunde).

    Deine komische while() ist absolut überflüssig für den Farbwechsel.
    Einfach Abfragen. Ist Farb1 gesetzt, dann setze Farb2, wenn Farbe2, dann setze Farbe1. Das bekommt man in einer Zeile Code hin 🙂

    Und zu deinem Zufallszahlen.... Ne Schleifedurchgehen und per if abzufragen, ob die Zahl grösser ist als die Vorherige solltest schon hinbekommen. Sonst haste es verdient durchzufallen :p



  • [quote="Alexander Sulfrian]Hi,
    eigentlich ist das ja total unwichtig für dein Vorhaben, allerdings möcht ich nochmal deine Logik in Frage stellen. Wenn t größer als 10 ist und dann immer größer wird, wann kann t dann 9 sein? Gibt es etwa eine Zahl die gleichzeigt größer als 10 und gleich 9 ist? Wenn dem so ist, möchte ich diese bitte erfahren 😉

    MfG

    Alexander Sulfrian[/quote]
    jetzt passts vom logischen her - naja, geht trotzdem ned - müsste aus der schleife irgendwie wieder rauskommen.. naja

    while(t < 10)
          {
          Label1->Color = clRed;
          t++;
          }
       while(t > 10)
          {
          Label1->Color = clBlack;
          t++;
          if(t > 20)
             {
             t = 0;
             }
          }
    

    --------
    mh... habs mal so probiert - geht aber au ned, zeigt aber au kein fehler an...warscheinlich für dich absolut einfach - für mich halt ned...wir hams no ned sehr lange an der schule und machn im Unterricht immer relativ einfache Sachen, inner Klassenarbeit kommt dann sowas dran(des is halt ne Aufgabe aus der Parallelgruppe..)

    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Timer1->Enabled = true;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    Timer1->Interval = 500;
    
    if(Label1->Color == clBlack)
       {
       Label1->Color = clRed;
       }
    if(Label1->Color == clRed)
       {
       Label1->Color = clBlack;
       }
    }
    //---------------------------------------------------------------------------
    

    was ist daran falsch?/Wo liegt der Fehler?

    AnNi



  • __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Timer1->Enabled = true; // Setz das direkt in der Komponente
    }
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    Timer1->Interval = 500; // Setz das direkt in der Komponente
    if(Label1->Color == clBlack)
       {
       Label1->Color = clRed;
       }
    // Was bitte machst du denn hier?
    // Vom eben gesetzten Rot sofort wieder Schwarz?
    // Logik 6, setzen!
    // benutze mal "else if" ;)
    if(Label1->Color == clRed)
       {
       Label1->Color = clBlack;
       }
    }
    

    AnNi schrieb:

    was ist daran falsch?/Wo liegt der Fehler?

    Siehe oben.



  • wohoo, es geht!
    danke!

    AnNi



  • label blinken lasse?
    on timer routine oder net?

    //timer auf 200
     if(Label1->Font->Color== clBlack)
      Label1->Font->Color = clRed;
     else
      Label1->Font->Color = clBlack;
    

    und dann die aufgabe mit dem größten ist ganze easy

    int max_zahl = 0;
    int vec[50];
    // array füllen kannste oder?
    for(int i=0  i<50 ; i++)
     vec[i] = random (100)+1;
    for(int i=0  i<50 ; i++)
     if(vec[i]>max_zahl)
      max_zahl = vec[i];
    cout << max_zahl << endl;
    //oder inne lisbox oder ShowMessage("größte zahl: " + max_zahl);
    


  • Sers!

    des erste hab ich jetzt hinbekommen - bei deinem 2ten check isch garnix *gg*
    sry, bin no totaler Anfänger

    ich würde des Problem versuchen so zu lösen, dass ich mir meine Zufallszahlen erstelle und se dann durch ne Schleife laufen lasse die jeweils schaut, welche Zahl größer ist und diese Zahl dann inne variable legt
    nach 50 durchgängen dann stoppt

    meine Frage no dazu:
    wie krieg ich es hin, dass es mir mit Hilfe vonner Schleife die Zahlen in eine ListBox packt(ohne, dass ichs 50 mal schreiben muss)?

    AnNi


Anmelden zum Antworten