pkj 2005/1 stefan dissmann zusammenfassung der vorwoche variable stehen für (einen) wert, der sich...
TRANSCRIPT
PKJ 2005/1Stefan Dissmann
Zusammenfassung der Vorwoche
Variable• stehen für (einen) Wert,• der sich im Programmablauf ändern kann.
Variablen besitzen einen Typ.
Konzepte für Variablen:• Vereinbarung,• Initialisierung,• Zuweisung,• Wertabfrage
PKJ 2005/2Stefan Dissmann
Zusammenfassung der Vorwoche
While-Schleife• wiederholt eine Anweisung oder• einen Block von Anweisungen• aufgrund einer Bedingung.
Syntax:while(Bedingung) while(Bedingung)
{ Anweisung; Anweisungen
}
Bedingungliefert bei ihrer Auswertung true oder false.
PKJ 2005/3Stefan Dissmann
Ein neues Problem:Bestimmung von Primzahlen
Aufgabe:Bestimme alle Primzahlen bis zu einer vorgegebenen Obergrenze, beispielsweise bis 64.
Erinnerung:Primzahlen sind natürliche Zahlen und immer nur durch 1 und sich selbst ganzzahlig teilbar.
Beispiele:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, …
Lösungsansatz:Primzahlbestimmung durch hinreichend viele Teilbarkeitsprüfungen.
PKJ 2005/4Stefan Dissmann
Primzahlbestimmung –Sieb des Eratosthenes
Vorgehen „Sieb des Eratosthenes“:(1) Schreibe alle natürlichen Zahlen (>1) bis zur Obergrenze als Liste auf.(2) Wähle die erste Zahl z aus.(3) Streiche alle (echten) Vielfachen von z aus der Liste aller Zahlen.(4) Falls das Ende der Liste noch nicht erreicht ist, wähle die nächste nicht gestrichene Zahl als z und beginne bei (3).(5) Sonst ist die Aufgabe erfüllt.
Beispiel:Schreibe Zahlen auf (1)
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Wähle z = 2 und streiche Vielfache ((2) und (3))
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 262 3 5 7 9 11 13 15 17 19 21 23 25
Wähle z = 3 und streiche Vielfache ((4) und (3))2 3 5 7 9 11 13 15 17 19 21 23 25
PKJ 2005/5Stefan Dissmann
Primzahlbestimmung –Sieb des Eratosthenes
Vorgehen „Sieb des Eratosthenes“:(1) Schreibe alle natürlichen Zahlen (>1) bis zur Obergrenze als Liste auf.(2) Wähle die erste Zahl z aus.(3) Streiche alle (echten) Vielfachen von z aus der Liste aller Zahlen.(4) Falls das Ende der Liste noch nicht erreicht ist, wähle die nächste nicht gestrichene Zahl als z und beginne bei (3).(5) Sonst ist die Aufgabe erfüllt.
Bestandsaufnahme:• Natürliche Zahlen auflisten (1): while-Schleife• Häufiges Wiederholen von (3) und (4): while-Schleife• Vielfache über Division ermitteln (3): wird schon gehen• Liste von Zahlen aufbewahren: ? (einfache Variable ungünstig)
PKJ 2005/6Stefan Dissmann
Liste der natürlichen Zahlen (>1)
public class listeVonZahlen {
public static void main(String[] args) {
int obergrenze = 20;
int zähler = 2;
while (zähler <= obergrenze) {
System.out.print(zähler + " ");
zähler = zähler + 1;
}
}
}
Ausgabe:2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
PKJ 2005/7Stefan Dissmann
Aufbewahren vieler Zahlen
Benötigt wird:Eine Variable, die für viele Werte des gleichen Typs
steht.
Passendes Konstrukt in JAVA:Variable, die Feld (Array) von Werten speichert
Nun für Felder betrachten:• Vereinbarung,• Initialisierung,• Zuweisung,• Wertabfrage
PKJ 2005/8Stefan Dissmann
Vereinbarung von Feldern
Erinnerung:int i; vereinbart einen Bezeichner i,
der für genau eine Zahl stehen kann.
Felder:int f[]; vereinbart einen Bezeichner f,
der eine Anzahl von Zahlen beinhaltet. Neue Sonderzeichen: [] Die Anzahl gehört nicht zur
Vereinbarung!
Auch möglich:
int[] feld1, feld2; entspricht: int feld1[], feld2[];
int feld1[], zahl, feld2[];
PKJ 2005/9Stefan Dissmann
Initialisierung von Feldern
Initialisierung eines Feldes umfasst:• Festlegen der Anzahl der Elemente (Größe des Feldes)• Festlegen der Werte für die Elemente
Beide Varianten sind möglich:• int[] f = new int[5];
Initialisieriert die Größe des Feldes auf 5 Elemente.Neues Schlüsselwort: newNeue Verwendung von […]
• int[] g = {17,2,4,122,0,-3}Initialisieriert die Größe des Feldes auf 6 Elemente.Belegt diese 6 Elemente mit den vorgegebenen Zahlen.Neue Verwendung von { … }
PKJ 2005/10Stefan Dissmann
Zuweisung an felder
Zuweisung ist möglich für
• Größe des Feldesint[] f;f = new int[7]; wie bei Initialisierung
• Einzelne Elemente des Feldesf[0] = 22; erstes Element erhält
den Wert 22f[1] = -3; zweites Element erhält
den Wert -3int elem = 4;f[elem] = 0; viertes Element erhält
den Wert 0f[elem+1] = 34; fünftes Element erhält
den Wert 34
PKJ 2005/11Stefan Dissmann
Zuweisung an Felder
Anmerkungen:• Die Nummer eines Elements heißt Index.
f[1] bezeichnet das zweite Element von f mit dem Index 1.• Der Index muss immer zwischen 0 und der Größe-1 des Feldes liegen.
int[] g={3}; g[1]=5; führt zu Fehler!• Neue Verwendung von […]: ermöglicht die Zuweisung an Elemente.
Vorsicht: • Erneutes Zuweisen der Größe führt zu Verlust der alten Elemente.• Zuweisung von ganzen Feldern führt zu (noch) unerklärbaren
Seiteneffekten.int[] f, g={3}; f=g; Nicht verwenden!
Statt dessen elementweises Kopieren durch f[0]=g[0];
PKJ 2005/12Stefan Dissmann
Wertabfrage bei Feldern
Abfrage ist möglich für• Größe des Feldes
über length-Abfrage:int[] f = {5,6,7,8};System.out.println(f.length); druckt 4
aus!
• Werte der einzelnen Elemente des Feldesint[] f = {5,6,7,8};System.out.println(f[1]); druckt 6 aus!System.out.println(f[1]+f[3]); druckt 14 aus!
Noch eine Verwendung von […]: ermöglicht die Abfrage der Elemente.
PKJ 2005/13Stefan Dissmann
Beispiele mit Feldern
Aufgabe war:Lege Liste mit den natürlichen Zahlen>1 bis zu einer vorgegebenen Obergrenze an!
Erste Lösung mit Initialisierung eines int-Feldes:int[] f={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
•Viel Schreibarbeit bei großer Grenze•Wenig flexibel, wenn Grenze geändert wird
•unbrauchbar
PKJ 2005/14Stefan Dissmann
Beispiele mit Feldern
Zweite Lösung mit Zuweisung in einer Schleife:int obergrenze = 64;int[] f = new int[obergrenze-1];int zähler = 0;while (zähler < f.length) {
f[zähler] = zähler+2;
zähler = zähler+1;
}
Und die zugehörige Testausgabe:zähler = ;while (zähler < f.length) {
System.out.print(f[zähler] + " ");
zähler = zähler+1;
}
PKJ 2005/15Stefan Dissmann
Sieb des Eratosthenes
Vorstufe zur Primzahlenbestimmung:int obergrenze = 64;int[] zahlen = new int[obergrenze-1];int zähler = 0;while (zähler < zahlen.length) {
zahlen[zähler] = zähler+2;
zähler = zähler+1;
}int testwert = zahlen[0]; // das ist die 2!zähler = 1;while (zähler < zahlen.length) {
// zahlen[zähler] teilbar durch testwert?
zähler = zähler+1;
}
Unzureichend: - nur für Vielfache von 2- Kommentar muss in JAVA ausformuliert werden
PKJ 2005/16Stefan Dissmann
Zusammenfassung
•Feld (auch Array, Feld- oder Array-Variable)• steht für eine nummerierte Folge von Werten (Elemente),• der sich im Programmablauf ändern können.
•Das Feld besitzen einen Typ, der für die einzelnen Elemente gilt.
•Der Zugang zu Elemente erfolgt über ihren Index.
•Konzepte für Felder:• Vereinbarung,• Initialisierung von Größe und Werten,• Zuweisung von Größe und Werten,• Abfrage von Größe und Werten