Paar Probleme mit meinen Programm.



  • Hi !
    Ich hab mir mal mein 1. Programm geschrieben:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    try
     {
    
    StrToFloat (Edit1->Text);
    if (Edit1->Text == 17)
       {
        Label7->Caption = "Richtig";
        Prozent = 100*16/100;
       }
    if (Edit1->Text ==  17 )
       {
        Label7->Caption = "Richtig";
       }
    else
       {
        Label7->Caption = "Falsch";
       }
    //----------------------------------------
    if (Edit2->Text == "Dunkelbraun")
       {
        Label8->Caption = "Richtig";
        Prozent = Prozent + 100/6;
       }
    if (Edit2->Text ==  "Dunkelbraun" )
       {
        Label8->Caption = "Richtig";
       }
    else
       {
        Label8->Caption = "Falsch";
       }
    //----------------------------------------
    StrToFloat (Edit3->Text) ;
    if (Edit3->Text == 1,70)
       {
        Label9->Caption = "Richtig";
        Prozent = Prozent + 100/6;
       }
    if (Edit3->Text ==  1.70)
       {
        Label9->Caption = "Richtig";
       }
    else
       {
        Label9->Caption = "Falsch";
       }
    
    //----------------------------------------
    if (Edit4->Text == "März")
       {
        Label10->Caption = "Richtig";
        Prozent = Prozent + 100/6;
       }
    if (Edit4->Text ==  "März" )
       {
        Label10->Caption = "Richtig";
       }
    else
       {
        Label10->Caption = "Falsch";
       }
    
    //----------------------------------------
    if (Edit5->Text == "Afghanistan")
       {
        Label11->Caption = "Richtig";
        Prozent = Prozent + 100/6;
       }
    if (Edit5->Text ==  "Afghanistan" )
       {
        Label11->Caption = "Richtig";
       }
    else
       {
        Label11->Caption = "Falsch";
       }
    
    //----------------------------------------
    if (Edit6->Text == "Webdesign")
       {
        Label12->Caption = "Richtig";
        Prozent = Prozent + 100/6;
        Label14->Caption = "Von 100 % hast du so viel Prozent erreicht:"
        + FloatToStrF (Prozent,ffNumber,8,2);
    
       }
    if (Edit6->Text ==  "Webdesign"  )
       {
        Label12->Caption = "Richtig";
       }
    else
       {
        Label12->Caption = "Falsch";
       }
    
    }
    catch (...)
       {
        Label13->Caption = "!!Achtung!!Entweder Zahl oder Buchstaben eingeben";
       }
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    Prozent = 0 ;
    }
    //---------------------------------------------------------------------------
    

    Jetzt gibts da 2 Probleme.
    1. Egal was ich bei größe angeben, wird richtig angezeigt, obwohl eigentlich nur 1,70 richtig sein soll. Alles andere soll "falsch" sein.

    2. Ich möchte, dass er am Ende die % Zahl ausgibt, wieviel man richtig hat.
    Aber hier kommt nur ein int Wert raus. Wenn ich jetzt alle richtig habe, dann hat man 96,00 % richtig und nicht 100. Wie mache ich, dass er 100 anzeigt ?



  • 1. ich sehe bei 1.70 ein komma, das ist keine float zahl.

    2. float und double zahlen mit == vergleichen kann gut schief gehen..

    3. das ist schwer standard c++, du gehörst eigentlich ins ...borland forum?
    denke ja..

    4. versuche, das nächste mal einen besseren titel für deinen thread zu wählen, nicht einfach nur ... probleme.. da kann man sich nix drunter vorstellen.

    5. gib dir für das endergebnis einfach mal die zwischenergebnisse aus (oder geh mit dem debugger durch), dann findest du die stelle, wo dir die prozente fehlen.



  • zu den Prozent:

    Ersetze mal 100/6 durch 100.0f/6.0f. Das Ergebnis von 100/6 ist nämlich eine abgeschnittene Ganzzahl, deswegen fehlt Dir am Ende was. mit 100.0f/6.0f sagst Du dem Computer, dass er das ganze als Fließkommazhlen auffassen soll.
    (Ich vermute, dass es daran liegt)

    P.S.:
    Wieso schreibst Du beim ersten Mal 100*16/100? Wenn Du das zu den anderen Prozenten dazuaddierst, kommst Du nur auf 99,3333(...) Prozent;



  • @Asgard, danke für deine Hilfe.
    Die % Zahlen funktionieren jetzt richtig.

    Doch da ist das Problem mit der Größe noch. Egal was ich da eingebe, er zeigt immer an dass es richtig ist.

    @elise
    1. Wieso ins borland Forum ?
    Das ist doch ein c++ Forum... und das was ich mache ist c++
    Objektorientiert.

    2. wieso kann float und double zahlen mit == vergleichen schief gehen?
    Tut mir leid, wenn die Frage bißchen anfängerlich klingt, liegt daran dass
    ich es bin.



  • Dieses Forum beschäftigt sich nur mit Standard-C++, also compiler- und
    betriebssystemunabhängigen Problemen. Dein Programm sieht aus, als wäre es
    mit dem Borlandcompiler geschrieben und als wäre es eine Windowsanwendung.
    Das ist kein Standard-C++ mehr.

    Fließkommazahlen kann man nicht mit == vergleichen, da sie (oft) fehlerbehaftet
    sind: Es tretetn nach (mathm.) Berechnungen Rundungsfhler auf, da die Variablen
    nur eine endliche Stellenanzhal haben. Dann sind zwei Zahlen, die mathem. eigentlicj
    gleich sind für den Computer gar nicht mehr gleich.

    Zur Themenbenennung:
    http://www.catb.org/~esr/faqs/smart-questions.html



  • Achso.
    Ok, danke für die Antworten. Demnächst werde ich im anderen "forum" meine Fragen stellen, mit Aussagekräftigen Titeln :).

    Was für eine andere Methode gibts, um das == 1,70 zu umgehen?



  • Normalerweise zieht man die Werte von einander ab und schaut nach, ob die
    Differenz kleiner ist als eine gewisse Fehlermarge

    double a,b;
    
    if(abs(a - b) < 0.000001)  // abs() liefert den Betrag von a-b
    {
    }
    


  • @Apokalyps

    StrToFloat (Edit3->Text) ;
    if (Edit3->Text == 1,70)
       {
        Label9->Caption = "Richtig";
        Prozent = Prozent + 100/6;
       }
    

    Ich kenne mich mit Borland-Funktionen nicht aus, aber könnte es sein, dass StrToFloat() einen float zurückgibt? In diesem Fall geht bei Dir die Rückgabe "verloren", da Du das Ergebnis keiner Variablen zuweist. Da sich damit kaum der Inhalt des Textfeldes geändert haben dürfte (wobei es ja ohnehin nur ein "Text"-Feld ist), macht ein Vergleich mit einem float keinen Sinn.

    Hast Du das mit dem Komma eigentlich geändert (siehe Posting von elise)?



  • @ Asgard
    Ja, hab da ein komma hingemacht.
    Geht aber trotzdem noch nicht.
    Ich hab doch das Ergebnis der Variable "Prozent" zugewiesen. Da müsste es doch gespeichert werden.

    @ Taurin
    Diese if Abfrage heißt ja:
    WENN abs(a-b) KLEINER ist als 0.000001 DANN {Anweisung}
    Aber wo wird ihn gesagt, das wenn die Eingabe 1,70 ist und er dann ins "richtig" springen soll?



  • Ich hab doch das Ergebnis der Variable "Prozent" zugewiesen. Da müsste es doch gespeichert werden.

    Ich meinte nicht die Prozente, sondern die Umwandlung des Inhalts des Textfelds in einen float. Zumindest ist sehr unwahrscheinlich, dass ein Textfeld auf einmal einen float aufnimmt, egal ob mit StrToFloat oder ohne. Durch das die Anweseigung StrToFloat(Edit1->TExt); wird gar nichts passieren, da der Inhalt von Edit1 nicht verändert wird. An den Fließkommawert kommst Du wohl eher so:

    float eingabe = StrToFloat(Edit1->Text);
    

    zu dem anderen Punkt:
    Du hast es doch schon selbst gesagt:

    WENN abs(a-b) KLEINER ist als 0.000001 DANN {Anweisung}

    Wenn also die Abweichung von der Eingabe und dem Vergleichswert < 0.0000001 ist, dann hat der Benutzer den richtigen Wert eingegeben und es wird der entsprechende Code-Block ausgeführt.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Borland C++ Builder (VCL/CLX) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi !
    Ich habe die Lösung. Ichhab einfach das 1,70 in "1,70" gesetzt und schon gehts.

    War viel einfach als das, was ihr mir vorgeschlagen habt 😮.
    Aber trotzdem danke für eure Hilfe 😉


Log in to reply