programm umschreiben



  • Hallo

    Wie schreibt man am besten ein C-Programm in ein reines C++ Programm um.
    (Ifstream/ofstream)

    #include <iostream.h>
    #include <iomanip.h>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>

    void WeinErfassen();
    void WeinAnzeigen();
    void WeinAendern();
    void WeinAusbuchen();

    FILE *datei ;

    struct datum
    {
    int tag;
    int monat;
    int jahr;
    };

    struct wein
    {
    char art[5];
    int wnr;
    char name[50];
    char jahrgang[10];
    char herkunftsland[10];
    datum datum;
    double preis;

    }

    STRUKT ;

    int main ()
    {
    int i;
    do
    {
    cout<<"1. WeinErfassen\n";
    cout<<"2. WeinAnzeigen\n";
    cout<<"3. WeinAendern\n";
    cout<<"4. WeinAusbuchen\n";
    cout<<"0. ENDE\n\n";
    cout<<"Bitte treffen Sie eine Entscheidung: ";
    cin>>i;
    switch(i)
    {
    case 1: WeinErfassen();break;
    case 2: WeinAnzeigen();break;
    case 3: WeinAendern();break;
    case 4: WeinAusbuchen();break;
    case 0: cout<<"\nDas Programm endet hier..";break;
    default: cerr<<"Fehler!\n";break;
    }
    }
    while(i!=0);
    getch();
    return 0;
    };

    void WeinErfassen()
    {
    char x;
    clrscr();
    datei=fopen("C:\\wein.dat","a+");

    do
    {
    cout << "Neuer Wein erfassen : " ;
    cout << endl ;
    cout << "Weinnummer eingeben: " ;
    cin >> STRUKT.wnr;
    cout << "WEIN-Art BESTIMMEN (Rotwein, Weisswein) > ";
    cin >> STRUKT.art;
    if (STRUKT.art==0)
    return;

    cout << "Name (ohne Zwischenraeume) > ";
    cin >> STRUKT.name;
    cout << "JAHRGANG (jj) > ";
    cin >> STRUKT.jahrgang;
    cout << "Herkunftsland > ";
    cin >> STRUKT.herkunftsland;
    cout << "Einlagerungsdatum(tt mm jj) > ";
    cin >> STRUKT.datum.tag >> STRUKT.datum.monat

    > STRUKT.datum.jahr;
    cout << "Preis (Euro) > ";
    cin >> STRUKT.preis;
    cout << "\nWein abspeichern? Ja/Nein: ";
    cin >> x;
    if (x=='j')
    { fwrite(&STRUKT,sizeof(STRUKT),1,datei);
    }
    cout<<"Wollen Sie weitermachen? Ja/Nein: ";
    cin >> x;
    }
    while(x!='n');
    fclose(datei);
    clrscr();
    return;
    }

    void WeinAnzeigen()
    {
    clrscr();
    datei=fopen("C:\\wein.dat","r+");
    fread(&STRUKT,sizeof(STRUKT),1,datei);
    cout<<"===================================================\n\n";
    do
    {
    fread(&STRUKT,sizeof(STRUKT),1,datei);

    cout << "Weinnummer: " << STRUKT.wnr << endl;
    cout << "Art: " << STRUKT.art << endl;
    cout << "Name: " << STRUKT.name << endl;
    cout << "Jahrgang: " << STRUKT.jahrgang << endl;
    cout << "Herkunftsland: " << STRUKT.herkunftsland << endl;
    cout << "Einlagerungsdatum: " << STRUKT.datum.tag << "." << STRUKT.datum.monat
    << "." << STRUKT.datum.jahr << endl;
    cout << "Preis: " << STRUKT.preis << endl << endl;
    cout << "-----------------------------\n";

    }

    while(!feof(datei));
    fclose(datei);
    cout<<"Weiter mit beliebiger Taste...";
    getch();
    clrscr();
    return;

    };

    void WeinAendern()
    {
    char x,suche;
    int s=1;
    clrscr();
    datei=fopen("C:\\wein.dat","r+");
    fread(&STRUKT,sizeof(STRUKT),1,datei);
    do
    {
    fread(&STRUKT,sizeof(STRUKT),1,datei);
    cout<<"Bitte gesuchte Weinnummer eingeben: ";
    cin>>suche;
    if(suche==STRUKT.wnr);
    {

    cout << "Art:\t\t\t" << STRUKT.art <<"\n";
    cout << "Name:\t\t\t" << STRUKT.name <<"\n";
    cout << "Jahrgang:\t\t" << STRUKT.jahrgang <<"\n";
    cout << "Herkunftsland:\t\t" << STRUKT.herkunftsland <<"\n";
    cout << "Einlagerungsdatum:\t" << STRUKT.datum.tag << "." << STRUKT.datum.monat
    << "." << STRUKT.datum.jahr <<"\n";
    cout << "Preis:\t\t\t" << STRUKT.preis << "\n";
    cin>>STRUKT.preis ;

    fseek(datei,(s-1)*sizeof(struct wein),SEEK_SET);
    fwrite(&STRUKT,sizeof(STRUKT),1,datei);
    }
    s++;
    cout << "Wollen Sie weiter suchen? Ja/Nein: ";
    cin >> x;
    }
    while(x!='n');

    cout<<"\nWeiter mit beliebiger Taste...";
    getch();
    clrscr();
    return;
    }

    void WeinAusbuchen()

    { char x,suche;
    int s=1;
    clrscr();
    datei=fopen("C:\\wein.dat","r+");
    fread(&STRUKT,sizeof(STRUKT),1,datei);
    do
    {
    fread(&STRUKT,sizeof(STRUKT),1,datei);
    cout<<"Bitte gesuchte Weinnummer eingeben: ";
    cin>>suche;
    if(suche==STRUKT.wnr);
    {

    cout << "Art: " << STRUKT.art << endl;
    cout << "Name: " << STRUKT.name << endl;
    cout << "Jahrgang: " << STRUKT.jahrgang << endl;
    cout << "Herkunftsland: " << STRUKT.herkunftsland << endl;
    cout << "Einlagerungsdatum: " << STRUKT.datum.tag << "." << STRUKT.datum.monat
    << "." << STRUKT.datum.jahr << endl;
    cout << "Preis: " << STRUKT.preis << endl << endl;
    cin>>STRUKT.preis ;

    fseek(datei,(s-1)*sizeof(struct wein),SEEK_SET);
    fwrite(&STRUKT,sizeof(STRUKT),1,datei);
    }
    s++;
    cout << "Wollen Sie weiter suchen? Ja/Nein: ";
    cin >> x;
    }
    while(x!='n');

    cout<<"\nWollen Sie den Eintrag loeschen? Ja/Nein: ";
    cin >> x;

    getch();

    clrscr();
    return;
    }

    Danke für ausführliche Tips.



  • Ich sehe 2 Ansätze.

    1. Man fängt in der ersten Zeile an, und ändert Schritt für Schritt um.
    Angefangen bei den includes, printf zu cout, FILE zu streams, etc
    Wirst man sicherlich mehrere Durchläufe benötigen.

    2. Man überlegt sich, was das Programm tut, wie sehen die Abhängigkeiten aus,
    gibt es Aufgaben, die durch Objekte selbst gelöst werden sollten
    (z.B. WeinÄndern sieht nach einem Kandidat aus).
    Und dann schreibt man es komplett neu.

    Bei solch einem kurzen Programm kannst du ruhig mal beide Wege probieren.



  • Danke fuer die schnelle Antwort.
    Vorgabe ist, das main programm kurz zu halten.
    Daten müssen binär in einer Datei gespeichert werden.und eine funktion zum löschen haben.
    Keine strings.
    Muss ich die Datei im main programm platzieren?
    Man merkt es warscheinlich schon,das ich keine Ahnung habe.



  • bildstone schrieb:

    Wie schreibt man am besten ein C-Programm in ein reines C++ Programm um.

    man löscht alles und baut es neu.
    am dringensten zu beachten wäre vielleicht:
    - methoden sollten nicht größer als 6 zeilen sein, wenn sie eine schleife oder if enthalten.
    - methoden und klassen sollten nur einem zweck dienen.
    - RAII.



  • bildstone schrieb:

    Vorgabe ist, das main programm kurz zu halten.

    Ich kenne nur den Begriff main-Funktion und kann mir unter main-Datei auch etwas vorstellen.
    Im ersten Fall wäre das Problem für mich mit einem

    int main()
    {
      tue_hauptarbeit_woanders();
      return 0;
    }
    

    aus der Welt.
    Im zweiten Fall mit einem #include, wobei das eine
    das andere nicht ausschließt und es auch nicht sollte.

    Daten müssen binär in einer Datei gespeichert werden.und eine funktion zum löschen haben.

    Daraus könnte man doch prima eine Klassenspezi ableiten, oder?
    Ne Klasse, die eine Datei verwaltet- Methoden bietet, die eine Wein-Klasse übernehmen und deren Inhalt dann intern binär in eine Datei schreibt und liest.

    Keine strings.

    Ungewöhnlich.
    Normalerweise sind strings ein Lieblingskind von C++ Fanatikern.
    Oder bezieht sich das auf das Dateiformat?

    Muss ich die Datei im main programm platzieren?

    Nein. S.o.

    Man merkt es warscheinlich schon,das ich keine Ahnung habe.

    Ok. Das ist ja an dir, das zu ändern.
    Oben rechts steht eine sehr brauchbare Linksammlung zu Tutorien.
    Braucht natürlich alles seine Zeit.
    Wenn du die Aufgabe schon länger hattest, und morgen ist Abgabe, sag ich jetzt mal, sorry, aber selber schuld. :p



  • SeppSchrot schrieb:

    Keine strings.

    Ungewöhnlich.
    Normalerweise sind strings ein Lieblingskind von C++ Fanatikern.

    es gibt anstalten, wo gesagt wird "sie dürfen keine sprachmittel verwenden, die ich ihnen nicht persönlich gezeigt habe". nur so kann garantiert werden, daß auch der dümmste korrektor anhand einer musterlösung einiger nachvollziehbare benotungen (allerdings kaum sinnvolle faire) schafft.



  • Zitat:

    Man merkt es warscheinlich schon,das ich keine Ahnung habe.

    Ok. Das ist ja an dir, das zu ändern.
    Oben rechts steht eine sehr brauchbare Linksammlung zu Tutorien.
    Braucht natürlich alles seine Zeit.
    Wenn du die Aufgabe schon länger hattest, und morgen ist Abgabe, sag ich jetzt mal, sorry, aber selber schuld.

    Habe morgen keinen Abgabetermin.Es handelt sich um ein Abschlussprojekt.
    Mache gerade eine Umschulung zum Maschinent.Werde sicher kein Programmierer.
    Das Problem ist,das ich die ganze Woche Grippe hatte, und im Unterricht ausgefallen bin.Hab schon die halbe Woche getuefftelt.Ist aber nicht gscheites rausgekommen.Das mit den keine Strings war ein Irrtum von mir .
    Naja,bin auch keine 20-ig mehr.

    Trozdem vielen Dank für die Tips.



  • Ist es dringend?



  • Servus

    Es würde mir reichen wenn mir jemand ein abschnitt vorprogr(beispiel).
    Komm momentan ueberhaupt nicht weiter.

    gruss



  • bildstone schrieb:

    Es würde mir reichen wenn mir jemand ein abschnitt vorprogr(beispiel).
    Komm momentan ueberhaupt nicht weiter.

    aus

    int main () 
    { 
    int i; 
    do 
    { 
    cout<<"1. WeinErfassen\n"; 
    cout<<"2. WeinAnzeigen\n"; 
    cout<<"3. WeinAendern\n"; 
    cout<<"4. WeinAusbuchen\n"; 
    cout<<"0. ENDE\n\n"; 
    cout<<"Bitte treffen Sie eine Entscheidung: "; 
    cin>>i;
    

    mache ich

    void maleMenu(){
    cout<<"1. WeinErfassen\n"; 
    cout<<"2. WeinAnzeigen\n"; 
    cout<<"3. WeinAendern\n"; 
    cout<<"4. WeinAusbuchen\n"; 
    cout<<"0. ENDE\n\n"; 
    cout<<"Bitte treffen Sie eine Entscheidung: "; 
    }
    
    int main () 
    { 
    int i; 
    do 
    { 
    maleMenu();
    cin>>i;
    


  • Hallo volkard

    Danke für den Beitrag.
    Hab schon mal in deinem c++ kurs nachgelesen.
    Bin vielleicht jetzt ein bisschen schlauer.(aber nur vielleicht)
    Ist doch schwerer als ich angenommen habe.

    Gibts eigentlich einen Vorteil mit c++?

    Gruss aus Österreich



  • Bildstone schrieb:

    Gibts eigentlich einen Vorteil mit c++?

    eigentlich nicht. das programmieren selbst dauert halt ein wenig länger und ist schwieriger. man achtet total drauf, daß potentielle fehler bereits zur compilezeit (oder wenigstens sehr deutlich und möglichst früh zur laufzeit) fliegen. dafür sparts du entsprechend an der fehlersuchzeit.
    wenn du gerne fehler suchst und nachher das gefühlt genießt, daß vielleicht doch noch ein paar drin sind, biste mit c besser bedient. wenn du nicht gerne fehler suchst und auch bereit bist, den entwurf zweimal wegzuwerfen bevor der dritte endlich stilistische mindestkriterien erfüllt, biste mit c++ besser bedient.



  • Ich glaube wenns mal klick macht,kann das ganze warscheinlich sogar Spass machen.Ich bin, auf jedenfall Lichtjahre davon entfernt.
    Ich werde mich hueten auch nur ansatzweise beruflich damit in Verbindung zu kommen.Ich warte jetzt nur noch bis mein Borland mich nich mehr reinlässt.

    Gruss



  • Nur nicht aufgeben.
    Irgendwer hat vielleicht Mitleid.Kann Dir leider nicht helfen.Bin selber ein erst Anfänger.

    Grueuzi



  • Hallo Leute

    Hat von euch jemand so ein ähnliches Beispielprogramm oder weiss einen link. Es wäre hilfreich zu sehen wie sowas fertig aussieht(mit dateiverknüpfung)

    Gruss aus der Ferne



  • bildstone schrieb:

    Hallo Leute

    Hat von euch jemand so ein ähnliches Beispielprogramm oder weiss einen link. Es wäre hilfreich zu sehen wie sowas fertig aussieht(mit dateiverknüpfung)

    Gruss aus der Ferne

    Sorry
    Wuerde gern helfen.Kenne mich leider selber nicht genug aus.
    Probiers vielleicht auf einem anderen Forum.

    Schüss



  • Hi,
    ich habe einfach mal angefangen. Es ist zwar nicht ganz fertig geworden, aber das sind die wichtigsten Punkte:

    - Ersetzte FILE durch fstream
    - nutze die STL (hier map)
    - const-Korrektness
    - die Klasse WeinEintrag ist der Eintrag für einen Wein. Die 'nr' ist nicht Teil des Eintrags (s.u.). Die Klasse besitzt einen Konstruktor und einen Streaming-Operator, so dass man leicht Objekte dieser Klasse auf den ostream ausgeben kann.
    - datum besitzt ebenso Streaming-Operatoren (ist ansonsten auch noch unfertig)
    - Neu ist die Klasse WeinKatalog. Sie enthält alle Wein-Einträge, erledigt im Konstruktor das Laden (Implementierung fehlt noch). Sie - nur sie ! - vergibt die Nummer für einen Eintrag.

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <map>
    
    void clrscr() {};
    class WeinKatalog;
    void WeinErfassen( WeinKatalog& kat );
    void WeinAnzeigen( const WeinKatalog& kat );
    void WeinAendern( const WeinKatalog& kat );
    void WeinAusbuchen( WeinKatalog& kat );
    
    struct datum
    {
        int tag;
        int monat;
        int jahr;
    
        friend std::ostream& operator<<( std::ostream& out, const datum& dat )
        {
            return out << dat.tag << "." << dat.monat << "." << dat.jahr;
        }
        friend std::istream& operator>>( std::istream& in, datum& dat_ )
        {
            datum dat;
            char pkt1, pkt2;
            if( in >> dat.tag >> pkt1 >> dat.monat >> pkt2 >> dat.jahr 
                && pkt1 == '.' && pkt2 == '.' )
            {
                dat_ = dat;
            }
            else
                in.setstate( std::ios_base::failbit );
            return in;
        }
    };
    
    class WeinEintrag
    {
    public:
        enum wein_art_type { Rotwein, Weiswein, keinWein };
    
        WeinEintrag( wein_art_type art, const std::string& name, int jahrgang, const std::string& land,
                const datum& dat, double preis )
            : m_art( art )
            , m_name( name )
            , m_jahrgang( jahrgang )
            , m_herkunftsland( land )
            , m_einlagerungs_datum( dat )
            , m_preis( preis )
        {}
    
        WeinEintrag()
            : m_art( keinWein )
            , m_name()
            , m_jahrgang( 0 )
            , m_herkunftsland()
            , m_einlagerungs_datum()
            , m_preis( 0.0 )
        {}
    
        friend std::ostream& operator<<( std::ostream& out, const WeinEintrag& we );
    
    private:
        wein_art_type m_art;
        std::string m_name;
        int m_jahrgang;
        std::string m_herkunftsland;
        datum m_einlagerungs_datum;
        double m_preis;
    };
    
    std::ostream& operator<<( std::ostream& out, const WeinEintrag& we )
    {
        using std::endl;
        if( we.m_art == WeinEintrag::keinWein )
            return out << "??" << endl;
        out << "Art: " << (we.m_art == WeinEintrag::Rotwein? "Rotwein": "Weiswein" ) << endl;
        out << "Name: " << we.m_name << endl;
        out << "Jahrgang: " << we.m_jahrgang << endl;
        out << "Herkunftsland: " << we.m_herkunftsland << endl;
        out << "Einlagerungsdatum: " << we.m_einlagerungs_datum << endl;
        out << "Preis: " << we.m_preis << endl;
        return out;
    };
    
    class WeinKatalog
    {
    public:
        typedef std::map< int, WeinEintrag > weine_type;
        typedef weine_type::value_type value_type;
        typedef weine_type::iterator iterator;
        typedef weine_type::const_iterator const_iterator;
    
        WeinKatalog();
        ~WeinKatalog();
        int insert( const WeinEintrag& we ) // neuen Wein hinzufügen
        {
            const_iterator iback = m_weine.end();
            const int nr = m_weine.empty()? 1: (--iback)->first + 1;
            m_weine.insert( std::make_pair( nr, we ) );
            return nr;
        }
    
        void erase( iterator i ) { m_weine.erase( i ); }
        iterator begin() { return m_weine.begin(); }
        iterator end() { return m_weine.end(); }
        const_iterator begin() const { return m_weine.begin(); }
        const_iterator end() const { return m_weine.end(); }
        iterator find( int nr ) { return m_weine.find( nr ); }
        const_iterator find( int nr ) const { return m_weine.find( nr ); }
    
    private:
        weine_type m_weine;
        bool m_geaendert;
    
        // -- Kopieren verhindern; wg. nicht trivialem Destruktor
        WeinKatalog( const WeinKatalog& );
        WeinKatalog& operator=( const WeinKatalog& );
    };
    
    std::ostream& operator<<( std::ostream& out, const WeinKatalog::value_type& wein )
    {
        return out << "Weinnummer: " << wein.first << std::endl << wein.second;
    }
    
    WeinKatalog::WeinKatalog()
        : m_weine()
        , m_geaendert( false )
    {
        // hier Katalog aus Datei einlesen
    }
    WeinKatalog::~WeinKatalog()
    {
        if( m_geaendert ) // bei Änderung abspeichern
        {
            ; // Speichern
        }
    }
    
    int main ()
    {
        using namespace std;
        WeinKatalog kat;
        int i;
        do
        {
            cout<<"1. WeinErfassen\n";
            cout<<"2. WeinAnzeigen\n";
            cout<<"3. WeinAendern\n";
            cout<<"4. WeinAusbuchen\n";
            cout<<"0. ENDE\n\n";
            cout<<"Bitte treffen Sie eine Entscheidung: ";
            cin >> i;
            switch(i)
            {
            case 1: WeinErfassen( kat );break;
            case 2: WeinAnzeigen( kat );break;
            case 3: WeinAendern( kat );break;
            case 4: WeinAusbuchen( kat );break;
            case 0: cout<<"\nDas Programm endet hier..";break;
            default: cerr<<"Fehler!\n";break;
            }
        } while( i != 0 );
        return 0;
    };
    
    void WeinErfassen( WeinKatalog& kat )
    {
        using std::cout;
        using std::cin;
        using std::endl;
        clrscr();
        char x;
        do
        {
            cout << "Neuer Wein erfassen : " ;
            cout << endl ;
            cout << "WEIN-Art BESTIMMEN (Rotwein=r, Weisswein=w) > ";
            std::string art;
            cin >> art;
            WeinEintrag::wein_art_type wein_art = (art == "r")? WeinEintrag::Rotwein: 
                (art == "w")? WeinEintrag::Weiswein: WeinEintrag::keinWein;
            if( wein_art == WeinEintrag::keinWein )
                return;
    
            cout << "Name (Zwischenraeume möglich) > " << endl;
            std::string name;
            getline( cin, name );
            cout << "JAHRGANG (jj) > ";
            int jahrgang;
            cin >> jahrgang;
            cout << "Herkunftsland > ";
            std::string land;
            cin >> land;
            cout << "Einlagerungsdatum(tt mm jj) > ";
            datum dat;
            cin >> dat;
            cout << "Preis (Euro) > ";
            double preis;
            cin >> preis;
            cout << "\nWein abspeichern? J/N: ";
            cin >> x;
            if (x=='j' || x=='J')
            {
                const int nr = kat.insert( WeinEintrag( wein_art, name, jahrgang, land, dat, preis ) );
                cout << "Der Wein wurde unter der Nummer " << nr << " abgespeichert " << endl;
            }
            cout<<"Wollen Sie weitermachen? J/N: ";
            cin >> x;
        }
        while(x=='j' || x=='J');
        return;
    }
    
    void WeinAnzeigen( const WeinKatalog& kat )
    {
        clrscr();
        std::copy( kat.begin(), kat.end(), 
            std::ostream_iterator< WeinKatalog::value_type >( std::cout, "--------------------\n" ) );
        return;
    };
    
    void WeinAendern( const WeinKatalog& kat )
    {
        using namespace std;
        clrscr();
        char x;
        do
        {
            cout << "Bitte gesuchte Weinnummer eingeben: ";
            int nr;
            cin >> nr;
            const WeinKatalog::const_iterator we = kat.find( nr );
            if( we != kat.end() )
            {
                cout << *we << endl;
            }
            else
                cout << "kein Eintrag unter " << nr << endl;
            cout << "Wollen Sie weiter suchen? J/N: ";
            cin >> x;
        }
        while( x=='j' || x=='J' );
        return;
    }
    
    void WeinAusbuchen( WeinKatalog& kat )
    { 
        using namespace std;
        clrscr();
        char x;
        do
        {
            cout << "Bitte gesuchte Weinnummer eingeben: ";
            int nr;
            cin >> nr;
            const WeinKatalog::iterator we = kat.find( nr );
            if( we != kat.end() )
            {
                cout << *we << endl;
                cout << "Wollen Sie den Eintrag löschen? J/N ";
                cin >> x;
                if( x == 'j' || x == 'J' )
                {
                    kat.erase( we );
                    cout << "Eintrag " << nr << " wurde gelöscht " << endl;
                }
            }
            else
                cout << "kein Eintrag unter " << nr << endl;
            cout << "Wollen Sie weiter suchen? J/N: ";
            cin >> x;
        }
        while( x=='j' || x=='J' );
        return;
    }
    

    Das ist nur ein 'schneller Schuß'. Die Fehlerbehandlung bei Eingaben ist noch arg rudimentär.

    Weiter könnte man noch eine Klasse Aktion einführen, in der man eine Funktion den Beschreibungs-Text und die Menü-Nummer organisiert.
    Ein passendes main stelle ich mir dann im Prinzip so vor:

    int main()
    {
        Aktionen aktionen;
        Weinkatalog kat;
        for(;;)
        {
            cout << aktionen;
            cout<<"0. ENDE\n\n";
            cout<<"Bitte treffen Sie eine Entscheidung: ";
            cin >> i;
            if( i == 0 ) break
            aktionen.mach( i, kat );
        }
        return 0;
    };
    

    Aktionen enthält dann mehrere Objekte vom Typ Aktion.

    Die Funktion 'WeinAendern' ändert nichts, ich hab's einfach mal so abgeschrieben, wie Du es vorgegeben hast. Wie diese Funktion umzusetzen ist und wie man die Redundanzen in WeinAendern und WeinAusbuchen beseitigt müßte man sich auch nochmal überlegen.

    Vielleicht stellst Du einfach mal konkrete Fragen zu dem einen oder anderen Punkt.

    :xmas2: Werner



  • An Werner Salomon

    Ich möchte mich herzlich bei dir für deinen Beitrag bedanken.Danke für die Arbeit zu so später Stunde.
    Das mit dem Objektorientierten programmieren haben wir in dem Kurs nicht mehr behandelt.Der Dozent meinte das es für uns Anfänger zu kompleziert und die Unterrichtszeit dafür nicht genügen würde.Bei uns gehts Maximal bis Struktur Arrays und mit Dateien arbeiten.
    Ich bin mit dem Programm etwas weitergekommen.Der Lehrer meinte ich soll noch ein paar Spielereien einbauen und alles schön dokummentieren.Das mit der Datei und löschen klappt noch nicht.Momentan sieht das Prog. so aus.
    Wir arbeiten mit dem Borland -compiler.

    #include <iostream.h>
    #include <iomanip.h>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>

    //Globale Datendefinitionen
    const short MAXCHAR = 40;
    const int MAXWEINE = 5;
    FILE *datei ;

    // Struktur für Datum format
    struct datum
    {
    int tag;
    int monat;
    int jahr;
    };

    // Struktur für Informationen der SWeine
    struct SWein
    {
    char art[MAXCHAR]; //Zeichenkette für Wein art
    int stueckzahl;
    int wnr; // Wein NR.
    char name[MAXCHAR]; // Wein Namen
    char jahrgang[MAXCHAR]; // Wein Jahrgang
    char herkunftsland[MAXCHAR]; // Wein Herkunftsland
    char einlagerungsdatei; // Wein Einlagerungsdatum
    datum datum;
    double preis; // Wein Preis
    };

    //Funktionsdeklarationen
    int menu();
    void weinErfassen(SWein sammlung[], int &aktAnz);
    void weinAnzeigen(SWein sammlung[], int aktAnz);
    void weinAendern(SWein sammlung[], int aktAnz);
    void weinAusbuchen(SWein sammlung[], int &aktAnz);

    // Hauptprogramm
    int main ()
    {
    //Lokale Daten
    int i, aktAnz = 0;
    SWein keller[MAXWEINE];

    do
    {
    cout<<"1. Wein erfassen\n";
    cout<<"2. Wein anzeigen\n";
    cout<<"3. Wein aendern\n";
    cout<<"4. Wein ausbuchen\n";
    cout<<"0. Ende\n\n";
    cout<<"Bitte treffen Sie eine Entscheidung: ";
    cin>>i;
    switch(i)
    {
    case 1:
    weinErfassen(keller, aktAnz);
    break;
    case 2:
    weinAnzeigen(keller, aktAnz);
    break;
    case 3:
    weinAendern(keller, aktAnz);
    break;
    case 4:
    weinAusbuchen(keller, aktAnz);
    break;
    case 0:
    cout<<"\nDas Programm endet hier..";
    break;
    default:
    cerr<<"Fehler!\n";
    break;
    }
    }while(i!=0);
    getch();
    return 0;
    }

    //Funktionsdefinitionen (Implementierungen)
    void weinErfassen(SWein sammlung[], int &aktAnz)
    {
    char x;
    clrscr();
    do
    {
    cout << "Weinnummer eingeben > " ;
    cin >> sammlung[aktAnz].wnr;
    cout << "Vorhandene Stueckzahl eingeben > " ;
    cin >> sammlung[aktAnz].stueckzahl;
    cout << "Wein-Art(Rotwein, Weisswein) > ";
    cin >> sammlung[aktAnz].art;
    if (sammlung[aktAnz].art==0)
    return;
    cout << "Name (ohne Zwischenraeume) > ";
    cin >> sammlung[aktAnz].name;
    cout << "Jahrgang (jj) > ";
    cin >> sammlung[aktAnz].jahrgang;
    cout << "Herkunftsland > ";
    cin >> sammlung[aktAnz].herkunftsland;
    cout << "Einlagerungsdatum(tt mm jj) > ";
    cin >> sammlung[aktAnz].datum.tag >>sammlung[aktAnz].datum.monat

    > sammlung[aktAnz].datum.jahr;
    cout << "Preis (Euro) > ";
    cin >> sammlung[aktAnz].preis;
    aktAnz++;
    cout<<"Wollen Sie weitermachen? Ja/Nein: ";
    cin >> x;
    }while(x!='n');
    clrscr();
    return;
    }

    void weinAnzeigen(SWein sammlung[], int aktAnz)
    {
    clrscr();
    cout<<"===================================================\n\n";
    for(int i = 0; i < aktAnz; i++)
    {
    cout << "SWeinnummer: " << sammlung[i].wnr << endl;
    cout << "Art: " << sammlung[i].art << endl;
    cout << "Name: " << sammlung[i].name << endl;
    cout << "Jahrgang: " << sammlung[i].jahrgang << endl;
    cout << "Herkunftsland: " << sammlung[i].herkunftsland << endl;
    cout << "Einlagerungsdatum: " << sammlung[i].datum.tag << "." << sammlung[i].datum.monat
    << "." << sammlung[i].datum.jahr << endl;
    cout << "Preis: " << sammlung[i].preis << endl << endl;
    cout << "-----------------------------\n";
    }
    cout<<"Weiter mit beliebiger Taste...";
    getch();
    clrscr();
    return;
    }

    void weinAendern(SWein sammlung[], int aktAnz)
    {
    clrscr();
    for(int i = 0; i < aktAnz; i++)
    {

    cout<<"Bitte gesuchte SWeinnummer eingeben: ";
    cin>>i;
    if(sammlung[i].wnr==i);
    {
    cout << "Art:\t\t\t" << sammlung[i].art <<"\n";
    cout << "Name:\t\t\t" << sammlung[i].name <<"\n";
    cout << "Jahrgang:\t\t" << sammlung[i].jahrgang <<"\n";
    cout << "Herkunftsland:\t\t" << sammlung[i].herkunftsland <<"\n";
    cout << "Einlagerungsdatum:\t" << sammlung[i].datum.tag << "." << sammlung[i].datum.monat
    << "." << sammlung[i].datum.jahr <<"\n";
    cout << "Preis:\t\t\t" << sammlung[i].preis << "\n";
    cin>>sammlung[i].preis ;
    }
    cout << "Wollen Sie weiter suchen? Ja/Nein: ";
    cin >> i;
    }
    cout<<"\nWeiter mit beliebiger Taste...";
    getch();
    clrscr();
    return;
    }

    void weinAusbuchen(SWein sammlung[], int &aktAnz);
    {
    char x;
    int i, anz;
    clrscr();
    do
    {
    clrscr();
    cout << "Bitte gesuchte Weinnummer eingeben: ";
    cin >> x;
    //Suche Index im Array des Weines mit der Weinnummer x
    for(i = 0;x == sammlung[i].wnr; i++);

    cout << "Wieviele Falschen moechten sie ausbuchen > ";
    cin >> anz;
    if(sammlung[i].stueckzahl < anz)
    {
    cout << "Ihre Buchhaltung stimmt nicht, es sind nicht mehr soviele Flaschen vorhanden";
    getch();
    }
    else
    if(sammlung[i].stueckzahl == anz)
    {
    //Was mache ich, wenn dies zutrifft?? Loesche ich den Wein kplt. oder nur stueckzahl auf 0??
    //cout<<"\nWollen Sie den Eintrag loeschen? Ja/Nein: ";
    //cin >> x;
    }
    else
    if(sammlung[i].stueckzahl > anz)
    sammlung[i].stueckzahl = sammlung[i].stueckzahl - anz;
    cout << "Wollen Sie weitere Weine ausbuchen? Ja/Nein: ";
    cin >> x;
    }while(x != 'n');

    getch();
    clrscr();
    return;
    }

    Gruss aus österreich :xmas1: :xmas2:



  • hab ich noch auf meiner festplatte gefunden:

    [ C/C++ ]

    // nach einer viel publizierten und oft abgewandelten demo mitte der 90er
    // modify wein, jul 2005 vi.
    // sollte als basis ausbaufähig sein

    #include <string.h>
    #include <fstream.h>

    class wein
    {
    public:
    char name[80];
    char jahrgang[10]; // char or int ?
    char art[30];
    char erstestrinken[10]; // char or int ?
    char anbaugebiet[40];
    char gueteklasse[20];
    float preis; //

    void DataIn();
    void writeData();
    void readDataIn();
    void readData();
    private:
    char help[4];
    };

    void wein::DataIn()
    {
    cout << "Name : ";
    cin >> name;
    cout << endl;
    cout << "Jahrgang : ";
    cin >> jahrgang;
    cout << endl;
    cout << "Art : ";
    cin >> art;
    cout << endl;
    cout << "erstes Trinken : ";
    cin >> erstestrinken;
    cout << endl;
    cout << "Anbaugebiet : ";
    cin >> anbaugebiet;
    cout << endl;
    cout << "Gueteklasse : ";
    cin >> gueteklasse;
    cout << endl;
    cout << "Preis (wie EUR.CENT) : ";
    cin >> preis;
    }

    void wein::writeData()
    {
    char tz=13;
    ofstream speichern("weinkell.dat",ios::app);
    if (speichern.good())
    {
    speichern << name << " " << jahrgang << " " << art << " " << erstestrinken << " " << anbaugebiet
    << " " << gueteklasse << " " << preis;
    speichern.put(tz);
    speichern << endl;
    }
    }

    void wein::readDataIn()
    {
    cout << "der " << name << " ist Jahrgang " << jahrgang
    << " und kommt aus " << anbaugebiet << " und kostet " << preis << " " << endl;
    }

    void wein::readData()
    {
    char p;
    ifstream lesen("weinkell.dat",ios::in);
    while (lesen.good()) // and p
    {
    lesen >> name >> jahrgang >> art >> erstestrinken >> anbaugebiet >> gueteklasse >> preis;

    cout << "Name : " << name << endl;
    cout << "Jahrgang : " << jahrgang << endl;
    cout << "Art : " << art << endl;
    cout << "erstes Trinken : " << erstestrinken << endl;
    cout << "Anbaugebiet : " << anbaugebiet << endl;
    cout << "Gueteklasse : " << gueteklasse << endl;
    cout << "Preis : " << preis << endl;
    cin >> p;
    }
    }

    main()
    {
    char sel;
    wein Wein1;
    cout << "Moechten Sie einen Datensatz eingeben, dann Taste i druecken" << endl
    << "oder wollen Sie die Daten lesen, dann Taste l druecken" << endl
    << "oder e = ende" << endl;
    while (sel != 'e')
    {
    cin >> sel;
    switch (sel)
    {
    case 'i':
    Wein1.DataIn();
    Wein1.writeData();
    Wein1.readDataIn();
    break;
    case 'l':
    Wein1.readData();
    break;
    case 'e':
    break;
    default:
    break;
    }
    }
    if (sel == 'e') return 0;
    }

    [ /code )

    mfg f.-th.



  • Wir haben auch schon was geschrieben nur kommen nicht mit dem ÄNDERN und LÖSCHEN klar!

    #include<iostream.h>
    #include<stdlib.h>
    #include<fstream.h>
    #include<string.h>
    #include<conio.h>

    // ********** Basisklasse CPerson *************************
    class CPerson
    {
    protected:
    char Vorname[30];
    char Nachname[30];
    char Dateiname[50];
    public:
    void eingeben();
    void ausgeben();
    void suchen();
    };

    // ********** Abgeleitete Klasse CPersonal ****************
    class CPersonal : public CPerson
    {
    private:
    int PersNr;
    public:
    void eingeben();
    void speichern();
    // void bearbeiten();
    // void löschen();
    CPersonal();
    };

    // ********** Abgeleitete Klasse CKunde *******************
    class CKunde : public CPerson
    {
    private:
    int KundenNr;
    public:
    void eingeben();
    void speichern();
    // void bearbeiten();
    // void löschen();
    CKunde();
    };

    // ********** Methoden der Basisklasse CPerson ************
    void CPerson::eingeben()
    {
    cout<<"Vorname = ";
    cin>>Vorname;
    cout<<"Nachname = ";
    cin>>Nachname;
    }

    void CPerson::ausgeben()
    {
    char zeichen;
    ifstream datei;
    system("cls");
    datei.open(Dateiname);
    if(!datei)
    cout<<"Fehler";
    else
    {
    cout<<"Personaldatei\n";
    while(!datei.eof())
    {
    zeichen=datei.get();
    if(zeichen=='#')
    cout<<endl;
    else
    cout.put(zeichen);
    }
    datei.close();
    }
    getch();
    }

    void CPerson::suchen()
    {
    char suchname[30],zeichenkette[30];
    int i=0;
    bool vorhanden=false;
    ifstream datei;
    cout<<"Suchname = ";
    cin>>suchname;
    datei.open(Dateiname);
    while(!datei.eof())
    {
    zeichenkette[i]=datei.get();
    if (zeichenkette[i]!=' ')
    i++;
    else
    {
    zeichenkette[i]='\0';
    if(strcmp(zeichenkette,suchname)==0)
    vorhanden=true;
    i=0;
    }
    }
    datei.close();
    if(vorhanden==true)
    cout<<endl<<suchname<<" ist in der Datei vorhanden"<<endl;
    else
    cout<<endl<<suchname<<" ist in der nicht Datei vorhanden"<<endl;
    getch();
    }

    /*
    void CPerson::löschen()

    */

    // ********** Methoden der abgeleiteten Klasse CPersonal **
    CPersonal::CPersonal()
    {
    strcpy(Dateiname,"H:\\xinstall\\Kunde_Personal_09112005\\Personal.txt");

    }

    void CPersonal::eingeben()
    {
    cout<<"Personaldaten \n";
    CPerson::eingeben();
    cout<<"Personalnummer = ";
    cin>>PersNr;
    }

    void CPersonal::speichern()
    {
    ofstream datei;
    datei.open(Dateiname,ios::app);
    if(!datei)
    cout<<"\nDatei kann nicht geoeffnet werden";
    else
    datei<<PersNr<<" "<<Vorname<<" "<<Nachname<<" # ";
    datei.close();
    }

    /*
    void CPerson::löschen()

    */

    // ********** Methoden der abgeleiteten Klasse CKunde *****
    CKunde::CKunde()
    {
    strcpy(Dateiname,"H:\\xinstall\\Kunde_Personal_09112005\\Kunde.txt");
    //Ersatzpfad: H:\\xinstall\\Kunde_Personal_09112005\\
    }

    void CKunde::eingeben()
    {
    cout<<"Kundendaten \n";
    CPerson::eingeben();
    cout<<"Kundennummer = ";
    cin>>KundenNr;
    }

    void CKunde::speichern()
    {
    ofstream datei;
    datei.open(Dateiname,ios::app);
    if(!datei)
    cout<<"\nDatei kann nicht geoeffnet werden";
    else
    datei<<KundenNr<<" "<<Vorname<<" "<<Nachname<<" # ";
    datei.close();
    }

    // ********** Menue mit Hauptprogramm *********************
    void menue()
    {
    char auswahl;
    system("cls");
    cout<<"\nDateiverwaltung .............";
    cout<<"\nKundendaten ................k";
    cout<<"\nPersonaldaten ..............p";
    cout<<"\nEnde .......................q";
    cout<<"\nIhre Wahl = ";
    cin>>auswahl;
    if(auswahl=='p'||auswahl=='P')
    {
    cout<<"\n\nPersonaldaten ..............";
    cout<<"\nNeueingabe von Daten ........n";
    // cout<<"\nSpeichern von Daten .........s";
    cout<<"\nAusgabe aller Daten .........a";
    cout<<"\nSuchen einzelner Daten ......f";
    cout<<"\nEnde ........................q";
    cout<<"\nIhre Wahl = ";
    cin>>auswahl;
    CPersonal meinPersonal;

    switch(auswahl)
    {
    case 'n':
    case 'N': meinPersonal.eingeben();
    meinPersonal.speichern(); break;
    case 'a':
    case 'A': meinPersonal.ausgeben(); break;
    case 'f':
    case 'F': meinPersonal.suchen(); break;
    case 'q':
    case 'Q': exit(-1); break;
    }
    }
    if(auswahl=='k'||auswahl=='K')
    {
    cout<<"\n\nKundendaten ................";
    cout<<"\nNeueingabe von Daten ........n";
    // cout<<"\nSpeichern von Daten .........s";
    cout<<"\nAusgabe aller Daten .........a";
    cout<<"\nSuchen einzelner Daten ......f";
    cout<<"\nEnde ........................q";
    cout<<"\nIhre Wahl = ";
    cin>>auswahl;
    CKunde meinKunde;
    switch(auswahl)
    {
    case 'n':
    case 'N': meinKunde.eingeben();
    meinKunde.speichern(); break;

    case 'a':
    case 'A': meinKunde.ausgeben(); break;
    case 'f':
    case 'F': meinKunde.suchen(); break;
    case 'q':
    case 'Q' :exit(-1); break;
    }
    }
    if(auswahl=='q'||auswahl=='Q')
    exit(-1);
    menue();
    }

    void main()
    {
    menue();
    }

    Hier unser kleiner Code.

    Die Azubis

    😕

    Danke schonmal im voraus!?!


Anmelden zum Antworten