studyklar
GdI 1 · Übungsblatt 6 · Aufgabe 5

Zweierpotenzen 2⁰ bis 2ⁿ ohne Math.pow: erst while, dann for

1, 2, 4, 8, 16, …: Jede Zweierpotenz ist das Doppelte der vorigen. Das Programm braucht darum kein Math.pow. Es beginnt bei 1 und verdoppelt in jeder Runde einer Schleife. In a) ist das eine while-Schleife, in b) dieselbe Rechnung als for-Schleife. Rechts steht das Programm des Teils, die Zeilen zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 6.5

a) Schreiben Sie ein Java-Programm A6_5a, welches alle Zweierpotenzen von 2⁰ bis 2ⁿ zeilenweise ausgibt. Dabei ist n eine einzugebende natürliche Zahl größer 1. Eventuell benötigte Schleifen sind als While-Schleifen zu realisieren. Realisieren Sie das Programm ohne Verwendung der Funktion Math.pow().

b) Kopieren Sie die Programmdatei aus Aufgabe a) (neuer Name: A6_5b). Ändern Sie das kopierte Programm derart, dass anstelle der While-Schleifen For-Schleifen verwendet werden.

Das Programm liest n und gibt dann n + 1 Zeilen aus: 2⁰, 2¹, … bis 2ⁿ. Math.pow ist eine fertige Methode für Potenzen; sie ist verboten. In a) sind nur while-Schleifen erlaubt, in b) wird jede davon durch eine for-Schleife ersetzt. Eine einzige Schleife reicht in beiden Teilen.

Merke: Statt jede Potenz neu auszurechnen, merkt man sich die letzte und verdoppelt sie: potenz = potenz * 2.
  1. a) Die Idee: verdoppeln statt potenzieren.
  2. a) n einlesen.
  3. a) Startwerte für Potenz und Zähler.
  4. a) Die while-Bedingung.
  5. a) Der Rumpf: ausgeben, verdoppeln, weiterzählen.
  6. a) Schreibtischtest mit n = 3.
  7. a) Ausführen mit n = 10.
  8. b) while in for umschreiben.
  9. b) Den Rumpf anpassen.
  10. b) Ausführen mit n = 10.

Verdoppeln statt potenzieren

Jede Potenz aus der vorigen
20=1,2i+1=2i⋅2:1  →  2  →  4  →  8  →  16  →  …2^0 = 1, \qquad 2^{i+1} = 2^i \cdot 2: \qquad 1 \;\to\; 2 \;\to\; 4 \;\to\; 8 \;\to\; 16 \;\to\; \dots

2ⁿ heißt: n-mal die 2 malnehmen. Jede Potenz ist also die vorige mal 2. Und 2⁰ ist 1, denn da wird noch gar nicht malgenommen. Wer mit 1 beginnt und in jeder Runde verdoppelt, hat nach i Runden genau 2ⁱ. Das braucht nur eine Multiplikation je Zeile.

n einlesen

public class A6_5a {     public static void main(String[] args) {        Out.print("n = ");        int n = In.readInt();
    }}

n ist eine natürliche Zahl, also int mit In.readInt(). Die Aufgabe sagt, n ist größer als 1; das setzen wir für die Eingabe voraus.

Aus Skript 4, Folien 4-30 und 4-33 („Ein-/Ausgabe“): Die Kursklassen In und Out lesen und schreiben auf der Konsole: In.readInt() liest eine ganze Zahl, Out.println(x) gibt x aus und beginnt eine neue Zeile.In und Out sind Hilfsklassen der Vorlesung, keine Klassen aus Java selbst: In.java und Out.java müssen im selben Ordner liegen wie das Programm.
Noch 9 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1a) Mit while

verdoppeln, bis 2ⁿ erreicht ist

public class A6_5a {     public static void main(String[] args) {        Out.print("n = ");        int n = In.readInt();         long potenz = 1;        int i = 0;        while (i <= n) {            Out.println("2^" + i + " = " + potenz);            potenz = potenz * 2;            i = i + 1;        }    }}
LegendeHervorgehoben: nur das Gerüst der Klasse A6_5a. Die Schritte füllen es Teil für Teil.