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!
-
Hier geht's weiter...
https://www.c-plusplus.net/forum/338193