Vektor auf der Textkonsole ausgeben (Output)



  • Hallo an euch alle,

    ich beschäftige mich seit geraumer zeit mit c/c++, und habe da so wie viele andere vor mir auch probleme ohne ende 😛

    ich habe gestern mit einer freundin ein programm geschrieben, dass einen stl vektor mit einer bestimmen anzahl von zufallszahlen (42 um genau sein) aus einem intervall füllt und sortiert.
    bis jetzt hat es auch funktioniert, das compilieren geht auch ohne probleme und ich kann die .exe starten.

    doch mein problem ist: ich soll vor und nach dem sortieren den vektor auf der textkonsole ausgeben sowie am ende das vektor-element zum index 13.

    wie mache ich das jetzt genau? wenn ich meine .exe starte, öffnet sich kurz das fenster und schließt sofort wieder.. ich habe also kein output oder?

    schöne grüße,
    patrizia



  • ein blick in die faq hätte geholfen...

    die konsole schliesst sich sofort nach dem ausgeführten programm, egal was und wie viel und oft du etwas ausgegeben hast





  • vielen dank, hat funktioniert.

    ich bekomme jetzt ein output mit 43 vektoren in form von

    0.03323232 usw...

    ist damit aber mein problem behoben? ich bekomme ja sozusagen nur ein output nach dem sortieren, wie mache ich das vor dem sortieren?
    und was heißt element zum vektor index 13?

    vielen dank schonmal...



  • Du kannst den Vektor vor dem Sortieren genauso ausgeben wie hinterher. Wie das bei dir aussieht, müsste ich raten, aber im Prinzip funktioniert es so:

    ausgabe(daten);
    sortiere(daten);
    ausgabe(daten);
    


  • du musst dir einen vektor vorstellen wie eine reihe von häusern, und jedes haus ist ein element von dem vektor. und der index ist die hausnummer



  • Skym0sh0 schrieb:

    und der index ist die hausnummer

    Nur das man bei Hausnummer eins später anfängt zu zählen 😉 .



  • also, das sortieren funktioniert bei mir nach diesem schema:

    http://www.cplusplus.com/reference/algorithm/sort/

    wenn ich die ausgabe vor dem sortieren, also vor dem

    using default comparison (operator <):
      sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33
    
      // using function as comp
      sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
    
      // using object as comp
      sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)
    
      // print out content:
      cout << "myvector contains:";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
    
      return 0;
    }
    

    funkioniert das nicht..

    mit dem vektor index zum element 13.. heißt das, dass ich ein output bekomme, dass das 13te element aussortiert und es mir zeigt? bin gerade etwas verwirrt oO



  • Und was hindert dich daran, die Ausgabeschleife (Zeile 11 bis 13) an eine andere Stelle des Codes zu packen? (btw, "funktioniert nicht" ist eine sehr exakte Fehlerbeschreibung ;))



  • hmmmm, habs mal getestet 😃

    also dann kam ich auf folgendes:

    cout << "vor dem sortieren";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
      // using default comparison (operator <):
      sort (myvector.begin(), myvector.begin()+4);    
    
      // using function as comp
      sort (myvector.begin()+4, myvector.end(), myfunction); 
    
      // using object as comp
      sort (myvector.begin(), myvector.end(), myobject);     
    
      // print out content:
      cout << "nach dem sortieren";
      for (it=myvector.begin(); it!=myvector.end(); ++it)
        cout << " " << *it;
    
      cout << endl;
      wait();
      return 0;
    }
    

    allerdings sieht das dann im fenster total wirrwar aus oO

    kann man eine etwas schönere darstellung bekommen? das man das bisschen besser erkennen kann.. das fenster ist so voll und das "nach dem sortieren" kommt direkt nach der 43ten zahl.. also sozusagen "0.03232323 nach dem sortieren 0.03232323 etc etc ...
    sieht so undurchsichtig aus...

    sieht das sonst ok aus?



  • Da könnte deine Ausgabe vermutlich ein paar Zeilenwechsel (endl) an der richtigen Stelle gebrauchen 😃



  • suppppppppppppeeeeeeeeeeeeer ich hab's geschafft ^^ ich bekomme eine saubere darstellung 😃
    DANKE DANKE DANKE, du hast mir wirklich sehr damit geholfen 😃

    das hört sich für jemanden, der das kann, total easy an, aber ich brauche noch ein bisschen, um damit umzugehen ^^

    das einzige, was ich jetzt nicht verstehe, ist das mit dem vektor-element zum index 13. was ist damit gemeint? soll ich das 13te element nochmal gesondert darstellen?



  • also ich hab mir das auch mal nageguckt... vllt hilft dir das weiter (sofern das ist, was du willst)

    http://ideone.com/wCGPz

    bzw

    #include <iostream>
    #include <vector>
    #include <ctime>
    #include <algorithm>
    #include <cstdlib>
    
    using namespace std;
    
    int main( int argc, char **argv )
    {
            vector<int> v;
            srand( time( 0 ) );     
    
            for( int i = 0; i != 42; ++i )
                    v.push_back( 1 + ( rand( ) % 100 ) );
    
            cout << "[Vector VOR dem Sortieren]" << endl;
    
            for( unsigned int i = 1; i != v.size( ) + 1; ++i )
                    cout << "Element " << i << " = " << v.at( i - 1 ) << endl;
    
            cout << "Das ist Element 13 davor:\t" << v.at( 12 ) << endl << endl;
    
            cout << "[Vector NACH dem Sortieren]" << endl;
    
            sort( v.begin( ), v.end( ) );
    
            for( unsigned int i = 1; i != v.size( ) + 1; ++i )
                    cout << "Element " << i << " = " << v.at( i - 1 ) << endl;
    
            cout << "Das ist Element 13 danach:\t" << v.at( 12 ) << endl;
    
            return 0;
    }
    


  • @ supermix

    das sieht ja genial aus 🙂 so schön sah das sortieren bei mir aber nicht aus ^^
    bin irgendwie verblüfft wie einfach das aussieht und trotzdem besser als bei mir funktioniert 😮

    wie würde denn der befehl lauten, die zahlen aus einem bestimmen intervall zu wählen? zB. im intervall von [10,15]. könnte man sowas auch einfügen?

    und noch zu guter letzt:

    wie kann ich mit den unten aufgeführten befehlen den vektor 13 herausfiltern?

    // using default comparison (operator <):
    sort (myvector.begin(), myvector.begin()+4);
    
    // using function as comp
    sort (myvector.begin()+4, myvector.end(), myfunction);
    
    // using object as comp
    sort (myvector.begin(), myvector.end(), myobject);
    
    // print out content:
    cout << "Vektoren sortiert" << endl;
    for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it << endl;
    
    cout << endl;
    

    wenn ich jetzt so etwas schreibe:

    // print out content:
    cout << "Element 13" << endl;
    for (it=myvector.begin()+(40); it!=myvector.end(); ++it)
    cout << " " << *it << endl;
    

    dann listet er mir als vektor die letzten beiden elemente, also das vorletzte und letzte element..

    jemand eine idee, wie ich nur element 13 herausfiltern? geht das überhaupt mit diesen befehlen?



  • patrizia86 schrieb:

    wie würde denn der befehl lauten, die zahlen aus einem bestimmen intervall zu wählen? zB. im intervall von [10,15]. könnte man sowas auch einfügen?

    Klar, in der Schleife, die supermix gepostet hat:

    for( unsigned int i = 1; i != v.size( ) + 1; ++i )
                    cout << "Element " << i << " = " << v.at( i - 1 ) << endl;
    

    müssten nur die Grenzen entsprechend angepasst werden 😉



  • So ein hässlicher Klammerungsstil 😮



  • 314159265358979 schrieb:

    So ein hässlicher Klammerungsstil 😮

    Ja. Öffnwende Klammern direkt hinter Buchstabenm und das Semikolon ohne Leerzeichen davor passen einfach nicht zum Rest. Ein paar andere Kleinigkeiten auch nicht.
    Hier die harmonisierte Fassung.

    for ( unsigned int i = 1 ; i != v . size ( ) + 1 ; ++ i )
                    cout << "Element " << i << " = " << v . at ( i - 1 ) << endl ;
    


  • volkard schrieb:

    314159265358979 schrieb:

    So ein hässlicher Klammerungsstil 😮

    Ja. Öffnwende Klammern direkt hinter Buchstabenm und das Semikolon ohne Leerzeichen davor passen einfach nicht zum Rest. Ein paar andere Kleinigkeiten auch nicht.
    Hier die harmonisierte Fassung.

    for ( unsigned int i = 1 ; i != v . size ( ) + 1 ; ++ i )
                    cout << "Element " << i << " = " << v . at ( i - 1 ) << endl ;
    

    😃
    Da fehlen aber noch die Leerzeichen in der Ausgabe 🤡



  • So kann man ein bestimmtes Intervall ausgeben; man muss lediglich die 3 mit Kommentaren versehenen Variablen anpassen.

    #include <iostream>
    #include <vector>
    #include <ctime>
    #include <algorithm>
    #include <cstdlib>
    
    using namespace std;
    
    int main( int argc, char **argv )
    {
            unsigned int iIntervallStart = 0;     //Beginn des Intervalls
            unsigned int iIntervallEnd = 42;      //Ende des Intervalls
            unsigned int iFilter = 13;            //Zu filterndes Element, Index
    
            vector<int> v;
            srand( time( 0 ) );     
    
            for( unsigned int i = iIntervallStart; i != iIntervallEnd; ++i )
                    v.push_back( 1 + ( rand( ) % 100 ) );
    
            cout << "[Vector VOR dem Sortieren]" << endl;
    
            for( unsigned int i = 1; i != v.size( ) + 1; ++i )
                    cout << "Element " << i << " = " << v.at( i - 1 ) << endl;
    
            cout << "Das ist Element 13 davor:\t" << v.at( iFilter - 1 ) << endl << endl;
    
            cout << "[Vector NACH dem Sortieren]" << endl;
    
            sort( v.begin( ), v.end( ) );
    
            for( unsigned int i = 1; i != v.size( ) + 1; ++i )
                    cout << "Element " << i << " = " << v.at( i - 1 ) << endl;
    
            cout << "Das ist Element 13 danach:\t" << v.at( iFilter - 1 ) << endl;
    
            return 0;
    }
    

    Ich versteh nicht so ganz, warum du das mit Iteratoren machen willst... das bringt nur zusätzliche Deklarationen :o Aber so würde ich es mit Iteratoren lösen:

    #include <iostream>
    #include <vector>
    #include <ctime>
    #include <algorithm>
    #include <cstdlib>
    
    using namespace std;
    
    int main( int argc, char **argv )
    {
            unsigned int iIntervallStart = 0;     //Beginn des Intervalls
            unsigned int iIntervallEnd = 42;      //Ende des Intervalls
            unsigned int iFilter = 13;             //Zu filterndes Element, Index
    
            vector<int> v;
            vector<int> :: iterator it;
            srand( time( 0 ) );     
            int i;
    
            for( unsigned int i = iIntervallStart; i != iIntervallEnd; ++i )
                    v.push_back( 1 + ( rand( ) % 100 ) );
    
            cout << "[Vector VOR dem Sortieren]" << endl;
    
            i = 0;
            for( it = v.begin( ); it != v.end( ); ++it )
            {
                    ++i;
                    cout << "Element " << i << " = " << *it << endl;
            }
    
            it = v.begin( ) + iFilter - 1;  
            cout << "Das ist Element 13 davor:\t" << *it << endl << endl;
    
            cout << "[Vector NACH dem Sortieren]" << endl;
    
            sort( v.begin( ), v.end( ) );
    
            i = 0;
            for( it = v.begin( ); it != v.end( ); ++it )
            {
                    ++i;
                    cout << "Element " << i << " = " << *it << endl;
            }
    
            it = v.begin( ) + iFilter - 1;  
            cout << "Das ist Element 13 danach:\t" <<  *it << endl;
    
            return 0;
    }
    

    @die anderen:
    ich weiß, das mit den Klammern ist afaik kein Stil, allerdings hab ich mir das so angewöhnt - aus granz pragmatischen Gründen:
    Ich finde man erkennt so schneller, wie viele Parameter eine Funktion will und vor allem was zu was gehört (also z.B Foo(Bar(myInt+4, myStrFunc(), &whatever), 0) ) ich kann das bei meinem Stil viel schneller erknnen, außerdem finde ich es (deshalb) schöner. Wenn immer ein Leerzeichen dazwischen ist, verliert man komplett die Übersicht (wtf hab nicht ein mal gesehen, dass v . at ( 12 ) ; zusammen gehört...).



  • supermix schrieb:

    aus granz pragmatischen Gründen:
    Ich finde man erkennt so schneller, ...

    👍
    Darum geht's. Meine "Harmonisierung" war wohl Quatsch.


Log in to reply