Werte aus einer datei lesen und mit ihnen rechnen



  • Guten Abend ihr Lieben!
    Ich hoffe von euch kann mir hier irgendjemand helfen, ich bin hier schon total am verzweifeln. Bin ganz neu in c++ und muss ne Übung machen, habe aber leider überhaupt keinen Plan, wie das geht. Und von meinen Komolitonen kann mir auch leider keiner helfen, da ja zur Zeit Ferien sind.
    Ich habe eine Textdatei die folgender Maßen aussieht(alles innerhalb der Striche):
    -------------------------------------------------------------------
    13
    3523216.343218, 5773089.044545, 5.05
    3523320.146447, 5773120.018090, 6.054
    3523396.324623, 5773086.533177, 7.07
    3523484.222519, 5773028.771703, 8.56
    3523416.415571, 5772984.404194, 35.65
    3523314.286588, 5772960.127632, 55.017
    3523377.070799, 5772899.017667, 25.032
    3523441.529255, 5772808.608403, 25.03
    3523410.555711, 5772752.521174, 15.0323
    3523324.332061, 5772735.778718, 0.021
    3523172.812832, 5772795.214437, 35.02
    3523155.233253, 5772883.949456, 4.021
    3523156.907498, 5773045.514159, 99.02
    ----------------------------------------------------------------------

    Die einzelenen Spalten muss man sich als X,Y,Z Koordinaten vorstellen. Nun soll ich folgende Aufgaben lösen:

    Es ist ein Programm zu schreiben, welches eine Liste von Punkten mit XYZ-Koordinaten einliest
    •Die Punkte repräsentieren ein Polygon, dessen Flächeninhalt zu ermitteln ist
    Formel : 1/2 ∑ (x i + x i+1) (y i+1 - y i)

    Außerdem soll noch folgendes gemacht werden

    die Mittelwerte der Koordinaten sowie die minimalen und maximalen Koordinaten zu bestimmen

    Die Punkte sowie die Ergebnisse sind formatiert auf dem Bildschirm auszugeben

    Zusätzlich sind die Punkte sowie die Ergebnisse in eine Datei auszugeben
    (Spalten mit 12 Zeichen und 3 Nachkommastellen)

    Wenn mir hierbei irgendjemand helfend unter die arme geifen könnte wäre ich der glücklichste Mensch auf Erden. Ich hoffe ich finde wen, der mir helfen kann.

    Wenn jemand fragen haben sollte, erreicht ihr mich ständig per Email.
    die.gelbe.blume@gmx.de

    Viele liebe Grüße
    Ciaoi Eure Anna



  • Hallo, schau mal in den C++ FAQ hier im Forum, da ist eine ziemlich gute Anleitung wie man mit Strömen umgeht. Sobald du dir ein fstream erstellt hast kannst du damit arbeiten wie mit cout bzw. cin.

    Gruß



  • Hi,

    nicht von der kompletten Aufgaben abschrecken lassen, sondern jede Teilaufgabe
    einzeln angehen.

    Ich würde mir das Einlesen der Datei in ein Array einer geeigneten Struktur als erstes vornehmen. Gleich im Anschluss die Ausgabe auf dem Bildschirm.
    Ziehe also deine Scripte zu rate, wie man Dateioperationen realisiert...

    Einfach anfangen und dann ggf. konkrete Fragen stellen.
    Das Warten darauf, dass dich jemand per Mail anschreibt um hier eine Einzelbetreuung anzubieten, ist so ziemlich das naivste, was du tun kannst 😃



  • Hallo Anna,

    was ist eine Koordinate in C++ - im einfachsten Fall etwa

    class Koordinate
    {
        double m_x;
        double m_y;
        double m_z;
    };
    

    Wie liest man genue eine (!) Koordinate aus einer Datei?
    Wie liest man viele Koordinaten?
    Wie berechnet man ein Element der Flächeninhaltssumme?
    Wie berechnet man die Summe aller Elemente?
    usw. für Mittelwerte, Maxima, Minima und Ausgaben ..

    einfach konkrete Fragen stellen.

    Gruß
    Werner



  • Da jetzt nach Anna und unsub auch noch Armer Ahnungsloser dieselbe Anfrage posten, scheint es ja sehr dringend zu sein.

    Ich finde die Aufgabe recht interesant; anbei mein Lösungsvorschlag:

    #include <algorithm>        // std::min, std::max, std::copy
    #include <fstream>
    #include <functional>       // std::plus<>
    #include <iostream>
    #include <iomanip>          // std::setprecision
    #include <iterator>         // std::istream_iterator
    #include <numeric>          // std::inner_product
    #include <vector>
    
    // --   eine 'Koordinaten'-Klasse, so wie sie für diese
    //      Aufgabe benötigt wird
    class Koordinate
    {
    public:
        Koordinate() 
            : m_x(0), m_y(0), m_z(0) {}
        Koordinate( double x, double y, double z ) 
            : m_x(x), m_y(y), m_z(z) {}
    
        Koordinate& operator+=( const Koordinate& b );
        Koordinate& operator/=( double divisor );
    
        friend double deltaF( const Koordinate& a, const Koordinate& b );
        friend Koordinate minKo( const Koordinate& a, const Koordinate& b );
        friend Koordinate maxKo( const Koordinate& a, const Koordinate& b );
    
        friend std::istream& operator>>( std::istream& in, Koordinate& k );
        friend std::ostream& operator<<( std::ostream& out, const Koordinate& k );
    private:
        double m_x;
        double m_y;
        double m_z;
    };
    
    // --   addieren von zwei Koordinaten
    Koordinate& Koordinate::operator+=( const Koordinate& b )
    {
        m_x += b.m_x;
        m_y += b.m_y;
        m_z += b.m_z;
        return *this;
    }
    Koordinate operator+( Koordinate a, const Koordinate& b )
    {
        return a += b;
    }
    
    // --   Division einer Koordinaten durch einen Skalar
    Koordinate& Koordinate::operator/=( double divisor )
    {
        m_x /= divisor;
        m_y /= divisor;
        m_z /= divisor;
        return *this;
    }
    
    Koordinate operator/( Koordinate k,  double divisor )
    {
        return k /= divisor;
    }
    
    // --   bestimmen der Koordinate mit den jeweils
    //      kleinsten bzw. größten Koordinaten-Werte aus zweien
    Koordinate minKo( const Koordinate& a, const Koordinate& b )
    {
        return Koordinate( 
            std::min( a.m_x, b.m_x ),
            std::min( a.m_y, b.m_y ), 
            std::min( a.m_z, b.m_z ) );
    }
    Koordinate maxKo( const Koordinate& a, const Koordinate& b )
    {
        return Koordinate( 
            std::max( a.m_x, b.m_x ),
            std::max( a.m_y, b.m_y ), 
            std::max( a.m_z, b.m_z ) );
    }
    
    // --   Koordinate lesen Format: "x, y, z"
    std::istream& operator>>( std::istream& in, Koordinate& k )
    {
        double x,y,z;
        char komma;
        if( in >> x >> komma >> y >> komma >> z )
        {
            k = Koordinate( x, y, z );
        }
        return in;
    }
    
    // --   Koordinate schreiben
    std::ostream& operator<<( std::ostream& out, const Koordinate& k )
    {
        return out << std::fixed << std::setprecision( 3 )
            << std::setw( 12 ) << k.m_x << ", " << std::setw( 12 ) << k.m_y << ", " << std::setw( 12 ) << k.m_z;
    }
    
    // --   Berechungs eines Elements der Summenformel zur Berechnung der 
    //      Fläche eines geschlossenes Polygons
    double deltaF( const Koordinate& a, const Koordinate& b )
    {
        return (a.m_x + b.m_x) * (b.m_y - a.m_y);
    }
    
    int main()
    {
        using namespace std;
        vector< Koordinate > koords;
        {   // --   Koordinaten einlesen
            int n;
            ifstream file( "input.txt" );
            copy( istream_iterator< Koordinate >( file >> n ), istream_iterator< Koordinate >(),
                back_inserter( koords ) );
            if( koords.size() != n )
            {
                cerr << "Fehler beim Lesen der Koordinaten" << endl;
                return -1;
            }
        }
    
        // --   gewünschte Ergebnisse ausgeben
        cout << "Minima:     " << accumulate( koords.begin() + 1, koords.end(), koords.front(), &minKo ) << endl;
        cout << "Maxima:     " << accumulate( koords.begin() + 1, koords.end(), koords.front(), &maxKo ) << endl;
        cout << "Mittelwert: " << accumulate( koords.begin(), koords.end(), Koordinate() ) / koords.size() << endl;
        cout << "Flaeche:    " << inner_product( koords.begin(), koords.end() - 1, koords.begin() + 1,
            deltaF( koords.back(), koords.front() ), std::plus< double >(), &deltaF  )/2 << endl;
    
        return 0;
    }
    

    Ich vermute mal, dass Ihr sie schwerlich als Eure eigene ausgeben könnt. Aber vielleicht reicht es, um eine eigene daraus zu schnitzen 😉

    Gruß
    Werner



  • Kompilierung läuft...
    Test.cpp
    C:\Programme\Microsoft Visual Studio\MyProjects\Test1\Test.cpp(68) : error C2039: 'min' : Ist kein Element von 'std'
    C:\Programme\Microsoft Visual Studio\MyProjects\Test1\Test.cpp(68) : error C2065: 'min' : nichtdeklarierter Bezeichner
    C:\Programme\Microsoft Visual Studio\MyProjects\Test1\Test.cpp(69) : error C2039: 'min' : Ist kein Element von 'std'
    C:\Programme\Microsoft Visual Studio\MyProjects\Test1\Test.cpp(70) : error C2039: 'min' : Ist kein Element von 'std'
    C:\Programme\Microsoft Visual Studio\MyProjects\Test1\Test.cpp(75) : error C2039: 'max' : Ist kein Element von 'std'
    C:\Programme\Microsoft Visual Studio\MyProjects\Test1\Test.cpp(75) : error C2065: 'max' : nichtdeklarierter Bezeichner
    C:\Programme\Microsoft Visual Studio\MyProjects\Test1\Test.cpp(76) : error C2039: 'max' : Ist kein Element von 'std'
    C:\Programme\Microsoft Visual Studio\MyProjects\Test1\Test.cpp(77) : error C2039: 'max' : Ist kein Element von 'std'
    Fehler beim Ausführen von cl.exe.

    Test1.exe - 8 Fehler, 0 Warnung(en)

    habe den quellcode getestet, gibt mir jedoch beim debuggen folgende fehlermeldung aus

    ???



  • scofield schrieb:

    Kompilierung läuft...
    Test.cpp
    C:\Programme\Microsoft Visual Studio\MyProjects\Test1\Test.cpp(68) : error C2039: 'min' : Ist kein Element von 'std'

    Ich vermute Du benutzt den VC6-Compiler. An dieser Stelle ist er nicht C++-Standard-konform. Lasse das std:: vor min und max einfach weg. Ggf. musst Du auch noch einen Header inkludieren - ich weiß aber nicht mehr welchen.
    In der STL-Implementierung des VC6 sind min und max jeweils per Makro implementiert.

    Gruß
    Werner


Log in to reply