MezData-Logo Creative Commons License 245 Lösungen Button :PI-BLUEJ: Integer in Dualzahl umwandeln, Hinleitung zur Do-While-Schleife

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
r = n % 2;
n = n / 2;
if (r==0) s = '0' + s; else s = '1' + 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.

Lösung anzeigen..

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

do{
  Verarbeitung
}while (Bedingung);

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!