¨Ubung III zur Vorlesung Informatik I

Werbung
Ü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
Herunterladen