2Schleifen und Kommentare
Wir wollen uns nun eine sinnvollere Aufgabe überlegen:
Aufgabe 1:
Vorgegeben:
int x;
Ziel: Ausgeben, ob x eine Primzahl ist.
Hilfestellung:
for(A; B; C) {
Anweisungen
}
Schleifen sind dazu da um Anweisungen wiederholt auszuführen.
A, B und C sind Anweisungen, sie sind im Vergleich zu den Semikolons zwischen ihnen optional.
Anweisung A ist eine Initialisierungsanweisung, hier wird meist eine Laufvariable initialisiert, int i = 0
zum Beispiel.
B ist eine Abbruchbedingung, ein Beispiel ist i < 100
.
C ist ein für gewöhnlich eine Inkrement/Dekrement-Anweisung i++
.
Ein Beispiel für eine Schleife, die alle Zahlen von 1 bis 100 ausgibt:
for(int i = 1; i < 101; i++) {
System.out.println(i);
}
Der Vorteil von i < 101
gegenüber i <= 100
ist, dass bei < 101 der Wert der Abbruchbedingung minus den Initialisierungswert die Anzahl der Iterationen entspricht: 101 - 1 = 100! Durch einen solchen Stil kann man Fehler vermeiden.
Wichtig ist außerdem noch, dass vor jedem Schleifendurchlauf zuerst überprüft wird, ob die Abbruchbedingung erfüllt ist.
Wenn nicht, wird die Schleife und anschließend die Inkrement/Dekrement Anweisung ausgeführt, dann beginnt dasselbe von vorn.
Viel Erfolg bei der Aufgabe!
Bevor wir den Code untersuchen, wollen wir uns die Definition einer Primzahl ansehen:
Eine Zahl, die nur durch sich selbst und Eins ohne Rest und ganzzahlig teilbar ist.
Eine Zahl x lässt sich also am Einfachsten auf diese Definition überprüfen, indem man sie durch alle Zahlen von 2 bis x-1 teilt. Wenn immer ein Rest übrig bleibt, dann handelt es sich um eine Primzahl.
Da das Teilen von x durch eine Zahl z mit z > x/2 und z < x stets ein Ergebnis zwischen 1 und 2 zur Folge hat, reicht es alle Zahlen von 2 bis x/2 zu überprüfen.
Zeile 4:
for(int i = 2; (i <= x / 2) && prim; i++) {
Wir wollen x durch einige Zahlen ab der 2 teilen, also initialisieren wir i mit dieser Zahl.
Außerdem haben wir soeben festgestellt, dass wir alle Werte bis x/2 überprüfen wollen, daher geben wir als Abbruchbedingung i <= x/2 an; auf den Teil && prim werden wir gleich genauer eingehen.
Da wir x durch jede natürliche Zahl teilen wollen, wählen wir als Inkrement ein klassisches i++.
Zeile 5:
if(x % i == 0) {
Zu gut deutsch: wenn man x durch i ohne Rest teilen kann.
Zeile 6:
prim = false;
Wir haben uns dazu entschieden eine boolsche Variable zu verwenden. Wenn nun nach der Schleife prim false ist, dann wissen wir, dass ein Teiler gefunden wurde und dass x keine Primzahl ist.
Dadurch, dass wir in Zeile 4 && prim überprüfe, bricht die Schleife nach dem ersten gefundenen Teiler ab.
Aufgabe 2:
Erweitere das Programm so, dass der Benutzer eine Zahl eingibt und für jede Zahl bis hin zur eingegebenen wird ermittelt, ob es sich um eine Primzahl handelt.
Kommentiere den Code so, dass eine dritte Person sofort erkennt, was jener für eine Funktion hat.
Mit
Scanner sc = new Scanner(System.in);
int y = sc.nextInt();
können Zahleneingaben abgefragt werden, zusätzlich muss die Anweisung import java.util.Scanner; oberhalb der Klasse stehen:
package serlo;
import java.util.Scanner;
public class Testklasse {
In Java können im Quellcode Kommentare mit // platziert werden:
// Das ist ein Kommentar, der bei der Programmausführung ignoriert wird.
Mehrzeilige Kommentare können mit /* */ platziert werden.
Die Kommentierung in dieser Lösung ist selbstverständlich übertrieben, wichtig beim Kommentieren ist, dass man seinen eigenen Code auch nach einigen Monaten lesen kann.
Vor allem bei komplizierten Konstrukten ist das Kommentieren wichtig, später werden wir noch etwas genau darauf eingehen.
Der Code sollte recht verständlich sein, mit etwas Farbe lässt sich dies sogar noch steigern:
![Bild](https://assets.serlo.org/legacy/55008aaf359e3_32b4bb20480accacf20ecfafa0ec1c3372161670.png)
Bei IntelliJ lässt sich die Farbe mit File --> Settings und dann weiter unter Editor --> Colors & Fonts --> Java anpassen. Wer eine andere Version oder eine andere Entwicklungsumgebung verwendet, wird zur Not sicher im Internet fündig.
![Bild](https://assets.serlo.org/legacy/55008bde11028_d0e9ff10067e713d9e4fd4f57590542a5b3ba899.png)
Aufgabe 3:
Reduziere die Kommentare auf ein sinnvolles Maß und teste das Programm mit der Eingabe 100.000einmal mit (i <= x / 2) && prim
und einmal mit i < x
als Abbruchbedingung.
Versuch den Code weiter zu optimieren.
Tipp: Entwicklungsumgebungen haben in der Konsole für gewöhnlich einen roten, quadratischen Stopp-Knopf, um die Codeausführung vorzeitig abzubrechen.
Andere Schleifentypen:
Neben der for()
-Schleife gibt es auch noch die while()
- und die do-while()
-Schleife:
for(int i = 0; i < 10; i++) {
System.out.print(i);
}
System.out.println();
int i = 0;
while(i < 10) {
System.out.print(i);
i++;
}
System.out.println();
i = 0;
do {
System.out.print(i);
i++;
} while(i < 10);
Die do-while Schleife wird meist verwendet, wenn man den Schleifenkörper mindestens einmal ausführen möchte.
Aufgabe 4:
Lass diese Summe mit Hilfe einer Schleife berechnen und gib das Ergebnis aus.
Hier noch ein Link für diejenigen unter euch, denen das Summenzeichen unbekannt ist: Summenzeichen.
Aufgabe 5:
Schleifen eignen sich ideal dafür um mit Arrays zu arbeiten.
Erziele die folgende Bilschirmausgabe
Montag ist der 1. Tag der Woche.
[…]
Sonntag ist der 7. Tag der Woche.
Verwende zur Bildschirmausgabe nur die folgende Zeile: System.out.println(woche[i]);
.