c++ Dateien einlesen und Array erzeugen



  • Hallo polopo,

    Ja - manni66 hat es schon gesagt - Dein Compiler ist nicht auf das aktuelle C++-11 eingestellt. Das erklärt die Fehlermeldungen. Tue das bitte oder installiere eine aktueller Version.

    polopo schrieb:

    Aber der zweite Code funktioniert bei mir einwandfrei.

    das ist gut! (s.u.)

    polopo schrieb:

    Nur habe ich eine frage der code so gibt mir ja den preis von der ersten Pumpe an wieso steht dann in der for schleife 5 ? 😕 und so musss ich dass einzeln für jede pumpe machen oder? 😕

    Es sind 5 Punkte der Kennlinie und diese stehen vor dem Preis in der Datei. Also mus die for-Schleife 5-mal durchlaufen werden um alle 5 Punkte zu lesen. Und ja - man muss das für jede Pumpe machen.

    polopo schrieb:

    Ich weiß ich nerve mit meinen teilweise "blöden" Fragen, aber wie gesagt ich verstehe das meiste nicht.

    Das Forum ist dazu da, um Fagen zu stellen. Du 'nervst' nicht. Du hast ja gesagt, dass Du Anfänger bist. Also kann auch niemand erwarten, dass Du Dich auskennst. Nur wer nicht fragt bleibt dumm!

    polopo schrieb:

    Deshalb noch zu guter Letzt kann ich hier im Forum eine Bilddatei einfügen? wenn ja, wie? Dann könnte ich nämlich die matrix anhängen wie sie zum Schluss aussehen muss.

    Bilder kann man hier (leider) nicht einstellen. Tippe bitte 2 oder 3 Zeilen der geforderten Ausgabe ab. Benutze dazu die Code-Tags! (erster Tag links unterhalb des Eingabefensters)

    polopo schrieb:

    Ich muss ja alles in ein Array bzw matrix abspeichern wie soll das wiederrum gehen? 😕

    Nun - in Deinem Code, den Du gepostet hast, kommen doch schon 2-D-Arrays vor. Hast Du das einfach nur kopiert, oder auch verstanden, was Du da tust? Im Übrigen soillst Du nicht 'alles' in ein 2-D-Array speichern, sondern die Zeiten, die jede Pumpe zum Leerpumpen des Brunnens benötigt.

    Prof schrieb:

    Erstellen Sie als Erstes eine Matrix, die für alle Brunnen speichert, wie viel Zeit jede der 9 Pumpen benötigt, um den jeweiligen Brunnen leer zu pumpen. Geben Sie den Inhalt der Matrix anschließend aus.

    Eine Zeit in Minuten kannst Du - im einfachsten Fall - als Integer (Typ int) darstellen. Ich habe Dir meinen Code noch mal üerarbeitet, so dass er jetzt hoffentlich mit Deinem Compiler übersetzt werden kann.

    Wichtig noch: Dürfen bei den struct's auch Methoden hinzu gefügt werden?

    Gruß
    Werner

    #include <fstream>
    #include <iostream>
    #include <vector>
    
    struct kennlinie{ // eigentlich ein Punkt auf einer Kennlinie!
        int liter; /* Foerdermenge pro Minute */ 
        int hoehe; /* in Meter */ 
    }; 
    struct pumpe{ 
        char name[20]; /* Name der Pumpe */ 
        kennlinie pkt[5]; /* Kennlinie aus 5 Punkten */ 
        float preis; /* in Euro */ 
    };
    
    std::istream& operator>>( std::istream& in, kennlinie& kp )
    {
        return in >> kp.liter >> kp.hoehe;
    }
    std::istream& operator>>( std::istream& in, pumpe& p )
    {
        in.getline( p.name, sizeof(p.name) );
        for( int i = 0; i< sizeof(p.pkt)/sizeof(p.pkt[0]); ++i )
            in >> p.pkt[i];
        in >> p.preis;
        return in;
    }
    
    namespace
    {   // hier sind die in der Aufgabe geforderten Konstanten
        const int ANZ_PUMPEN = 9;
        const int ANZ_BRUNNEN = 10;
    }
    
    struct brunnen 
    { 
        float foerderhoehe; /* in m */ 
        float wasserstandshoehe; /* in m */ 
        float brunnendurchmesser; /* in m */ 
    }; 
    std::istream& operator>>( std::istream& in, brunnen& b )
    {
        // ... hier Brunnendaten lesen
        return in;
    }
    
    int main()
    {
        using namespace std;
    
        vector< pumpe > pumpen; // viele Pumpen; Es steht nirgends dass die Pumpen in einem Array gespeichert werden sollen - oder?
        ifstream datei("pumpen.txt");
        if( !datei.is_open() )
        {
            cout << "Kann die Datei nicht oeffnen" << endl;
            return 0;
        }
        for( pumpe p; datei >> ws >> p; )  // Bem. zu 'ws': evt. Leerzeilen überlesen
            pumpen.push_back( p );
    
        cout << pumpen.size() << " Pumpen eingelesen" << endl;
        if( pumpen.size() != ANZ_PUMPEN )
        {
            cout << "Die Datei mit den Pumpen entspricht nicht den Vorgaben aus der Aufgabe" << endl;
            return 0;
        }
    
        brunnen alleBrunnen[ANZ_BRUNNEN];   // wie in der Aufgabenstellung blöderweise gefordert; Oh jee!!
        // .. hier jetzt die Brunnen einlesen
    
        int pumpZeitenInMin[ANZ_BRUNNEN][ANZ_PUMPEN];       // die geforderte Matrix
        // .. Zeiten eintragen
        // .. Matrix formatiert ausgeben
        return 0;
    }
    


  • Hallo polopo,

    In Deutschland darf ein Handwerksmeister bei den meisten Gewerken nur dann auch Lehrlinge ausbilden, wenn er eine gewisse Anzahl von Jahren selbst gearbeitet hat.
    Frage doch mal Deinen Prof wieviele Jahre er an welchen Projekten mit C++ gearbeitet hat und in welcher Funktion. Und wie groß waren diese Projekte (Anzahl Code-Zeilen, Anzahl der beteiligten Personen und Projektdauer)?

    Frage ihn doch auch, ob ihm die Namen Knuth, Stroustrup, Sutter, Booch, Andrew König, Scott Meyers oder Alexandrescu etwas sagen. Wenn 'Professor für C++' nicht nur auf seiner Visitenkarte steht, so müsste er mindestens ein halbes Dutzend Bücher von diesen Autoren gelesen haben. Und wenn er das gelesen hat, sollten seine Aufgaben anders aussehen ...



  • Vielen Vielen dank Werner Salomon ich werde mich mit deinem vorgegeben Code versuchen durchzuarbeiten. Hoffentlich erfolgreich 🙂

    ########### Die Matrix Zeit ################
                      |Ebara4WN7 | Ebara4N14 |EbaraSB330 | EbaraSB345  .....
    ------------------|----------|-----------|-----------|-----------
    Brunnen 981.719l  |   19M    |    19M    |           | 21M
    Brunnen 3392.82l  | 1H: 7M   |           |           |
    Brunnen 534.0551l |          |           |           |
    .
    .
    ##########################################################
    
    ########### Die Matrix- Preis- Leistung ################
                      |Ebara4WN7 | Ebara4N14 |EbaraSB330 | EbaraSB345  .....
    ------------------|----------|-----------|-----------|-----------
    Brunnen 981.719l  | 163.948% |           | 368.765%  | 
    Brunnen 3392.82l  |          |           |           |
    Brunnen 534.0551l |          |           |           |
    .
    .
    .
    

    ↑so genau(natürlich komplett ausgefüllt 😃 ) sollte die Ausgabe dann aussehen↑

    const unsigned int ANZ_PUMPEN(10); 
    const unsigned int ANZ_BRUNNEN(10); 
    int pumpZeitenInMin[ANZ_BRUNNEN][ANZ_PUMPEN]; 
    
     for(unsigned int i(0); i != ANZ_BRUNNEN; ++i) 
            for(unsigned int j(0); j != ANZ_PUMPEN; ++j) 
                pumpZeitenInMin[i][j] = 0; 
    
        for(unsigned int i(0); i != ANZ_BRUNNEN; ++i) { 
            for(unsigned int j(0); j != ANZ_PUMPEN; ++j) { 
                std::cout << pumpZeitenInMin[i][j] << " ";
            } 
           std::cout << "\n"; 
        } 
        std::cout << std::endl; 
    
    return 0; 
    }
    

    Die Ausgabe für die Matrix kann ich dann so machen oder?

    Jetzt kommt halt wieder eine andere Frage auf mit wie bekomme hin die extra zeilen mit ##### bzw die Überschriften einzufügen und das alles so umzuschreiben dass das Ergebnis genauso wie oben aussieht.

    Ah und nebenbei die ganzen Anmerkungen werde ich in betracht ziehen und mit meinem Professor nochmal drüber reden. Denn ich bin nicht der einzige Student der im Moment in Informatik nur Bahnhof versteht..

    Werner Salomon schrieb:

    Wichtig noch: Dürfen bei den struct's auch Methoden hinzu gefügt werden?

    }

    Das weiß ich leider selber nicht 😕



  • polopo schrieb:

    Ah und nebenbei die ganzen Anmerkungen werde ich in betracht ziehen und mit meinem Professor nochmal drüber reden.

    Erfahrungsgemäß bringt das gar nichts. Viele Profs sind einfach ziemlich schlecht, zumindest in einigen der von ihnen gehaltenen Vorlesungen. Das heißt jetzt nicht unbedingt, dass sie gar keine Ahnung haben. Mag sein, dass sich ein Prof sagen wir für KI interessiert, die ganzen Forschungen auf dem Bereich mitverfolgt, evtl. selber forscht usw. Da sollte er sich dann auch halbwegs auskennen. Aber die halten oft nebenbei noch irgendwelche anderen Vorlesungen, wie eben z.B. C++. Und da haben sie oft überhaupt keine Erfahrung und beziehen sich auf oberflächliche Kenntnisse, die sie sich vor 20-30 Jahren angeeignet haben.
    Wenn du sie darauf ansprichst, kommen sie mit lauter sinnlosen Ausreden. Dir muss halt einfach klar sein, dass die Programmiervorlesungen oft sehr schlecht sind und das nebenbei noch selber lernen musst.



  • Hallo polopo,

    Eine Frage zuerst: sind es 9 Pumpen oder 10 Pumpen ?

    Prof schrieb:

    In der Datei pumpen.txt werden die Daten für 9 verschiedene Brunnenpumpen bereitgestellt.

    polopo schrieb:

    Jetzt kommt halt wieder eine andere Frage auf mit wie bekomme hin die extra zeilen mit ##### ...

    das ist nun wirklich einfach:

    cout << "########### Die Matrix Zeit ################" << endl;
    

    was lernt Ihr in der Vorlesung, wenn Du nicht mal weißt, wie man einen Text ausgibst? Sagt Dir das 'Hello World'-Programm etwas?

    polopo schrieb:

    .. bzw die Überschriften einzufügen ...

    dazu ist es sinnvoll, den Manipulator std::setw zu kennen.

    cout << "                  |"; // Prefix
        for( int i=0; i<ANZ_PUMPEN; ++i ) {
            cout << setw(10) << pumpen[i].name << "|"; // erfordert #include <iomanip>
        }
        cout << endl;
        cout << "------------------|"; // Prefix
        for( int i=0; i<ANZ_PUMPEN; ++i ) {
            cout << "----------|";
        }
        cout << endl;
    

    So werden die Texte rechtsbündig ausgegeben. Für linksbündige Ausgabe musst Du noch std::left hinzufügen.

    polopo schrieb:

    ... und das alles so umzuschreiben dass das Ergebnis genauso wie oben aussieht.

    Das ist schon wesentlich schwieriger. Insbesondere dieses Zeitformat sieht etwas komisch aus (höflich ausgedrückt!).
    Du hast für die Ausgabe der Zeit 10Zeichen Platz. Es sollen aber auch Tage ausgegeben werden können.

    Prof schrieb:

    Die Zeitangabe enthält Tage, Stunden und Minuten, wenn die benötigte Zeit größer als 1 Tag ist.

    Ich mache jetzt mal einen Formatierungsvorschlag und Du sagst, ob das so passt.

    |0123456789| // max 10Zeichen pro Spalte
    |   19M    | 
    | 1H: 7M   |
    |23H:59M   |
    |1D 13H:45M|
    

    sieht bescheuert aus; ist das die Vorgabe für die Formatierung?

    Aber bevor ich Dir zeige wie es geht, sollst Du selber ja auch noch was machen. Du hast jetzt folgende Aufgaben:

    • Einlesen der Brunnen aus der Brunnen-Datei. Nehme bitte das Einlesen eines Punktes der Kennlinie als Vorbild ( struct kennlinie ), dann sollte das kein Problem mehr sein.
    • Eine Methode ' float getLiterProMinute( float foerderhoehe ) const; ' bei der struct pumpe , die bei vorgegebener Förderhöhe die Förderleistung aus der Kennlinie berechnet (schwierig!)
    • Eine Methode ' float getVolumen() const; ' bei der struct brunnen , die das Volumen des Brunnens zurück gibt (einfach)
    • Beschreiben und Ausgabe der Matrix mit den Förderzeiten. Hier würde ich Dir eine zusätzliche Klasse (meinetwegen auch struct ) empfehlen, die diese Formatierung übernimmt.
    • Finde die Pumpe mit dem kleinsten Wert für Preis*Förderzeit für einen Brunnen
    • Ausgabe der Tabelle mit den prozentualen Angaben für Preis*Förderzeit

    Nehme vorher noch mein Programm (ich unterstelle mal, dass es ohne Fehler durchläuft) und mache kleine Änderung und schaue Dir an, was passiert. Füge auch zusätzliche Ausgaben hinzu. Wichtig ist, dass Du ein Gefühl dafür bekommst, was da passiert.

    Arbeite dann die Aufgabenliste ab. Und berichte von Deinen Erfahrungen und stelle möglichst konkrete Fragen.

    Gruß
    Werner



  • Hallo SeppJ: schiebe den Thread doch bitte wieder in's C++-Forum zurück. Danke



  • Werner Salomon schrieb:

    Eine Frage zuerst: sind es 9 Pumpen oder 10 Pumpen ?

    Nein es stimmt es ist 9 Pumpen. Aber die Ausgabe hat ja dann 10 zeilen und 10 Spalten. ist also nur ein Denkfehler von mir 😕

    Werner Salomon schrieb:

    cout << "########### Die Matrix Zeit ################" << endl;
    

    was lernt Ihr in der Vorlesung, wenn Du nicht mal weißt, wie man einen Text ausgibst? Sagt Dir das 'Hello World'-Programm etwas?

    Das weiß ich natürlich 😃 Ist mir nachdem ich den Beitrag geschrieben habe auch aufgefallen. War eine sinnlose Frage 🙂

    Werner Salomon schrieb:

    Ich mache jetzt mal einen Formatierungsvorschlag und Du sagst, ob das so passt.
    Code:

    |0123456789| // max 10Zeichen pro Spalte
    |   19M    | 
    | 1H: 7M   |
    |23H:59M   |
    |1D 13H:45M|
    

    sieht bescheuert aus; ist das die Vorgabe für die Formatierung?

    Ich habe die Aufgabe komplett reingestellt und bezüglich der Formatierung steht nichts. Aber sollte so passen sein 👍

    Werner Salomon schrieb:

    Einlesen der Brunnen aus der Brunnen-Datei. Nehme bitte das Einlesen eines Punktes der Kennlinie als Vorbild (struct kennlinie), dann sollte das kein Problem mehr sein.

    Der erste Punkt sollte ja dann so aussehen ?

    { 
        std::istream& operator>>( std::istream& in, brunnen& b ) 
    
        return in >> b.foerderhoehe >> b.wasserstandshoehe >> b.brunnendurchmesser; 
    int main() 
    { 
        using namespace std; 
    
        vector< brunnen > brunnen; 
        ifstream datei("brunnen.txt"); 
        if( !datei.is_open() ) 
        { 
            cout << "Kann die Datei nicht oeffnen" << endl; 
            return 0; 
        } 
        for( brunnen b; datei >> ws >> b; )  
            pumpen.push_back( b ); 
    
        cout << brunnen.size() << " Brunnen eingelesen" << endl; 
        if( brunnen.size() != ANZ_Brunnen ) 
        { 
            cout << "Die Datei mit den Brunnen entspricht nicht den Vorgaben aus der Aufgabe" << endl; 
            return 0; 
        }
    

    Werner Salomon schrieb:

    Eine Methode 'float getLiterProMinute( float foerderhoehe ) const;' bei der struct pumpe, die bei vorgegebener Förderhöhe die Förderleistung aus der Kennlinie berechnet (schwierig!)

    ganz ehrlich? hier verstehe ich überhaupt nicht was von mir gefordert ist 😕

    Werner Salomon schrieb:

    Eine Methode 'float getVolumen() const;' bei der struct brunnen, die das Volumen des Brunnens zurück gibt (einfach)

    float getVolume(float brunnendurchmesser, float foerderhoehe, float PI) ;
    float Volume;
    const float PI = 3.14;
    
    Volume = PI* (brunnendurchmesser)^2 * foederhoehe / 4.0 ;
    

    wäre toll wenn es so klappen würde...Aber tut es nicht

    Beschreiben und Ausgabe der Matrix mit den Förderzeiten. Hier würde ich Dir eine zusätzliche Klasse (meinetwegen auch struct) empfehlen, die diese Formatierung übernimmt.

    int main ( )
    {
        int X [10][10];
    
        for(int i=0; i<0; i++)
        {
            for(int j=0; j<0; j++)
                cout<<" "<<X[i][j];
            cout<<"\n";
        }
    
        return 0;
    }
    

    Das ist natürlich auch Müll... 😞

    Finde die Pumpe mit dem kleinsten Wert für Preis*Förderzeit für einen Brunnen

    { 
        int i,min,Preis*foerderzeit; 
    
        scanf("%", Preis*foerderzit); 
    
        { 
            if (i < min) min = i;       
            scanf("%i", &i); 
        } 
    
        printf( Min: %i", min);
    

    das kann ich so auch nicht benutzen oder 😞

    Ich habe heute vergeblichst versucht die Punkte durchzuarbeiten aber wie man sieht kommt bei mir nur "Müll raus"
    Sorry für den lagen Text in diesem Sinne;Wollte eigentlich alles so durcharbeiten und schließlich einfügen und dann posten aber wie schon öfters erwähnt, wenn es um Informatik bzw. um c++ geht hängt bei mir alles. Meine Zeit wird auch knapp sollte bis Montag den Beleg fertig haben. Da dieser als Prüfungsvorleistung dient werde ich die Prüfung erst im nächsten Jahr mitschreiben können... meine einzige Hoffnung war es den Beleg hinzubekommen und bis zu den Prüfungen von Anfang Videos zu c++ zu schauen und zu üben. Aber wie man sieht reicht mein wissen im Moment überhaupt nicht für den Beleg aus.
    Vielen dank trotzdem an die hinweise und die Hilfen
    ganz besonders an WernerSalomon.



  • Hallo polopo,

    polopo schrieb:

    Nein es stimmt es ist 9 Pumpen. Aber die Ausgabe hat ja dann 10 zeilen und 10 Spalten. ist also nur ein Denkfehler von mir

    OK - dann ist es auch eine 10x9-Matrix. Auch wenn dann in der Tabelle in der ersten Spalte die Nummer des Brunnens steht!

    polopo schrieb:

    .. und bezüglich der Formatierung steht nichts.

    Du erwähntest ein Bild der Ausgabe, was Du hier zwar nicht einstellen kannst, aber dort sollte die Formatierung zu sehen sein.

    polopo schrieb:

    Der erste Punkt sollte ja dann so aussehen ?

    {
        std::istream& operator>>( std::istream& in, brunnen& b )
     
        return in >> b.foerderhoehe >> b.wasserstandshoehe >> b.brunnendurchmesser;
    int main()
    {
        using namespace std;
     
        vector< brunnen > brunnen; 
        // usw...
    

    Ups! - Du weißt anscheinend nicht, wie man eine Funktion schreibt. Eine Funktion beginnt mit dem Typ (nicht mit '{'!) - z.B. int oder hier std::istream& dann kommt der Funktionsname - z.B. main oder wie hier operator>> , und dann in Klammern () die Parameterliste, die darf auch leer sein und dann der Funktions-Body startet mit '{' und endet mit '}'. Und bezüglich der Zeichen '{' und '}' ist der Compiler extrem kleinlich!
    Du hast irgendwelche Key- und Typ-Worte irgendwo hingeklotzt und erwartet jetzt, dass die Maschine so schlau ist, das alles zu sortieren. So geht das nicht. Ich verweise auf Deine erste Unterrichtsstunde und das Hello-World-Programm. Da kam das dran!

    polopo schrieb:

    Werner Salomon schrieb:

    Eine Methode 'float getVolumen() const;' bei der struct brunnen, die das Volumen des Brunnens zurück gibt (einfach)

    float getVolume(float brunnendurchmesser, float foerderhoehe, float PI) ;
    float Volume;
    const float PI = 3.14;
    
    Volume = PI* (brunnendurchmesser)^2 * foederhoehe / 4.0 ;
    

    wäre toll wenn es so klappen würde...Aber tut es nicht

    kann auch nicht. Siehe oben: wie schreibt man eine Funktion. BTW '^2' macht nicht das was Du denkst. Besser Du schreibst:

    PI* brunnendurchmesser * brunnendurchmesser * foederhoehe / 4.0
    

    polopo schrieb:

    Finde die Pumpe mit dem kleinsten Wert für Preis*Förderzeit für einen Brunnen

    { 
        int i,min,Preis*foerderzeit; 
        
        scanf("%", Preis*foerderzit); 
        { 
            if (i < min) min = i;       
            scanf("%i", &i); 
        } 
        printf( Min: %i", min);
    

    das kann ich so auch nicht benutzen oder

    wenn Du C und nicht C++ lernen möchtest, sind Teile davon irgendwie brauchbar. Jetzt mal im Ernst. Du hast praktisch keine Ahnung, weißt nicht wie man eine Funktion hin schreibt, aber Du kennst scanf und printf . Woher?? Wenn Du das von Deinem Prof gelernt hast, dann Gute Nacht - vergiss diese Vorlesung. Das ist reines C und in C++ wird dies normal nicht benutzt. Dein Compiler kennt es nur deshalb noch, um die Aufwärtskompatibilität sicher zu stellen.

    polopo schrieb:

    Ich habe heute vergeblichst versucht die Punkte durch zuarbeiten aber wie man sieht kommt bei mir nur "Müll raus"

    ... hat was mit Garbage-In Garbage-Out zu tun. Siehe meine Bemerkungen oben.
    Bis morgen (Montag) schaffst Du das nicht mal im Ansatz. Für diese Aufgabe musst Du zunächst die grundsätzlichen Basics lernen:

    • wie schreibt man eine Funktion
    • wie fügt man rein syntaktisch einer struct/class eine Methode hinzu
    • schreibe selbst ein Programm (kein Copy&paste aus dem I-Net) was zwei Zahlen einliest und deren Summe und/oder Produkt berechnet
    • wie sieht ein einfacher Algorithmus aus; z.B. finde in einem Array den größten Wert

    so lange Du so etwas nicht kannst, brauchst Du an dieses Aufgabe gar nicht ran gehen.

    Ansonsten, lass Dir hier ruhig helfen. Ich möchte Dich nicht demotivieren. Aber für Belege und/oder Prüfungen ist es für Dich noch viel zu früh.

    Gruß
    Werner



  • dhs



  • Werner Salomon schrieb:

    Hallo polopo,

    In Deutschland darf ein Handwerksmeister bei den meisten Gewerken nur dann auch Lehrlinge ausbilden, wenn er eine gewisse Anzahl von Jahren selbst gearbeitet hat.
    Frage doch mal Deinen Prof wieviele Jahre er an welchen Projekten mit C++ gearbeitet hat und in welcher Funktion. Und wie groß waren diese Projekte (Anzahl Code-Zeilen, Anzahl der beteiligten Personen und Projektdauer)?

    Frage ihn doch auch, ob ihm die Namen Knuth, Stroustrup, Sutter, Booch, Andrew König, Scott Meyers oder Alexandrescu etwas sagen. ...

    Ob das wohl sinnvoll ist, sich derart mit dem Prof anzulegen, wenn man eigentlich nur durch dieses Semester durch und den Schein haben will?


Anmelden zum Antworten