/* Lösungsvorschlag Aufgabe 2 */ #include #include

Werbung
/* 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"
Herunterladen