c++ Dateien einlesen und Array erzeugen



  • Hi polopo,

    ein paar Anmerkungen und Tipps:

    - bitte benutze Codetags. Damit bleibt dein Code leserlich.

    - dein Stringstream ist nach der while Schleife, also verarbeitest du da immer nur die letzte Zeile.

    - warum char[20] wenn du doch c++ benutzt?

    - Hier eine Diskussion bei Stack Overflow, bei der es um dein eigentliches Problem geht, ich fürchte du hast keine Ahnung wo nach du genau suchen musst.

    - "pumpe" als Variablen Namen, wenn es auch ein Struct Namens "pumpe" gibt, halte ich für äußerst unschön.



  • Hallo polopo,

    Du schreibst: '... ist C++.' Ok - ich knalle Dir mal ein fertiges Programm hin, welches Elemente aus der Sprache C++ nutzt! Probiere es bitte mal aus und berichte uns Deine Erfahrungen damit. Mehr dazu vielleicht heute abend.

    #include <array>
    #include <fstream>
    #include <iostream>
    #include <string>
    #include <vector>
    
    struct kennlinien_punkt // eigentlich ein Punkt auf einer Kennlinie!
    {
        int liter_; // Foerdermenge in [l/min]
        int hoehe_; // .. bei dieser Foerderhoehe in [m]
    };
    
    struct pumpe
    {
        std::string name_;  // Name der Pumpe; char[20] als Member zur Ablage eines Namens ist kein C++!
        std::array< kennlinien_punkt, 5 > kennlinie_;
        float preis_; // Preis in Euro; als float Na ja!
    };
    
    // das sind die Lese-Funktionen für den Kennlinienpunkt und die Pumpe
    std::istream& operator>>( std::istream& in, kennlinien_punkt& kp )
    {
        return in >> kp.liter_ >> kp.hoehe_;
    }
    std::istream& operator>>( std::istream& in, pumpe& p )
    {
        getline( in, p.name_ );
        for( auto& kp: p.kennlinie_ )
            in >> kp;
        in >> p.preis_;
        return in;
    }
    
    int main()
    {
        using namespace std;
        vector< pumpe > pumpen; // viele Pumpen
        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;
        return 0;
    }
    


  • Hallo nochmal zusammen;
    Ich weiß, ich stelle mich gerade total blöd dar, aber ich bin wirklich ein blutiger Anfänger.Die Fähigkeit Informatik zu verstehen klappt nicht so richtig.. Aber wieder zurück.
    Der erste Teil; also dieser ist vorgegeben:

    struct 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 */ 
    };
    

    Wir sollen diesen Teil genauso verwenden.Das ist nichts was ich selber zusammengebastelt habe. Deshalb verstehe ich nicht wie es sein kein, dass mein Prof. das für C gemacht haben soll,denn wir haben nur ein einziges Semester und arbeiten seit beginn mit C++..
    Danke Werner Salomon für deinen Code aber ich komme mit diesem etwas durcheinander. Der will sich so erst gar nicht öffnen lassen.

    Und in letzten Teil hast du Vektoren benutzt. Wir sollen die Daten mit einer anderen Textdatei zusammen einlesen und anschließend in einer 2dMatrix ausgeben. 
    [10]*[10] Matrix wäre das in meinem Fall. ich will niemanden auffördern den Code für mich zu programmieren deshalb hab ich den zweiten Teil hier weggelassen damit ich nur ansatzweise verstehe wie ich vorangehen soll. Was aber glaube ich schwerer wird als erwartet.
    Wie gesagt ich habe des öfteren Versucht nur die Datei einzulesen was auch funktioniert hat, aber mit den Werten weiterzurechnen bzw in ein Array abzuspeichern funktioniert einfach nicht  :( 
    [code]
    
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <array>
    using namespace std;
    struct 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 */ 
    }; 
    int main()
    {
    	int i = 0, j = 0;
    	string line;
    	string array[10][10];
    
    	ifstream ratesfile(pumpen.txt");
    	if(ratesfile.is_open())
    
    		std::cout << " \n"; 
    	else
    
    		std::cout << "Datei kann nicht geöffnet werden\n"; 
    
    	for(int i = 0; i < 10; ++i) 
    	{
    		for(int j = 0; j < 10; ++j) 
    		{
    
    			if(getline(ratesfile, line ))
    			{
    				array[i][j] = line;
    				cout << array[i][j] << endl;
    			}
    		}
    	}
    
    	cin.get();
    
    	for(int i = 0; i < 10; ++i)
    	{
    		cout << array[i][0] << endl;
    		cout << array[i][1] << endl;
    	}
    	cin.get();
    
    	for(int i = 0; i < 10; ++i)
    	{
    		for(int j = 0; j < 10; ++j)
    		{
    			cout << array[i][j] << endl;
    		}
    	} 
    
    	ratesfile.close();
    
    	return 0;
    }
    

    auch der code (den ich aus dem Internet habe) gibt mir allein die Datei aus nicht in einem Array 😕 😕



  • Schau dir mal die Farbe deines Codes genau an.

    ifstream ratesfile(pumpen.txt");
    


  • Werner Salomon hat eine C++ Lösung für dein (Programmier-) Problem gepostet, welches du geschildert hast, nicht für die von deinem Prof gestellte Aufgabe.

    Wie wäre es, wenn du die Aufgabe(n) so postest, wie du sie gestellt bekommen hast, wir können nicht wissen das du die Daten in einer speziellen Form weiter verarbeiten sollst/musst.

    Auch wenn du evt. andere Datenstrukturen benutzen sollst / musst, zeigt dir das Programm von Werner Salomon doch, wie es algorithmisch zu lösen ist.



  • ok, dann poste ich mal die komplette Aufgabe

    Ein Unternehmen für Garten- und Landschaftsbau baut Bewässerungsanlagen für Gärten. Zur Förderung von Wasser aus vorhandenen Brunnen muss eine geeignete Pumpe gewählt werden. Die Brunnenpumpe muss leistungsstärker sein, je höher und mehr Wasser aus dem Brunnen gefördert wird. Jede Brunnenpumpe besitzt eine Kennlinie, die aussagt, bei welcher Förderhöhe wie viel Wasser gepumpt wird. Die Daten eines Punktes auf der Kennlinie erfassen wir mit folgender Struktur:

    struct kennlinie
    {
    int liter; /* Foerdermenge pro Minute /
    int hoehe; /
    in Meter */
    };

    Zur Vereinfachung sollen die Kennlinien unserer Brunnenpumpen anhand von 5 darauf befindlichen Punkten erfasst werden (Beispiel: Diagramm zur Leistung einer Pumpe mit 5 Punkten).

    Die Meterangabe beim letzten Index entspricht der maximalen Förderhöhe der Pumpe. Als weitere Eigenschaft besitzt jede Pumpe einen Preis und einen Namen:

    struct pumpe
    {
    char name[20]; /* Name der Pumpe /
    kennlinie pkt[5]; /
    Kennlinie aus 5 Punkten /
    float preis; /
    in Euro */
    };

    In der Datei pumpen.txt werden die Daten für 9 verschiedene Brunnenpumpen bereitgestellt. Lesen Sie die Daten aus der Datei ein und speichern Sie diese unter der Verwendung der Struktur pumpe in einem Array. Die Datei nennt für jede Pumpe erst den Namen der Pumpe, dann die 5 Punkte der Kennlinie bestehend aus der Anzahl der Liter und der Angabe der Höhe und danach der Preis der Pumpe.

    Ein Brunnen besitzt drei Eigenschaften (zur Verdeutlichung siehe Abbildung Skizze Tiefbrunnen).

    Die Abmessungen von 10 unterschiedlichen Brunnen befinden sich in der Datei brunnen.txt und sollen mithilfe folgender Struktur in einem Array gespeichert werden:

    struct brunnen
    {
    float foerderhoehe; /* in m /
    float wasserstandshoehe; /
    in m /
    float brunnendurchmesser; /
    in m */
    };

    Achtung! Die Anzahl der Brunnen sowie die Pumpen sind als Konstanten in der main()-Funktion zu speichern und im Programm an allen nötigen Stellen zu nutzen. Die Inhalte der angegebenen Datein entspricht diesen Vorgaben. Verwenden Sie für PI den Wert 3.1415. Das Benutzen der Mathematikbibliothek ist nicht zulässig (und auch nicht nötig). Zur weiteren Vereinfachung, gehen Sie bitte entgegen der physikalischen Gesetzte davon aus, die Pumpe unabhängig vom Füllstand des Brunnens stets die gesamte Förderhöhe überwinden muss.

    Die Berechnung
    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. Die Zeitangabe in der Ausgabe enthält nur Minuten, wenn die benötigte Zeit kleiner als 60 Minuten ist. Die Zeitangabe enthält Stunden und Minuten, wenn die benötigte Zeit kleiner als 1 Tag ist. Die Zeitangabe enthält Tage, Stunden und Minuten, wenn die benötigte Zeit größer als 1 Tag ist. Übrige Sekunden können ignoriert bzw. abgerundet werden. Kann die Pumpe die geforderte Höhe nicht überwinden, tragen Sie "n. e." - nicht einsatzfähig - in die Ausgabe ein.

    Fertigen Sie nun eine Ausgabe für einen Preis-Leistungsvergleich in Form einer 2. Matrix an. Zeigen Sie für alle Brunnen den Preis der Pumpe an, die das beste Preis-Leistungs-Verhältnis besitzt (Index aus Preis*Zeit) und eingesetzt werden kann, in Euro an. Für alle anderen Pumpen soll die Matrix einen prozentualen Vergleichswert anzeigen. Der kleinste Preis*Zeit-Index (je Zeile) entspricht 100%. Tragen Sie, wenn die Pumpe nicht einsatzfähig ist, "0" in die Matrix ein.

    Erstellen Sie Ihre Ausgabe exakt so, wie in folgender Abbildung zu sehen, ausgefüllt mit allen Werten
    (10 x 10 matrix die erste zeile die namen der pumpen
    die erste spalte Brunnen Zahl( Zahl= volumen jeweils)



  • Da kann dein Prof noch so viel von C++ reden, dass ist eine astreine C Aufgabe. Habe sowas leider schon zu häufig bei Maschinenbau bzw. E-Technik Studenten gesehen.



  • Hallo polopo,

    polopo schrieb:

    Der erste Teil; also dieser ist vorgegeben:

    struct 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 */ 
    };
    

    Wir sollen diesen Teil genauso verwenden.Das ist nichts was ich selber zusammengebastelt habe. Deshalb verstehe ich nicht wie es sein kein, dass mein Prof. das für C gemacht haben soll,denn wir haben nur ein einziges Semester und arbeiten seit beginn mit C++..

    Im Ernst jetzt: wer als Speicher für einen Namen ein char[]-Feld benutzt, programmiert in C. Und bitte sage das auch so Deinem Prof! Auch wenn das ganze evt. wg. ein oder zwei Details oder Key-Words mit einem C++-Compiler übersetzt werden muss. Und lass Dir nicht einreden, dass das einfacher wäre - besser für Anfänger geeignet. Mit string und vector wird es wesentlich einfacher!
    Woher weißt Du, dass Du da C++ lernst? Ich nehme an, der Titel der Vorlesung lautet so - aber sonst? was macht Dich so sicher?

    polopo schrieb:

    Danke Werner Salomon für deinen Code aber ich komme mit diesem etwas durcheinander. Der will sich so erst gar nicht öffnen lassen.

    was bedeutet 'lässt sich nicht öffnen'? Du solltest den Code zunächst mal übersetzten und wenn es da Fehlermeldungen gibt, so teile sie bitte mit. Welche Entwicklungsumgebung benutzt Du?

    polopo schrieb:

    Und in letzten Teil hast du Vektoren benutzt. Wir sollen die Daten mit einer anderen Textdatei zusammen einlesen und anschließend in einer 2dMatrix ausgeben.
    [10]*[10] Matrix wäre das in meinem Fall.

    Oh je - eine zweidimensionale Matrix mit festen Grenzen und das für eine Applikation dieser Art. Das hat man vielleicht in den 80'er Jahren des letzten Jahrhunderts so gemacht. Wenn Du C++ lernen willst (nicht nur einen Schein für komisches C), dann beschäftige Dich zuerst mit std::vector<> und std::string .

    polopo schrieb:

    Wie gesagt ich habe des öfteren Versucht nur die Datei einzulesen was auch funktioniert hat, aber mit den Werten weiterzurechnen bzw in ein Array abzuspeichern funktioniert einfach nicht

    was kein Wunder ist, denn Du hast die Werte aus der Datei gar nicht gelesen, sondern nur die Zeichen aus der Datei in Deinen Speicher kopiert. Wenn Du sie lesen willst, so müssen die Zeichenfolgen interpretiert werden (siehe meine Leseroutinen oben). Wenn Du eine Zahl liest, so muss die Zeichenfolge '4', '5', '1', '.', '3' und '2' erst zu einem Typ float(besser double, noch besser ein Geldtyp) zusammengebaut werden.

    aus der Aufgabenstellung:

    Prof schrieb:

    Achtung! Die Anzahl der Brunnen sowie die Pumpen sind als Konstanten in der main()-Funktion zu speichern und im Programm an allen nötigen Stellen zu nutzen.

    Auch das ist der Geist von C (und Fortran, die 1960'er lassen grüßen) und selbst in C ist dies nicht erstrebenswert!

    Prof schrieb:

    Verwenden Sie für PI den Wert 3.1415. Das Benutzen der Mathematikbibliothek ist nicht zulässig

    Wieso nicht? Sollen hier die Studierenden absichtlich unwissend gehalten werden?

    Für die erste Matrix braucht man doch eine Funktion (besser Methode der pumpe ), die mit Vorgabe der Förderhöhe die Pumpleistung zurück gibt. Davon ist aber keine Rede! Ließe sich mit C++-Mitteln übrigens sehr schön lösen.

    Wenn wir Dir helfen sollen, so versuche bitte das angehängte Code-Schnipsel zum Laufen zu bringen. Falls es sich nicht generieren lässt, so sage bitte in welcher Zeile mit welchem Fehler. (Ja - ich halte mich an die Vorgaben, aber rede mal mit Deinem Prof - er soll sich doch mal hier melden) Und Du bist auch nicht blöd, sondern nur ein unglücklicher Anfänger, der einen rückständigen Prof hat.

    Gruß
    Werner

    #include <iostream>
    #include <fstream>
    #include <string>
    
    struct 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;
    }
    
    int main()
    {
        using namespace std;
        ifstream pumpenDatei("pumpen.txt");
        if( !pumpenDatei.is_open() )
        {
            cout << "kann Datei nicht oeffnen" << endl;
            return 0;
        }
        pumpe p;
        pumpenDatei >> ws; // ggf. Leerzeile(n) überlesen
        pumpenDatei.getline( p.name, sizeof(p.name) );
        for( int i=0; i<5; ++i ) {
            pumpenDatei >> p.pkt[i];
        }
        pumpenDatei >> p.preis;
    
        cout << "Der Preis ist " << p.preis << endl; // da sollte nachher 451.32 ausgegeben werden
        return 0;
    }
    


  • Deshalb verstehe ich nicht wie es sein kein, dass mein Prof. das für C gemacht haben soll,denn wir haben nur ein einziges Semester und arbeiten seit beginn mit C++.

    Dein Professor ist schlicht inkompetent. Vermutlich hat er 1995 C mit Klassen gelernt und unterrichtet jetzt genau das. Wir haben aber 2018, C++11 wird 7 Jahre alt und C++ hat sich weiterentwickelt.


  • Mod

    manni66 schrieb:

    Deshalb verstehe ich nicht wie es sein kein, dass mein Prof. das für C gemacht haben soll,denn wir haben nur ein einziges Semester und arbeiten seit beginn mit C++.

    Dein Professor ist schlicht inkompetent. Vermutlich hat er 1995 C mit Klassen gelernt und unterrichtet jetzt genau das. Wir haben aber 2018, C++11 wird 7 Jahre alt und C++ hat sich weiterentwickelt.

    Das hier gezeigte C ist älter als 1995. Und es ist noch nicht einmal gutes C. Es wurden einige Probleme angesprochen. Unpassende Datentypen. Unpassende Datenstrukturen. Altertümlicher Programmaufbau. Da braucht man gar nicht mehr ins Details gehen, das ist einfach nur schlecht, schon von ganz weit weg gesehen.

    Das macht weder Spaß, noch ist es sinnvoll. Man könnte mit wesentlich weniger Code ein wesentlich besseres Programm schreiben und bräuchte dazu sogar noch wesentlich weniger Wissen. Wenn es denn nur das richtige Wissen wäre, anstatt dessen, was hier gelehrt wurde.

    Und das sage ich unter der Voraussetzung, dass das wohl C sein soll. Wenn das C++ sein soll, dann ist es schlicht eine Katastrophe.



  • Hallo nochmal zusammen,
    vorweg vielen Dank für die große und detaillierte Antwort WernerSalamon.
    Wie gesagt ich studiere Maschinenbau und wir haben Informatik nur ein Semester über. In den Vorlesungen sowie Übungen wird nur von C++ geredet, benutzen auch in der uni c++ Programme. Ich selber habe mir das Programm Dev-C++ runtergeladen. Code::Blocks funktionierte nicht bei mir aber naja ist ein anderes Thema. Also deshalb war ich der festen Überzeugung dass wir nur mit c++ arbeiten. Wir hatten ja sonst nie was anderes dran 😕 aber dann hat sich ja das auch geklärt
    WernerSalamon Beim ersten Code bekomme ich Fehlermeldungen wie
    17 10 [Error] 'array' in namespace 'std' does not name a template type
    In function 'std::istream& operator>>(std::istream&, pumpe&)':
    17 10 [Error] 'array' in namespace 'std' does not name a template type
    29 [Error] range-based 'for' loops are not allowed in C++98 mode
    29 [Error] 'struct pumpe' has no member named 'kennlinie_'

    Aber der zweite Code funktioniert bei mir einwandfrei. 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? 😕
    Ich weiß ich nerve mit meinen teilweise "blöden" Fragen, aber wie gesagt ich verstehe das meiste nicht.
    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.
    Zusammen mit dieser Frage meine letzte Frage. Ich muss ja alles in ein Array bzw matrix abspeichern wie soll das wiederrum gehen? 😕



  • 17 10 [Error] 'array' in namespace 'std' does not name a template type

    Du hast deinen Compiler nicht auf C++11 oder besser eingestellt. Benutze -std=c++11 (oder 14 oder 17). Nein, ich weiß nicht, wo das in DevC++ eingestellt wird.



  • Wenn seine Version von DevC++ überhaupt einen aktuellen compiler besitzt (was ich bezweifle).
    Wahrscheinlich ist es ein veralteter gcc, der die neuen Standards nicht kennt.


  • Mod

    asdfsx schrieb:

    Wenn seine Version von DevC++ überhaupt einen aktuellen compiler besitzt (was ich bezweifle).
    Wahrscheinlich ist es ein veralteter gcc, der die neuen Standards nicht kennt.

    9 [Error] range-based 'for' loops are not allowed in C++98 mode



  • 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


Anmelden zum Antworten