studyklar
GdI 1 · Übungsblatt 11 · Aufgabe 3

Zweierpotenzen bis 2³² als Tabelle mit printf

Die Zweierpotenzen von 2⁰ bis 2ⁿ gab schon das Programm A6_5 aus, aber die Zahlen standen nicht untereinander. Jetzt sorgt System.out.printf für saubere Spalten. Rechts steht die gewünschte Ausgabe Zeichen für Zeichen und darunter das Programm; hervorgehoben ist, was zum aktuellen Schritt gehört.

Die Aufgabe

Übungsblatt 11

Auf die Verwendung der Klassen In und Out soll ab sofort verzichtet werden. Realisieren Sie alle Ein- und Ausgaben mit den Möglichkeiten der Java-Klassenbibliothek.

Aufgabe 11.3

Kopieren Sie Ihr Java-Programm A6_5 in die Datei A11_3.java und ändern Sie es so ab, dass die Ausgaben mittels System.out.printf(...) übersichtlich formatiert werden! Berücksichtigen Sie beim Format Zweierpotenzen bis maximal 2³².

Die Ausgabe sollte wie folgt aussehen:

2 hoch  0  =          1
2 hoch  1  =          2
...
2 hoch  4  =         16
...
2 hoch 10  =       1024
...
2 hoch 32  = 4294967296

Ausgangspunkt ist A6_5: Es liest eine Zahl n und gibt 2⁰, 2¹, … bis 2ⁿ aus, ohne Math.pow. Neu ist nur die Form der Ausgabe. Jede Zeile soll gleich gebaut sein, die Zahlen rechtsbündig, sodass Einer unter Einern stehen. Die breiteste Zahl, für die das gelten soll, ist 2³². Dazu kommt die Vorgabe des Blatts: keine Kursklassen In und Out mehr.

Merke: printf gibt Text nach einer Schablone aus, dem Formatstring. Platzhalter wie %10d geben einer Zahl eine feste Breite. So stehen Zahlen verschiedener Länge sauber untereinander.
  1. Was aus A6_5 bleibt.
  2. Scanner und System.out statt In und Out.
  3. Warum println keine Spalten schafft.
  4. Text und Exponent im Formatstring.
  5. Die Breite für den Wert: 10 Stellen.
  6. Warum potenz long sein muss.
  7. Das Programm mit n = 32 laufen lassen.

Was aus A6_5 bleibt

public class A11_3 {     public static void main(String[] args) {
        long potenz = 1;        for (int i = 0; i <= n; i++) {
            potenz = potenz * 2;        }    }}

Kopiert wird die Fassung mit for-Schleife (A6_5b). Die Rechnung bleibt gleich: potenz beginnt bei 1 = 2⁰ und wird in jedem Durchlauf verdoppelt. Die Schleife läuft für i von 0 bis n. Ändern muss sich nur die Ausgabezeile und die Eingabe.

Aus Blatt 6, Aufgabe 5 („Zweierpotenzen 2⁰ bis 2ⁿ ohne Math.pow: erst while, dann for“): A6_5b liest n mit In.readInt(), setzt long potenz = 1 und gibt in einer for-Schleife für i = 0 bis n mit Out.println die Zeile „2^i = potenz“ aus; danach potenz = potenz * 2.

Scanner und System.out statt In und Out

import java.util.Scanner; public class A11_3 {     public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        System.out.print("n = ");        int n = sc.nextInt();        sc.close();

In und Out stammen aus der Vorlesung und gehören nicht zu Java. Zum Lesen von der Tastatur dient jetzt die Klasse Scanner: import java.util.Scanner; macht sie bekannt, new Scanner(System.in) liest von der Tastatur, sc.nextInt() holt die nächste ganze Zahl. Out.print wird zu System.out.print.

Aus Skript 6, Folie 6-52 („Eingabe von der Tastatur – 1“): Scanner sc = new Scanner(System.in); legt einen Scanner an; nextInt() liest eine ganze Zahl; sc.close() schließt ihn.
Noch 6 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 1

1234567891011121314151617181920212223
2 hoch  0  =          1
2 hoch  1  =          2
2 hoch  4  =         16
2 hoch 10  =       1024
2 hoch 32  = 4294967296
Legendegerade gemeintOben die Soll-Ausgabe aus der Aufgabe, ein Kasten je Zeichen. Im Programm darunter ist erst nur das Gerüst hervorgehoben.

Abbildung 1

import java.util.Scanner; public class A11_3 {     public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        System.out.print("n = ");        int n = sc.nextInt();        sc.close();         long potenz = 1;        for (int i = 0; i <= n; i++) {            System.out.printf("2 hoch %2d  = %10d%n", i, potenz);            potenz = potenz * 2;        }    }}