Ziele sind das Arbeiten mit Funktionen (Modularisierung, Parameterübergabe), sowie - Aufgabe 3: Diese Aufgabe baut auf der 2. Aufgabe auf und erweitert diese. Die Funktionalität der 2. Aufgabe wird also weiterhin erwartet und wird überprüft werden! Das Programm ist so zu erweitern bzw. zu ändern, dass die vom Anwender gewählten Menüpunkte als Funktionsaufrufe implementiert werden. Zusätzlich ist ein weiterer Menüpunkt einzufügen und zu implementieren (siehe weiter unten). Nachdem die ausgewählte Aktion durchgeführt wurde, wird die Auswahl erneut angeboten. Dies wird solange wiederholt, bis der Anwender entscheidet, dass das Programm beendet werden soll. Folgende Funktionen sollen zur Auswahl stehen und mittels switch case realisiert werden: a. Russische Bauernmultiplikation b. Kreis-Kugel-Berechnung c. Schaltjahrberechnung d. Lösung einer quadratischen Gleichung e. Nachbarn in einem Feld tauschen (NEU!) x. Programm beenden Die Auswahl (= das Menü) soll ebenfalls als Funktion implementiert werden! Hinweise zur Durchführung: Schritt 1: Beginnen Sie mit einem neuen Projekt (Achtung: Hinzufügen zur bestehenden Projektmappe) und fügen Sie in eine leere cpp-datei den Quelltext von Aufgabe 2 ein (Copy&Paste = Kopieren&Einfügen). Das wird später die Datei mit dem Hauptprogramm (beachten Sie dies bei der Wahl des Dateinamens) Übersetzen und testen Sie das Projekt, erst dann gehen Sie zu Schritt 2 über. Dokumentieren Sie diesen (und alle weiteren Tests) in einem handschriftlichen Protokoll auf Papier. Schritt 2: Fügen Sie dem Projekt eine (leere) Header-Datei hinzu (Vorschlag für den Namen: aufg3_funktionen.h oder aufgabe3.h). Kopieren Sie in diese Datei den entsprechenden Quelltext vom Ende des Aufgabenblattes (Copy&Paste). Beachten Sie bitte: Die Header-Datei enthält die Schnittstellendefinitionen für alle Projektbestandteile und darf nicht geändert werden! Ersetzen Sie dann die #include-anweisung(en) durch #include "ihr gewählter Dateiname.h". Übersetzen und testen Sie das Projekt erneut. (Protokollieren nicht vergessen!) Schritt 3: Fügen Sie dem Projekt eine weitere cpp-datei (der Name sollte sinnvollerweise genauso lauten wie der der Header-Datei, nur die Erweiterung ändert sich zu cpp; d.h. aufg3_funktionen.cpp). Beginnen Sie dann damit, die einzelnen Menüpunkte nach und nach in Funktionen umzuändern. Achten Sie auf die Schnittstellendefinition in der Header-Datei und die Aufgabenverteilung zwischen Aufrufer (main()-funktion) und Unterprogramm. Seite 1 von 5
Die Implementierung der Funktion erfolgt dabei in der neuen Datei, gleichzeitig verschwindet der entsprechende Quellcode aus dem Hauptprogramm und wird durch den passenden Funktionsaufruf ersetzt. Testen und protokollieren Sie nach jeder geänderten Funktion, es müssen jederzeit alle Menüpunkte funktionieren! Schritt 4: Fügen Sie den neuen Menüpunkt Nachbarn in einem Feld tauschen in das Menü ein und implementieren Sie zunächst eine leere Funktion, die lediglich den Text Nachbarn tauschen ausgibt. Wenn das funktioniert, implementieren Sie folgende Aufgabenstellung: Die Funktion tauschenachbarn füllt ein Array mit einzugebenden Werten bis zu einer maximalen Anzahl. Danach wird das gefüllte Array ausgegeben. Im nächsten Schritt werden die Inhalte der beiden benachbarten Arrayelemente getauscht und das geänderte Array ausgegeben. Die Ausgabe ist so zu gestalten, dass die Vertauschung gut zu erkennen ist. Die Ausgabe des gefüllten Feldes (nach der Vertauschung erfolgt im Hauptprogramm. Beispiel: vorher 17-8 12 4-100 22 815-5 17 4-9 0 nachher -8 17 4 12 22-100 -5 815 4 17 0-9 Lösungshinweise: die maximale Anzahl der Arrayelemente wird als Konstante im Hauptprogramm festgelegt und als Parameter übergeben, ebenso wie das (leere) Array. Als Ergebnis gibt die Funktion die Anzahl der tatsächlich belegten Elemente zurück. Sonstiges: Im Anhang findet sich auch das Fragment eines Hauptprogramms, das Ihnen als Orientierung für die Umgestaltung ihres Programms dienen kann. Insbesondere können Sie dort die eine oder andere Idee für den Einsatz der Funktionen finden. Die Header-Datei muss in der vorgegebenen Form verwendet werden, die Schnittstellen sind entsprechend zu implementieren. Das anzufertigende Protokoll ist Bestandteil der Aufgabenstellung Vorbereitung: Neben den obligatorischen Testwerten ist ein Entwurf der Funktion Nachbarn tauschen zu erstellen (Struktogramm oder Flußdiagramm) und zur Übung mitzubringen. Seite 2 von 5
Bitte beachten Sie, dass die Header-Datei zwingend zu benutzen ist. Diese Datei darf nicht geändert werden! // Headerdatei zu Aufgabe 3 Wintersemster2018/2019 #include <iostream> #include <cmath> #include <iomanip> using namespace std; // Funktion zum Anzeigen des Auswahlmenues char menu(); // Eingabe in die Funktion: keine // Rückgabe der Funktion: gewählter Menüpunkt // Besonderheit: Diese Funktion darf zu int menue(); // geändert werden, wenn die Auswahl bisher numerisch erfolgte //Funktion zur Bauernmultiplikation void bauernmultiplikation(int a, int b); //Eingabe an die Funktion: die beiden Faktoren //Rückgabe aus der Funktion: keine //Besonderheiten: Berechnung der Werte und Ausgabe komplett in der Funktion //Funktion zur Berechnung von Kreis und Kugel void kreis_kugel(double radius); //Eingabe in die Funktion: Radius //Rückgabe der Funktion: keine //Besonderheiten: Berechnung der Werte und Ausgabe komplett in der Funktion //Funktion zur Überprüfung auf Schaltjahr bool istschaltjahr(int jahr); //Eingabe: das zu überprüfende Jahr //Rückgabe: true, wenn es sich um ein Schaltjahr handelt, sonst false //Funktion zur Lösung der p-q-formel double quad_gl(double p, double q, double& x1, double& x2); //Eingabe: die beiden Koeffizienten p und q //Rückgabe: Diskriminante als Funktionswert, x1 und x2 über Parameterliste //Funktion, um benachbarte Elemente in einem Feld zu tauschen int nachbarn_tauschen(int daten[], const int MAXANZAHL); //Eingabe: das leere Array, Max. Größe des Arrays //Rückgabe: die Zahl der tatsächlich eingegebenen Werte //Besonderheiten: Die Funktion muss auch mit einer ungeraden Anzahl von // Elementen zurecht kommen //Funktion zum Ausgeben eines Feldes void feldausgeben(int daten[], int anz); //Eingabe: Das Feld, die Zahl der belegten Elemente //Rückgabe: keine //Besonderheiten: Diese Funktion muss nicht verwendet werden Seite 3 von 5
Beispiel eines Programmrahmens (Menüsteuerung): ACHTUNG!! Das ist ein Fragment, welches nicht lauffähig ist! // Aufgabe 3 - Wintersemester 2018-2019 // Autoren: Jörg Schake, Dirk Seeber // Datum: 9. November 2018 #include "aufg3_funktionen.h" int main() // Konstantendeklaration const double PI = 4 * atan( 1.0 ); // Variablendeklaration char menuwahl = 'x'; bool programmende = false; // weitere Variablen // case 'a' int a, b; // case 'b' double radius; // case 'c' int jahr; // case 'd' double diskriminante, p, q, x1, x2; // case 'e' const int MAXANZAHL = 10; // Maximale Größe des Arrays int anzahl; // die tatsächlich belegte Anzahl im Array // d.h. anzahl <= MAXANZAHL int werte[maxanzahl]; // das Array selbst do menuwahl = menu(); switch (menuwahl) case 'a': // Ihre Implementierung Russische Bauernmultiplikation cout << "Russische Bauernmultiplikation" << endl << endl; cout << "In jedem Rechenschritt wird..." << endl; cout << " der erste Faktor durch 2 dividiert." << endl; cout << " der zweite Faktor verdoppelt" << endl << endl; cout << "Geben Sie den ersten Faktor ein: "; cin >> a; cout << "Geben Sie den zweiten Faktor ein: "; cin >> b; bauernmultiplikation(a, b); Seite 4 von 5
} case 'b': // Ihre Implementierung Kreis-Kugel-Berechnung cout << "Bitte Radius eingeben: "; cin >> radius; kreis_kugel( radius ); case 'c': // Ihre Implementierung Schaltjahrberechnung cout << "Gib eine Jahreszahl ein: "; cin >> jahr; //Ausgabe und Funktionsaufruf einfügen case 'd': // Ihre Implementierung Loesung einer quadratischen Gleichung cout << "Gib p ein: "; cin >> p; cout << "Gib q ein: "; cin >> q; //Ausgabe und Funktionsaufruf einfügen case 'e': // Ihre Implementierung Nachbarn in einem Feld tauschen // Funktionsaufruf einfügen // Feldausgabe einfügen case 'x': // Programm beenden programmende = true; default: // Warnhinweis cout << "Der eingegebene Wert " << menuwahl; cout << " ist nicht gueltig!" << endl; } // endswitch } while ( false == programmende ); system("pause"); return 0; Seite 5 von 5