Datenaustausch zwischen Funktionen (Greedy-Algorithmus)



  • Hallo! 🙂

    Seit 2 Monaten setze ich mich nun mit der prozeduralen C++-Programmierung auseinander. Im Rahmen von Übungsaufgaben habe ich inzwischen ein Programm zur Umsetzung des Greedy-Algorithmus aus dem Operations Research entwerfen können, welches in der Lage ist Daten aus einer Textdatei einzulesen, zu berechnen und wieder als Textdatei auszugeben. Bisher habe ich das alles mit globalen Variablen gelöst.

    Nun lautet die Vorgabe aber sich von den globalen Variablen zu entfernen und alles mit lokalen Variablen zu realisieren, wobei der Datenaustausch mit formalen und aktuellen Parametern und ggf. mit Zeigern zu erfolgen hat. Das stellt für mich eine riesige Herausforderung da. Es fehlt mir zudem überhaupt an einem Ansatz und nachdem ich nun Stunden vor dem Code hing wollte ich euch mal nach Hilfe fragen! Ihr würdet mir wirklich sehr helfen, wenn ihr mich da weiter bringen würdet und mir zeigen könntet wie man das beispielsweise umsetzen könnte.

    Mein Code lautet wie folgt:

    // Include-Anweisungen
    #include <iostream>        // cin, cout - Für Eingabe- und Ausgabestream
    #include <iomanip>        // setw, setprecision - Für die Begrenzung der Nachkommastellen
    #include <fstream>        // Notwendig um die Streamklasse für die Datenbearbeitung nutzen zu können
    #include <conio.h>
    
    using namespace std;    // Zum Abkürzen der langen Befehle std::cout, std::cin
    
    // Prototypen
    void dateieingabe(void);
    void berechnung(void);
    void dateiausgabe(void);
    
    // Globale Variablen und Streams
    // Konstanten
    
    const int MAXITEMS = 100;    // Maximale Anzahl Items
    
    // globale Variablen
    
    int    anzahl,                    // Anzahl an Items
        items_im_rucksack,        // Eingepackte Gegenstände
        i,                        // Itemindex
        j,                        // Vergleichsindex
        c;                        // Kapazitätsrestriktion
    
    double summe_p,                    // Summe der p-Werte (sollen maximiert werden)
           temp,                    // Temporäre Variable für Selectionsort
           rucksack,                // Tatsaechlicher genutzter Platz
           restplatz_im_rucksack;    // Entspricht zu Beginn c, wird reduziert durch in Rucksack gepackter Items
    
    // Vektoren
    
    int       Items[MAXITEMS];            // Nummern der Items
    double w[MAXITEMS],                // Gewichte
           p[MAXITEMS],                // Itemprofit, dessen Summe maximimal werden soll
           quot[MAXITEMS];            // Greedy-Bewertung der einzelnen Gegenstände (Quotient aus p/w)
    
    // Streams
    
    ifstream    datei1;                // Beschreibt den Einlese-Stream
    ofstream    datei2;                // Beschreibt den Textdatei-erstellenden Stream / Ausschreibenden-Stream
    
    // Char-Variablen
    
    char        zeile[81];            // max. 80 Zeichen pro Zeile für Kommentare
    
    void main(void)
    {
    
        // Bildschirm-Information
        cout << "\nProgramm zur Anwendung des Greedy-Algorithmus zur Loesung eines 0/1-Rucksack Problems.\n\n";
    
        // Funktionsaufruf für Dateieingabe
        dateieingabe();
    
        // Funktionsaufruf für Berechnung
        berechnung();
    
        // Funktionsaufruf für Dateiausgabe
        dateiausgabe();
    
        system("pause");
    }
    
    // Funktion liest Textdatei ein und schreibt Werte für Vektoren und Kapazität
    void dateieingabe(void)
    {
    
        // Benutzerdefinierte Textdatei öffnen
        cout << "Hinweis: Bitte sicherstellen, dass sich die Input-Datei im Verzeichnis befindet\nund der Dateiname 'input_items.txt' lautet. ";
        cout << "Zum Einlesen der Datei bitte Taste druecken...\n";
            _getch();
    
        datei1.open("input_items.txt");
    
        // Zustand der Textdatei prüfen
        if (! datei1)
        {
            cout << "\nFehler beim Einlesen der Datei input_items.txt!\n\n";
            system("pause");
        }
    
        // Benutzerdefinierte Textdatei lesen
        datei1.getline(zeile,81);                       
        cout << "\n" << zeile << endl;
        datei1 >> anzahl;                                    // Weist der n-Variable ihren Wert zu - Bsp. 1) wird n = 8; Bsp. 2) wird n = 30
        cout << "Anzahl an Items: " << anzahl << endl;
        datei1.ignore();
        datei1.getline(zeile,81);
        cout << "\n" << zeile << endl;
        datei1 >> c;                                    //Weist der c-Variable ihren Wert aus Datei zu
        cout << "Kapazitaet des Rucksacks: " << c << endl;
        datei1.ignore();
    
        datei1.getline(zeile,81);
        cout << "\n" << zeile << endl;
        for (i = 1; i <= anzahl; i++)
        {
            datei1 >> Items[i-1] >> p[i-1] >> w[i-1];    // Schreibt die Werte aus der Textdatei in die "Vektoren"
    
            // Kontrollausgabe
            cout << "\n" << Items[i-1] << " ";
            cout << fixed << setprecision(1) << p[i-1] << " " << w[i-1];
    
            if (i >= anzahl)
            {
                cout << "\n\n" << "Alle Vektoren gefuellt. Anzahl der definierten Vektoren betraegt " << anzahl;
                cout << "\n\n\n" << "Naechster Schritt: Anwendung des Greedy-Algorithmus - Quotientenbildung";
                cout << "\n\n";
                _getch();
    
            }
        }
    }
    
    // Funktion berechnet Quotienten, Sortiert die Ergebnisse absteigend und befüllt Rucksack bis dieser voll ist
    void berechnung(void)
    {
    
        // Quotientenbildung
        for (i = 1; i <= anzahl; i++)
        {
            quot[i-1] = p[i-1]/w[i-1];
            cout << "\n";
            cout << fixed << setprecision(1) << quot[i-1];
    
            if (i >= anzahl)
            {
                cout << "\n\n" << "Alle Quotienten gebildet!\n\n\n";
                cout << "Naechster Schritt: Anwendung des Greedy-Algorithmus - absteigende Sortierung mittels 'Selection Sort'\n\n";
    
                _getch();
            }
        }
    
        // Absteigende Sortierung nach "Selectionsort"- Ausgabe in Gewicht und Sortierung nach Quotient
        for(i=0; i<anzahl-1; i++)           
        {
            for(j=i+1;j<anzahl; j++)
            {
                if (quot[i] < quot[j])
                {
    
                    // Tausch der Variablen
                    temp = w[j];           
                    w[j] = w[i];
                    w[i] = temp;
                    temp = p[j];
                    p[j] = p[i];
                    p[i] = temp;
    
                    temp = quot[j];
                    quot[j]=quot[i];
                    quot[i]=temp;
    
                }
            }
        }       
    
        cout << "Ende - ";
        cout << "Sortierung beendet!\n\n";
    
        for (i=0; i<anzahl; i++)
        {
            if (i<anzahl)
            {
                cout << w[i] << " ";
            }
        }
    
        cout << "\n\n\n";
        cout << "Naechster Schritt: Befuellen des Rucksacks\n\n";
    
        _getch();
    
        // Gegenstände in Rucksack einpacken
        restplatz_im_rucksack = c;
        rucksack = 0;
        summe_p = 0;
        items_im_rucksack = 0;
    
        for (i = 0; i < anzahl; i++)
        {
    
            if (restplatz_im_rucksack - w[i] >= 0)
            {
                restplatz_im_rucksack = restplatz_im_rucksack - w[i];
                rucksack = rucksack + w[i];
                summe_p = summe_p + p[i];
                items_im_rucksack = items_im_rucksack + 1;
            }
    
            if (restplatz_im_rucksack - w[i] < 0)
            {
                break;
            }
    
        }
    
        if ((i = anzahl) || (rucksack = c))
        {                                   
                cout << "Anzahl in Rucksack verstauter Items: " << items_im_rucksack << "\n";
                cout << "Belegter Platz im Rucksack: " << rucksack << "\n";
                cout << "Ungenutzter Platz im Rucksack: " << restplatz_im_rucksack << "\n";
                cout << "Gesamtprofit: " << summe_p << "\n\n" << "Fuer Dateiausgabe Taste druecken...\n\n";
    
                _getch();
    
                cout << "Ausgabe in Textdatei wird initialisiert...";
        }
    }
    
    // Funktion gibt die berechneten Ergebnisse als Textdatei aus
    void dateiausgabe(void)
    {
    
        // Ergebnisse als Textdatei ausgeben
        // Öffnen des Ausgabestreams
            datei2.open("items_output.txt", ios::trunc);                // ios::trunc weist an eine vorhandene Datei zu überschreiben
    
            // Ausgabe von Titelzeile und Ergebnissen / Schreiben der Ergebnisse
            datei2 << "Lösung des 0/1-Rucksack-Problems\n";
            datei2 << "\nAnzahl beruecksichtigter Items: ";
            datei2 << items_im_rucksack << endl;
            datei2 << "\nGesamtprofit: " << fixed << setprecision(1) << summe_p << endl;
            datei2 << "\nGesamtgewicht: " << fixed << setprecision(1) << rucksack << endl;
    
            datei2.close();
    
            // Ausgabe des Endes des Programmes
            cout << "\nErgebnisliste als 'items_output.txt' ausgegeben\nBerechnung beendet.\n";
    
    }
    

    Hat jemand eine Idee wie ich den Datenaustausch zwischen den Funktionen ermöglichen kann, wenn die globalen Variablen nicht herangezogen werden?

    Viele Grüße!

    Xalion



  • Ich zitiere mal

    theta schrieb:

    Hier ist das C++/CLI Unterforum, nicht das C und nicht das C++ Unterforum. Du bist also im falschen Unterforum.



  • Danke für den Hinweis! Es war für mich am Anfang trotz genauerem hinsehen nicht sehr leicht herauszufinden, wo ich nun genau hin muss. Nun dachte ich wegen meinem "Microsoft Visual C++ 2010 Express", dass ich hier richtig wäre. Leider kann ich das Thema hier nicht löschen, es kann aber gelöscht werden!




Log in to reply