frage zu temolates



  • zuerst mal der beispielcode:

    #include <iostream>
    #include <fstream.h>
    #include <string.h>
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
        string mEE[50];
        string mED[50];
        string eingabe;
        unsigned short counter = 0, ranking =0, mDurchgaenge;
    
        cout<<"Wieviele Wortpaare willst du eingeben?"<<endl;
        cin>>mDurchgaenge; 
    
        while (++counter <= mDurchgaenge){                                                    cout<<counter<<". Eingabe noch "<<mDurchgaenge - counter<<endl;
            cin>>mEE[counter]; cout<<"  << und >>  "; cin>>mED[counter];
            }
    
            system("cls");                                                          //Konsole plätten
            cout<<"Fertig! Nun der Quizteil."<<endl;
    
        while (counter > 1){
            --counter;
            cout<<mEE[counter]<<" ==> nun in deutsch: ";
            cin>>eingabe;
            if (eingabe == mED[counter]){
                cout<<"Richtig! ";
                }
                else {ranking++;
                cout<<"Falsch! "<<endl;}
            }
    
        cout<<"Ergebnis: "<<"du hast "<<ranking<<" falsche übersetzungen von "
        <<mDurchgaenge<<" Versuchen"<<endl;
    
        ofstream fout( "ranking.txt",ios::app | ios::out );                         //verhindert überschreiben der Datei
        fout << ranking<<" von "<<mDurchgaenge<<" sind falsch"<<endl;               //legt ne Datei an
    
      system("PAUSE");	
      return 0;
    }
    

    zum prog:
    also ich hab ein kleines programm geschrieben (ein paar kritiken sind erwünscht), es fragt nach wörtpaaren, zb. deutsch englisch, speichert sie in einem array und fragt dann in umgekehrter reihenfolge die englischen begriffe mit "mEE" ab und deeeer user muss den passenden deutschen begriff eingeben.
    rest ist müll....

    ich wollte das der benutzer wählt ob das prog die deutschen begriffe fragt oder die englischen.
    dazu: ... cout<<mEE[counter]<<" ==> nun in deutsch: ";
    cin>>eingabe;
    if (eingabe == mED[counter]){
    ....
    nun wollte ich den scheiß aber nicht kopieren sondern mit templates arbeiten.
    nur bin ich ein armer abfänger und würde gerne wissen wie das hier aussehen könnte, oder ob das vielleicht gar nicht geht?

    für reply wär ich dankbar. 😕

    Edit By SideWinder: Code-Tags eingefügt, bitte in Zukunft selber machen, danke!



  • Templates sind hier imho ungeeignet. Wenn du stattdessen dynamische Container aus der STL meinst funktioniert das so:

    #include <string>
    #include <vector>
    using namespace std;
    
    ...
    
    // Ein Vektor ist ein dynamisches Array (kümmert sich selbst um Speicher, etc. musst du dich nicht darum kümmern) - der Typ "string" in eckigen Klammern gibt an von welchem Typ das Array sein soll (das wäre zB eine Verwendung eines Templates)
    vector<string> mED;
    vector<string> mEE;
    
    ...
    
    // String hinten einfügen
    mED.push_back(deutscheswort);
    mEE.push_back(englischeswort);
    
    ...
    
    // So einen Container läuft man mit einem Iterator durch, da du ja verkehrt
    //durchlaufen willst mit einem Reverse-Iterator:
    vector<string>::reverse_iterator runner = mED.rbegin(); // das r vor begin liefert einen reverse_iterator statt einen iterator
    
    while(runner != mED.rend())
    {
        // tu was, mit *runner kommst du auf den derzeitigen string
        ++runner;
    }
    

    Hoffe das ist verständlich. Wenn nicht frag einfach noch!

    BTW: Ein paar Tips noch:

    - Verwende neue Headernamen für die Standard-C++-Header, im Falle von <iostream> tust du das ja bereits. Du benötigst aber noch <fstream> statt "fstream.h" und zwingend auch noch <string> statt <string.h> für die string-Klasse

    - Verwende kein system("cls")

    BTW2: Ich verschiebe dich jetzt ins Standard-C++-Forum, weil hier kein konsolenspezifisches Thema vorliegt.

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • danke, ich denke, dass mit den dynamischen arrays hab ich verstanden.
    dann habe ich ein programm gebaut, auf dieser basis, zum ausprobieren.

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;

    int main(int argc, char *argv[])
    {
    vector<string> mED;
    vector<string> mEE;

    string deutscheswort, englischeswort;
    cin>>deutscheswort;
    cin>>englischeswort;

    mED.push_back(deutscheswort);
    mEE.push_back(englischeswort);

    cout<<mED[1];

    system("PAUSE");
    return 0;
    }

    das cout<<... endet mit einem programmabsturz, warum eigentlich?

    dann habe ich noch eine frage zu:

    vector<string>::reverse_iterator runner = mED.rbegin(); // das r vor begin liefert einen reverse_iterator statt einen iterator

    while(runner != mED.rend())
    {
    // tu was, mit *runner kommst du auf den derzeitigen string
    ++runner;
    }

    von iter5atoren habe ich bisher noch nicht viel gehört. 1. man verknüpft sie mit datentypen? 2. man gibt ihnen einen namen(runner)? 3. mit nem = gibt man ihnen eine anweisung? ist das richtig?
    was macht das mED.rend? ...mit *runner kommst du auf den derzeitigen string==>>
    wie müsste das aussehen?



  • Dynamische Arrays beginnen genauso bei 0 zum Zählen. Du fügst bloß ein Element in das Array (den Vektor) ein -> 1 wäre aber bereits das zweite Element.

    Iteratoren sind für bestimmte Datentypen geschrieben worden -> für Container. Vektor ist ein solcher Container. Mit Hilfe ovn Iteratoren kannst du alle Cotnainer auf die selbe WEise durchlaufen - ob da nun ein Vektor oder ein Liste dahintersteht ist egal.

    Sie werden wie ganz normale Variablen angelegt.

    //    (1)       (2)    (3)        (4)         (5)
    vector<string>  ::   iterator   runner =  bestehender_vec.begin();
    
    1 ... Containerdatenyp
    2 ... Auflösungsoperator -> In vector<string> existiert ein Datentyp...
    3 ... ...namens iterator
    4 ... Ganz normaler Variablenname
    5 ... Wohin soll der Iterator am Beginn zeigen? Auf den Beginn unserer Liste
    

    In meinem Beispiel habe ich einen reverse_iterator genommen. Und statt begin() rbegin(). Wenn ein reverse_iterator auf rbegin() zeigt, zeiger er auf das letzte Element des Containers. Er läuft also den Container verkehrt durch.

    while (runner != bestehender_vec.end()) // Solange wir nicht fertig durchgelaufen sind
    {
        cout << *runner << endl; // zB string ausgeben
        ++runner; // eins weiter
    }
    

    MfG SideWinder



  • super, danke


Anmelden zum Antworten