Programm ist zu kompliziert!



  • Euro Tipps haben mir schon sehr beim weiterkommen geholfen aber ich merke das das einzelne eintragen einfach viel zu kompliziert ist! Könnte mir vielleicht irgendjemand zeigen wie ich das ganze vereinfachen kann(am besten praktisch).

    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    int main() 
    { 
      string j, i1; 
      cout << "Franz" << static_cast<char>(148)<< "sisch Vokabeltrainer 0.3" << endl << endl; 
    
     //Aufgabe 1
    marke: 
    
      i1 = "être" ;                                    //Fehler aber wie kann ich hier Ansi-                                                       //Code verwenden ??????
      cout<<"sein"<<endl<<"        " ;
      getline(cin,j);
    
      if(i1 == j) 
        cout<<endl<<endl;
    
      else 
        {cout<<"falsch";
      goto marke;}
    
     getchar(); cin.get(); return 0; }
    

    Am besten wäre wenn man für jede neue Vokabel nur zwei neue Werte eintragen müsste. Goto (hab ich gehört) soll man zwar nicht verwenden aber wenn die Antwort falsch war solls halt nochmal ein zwei Antworten zurück gehen.

    Gruss Axo



  • also, ich verstehe dein problem nicht ganz, weil ich den gewünschten ablauf des programms nicht verstehe.

    aber schon man ein kleiner tip, schreib ordentlicher

    statt:

    if(i1 == j)  
        cout<<endl<<endl; 
    
      else  
        {cout<<"falsch"; 
      goto marke;} 
    
     getchar(); cin.get(); return 0; }
    

    schreibst du besser:

    if (i1 == j)  
            cout<<endl<<endl; 
    
        else  
    
        {
            cout<<"falsch"; 
            goto marke;
        } 
    
        getchar(); 
        cin.get(); 
        return 0; 
    }
    

    und goto sollte man wirklich nur einstzen, wenn es keine andere möglichkeit gibt, und das ist extrem selten. nimm doch eine schleife (z.b. do...while)



  • Hi,

    goto sollte man gar nicht mehr einsetzen.
    Zumindest ich habe es wirklich noch nie gebraucht!

    Ich verwende statt

    while (bla)
    {
    while (bla)
    {
    goto raus;
    }
    }
    raus
    

    lieber sowas, um aus verschachtelten Schleifen zu springen:

    bool bShouldRun = true;
    while (bla)
    {
    while (bla)
    {
    bShouldRun = false;
    break;
    }
    if (!bShouldRun)
    break;
    }
    

    ChrisM



  • In meinen C++ Büchern steht auch, dass man "goto" nicht verwenden sollte...

    Da der Code dadurch unübersichtlich wird.

    Aber ich Persönlich finde es nicht so schlimm, wenn man "goto" in kleineren Programmen verwendet.

    Noch ein Tipp: Leg doch eine Datei an, wo die ganzen strings drinnen sind, z.b. Woerter.h oder Woerter.hpp, und binde sie dann mit

    #include "Woerter.h"
    // b.z.w.
    #include "Woerter.hpp"
    

    Leider kann ich dir im moment kein besseren Code Schreiben, da ich kein Compiler auf der Platte hab 😃 😃 😃

    Vielleicht morgen... mal sehen!



  • ChrisM schrieb:

    Hi,

    goto sollte man gar nicht mehr einsetzen.
    Zumindest ich habe es wirklich noch nie gebraucht!

    Ich verwende statt

    while (bla)
    {
    while (bla)
    {
    goto raus;
    }
    }
    raus
    

    lieber sowas, um aus verschachtelten Schleifen zu springen:

    bool bShouldRun = true;
    while (bla)
    {
    while (bla)
    {
    bShouldRun = false;
    break;
    }
    if (!bShouldRun)
    break;
    }
    

    ChrisM

    Gerade in diesem Beispiel finde ich das goto aber tatsächlich schöner. Allerdings kommt man in diese Situation fast nie (ich hab in 10.000 Zeilen nur ein einziges goto), wenn man anständig programmiert. Mehrere verschachtelte Schleifen kann man wunderbar in eine Funktion auslagern und mit return verlassen. 😋



  • Wer anständig konzepiert wird selten einen Fall haben, wo es wirklich nicht ohne goto geht bzw. schön ist.



  • so wie ich das verstehe, soll beim programm das franz. wort für "sein" vom
    benutzer eingegeben werden und dann verglichen. ich glaube, dass du eine art
    lernprogramm machst und dein problem ist die abfrage immer wieder einzugeben.
    mein vorschlag:
    x -> zufallszahl
    char *c_deutsch[9000000] -> array der dt. wörter
    char *c_franz[9000000] -> array der franz. wörter
    char *eingabe -> eingegebener string
    achtung! das franz. wort muss auf dem selben speicherplatz wie das dt. sein.
    z.Bsp: c_deutsch[10000] = "sein" muss das franz. ebenfalls auf 10000 sein, also
    c_franz[10000] = "être"
    als nähstes brauchst due eine schleife, die solange läuft bis eingabe "exit"ist
    in der schleife wird x eine zufallszahl zugewiesen
    mit cout << c_deutsch[x]; sagtst du dem user welches wort verlangt wird
    er gits ein


    wenn es stimmt "richtig" ansonsten "falsch"
    jetzt kannst du das rchtige wort anzeigen lassen
    schleifen ende



  • hier ist mein code:

    #include <iostream>
    
    void main()
    {
    int x;
    char *dt[5];
    char *fr[5];
    char *eingabe;
    dt[0]="ich";
    dt[1]="du";
    dt[2]="er";
    dt[3]="wir";
    dt[4]="ihr";
    dt[5]="sie (m.)";
    fr[0]="je";
    fr[1]0"tu";
    fr[2]="il";
    fr[3]0"nous";
    fr[4]="vous";
    fr[5]0"ils";
    
    while (eingabe != "exit")
    {
     x = DeinZufallszahlgenerator(0 bis 5);
     cout << dt[x] << "\n";
     cin >> eingabe;
     if (eingabe == fr[x])
      cout<<"richtig!\n";
     else
    {
      cout<<"falsch!\n"
      cout<<"richtig waere: " << fr[x] << "\n";
    }
    }
    }
    

    ich habs nicht ausprobiert, könnten also noch fehler enthalten aber ich glaube
    es zu debuggen wird wohl nicht so schwer sein.



  • Verwende doch eine Map für deinen Vokabeltrainer...



  • Du kannst es mit Array's (Feldern) machen, und dabei Funktionen benutzen.

    Mach die Wörter dann in eine Zusätzliche Datei, und lass sie mit einer Schleife Durchlaufen (foreach, falls es die in C++ gibt 😮)

    Du kannst auch noch ein zusätzliches Programm schreiben, wo man die Wörter dem Programm "Lernen" kann, indem man diese mit "fwrite" in eine Datei einträgt (*.txt), und mit "fopen" öffnet...

    kannst ja auch noch "rand" oder "srand" benutzen, um eins von den Wörtern auszusuchen 😉



  • Serious - Tobi schrieb:

    Du kannst es mit Array's (Feldern) machen, und dabei Funktionen benutzen.

    Mach die Wörter dann in eine Zusätzliche Datei, und lass sie mit einer Schleife Durchlaufen (foreach, falls es die in C++ gibt 😮)

    Du kannst auch noch ein zusätzliches Programm schreiben, wo man die Wörter dem Programm "Lernen" kann, indem man diese mit "fwrite" in eine Datei einträgt (*.txt), und mit "fopen" öffnet...

    kannst ja auch noch "rand" oder "srand" benutzen, um eins von den Wörtern auszusuchen 😉

    Eine Map ist hier deutlich besser, da sie immer 2 Werte einander zuordnet.
    Und einlesen mit fopen und fwrite tut man nicht mehr in C++, dafür gibts iostreams.

    http://c-plusplus.net/forum/viewtopic.php?t=39469

    Devil



  • char* == char* ist böse, vor allem in Programmbeispielen wenn ma nicht weiss das das nicht geht 🙄



  • dreaddy schrieb:

    char* == char* ist böse, vor allem in Programmbeispielen wenn ma nicht weiss das das nicht geht 🙄

    ich weiss, dass es nicht geht. hatte keine lust den code länger zu machnen, da
    1. es fürh war als ich das schrieb und deswegen noch halb im schlaf
    2. er auch seinen eigenen verstand benutzen soll

    eine map ist auch 'ne gute idee



  • @INTEGER:
    Garnicht schön, das in eine Textdatei einzulesen ist viel sinnvoller, sonst sieht der Code nur unnötig hässlich aus...



  • Habs erstmal INTEGER versucht. Nur einen (bestimmt lächerlichen)Fehler hab ich nicht rausgekriegt.

    x = DeinZufallszahlgenerator(0 bis 5);
    

    25 F:\c++\pro\franz2\main2.cpp
    parse error before numeric constant



  • char* x = "DeinZufallszahlgenerator(0 bis 5)";
    // du hast die "" vergessen!
    

    Mit dem bößen char* 😉

    Oder mach ne INTEGER (int) Funktion, die einen booleschen (heisst das so? oder boolschen :D) Wert zurückliefert, z.b.:

    if (ueberpruefen == 0) 
    cout <<"Richtig!";
    else
    cout <<"Falsch!";
    

    LOL, vielleicht geht's ja, habs net ausprobiert



  • Natürlich musst du erst die Funktion DeinZufallszahlgenerator() definieren, um sie anwenden zu können.
    Oder du benutzt den Zufallsgenerator der Standardbiliothek.

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    int main()
    {
      srand(time(NULL));
      cout << rand()%6;
    }
    


  • Hmm mit "" gehts auch net. 😮

    5 F:\c++\pro\franz2\main2.cpp `main' must return `int'

    F:\c++\pro\franz2\main2.cpp [Warning] In function `int main(...)':

    25 F:\c++\pro\franz2\main2.cpp invalid conversion from `const char*' to `int'

    F:\c++\pro\franz2\Makefile.win [Build Error] [main2.o] Error 1

    #include <iostream>
    using namespace std;

    void main()
    {
    int x;
    char *dt[5];
    char *fr[5];
    char *eingabe;
    dt[0]="ich";
    dt[1]="du";
    dt[2]="er";
    dt[3]="wir";
    dt[4]="ihr";
    dt[5]="sie (m.)";
    fr[0]="je";
    fr[1]="tu";
    fr[2]="il";
    fr[3]="nous";
    fr[4]="vous";
    fr[5]="ils";

    while (eingabe != "exit")
    {
    x = "DeinZufallszahlgenerator(0 bis 5)";


    cin >> eingabe;
    if (eingabe == fr[x])
    cout<<"richtig!\n";
    else
    {
    cout<<"falsch!\n" ;

    return 0;
    }
    }
    }



  • also entwerde du setzt ein int vor die main() oder du nimmst das return 0 raus

    x = "DeinZufallszahlgenerator(0 bis 5)";
    

    das geht so nicht. du versuchst da ein character in ein integer umzuwandeln
    ich denke mal deinZufallszahlgenerator soll ne funktion sein oder?

    x = deineFunktion();
    

    dann muss das so lauten. wobei die Funktion einen int-wert zurückgeben muss



  • #include <iostream>
    #include <cstdlib>
    #include <string>
    #include <ctime>
    using namespace std;
    
    // deine Funktion
    int DeinZufallszahlgenerator()
    {
      srand(time(NULL));
      return rand()%6;
    }
    
    int main()
    {
      int x;
      char* dt[5];
      char* fr[5];
      string eingabe;
      dt[0]="ich";
      dt[1]="du";
      dt[2]="er";
      dt[3]="wir";
      dt[4]="ihr";
      dt[5]="sie (m.)";
      fr[0]="je";
      fr[1]="tu";
      fr[2]="il";
      fr[3]="nous";
      fr[4]="vous";
      fr[5]="ils";
    
      while (eingabe != "exit")
      {
         x = DeinZufallszahlgenerator();
         cout << dt[x] << "\n";
         cin >> eingabe;
         if (eingabe == fr[x])
           cout << "richtig!\n";
         else
         {
           cout << "falsch!\n" ;
           cout << "richtig waere: " << fr[x] << "\n";
           return 0;
         }
      }
    }
    


  • @ChrissiB:

    Das aufrufen von srand in der Funktion ist sehr ungünstig. Das sollte nämlich nur einmal im Programm passieren. Du tust es aber vor jedem Aufruf und wenn die Zeitschritte zwischen zwei Aufrufen so klein sind, daß time keinen Unterschied feststellt kriegst Du die gleiche Zahl geliefert.

    Probier mal ein

    int array[100];
    for(int i=0; i<100; ++i)
    array[i] = DeinZufallsgenerator();

    und laß Dir danach das Array ausgeben.

    MfG Jester


Anmelden zum Antworten