Übung III zur Vorlesung Informatik I Prof. Dr. Nikolaus Wulff Zum 16. Nov. 2015 1 Binäre Operatoren Aufgabe Berechnen Sie für die short Variablen x,y,z mit den Vorbelegungen x = 4 und y = 7 die folgenden Ausdrücke: z z z z = = = = x x x x << 3; & ~y; | y; ^ y; Tip Schreiben Sie sich die Zahlen in Binärdarstellung untereinander und verwenden Sie dann die boolsche Algebra. 2 1 2 3 4 5 Länge einer Zeichenkette int slen(char s []) { int length; for(length=0; s[length ]; length++){} return length; } Listing 1: Länge einer Zeichenkette per for-Schleife Schreiben Sie die angegebene Methode slen, welche die Länge einer übergebenen Zeichenkette s ermittelt, einmal mit einer while und einmal mit einer do-while Schleife. Hinweis Eine Zeichenkette wird immer mit ’\0’ ≡ 0 abgeschlossen. Die Zeichenkette s=”Hello” hat also die Repräsentation ’H’,’e’,’l’,’l’,’o’,’\0’. D.h. (s[5] == 0) ist in diesem Fall ein wahrer Ausdruck. Wo taucht diese Abfrage im obigen Codefragment auf? 1 3 Fehler über Fehler Die folgende Funktion whatswrong soll zwei Zahlen nach Größe vergleichen und das Ergebnis des Vergleichs als Zeichenkette zurückgeben. Leider enthält die Implementierung zahlreiche Fehler. Helfen Sie mir bitte bei der Korrektur: 1. Notieren Sie alle Fehler, versehen mit einem Kommentar, was in der jeweiligen Zeile falsch ist. 2. Schreiben Sie eine korrekte Implementierung von whatswrong. 1 2 3 4 5 char char char char LT[]=”is less”; GT[]=”is greater”; EQ[]=”equals”; UNKOWN[] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void whatswrong(double x, double y) { char ∗result; switch(x,y) case x<y: result = LT; case x>y: result = GT; break; case x==y result = EQ; break; else result = UNKOWN; 20 return result; 21 22 } Listing 2: Fehlerhaftes switch-case 4 1 2 3 4 5 6 7 8 sträwkcür etteknehcieZ /∗∗ revers .h ∗/ #ifndef REVERS H #define REVERS H /∗∗ ∗ char∗ str char array to revers ∗ return str as reverted char array ∗/ void reverse(char str []) ; 9 10 #endif /∗ REVERS H defined ∗/ Listing 3: Header Datei zur Invertierung einer Zeichenkette 2 Aufgabe Entwickeln Sie eine Methode revers(char str[]), die eine übergebene Zeichenkette rückwärts zurückliefert. D.h. die Funktion revers gibt die Zeichenkette nicht rückwärts auf der Konsole aus, sondern invertiert das Argument für dens aufrufenden Programmteil. Tip Da der Rückgabewert von revers vom Type void ist, muss die Zeichenkette direkt im Feld str invertiert werden. Sie benötigen daher entweder zwei Zeiger char *start, *ende für den Anfang und das Ende des Feldes zum Realisieren einer swap-Operation, sowie eine temporäre char Variable oder aber zwei Indexzähler. Der Eine muss inkrementiert der Andere dekrementiert werden. Wie lautet die Abbruchbedingung der entsprechenden for, while oder do-whileSchleife? 5 kgV und ggT Aufgabe Entwicken Sie eine Methode kgV(a,b) zur Bestimmung des kleinsten gemeinsamen Vielfachen zweier Zahlen a, b ∈ N \ {0}. Es gilt die Beziehung kgV(a, b) · ggT(a, b) = a·b ∀a, b ∈ N \ {0}. (1) Tip Es gibt verschiedene Methoden den kgV und ggT zu bestimmen, eine ist die Primfaktorzerlegung. Einfacher ist es jedoch eine der beiden Methoden effektiv zu implementieren und dann die jeweils fehlende durch Umformung von Formel 1 zu ermitteln. Der ggT ist Gegenstand der Vorlesungen, daher wird in dieser Übung das kgV implementiert. Um eine Lösungsidee für den gesuchten Algorithmus zu entwickeln, dient die folgende Überlegung: Für a, b ∈ N \ {0} gibt es den kgV(a, b) und daher gilt ∃ m, n ∈ N mit kgV(a, b) = m·a=n·b ⇒ ⇔ m · a mod b ≡ 0. ma = n Rest 0 b (2) (3) D.h. es gilt nur noch das minimale m zu finden, das Formel (3) erfüllt, was leicht in Form einer Schleife zu implementieren ist: 1. Begin mit m = 1. 2. Berechne den Rest von m · a geteilt durch b. 3. Ist der Rest 0 so ist m · a das gesuchte kgV. 4. Falls nicht so erhöhe m um 1 und gehe zu Schritt 2. Verwenden Sie den Modulo Operator % und eine geeignete Abbruchbedingung für die verwendete for- oder while-Schleife. 3