studyklar
GdI 1 · Übungsblatt 7 · Aufgabe 2

Array zyklisch verschieben: n Stellen nach links oder rechts

Zehn Zahlen stehen in einer Reihe. Sie rücken alle um n Plätze nach links oder rechts. Was dabei an einem Ende hinausfällt, kommt am anderen Ende wieder hinein, wie bei einem Ring. Der Rest einer Division (%) erledigt genau das. Rechts stehen das Beispiel und das Programm, die Zeilen zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 7.2

Schreiben Sie ein Programm A7_2, das zunächst die Elemente eines zehnstelligen Integer-Arrays a von der Tastatur einliest. Die Array-Elemente sollen anschließend um n Stellen wahlweise nach links oder rechts zyklisch verschoben werden, siehe Beispiel unten. Das Programm soll dazu die Anzahl n sowie die Information über die Verschieberichtung von der Tastatur einlesen. Für die Verschieberichtung gilt: Eingabe 0 ➔ Verschiebung nach links; Eingabe 1 ➔ Verschiebung nach rechts. Abschließend ist der verschobene Inhalt des Arrays auszugeben.

Das Programm soll dafür sorgen, dass die Eingaben von n und der Verschieberichtung jeweils solange wiederholt werden, bis die Werte gültig sind. n muss im Wertebereich 1 bis 9 liegen, für die Richtung werden nur die Werte 0 und 1 akzeptiert.

Beispiel:

Eingabe der Array-Elemente:1 2 3 4 5 6 7 8 9 10
Eingabe:n = 4 für Verschieben um 4 Stellen
Eingabe:0 für Verschieben nach links
Ausgabe:5 6 7 8 9 10 1 2 3 4

Zyklisch verschieben heißt: Alle Elemente rücken um gleich viele Plätze weiter. Wer dabei über den Rand hinausrückt, landet am anderen Ende. Im Beispiel rücken 5 bis 10 um 4 Plätze nach links an den Anfang. 1 bis 4 fallen links hinaus und stehen danach hinten.

Das Programm liest erst die zehn Zahlen, dann n und die Richtung. Für n gilt 1 bis 9, für die Richtung 0 oder 1. Jede andere Eingabe wird wiederholt.

„Zehnstellig“ heißt hier: Das Array hat zehn Plätze. Es geht nicht um Zahlen mit zehn Ziffern.

Merke: Zyklisch heißt: Was an einem Ende hinausfällt, kommt am anderen Ende wieder hinein.
  1. Zehn Zahlen in das Array a einlesen.
  2. n einlesen, bis es gültig ist.
  3. Die Richtung einlesen, bis sie gültig ist.
  4. Ein zweites Array b für das Ergebnis anlegen.
  5. Nach links verschieben.
  6. Nach rechts verschieben.
  7. Ergebnis ausgeben und testen.

Zehn Zahlen einlesen

public class A7_2 {     public static void main(String[] args) {        int[] a = new int[10];        Out.println("Bitte 10 ganze Zahlen eingeben:");        for (int i = 0; i < a.length; i++) {            a[i] = In.readInt();        }

Das Array a bekommt zehn Plätze, Index 0 bis 9. Eine for-Schleife liest die zehn Zahlen nacheinander ein. Das ist dasselbe Vorgehen wie in Aufgabe 7.1, nur mit 10 statt 6 Plätzen.

Aus Blatt 7, Aufgabe 1 („Array rückwärts ausgeben: erst Tastatur, dann Datei“): new int[6] legt ein Array mit sechs Plätzen an, Index 0 bis 5. Die Schleife for (int i = 0; i < a.length; i++) liest mit In.readInt() eine Zahl nach der anderen nach a[i]. In und Out sind Hilfsklassen der Vorlesung, keine Standardklassen von Java; In.java und Out.java liegen im selben Ordner wie das Programm.

n einlesen, bis es gültig ist

        int n;        do {            Out.print("Um wie viele Stellen verschieben (1 bis 9)? ");            n = In.readInt();        } while (n < 1 || n > 9);

n soll zwischen 1 und 9 liegen. Ungültig ist n, wenn es kleiner als 1 oder größer als 9 ist: n < 1 || n > 9. Das Zeichen || heißt „oder“: Die Bedingung ist wahr, sobald eine der beiden Seiten wahr ist.

Gefragt wird mindestens einmal, erst danach lässt sich prüfen. Darum passt die do-while-Schleife: Sie führt den Rumpf aus und prüft die Bedingung erst am Ende. Ist n ungültig, beginnt sie von vorn und fragt erneut. Bei n = 12 ist 12 > 9 wahr, also wird wiederholt; bei n = 4 sind beide Seiten falsch, die Schleife endet.

Aus Skript 4, Folien 4-53 und 4-43 („Do-While-Schleife“, „Zusammengesetzte Vergleiche“): Bei do { … } while (Bedingung); wird die Bedingung am Ende der Schleife geprüft, der Rumpf läuft also mindestens einmal. || verknüpft zwei Vergleiche mit „oder“, && mit „und“.
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

n = 4, Richtung = 0 (links)
i
0
1
2
3
4
5
6
7
8
9
a[i]
1
2
3
4
5
6
7
8
9
10
b[i]
?
?
?
?
?
?
?
?
?
?
public class A7_2 {     public static void main(String[] args) {        int[] a = new int[10];        Out.println("Bitte 10 ganze Zahlen eingeben:");        for (int i = 0; i < a.length; i++) {            a[i] = In.readInt();        }         int n;        do {            Out.print("Um wie viele Stellen verschieben (1 bis 9)? ");            n = In.readInt();        } while (n < 1 || n > 9);         int richtung;        do {            Out.print("Richtung (0 = links, 1 = rechts)? ");            richtung = In.readInt();        } while (richtung != 0 && richtung != 1);         int[] b = new int[10];        for (int i = 0; i < a.length; i++) {            if (richtung == 0) {                b[i] = a[(i + n) % a.length];            } else {                b[(i + n) % a.length] = a[i];            }        }         Out.print("Ergebnis: ");        for (int i = 0; i < b.length; i++) {            Out.print(b[i] + " ");        }        Out.println();    }}
Legendegerade gemeintüber den Rand gewandertDas Beispiel des Blatts und das Programm. „?“ steht für Werte, die erst ein späterer Schritt erklärt.