/* Lösungsvorschlag Aufgabe 2 */ #include <iostream> #include <iomanip> using namespace std; // Zur Zahldarstellung wird ein altertuemlicher Array genutzt. // Dies ist nicht modernes C++. int const NN = 10; typedef int zahl [NN]; void setzero (zahl& z) { for (int i = 0; i < NN; ++i) z [i] = 0; }//setzero void copy (zahl za, zahl& zb) { for (int i = 0; i < NN; ++i) zb [i] = za [i]; }//copy void add (zahl z1, zahl z2, zahl& erg) { // Zahlueberlauf wird nicht festgestellt. int const vgl = 1000; erg [0] = z1 [0] + z2 [0]; for (int i = 1; i < NN; ++i) { erg [i] = z1 [i] + z2 [i]; if (erg [i-1] >= vgl) { erg [i] += 1; erg [i-1] -= vgl; } } }//add void printzahl (zahl z) { int i; for (i = NN-1; (z [i] == 0) && (i > 0); --i) ; if (i == 0) cout << z [0]; else { cout << z [i]; for (int j = i-1; j >= 0; --j) cout << setfill ('0') << "." << setw (3) << z [j]; } }//printzahl void Fibonacci (unsigned n, zahl& erg) { setzero (erg); if (n == 0) ; else { zahl f0; setzero (f0); zahl f1 = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // unschoen!! for (unsigned index = 2; index < n+1; ++index) { zahl fneu; add (f0, f1, fneu); copy (f1, f0); copy (fneu, f1); } copy (f1, erg); } }//Fibonacci int main () { for (int i = 1; i < 150; i++) { zahl z; Fibonacci (i, z); cout << setfill (' ') << setw (4) << i << ". Fibonacci-Zahl = "; printzahl (z); cout << endl; } return 0; }//main /* Ergebnis: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl Fibonacci-Zahl = = = = = = = = = = = = = = = = = = 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1.597 2.584 41. Fibonacci-Zahl = 165.580.141 42. Fibonacci-Zahl = 267.914.296 43. Fibonacci-Zahl = 433.494.437 99. Fibonacci-Zahl = 218.922.995.834.555.169.026 100. Fibonacci-Zahl = 354.224.848.179.261.915.075 101. Fibonacci-Zahl = 573.147.844.013.817.084.101 */ Allgemeines zu den Lösungen - Übersichtlichkeit durch Einrücken Kommentare Genauigkeit! Nicht F(n+1) oder F(n-1) Aufgabenstellung genauer lesen o Nicht die ganze Reihe ausgeben o Programm beenden nach Ausgabe o keine führenden Nullen - Bewertungsabstufungen: OK, OK-, - nur bei MS Compilern i außerhalb der Schleife gültig: for(int i=0; i<5; ++i){} for(i=0; i<5; ++i){} Also bitte bei mehreren Schleifen entweder for(int i=0; i<5; ++i){} for(int i=0; i<3; ++i){} oder int i; for(i=0; i<5; ++i){} for(i=0; i<3; ++i){} /* Lösungsvorschlag Aufgabe 3 */ /**** Loesung (1052) von Barmeier, Till, XXX, XXX Hagel, Christian, XXX, XXX ****/ #include <iostream> #include <assert.h> using namespace std; int int int int int int int a=0; b=0; c=0; d=0; e=0; f=0; i=0; int main() { cout << "Sechs Zahlen sollen durch maximal Zehn Vergleiche der Groesse nach sortiert werden" << endl << endl; cout << "Bitte durch Leerzeichen getrennt sechs Ganzzahlen eingeben:"<< endl; cin >> a >> b >> c >> d >> e >> f; if (a > b) { i=a; a=b; b=i; } assert(a<=b); if (c > d) { i=c; c=d; d=i; } assert(c<=d); if (b > d) { i=a; a=c; c=i; i=b; b=d; d=i; } assert (a<=b && b<=d && c<=d); if (e > b) { if (d > e) {i=d; } //if else { if (e > a) {i=b; else { i=a; a=e; } //else assert(a<=b && b<=d && d=e; e=i; } b=e; e=d; d=i; } e=d; d=b; b=i; } d<=e && c<=e); if (c > b) { if (c > d) {i=c; c=d; d=i; } } //if else { if (c > a) {i=b; b=c; c=i; } else {i=a; a=c; c=b; b=i; } } //else assert(a<=b && b<=c && c<=d && d<=e); if (f > b) { if (f > d) { if (e > f) {i=e; e=f; f=i; } } //if else { if (f > c) {i=d; d=f; f=e; e=i; } else {i=c; c=f; f=e; e=d; d=i; } } //else } //if else { if (f > a) { i=b; b=f; f=e; e=d; d=c; c=i; } else { i=a; a=f; f=e; e=d; d=c; c=b; b=i; } } //if assert(a<=b && b<=c && c<=d && d<=e && e<=f); cout << "Reihenfolge:" << endl << a << " " << b << " " << c << " " << d << " " << e << " " << f << endl; return 0; } //main Sortiert werden soll: 12 4 -125 24 8 0 n. Sechs Zahlen sollen durch maximal Zehn Vergleiche der Groesse nach sortiert werden Bitte durch Leerzeichen getrennt sechs Ganzzahlen eingeben: Reihenfolge: -125 0 4 8 12 24 Sortiert werden soll: 29 7 73 2 11 73 n. Sechs Zahlen sollen durch maximal Zehn Vergleiche der Groesse nach sortiert werden Bitte durch Leerzeichen getrennt sechs Ganzzahlen eingeben: Reihenfolge: 2 7 11 29 73 73 Übungen zu MN1, WS 2004/2005: Aufgabe 4: Arithmetische Ausdrücke Schreiben Sie ein Programm zur Berechnung arithmetischer Ausdrücke. Benutzen Sie als Grundlage die folgende Grammatik: Ausdruck V S F ::= ::= ::= ::= "+" V "−" V V V "+" S V "−" S S S "∗" F S "/" F F Zahl (A) Betrachten Sie als Zahlen die dezimalen Ganzzahlen mit und ohne Vorzeichen. Verändern Sie die vorstehende Grammatik so, daß −3 − 4 = −7 ist. Implementierung: Das Programm soll zu Beginn eine Zeichenkette (den arithmetischen Ausdruck) einlesen, den berechneten Ausdruck ausgeben und sich dann beenden. Abgabetermin ist Freitag, der 12.11. Abgabe und weitere Informationen siehe: http://www.informatik.uni-hamburg.de/TKRN Lehre Informatik für Mathematiker und Naturwissenschaftler Nützliche Funktionen zur Zeichenkettenverarbeitung (1): size_type length() const; size_type size() const; Beide Funktionen liefern die Länge (Anzahl der Zeichen) der Zeichenkette. Der size_type Rückgabewert ist ein vorzeichenloser Ganzzahltyp. string str = "Hello"; string::size_type len; len = str.length(); // len == 5 len = str.size(); // len == 5 string& insert(size_type pos, const string& str); Fügt eine Zeichenkette in die aktuelle Zeichenkette ein, beginnend bei der angegebenen Position. string str11 = "abcdefghi"; string str12 = "0123"; str11.insert (3,str12); cout << str11 << endl; // "abc0123defghi" str12.insert (1,"XYZ"); cout << str12 << endl; // "0XYZ123" string& erase(size_type pos, size_type n); Löscht einen Teil der aktuellen Zeichenkette. string str13 = "abcdefghi"; str12.erase (5,3); cout << str12 << endl; // "abcdei" string& replace(size_type pos, size_type n, const string& str); Ersetzt eine Teilzeichenkette durch eine andere Zeichenkette. string str14 = "abcdefghi"; string str15 = "XYZ"; str14.replace (4,2,str15); cout << str14 << endl; // "abcdXYZghi" Nützliche Funktionen zur Zeichenkettenverarbeitung (2): size_type find (const string& str, size_type pos); size_type rfind (const string& str, size_type pos); Sucht nach dem ersten (bzw. letzten) Auftreten der Teilzeichenkette str in der aktuellen Zeichenkette ab Position pos. string str16 = "abcdefghi"; string str17 = "def"; string::size_type pos = str16.find (str17,0); cout << pos << endl; // 3 pos = str16.find ("AB",0); if (pos == string::npos) cout << "Not found" << endl; string substr (size_type pos, size_type n); Liefert eine Teilzeichenkette zurück. string str18 = "abcdefghi" string str19 = str18.substr (6,2); cout << str19 << endl; // "gh"