Seite 1 von 10 Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe ( / 6 Pkt.) a) Geben Sie die binäre Darstellung des dezimalen Zahlenwertes 57 an (inklusive Rechenweg und Proberechnung). (3 Punkte) 57 / 2 = 28 R 1 28 / 2 = 14 R 0 14 / 2 = 7 R 0 7 / 2 = 3 R 1 3 / 2 = 1 R 1 1 / 2 = 0 R 1 111001 = 32 + 16 + 8 + 1 = 57 b) Geben Sie die Darstellung des dezimalen Zahlenwertes 67 im Zahlensystem mit der Basis 5 an (inklusive Rechenweg und Proberechnung) (3 Punkte). 67 / 5 = 13 R 2 13 / 5 = 2 R 3 2 / 5 = 0 R 2 232 = 50 + 15 + 2 = 67
Seite 2 von 10 2. Aufgabe ( / 15 Pkt.) Was liefert das folgende Programm an Bildschirmausgaben? #include <iostream> using namespace std; int main() const int oberegrenze = 19; const int startwert = 2; int x = 7, y = startwert, zeile = 1; while ( y + x < oberegrenze ) cout << zeile << ". Zeile: " << (y + x) * 2 <<endl; x++; y++; zeile++; 1. Zeile: 18 2. Zeile: 22 3. Zeile: 26 4. Zeile: 30 5. Zeile: 34 (5 Punkte) zeile = 1; for ( x = 0; x <= oberegrenze; x = x + 4 ) cout << "Ausgabe " << zeile << ": "; for ( y = oberegrenze; y > 0; y = y - 4 ) cout << (x * 2) + y << " "; cout << endl; zeile++; cout << endl; Ausgabe 1: 19 15 11 7 3 Ausgabe 2: 27 23 19 15 11 Ausgabe 3: 35 31 27 23 19 Ausgabe 4: 43 39 35 31 27 Ausgabe 5: 51 47 43 39 35 (10 Punkte)
Seite 3 von 10 3. Aufgabe ( / 4 Pkt.) Gegeben ist folgende Wahrheitstabelle: x y z f1(x,y,z) f2(x,y,z) f3(x,y,z) f4(x,y,z) 1 1 1 1 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 Geben Sie bitte die Boole schen Funktionen an, die die Bedingungen erfüllen, wobei nur die booleschen Operatoren "und", "oder", "nicht" erlaubt sind. f1 (x,y,z) = xyz + x!y!z +!xyz +!x!yz +!x!y!z ===> yz +!y!z +!xz f2 (x,y,z) = xyz + xy!z + x!y!z +!xyz +!xy!z +!x!y!z ===> y +!y!z f3 (x,y,z) = x!yz + x!y!z +!xy!z +!x!y!z ===> x!y +!x!z f4 (x,y,z) = xy!z + x!yz + x!y!z +!xy!z +!x!yz ===> y!z + x!y +!yz
Seite 4 von 10 4. Aufgabe ( / 9 Pkt.) a) Skizzieren und beschreiben Sie kurz die Wirkungsweise der System-Software- Komponenten (Compiler, Debugger, Editor, Linker), die man benötigt, um von einem Quellprogramm-Entwurf zum lauffähigen Maschinenprogramm zu kommen. Nennen Sie jeweils Beispiele und beachten Sie dabei die richtige Reihenfolge. ( 6 Punkte) Editor: Erstellen/Modifizieren des Programmtextes (Header- und Quellcode-Dateien). Beispiele: Editor in Visual C++ Express, notepad jeweils 1,5 Punkte Compiler: Linker: Debugger: Programmtext (Quellcodedatei) übersetzen, dabei Objectcode erzeugen. Nur ein vollständig fehlerfreies Programm kann in Objectcode übersetzt werden. Beispiele: Compiler in Visual C++ Express, gcc, g++, cc Ausführbares Programm erzeugen (aus den zuvor erzeugten Objectcode-Dateien). Beispiele: Linker in Visual C++ Express, gcc, g++, cc Programm ausführen und testen. Der Debugger ist nicht nur zur Lokalisierung von Programmierfehlern, sondern auch zur Analyse eines Programms durch Nachvollzug des Programmablaufs hilfreich. Beispiele: Debugger in Visual C++ Express, gdb, dbx b) Was bedeutet rekursive Funktion? Nennen Sie Anwendungsbeispiele. ( 3 Punkte ) Eine rekursive Funktion ist eine Funktion, die sich selbst wieder aufruft. Beispiele: Fakultätsberechnung Fibonacci-Zahlen
Seite 5 von 10 5. Aufgabe ( / 11 Pkt.) a) Welche Ausgaben liefert das folgende Programm an Bildschirmausgaben? (11 Punkte) #include <iostream> using namespace std; int main() int info[10] = 9, 12, 13, 15, 18, 21, 23, 24,27, 30 ; int n = 10, i; int erg = 0; char c; //Verarbeitung + Ausgabe for ( i = 0; i < n; i++) c = '-'; if ( 0 == (info[i] % 3 ) ) c = '*'; erg = erg + info[i]; cout << "c = " << c << " cout << "Ergebnis = " << erg << endl; return 0; info = " << info[i] << endl; c = * info = 9 c = * info = 12 c = - info = 13 c = * info = 15 c = * info = 18 c = * info = 21 c = - info = 23 c = * info = 24 c = * info = 27 c = * info = 30 Ergebnis = 156
Seite 6 von 10 6. Aufgabe ( / 15 Pkt.) Geben Sie für die folgende umgangssprachlich beschriebene Anweisung die Umsetzung in ein Teil eines Ablaufdiagramms (Flußdiagramms) oder einen Strukturblock (Struktogramm) (6 Punkte) sowie in einen Teil eines C/C++-Programms an: Was wird ausgegeben, wenn der Programmausschnitt so ausgeführt wird? (6 Punkte) (3 Punkte) Setze a auf 11 Setze b auf 35 Solange (a den Wert kleiner gleich 40) und (b den Wert kleiner gleich 50) hat, wiederhole die folgenden Anweisungen Falls a gleich b ist Setze b auf 60 Ausgabe von b sonst Ausgabe von a Erhöhe a um 12 a) 6 Punkte b) a = 11; b = 35; while ( ( a <= 40 ) && ( b <= 50 ) ) if ( a == b ) b = 60; cout << "b = " << b << endl; else cout << "a = " << a << endl; a = a + 12; c) 6 Punkte 3 Punkte a = 11 a = 23 b = 60
Seite 7 von 10 7. Aufgabe ( / 20 Pkt.) Für ein Straßenkataster sollen für maximal 1234 Häuser Informationen gespeichert werden, die alle nach der gleichen Weise wie folgt strukturiert sind: Hausadresse Dachform Baujahr Haus Lage Vorname Strasse Eigentuemer Nachname Plz Preis Adresse Dabei gelten folgende Beschreibungen: Dachform besitzt den Wertevorrat: flach, giebel, pult, walm Baujahr ist eine ganze Zahl Preis ist eine reelle Zahl Eigentuemer enthält die Elemente: Vorname ist max. 25 Zeichen lang Nachname ist max. 25 Zeichen lang Adresse enthält die folgenden Elemente: Strasse ist max. 22 Zeichen lang Plz ist eine 5-stellige Zahl Ort ist max. 22 Zeichen lang Hausadresse ist vom gleichen Aufbau wie die Eigentuemer-Adresse Lage besitzt den Wertevorrat: hang, zentrum, randlage, flussnah Ort a) Beschreiben Sie in C/C++ diesen Datentyp vollständig (alle notwendigen Angaben) (11 Punkte) enum mydachform flach, giebel, pult, walm ; enum mylage hang, zentrum, randlage, flussnah ; struct myadresse string strasse; long plz; string ort; ; struct myeigentuemer string vorname; string nachname; myadresse adresse ; 1 Punkt 2 Punkte 2 Punkte
Seite 8 von 10 struct haus mydachform dachform; int baujahr; double preis; myeigentuemer eigentuemer; myadresse hausadresse; mylage lage; ; 6 Punkte b) Zeigen Sie in einem Hauptprogramm, wie Ihr Datentyp instantiiert wird und zeigen Sie an untenstehendem Beispiel, wie ein neues Haus an der 12 Stelle der Liste in die Variablen eingetragen wird: (9 Punkte) Straße (Hausadresse): Weserstr. 23 PLZ (Hausadresse): 64331 Ort (Hausadresse): Weiterstadt Name (Eigentuemer): Rot Vorname (Eigentuemer): Peter Straße (Eigentuemer): Elbestr. 47 PLZ (Eigentuemer): 64367 Ort (Eigentuemer): Muehltal Lage: zentrum Preis: 21545 EUR Baujahr: 2002 Dachform: pult haus liste[1234]; 9 Punkte liste[11].hausadresse.strasse = "Weserstr. 23"; liste[11].hausadresse.plz = 64331; liste[11].hausadresse.ort = "Weiterstadt"; liste[11].eigentuemer.nachname = "Rot"; liste[11].eigentuemer.vorname = "Peter"; liste[11].eigentuemer.adresse.strasse = "Elbestr. 47"; liste[11].eigentuemer.adresse.plz = 64367; liste[11].eigentuemer.adresse.ort = "Muehltal"; liste[11].lage = zentrum; liste[11].preis = 21545.0; liste[11].baujahr = 2002; liste[11].dachform = pult;
Seite 9 von 10 8. Aufgabe ( / 20 Pkt.) a) Formulieren Sie eine Funktionsdeklaration mittel, die für ein gegebenes Array V mit n reellen Komponenten V i den Mittelwert mw, größten Wert max sowie den kleinsten Wert min ermittelt. Ein- und Ausgabegrößen sollen als Parameter (nicht als Return-Wert) übergeben werden. (3 Punkte) void mittel( double [], int, double &, double &, double & ); void mittel( double V[], int anz, double &mw, double &min, double &max ); b) Man gebe die Implementierung dieser Funktion an. Zur Berechnung des Mittelwertes verwende man die bekannte Formel: (11 Punkte) n mw = ( v i ) / n i=1 void mittel( double V[], int anz, double &mw, double &min, double &max ) int i; double summe = 0; for ( i = 0; i < anz; i++ ) summe = summe + V[i]; // Minimum und Maximum bestimmen if ( min > V[i] ) min = V[i]; else if ( max < V[i] ) max = V[i]; else ; // nichts zu tun // ende for Schleife // Mittelwert berechnen mw = summe / anz;
Seite 10 von 10 c) Implementieren Sie das main-programm mit einem Funktionsaufruf Ihrer Funktion, so dass mit deren Hilfe für die 50 gegebenen Werte einer aktuellen Messreihe die Größen mw, max und min bestimmt werden. Die Messreihe sei in einem Datenarray v [100] gespeichert. Die Eingabe der Messwerte ist nicht gefordert! (6 Punkte) #include "function.h" #include <iostream> using namespace std; int main() const int maxanz = 100; int anzahl = 50; double V[maxAnz]; double mw, min, max; // Eingabe der Werte nicht gefordert // Aufruf der Funktion mittel mittel ( V, anzahl, mw, min, max ); // Ausgabe cout << "Der Mittelwert ist : " << mw << endl; cout << "Der Maximalwert ist: " << max << endl; cout << "Der Minimalwert ist: " << min << endl; return 0;