Problem
Eingabe: Positive-Zahl n, Zurückgegeben werden soll die Dualzahl-Darstellung als String.
Eingabe n | 0 | 1 | 2 | 3 | 4 | 5 | ... | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|
Ausgabe Dualzahl | 0 | 1 | 10 | 11 | 100 | 101 | Â | 1111 | 1 0000 |
Analyse
Wie werden ganze Zahlen dargestellt? Antwort..
Lösungs-Algorithmus (siehe Tabellenbuch):
Beispiel mit Eingabe n = 13
Teilen | mit Rest | Lösung |
---|---|---|
13 / 2 = 6 | Rest 1 | Reste von unten nach oben Lesen:
Lösung 1101 |
6 / 2 = 3 | Rest 0 | |
3 / 2 = 1 | Rest 1 | |
1 / 2 = 0 | Rest 1 |
"Solange mit Rest durch 2 Teilen wie Zahl noch grösser 0 und dann die Reste von unten nach oben lesen"
Teilproblem: Den Rest ermitteln (Modulo-Operator)
In C und Java kann mit dem Modulo-Operator '%' der Rest einer Divison ermittelt werden:
13 % 2 = 1; // "13 modulo 2"
Teilproblem: Reste sammeln in Zeichenkette (String)
Nach jedem Verarbeitungs-Durchlauf wird ein neuer Rest r ermittelt, dieser Rest steht jedoch bei der Rückgabe vor den bisher berechneten Resten.
Um dieses Problem zu lösen, wird der aktuelle Rest vor den vorherigen Resten Zeichenkette eingefügt:
String s=""; // die Rückgabe wird in einer Zeichenkette (string) gesammelt, Initialisierung mit ""
if (r==0) s = '0' + s; else s = '1' + s; // Rest einfügen
Am Ende der Berechnung steht in s das Ergebnis.
Design
Um den Algorithmus programmieren zu können, werden Variabeln benötigt:
int n, r; // Eingabe n und Rest r
String s=""; // die Rückgabe wird in einer Zeichenkette (string) gesammelt
Die Verarbeitung:
r = n % 2; // Rest berechnen
n = n / 2; // neues n berechnen
if (r==0) s = '0' + s; else s = '1' + s; // Rückgabe konstruieren
Beispiel der Verarbeitung mit Eingabe n = 13:
 | Rest r | neues n | neues s | ||||||
---|---|---|---|---|---|---|---|---|---|
|
|
|
|||||||
n | r |
|
n % 2 | n |
|
n / 2 | s |
|
'r' + s |
13 | 1 |
|
13 % 2 | 6 |
|
13 / 2 | "1" |
|
'1' + "" |
6 | 0 |
|
6 % 2 | 3 |
|
6 / 2 | "01" |
|
'0' + "1" |
3 | 1 |
|
3 % 2 | 1 |
|
3 / 2 | "101" |
|
'1' + "01" |
1 | 1 |
|
1 % 2 | 0 |
|
1 / 2 | "1101" |
|
'1' + "101" |
Nun fehlt noch die Eingabe, die Wiederholung der Verarbeitung und die Ausgabe zum fertigen Programm.
Aufgabe: Komplettieren Sie das Design!
Programmierung / Implementierung / Test
Aufgabe: Implementieren Sie eine Methode DoClass.wandle(n:GZ):Text und testen Sie Ihre Lösung!
Verwenden Sie als Test-Eingabe 13, 1 und 0.
Problem beim Testen mit Eingabe 0
Wenn n = 0 ist wird das Ergebnis ""ausgegeben.
Bisher kannten Sie nur kopfgesteuerte Schleifen, bei n = 0 wird bei der while-Schleife mit der Bedingung n > 0 die Verarbeitung abgewiesen.
D.h. die richtige Ausgabe "0" wird nicht erzeugt.
Wichtige Erkenntnis: Damit das Verfahren funktioniert, muss der Rest auch bei der Eingabe 0 Ermittelt werden!
Man benötigt eine Schleife, die die Bedingung erst nach der Verarbeitung prüft!
Allgemeine Do-While-Schleife
|
|
Da die Überprüfung der Bedingung erst nach dem Verarbeitungs-Rumpf geschiet, nennt man diese Schleife auch Fußgesteuerte Schleife.
Aufgabe: Ändern und testen Sie nun Ihre Lösung. Erstellen Sie ein Struktogramm!