Post on 06-Apr-2015
Programmiervorkurs WS 2014
ReferenzdatentypenTermin 4
Felder• Ein umstaendlicher Kalenderpublic class Kalender {
public static void main(String[] args) {
//Eingabe:
Scanner sc = new Scanner(System.in);
System.out.println("Ihr Termin am Mo um 0 Uhr:");
String mo00uhr = sc.next();
System.out.println("Ihr Termin am Mo um 1 Uhr:");
String mo01uhr = sc.next();
System.out.println("Ihr Termin am Mo um 2 Uhr:");
String mo02uhr = sc.next(); // usw.
//Ausgabe:
System.out.println("Mo 0 Uhr: " + mo00uhr);
System.out.println("Mo 1 Uhr: " + mo01uhr);
System.out.println("Mo 2 Uhr: " + mo02uhr); // usw.
}
}
Felder
• Ein Kalender mit einem Feldpublic class Kalender {
public static void main(String[] args) {
//Eingabe:
Scanner sc = new Scanner(System.in);
String[] mo = new String[24];
for (int i = 0; i < mo.length; i++) {
System.out.println("Ihr Termin am Mo um " + i + " Uhr:");
mo[i] = sc.next();
}
//Ausgabe:
for (int i = 0; i < mo.length; i++) {
System.out.println("Mo " + i + " Uhr: " + mo[i]);
}
}
}
Felder
• Ein Kalender mit einem Feld
Ein Feld mit Platz für 24 Zeichenketten:Vorlesung
Vorlesung
Seminar
Seminar
Zahnarzt
mo[0]mo[1]mo[2]
mo[23]
Typ der Daten, die im Feld gespeichert werden
Kennzeichen für Feld
Bezeichner des Feldes
Größe des Feldes
legt neues Feld im Speicher an
String[] mo = new String[24];
Felder
• Ein Kalender mit einem Feldpublic class Kalender {
public static void main(String[] args) {
//Eingabe:
Scanner sc = new Scanner(System.in);
String[] mo = new String[24];
for (int i = 0; i < mo.length; i++) {
System.out.println("Ihr Termin am Mo um " + i + " Uhr:");
mo[i] = sc.next();
}
//Ausgabe:
for (int i = 0; i < mo.length; i++) {
System.out.println("Mo " + i + " Uhr: " + mo[i]);
}
}
}
Felder
• Ein Kalender mit einem Feld
mo[i] = sc.next();
System.out.println("Mo " + i + " Uhr: " + mo[i]);
Felder
• Ein Kalender mit einem Feld
mo[i] = sc.next();
System.out.println("Mo " + i + " Uhr: " + mo[i]);
Zugriff auf Zelle mit Index i des Feldes mo...
...zum Schreiben:
...und zum Lesen:
Felder
• Ein Kalender mit einem Feld
mo[i] = sc.next();
System.out.println("Mo " + i + " Uhr: " + mo[i]);
Zugriff auf Zelle mit Index i des Feldes mo...
...zum Schreiben:
...und zum Lesen:
Achtung: die erste Zelle hat Index 0.
Felder
• Ein Kalender mit einem Feld
for (int i = 0; i < mo.length; i++) {
System.out.println("Ihr Termin am Mo um " + i + " Uhr:");
mo[i] = sc.next();
}
//Ausgabe:
for (int i = 0; i < mo.length; i++) {
System.out.println("Mo " + i + " Uhr: " + mo[i]);
}
Iteration über Zellen des Feldes mo:Anzahl der Zellen
Felder
• Vektorrechnungpublic class Vektorsumme {
public static void main(String[] args) { double[] a = new double[3]; a[0] = 1.0; a[1] = 2.0; a[2] = 1.5; double[] b = new double[3]; b[0] = 3.5; b[1] = 1.0; b[2] = 2.5; double[] c = new double[3]; //Vektorsumme: for (int i = 0; i < c.length; i++) c[i] = a[i] + b[i]; //Ausgabe: for (int i = 0; i < c.length; i++) System.out.println(c[i]);
}
}
Felder
• Vektorrechnungpublic class Vektorsumme {
public static void main(String[] args) { double[] a = new double[3]; a[0] = 1.0; a[1] = 2.0; a[2] = 1.5; double[] b = new double[3]; b[0] = 3.5; b[1] = 1.0; b[2] = 2.5; double[] c = new double[3]; //Vektorsumme: for (int i = 0; i < c.length; i++) c[i] = a[i] + b[i]; //Ausgabe: for (int i = 0; i < c.length; i++) System.out.println(c[i]);
}
}
Felder lassen sich für alle Datentypen erzeugen!
Felder
• Vektorrechnungpublic class Vektorsumme {
public static void main(String[] args) { double[] a = new double[3]; a[0] = 1.0; a[1] = 2.0; a[2] = 1.5; double[] b = new double[3]; b[0] = 3.5; b[1] = 1.0; b[2] = 2.5; double[] c = new double[3]; //Vektorsumme: for (int i = 0; i < c.length; i++) c[i] = a[i] + b[i]; //Ausgabe: for (int i = 0; i < c.length; i++) System.out.println(c[i]);
}
}
Felder
• Vektorrechnungpublic class Vektorsumme {
public static void main(String[] args) { double[] a = {1.0, 2.0, 1.5};
double[] b = {3.5, 1.0, 2.5};
double[] c = new double[3]; //Vektorsumme: for (int i = 0; i < c.length; i++) c[i] = a[i] + b[i]; //Ausgabe: for (int i = 0; i < c.length; i++) System.out.println(c[i]);
}
}
kompaktere Initialisierung
Felder
• Referenzenpublic class Doppel {
public static void main(String[] args) { int i = 3; //eine Ganzzahl i mit Wert 3 int j = i; //eine Ganzzahl j; j wird Wert von i zugewiesen j = 2 * j; //Wert von j wird verdoppelt
//Ausgabe: System.out.println("Der Wert von i ist: " + i); System.out.println("Der Wert von j ist: " + j);
}
} Ausgabe?
Felder
• Referenzenpublic class Doppel {
public static void main(String[] args) { int i = 3; //eine Ganzzahl i mit Wert 3 int j = i; //eine Ganzzahl j; j wird Wert von i zugewiesen j = 2 * j; //Wert von j wird verdoppelt
//Ausgabe: System.out.println("Der Wert von i ist: " + i); System.out.println("Der Wert von j ist: " + j);
}
}
Der Wert von i ist: 3Der Wert von j ist: 6
Ausgabe:
i behält also seinen ursprünglichen Wert.
Felder
• Referenzenpublic class Doppel {
public static void main(String[] args) { int[] i = {3}; //ein int-Feld i mit einer Zelle; i[0] = 3 int[] j = i; //ein int-Feld j, dem i zugewiesen wird j[0] = 2 * j[0]; //Wert von j[0] wird verdoppelt
//Ausgabe: System.out.println("Der Wert von i[0] ist: " + i[0]); System.out.println("Der Wert von j[0] ist: " + j[0]);
}
} Ausgabe?
Felder
• Referenzenpublic class Doppel {
public static void main(String[] args) { int[] i = {3}; //ein int-Feld i mit einer Zelle; i[0] = 3 int[] j = i; //ein int-Feld j, dem i zugewiesen wird j[0] = 2 * j[0]; //Wert von j[0] wird verdoppelt
//Ausgabe: System.out.println("Der Wert von i[0] ist: " + i[0]); System.out.println("Der Wert von j[0] ist: " + j[0]);
}
} Ausgabe:Der Wert von i[0] ist: 6Der Wert von j[0] ist: 6
i[0] hat sich verändert! Warum?
Felder
• Referenzen
int[] i = {3}; int[] j = i; j[0] = 2 * j[0];
3
zeigt aufi ist eine Referenzvariable:
i
Felder
• Referenzen
int[] i = {3}; int[] j = i; j[0] = 2 * j[0];
3
zeigt auf
i
j
Felder
• Referenzen
int[] i = {3}; int[] j = i; j[0] = 2 * j[0];
3
zeigt auf
j zeigt auf dasselbe Feld wie i.Es wird keine Kopie des Feldes erzeugt!
i
j
Felder
• Referenzen
int[] i = {3}; int[] j = i; j[0] = 2 * j[0];
6
zeigt auf
j[0] wird verdoppelt.Damit wird auch i[0] verdoppelt.Also: Der Wert von i[0] ist: 6
Der Wert von j[0] ist: 6
i
j
Felder
• Referenzenpublic class Doppel {
public static void main(String[] args) { int[] i = {3}; //ein int-Feld i mit einer Zelle; i[0] = 3 int[] j = i; //ein int-Feld j, dem i zugewiesen wird j[0] = 2 * j[0]; //Wert von j[0] wird verdoppelt
//Ausgabe: System.out.println(i); System.out.println(j);
}
} Ausgabe?
Felder
• Referenzenpublic class Doppel {
public static void main(String[] args) { int[] i = {3}; //ein int-Feld i mit einer Zelle; i[0] = 3 int[] j = i; //ein int-Feld j, dem i zugewiesen wird j[0] = 2 * j[0]; //Wert von j[0] wird verdoppelt
//Ausgabe: System.out.println(i); System.out.println(j);
}
} Ausgabe:
[I@1e5e2c3[I@1e5e2c3
gibt Adresse im Speicher an
Mehrdimensionale Felder
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
• Die Einmaleins-Matrix:
Mehrdimensionale Felder
public class Einmaleins {
public static void main(String[] args) {
//Berechnung der Einmaleins-Matrix:
int[][] p = new int[10][10]; // Feld mit Zahlenprodukten
for (int z = 0; z < 10; z++) { // Zeilen
for (int s = 0; s < 10; s++) { // Spalten
p[z][s] = (z + 1) * (s + 1);
}
}
//Ausgabe eines Produktes (ohne Neuberechnung!)
int x = 5;
int y = 8;
System.out.println(x + " * " + y + " = " + p[x - 1][y - 1]);
}
}
Mehrdimensionale Felder
int[][] p = new int[10][10];
erste Dimension (Anzahl Zeilen)
zweite Dimension (Anzahl Spalten)
ein Feld mit zwei Dimensionen
Mehrdimensionale Felder
public class Einmaleins {
public static void main(String[] args) {
//Berechnung der Einmaleins-Matrix:
int[][] p = new int[10][10]; // Feld mit Zahlenprodukten
for (int z = 0; z < 10; z++) { // Zeilen
for (int s = 0; s < 10; s++) { // Spalten
p[z][s] = (z + 1) * (s + 1);
}
}
//Ausgabe eines Produktes (ohne Neuberechnung!)
int x = 5;
int y = 8;
System.out.println(x + " * " + y + " = " + p[x - 1][y - 1]);
}
}
Mehrdimensionale Felder
public class Einmaleins {
public static void main(String[] args) {
int[][] p = new int[10][10];
for (int z = 0; z < 10; z++) {
for (int s = 0; s < 10; s++) {
p[z][s] = (z + 1) * (s + 1);
}
}
int x = 5;
int y = 8;
System.out.println(x + " * " + y + " = " + p[x - 1][y - 1]);
}
}
Achtung: Umrechnung erforderlich! Einmaleins beginnt mit 1 Feldindex beginnt mit 0
Mehrdimensionale Felder
public class Einmaleins {
public static void main(String[] args) {
int[][] p = new int[10][10];
for (int z = 0; z < 10; z++) {
for (int s = 0; s < 10; s++) {
p[z][s] = (z + 1) * (s + 1);
}
}
int x = 5;
int y = 8;
System.out.println(x + " * " + y + " = " + p[x - 1][y - 1]);
}
}
Achtung: Umrechnung erforderlich! Einmaleins beginnt mit 1 Feldindex beginnt mit 0
Mehrdimensionale Felderpublic class Feld {
public static void main(String[] args) {
int[][] x = new int[3][];
x[0] = new int[2];
x[1] = new int[1];
x[2] = new int[1];
x[0][0] = x[1][0] = 2;
x[2][0] = x[0][1] = 1;
//Ausgabe:
for (int z = 0; z < x.length; z++) {
for (int s = 0; s < x[z].length; s++) {
System.out.print(x[z][s] + "\t");
}
System.out.print("\n");
}
}
}
Mehrdimensionale Felderpublic class Feld {
public static void main(String[] args) {
int[][] x = new int[3][];
x[0] = new int[2];
x[1] = new int[1];
x[2] = new int[1];
x[0][0] = x[1][0] = 2;
x[2][0] = x[0][1] = 1;
zweite Dimension noch offen
x x[0]
x[1]x[2]
Mehrdimensionale Felderpublic class Feld {
public static void main(String[] args) {
int[][] x = new int[3][];
x[0] = new int[2];
x[1] = new int[1];
x[2] = new int[1];
x[0][0] = x[1][0] = 2;
x[2][0] = x[0][1] = 1;
jede Zelle ist selbst ein 1-D-Feld(Felder dürfen verschiedene Längen haben)
x x[0]
x[1]x[2]
Mehrdimensionale Felderpublic class Feld {
public static void main(String[] args) {
int[][] x = new int[3][];
x[0] = new int[2];
x[1] = new int[1];
x[2] = new int[1];
x[0][0] = x[1][0] = 2;
x[2][0] = x[0][1] = 1;
x x[0]
x[1]x[2]
2 1
2
1
Klassen
Eine Klasse definiert gemeinsame Eigenschaften einerMenge von Objekten. Jedes Objekt ist Instanz einer Klasse.
Klasse
Objekt
Klassen
Eine Klasse definiert gemeinsame Eigenschaften einerMenge von Objekten. Jedes Objekt ist Instanz einer Klasse.
Attribute sind Datenelemente, • die in jedem Objekt einer Klasse gleichermaßen enthalten sind
• und von jedem Objekt mit individuellen Werten repräsentiert werden können.
Klassen
Eine Klasse definiert gemeinsame Eigenschaften einerMenge von Objekten. Jedes Objekt ist Instanz einer Klasse.
public class Adresse { public String str; //der Strassenname public int plz; //die Postleitzahl public String ort; //der Ortsname}
Attribute sind Datenelemente, • die in jedem Objekt einer Klasse gleichermaßen enthalten sind
• und von jedem Objekt mit individuellen Werten repräsentiert werden können.
Beispiel:
Klassen
public class Adresse { public String str; public int plz; public String ort;}
Beispiel:Bezeichner der Klasse(Konvention: Beginn mit Großbuchstabe)
Klassen
public class Adresse { public String str; public int plz; public String ort;}
Beispiel:
Attribute
Datentyp Bezeichner
Klassen
public class Adresse { public String str; public int plz; public String ort;}
Beispiel:
muss in Datei Adresse.java gespeichert werden!
Klassen
public class Adresse { public String str; public int plz; public String ort;}
public class Adressbuch { public static void main(String[] args) { Adresse a = new Adresse(); a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; System.out.print(a.str + ", " + a.plz + " " + a.ort); }}
Klassen
public class Adresse { public String str; public int plz; public String ort;}
public class Adressbuch { public static void main(String[] args) { //Instantiierung: Adresse a = new Adresse(); a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; System.out.print(a.str + ", " + a.plz + " " + a.ort); }}
Klassen
public class Adresse { public String str; public int plz; public String ort;}
public class Adressbuch { public static void main(String[] args) { //Instantiierung: Adresse a = new Adresse(); //Setze Attributwerte: a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; System.out.print(a.str + ", " + a.plz + " " + a.ort); }}
Klassen
public class Adresse { public String str; public int plz; public String ort;}
public class Adressbuch { public static void main(String[] args) { //Instantiierung: Adresse a = new Adresse(); //Setze Attributwerte: a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; //Ausgabe System.out.print(a.str + ", " + a.plz + " " + a.ort); }}
Klassen public class Adressbuch { public static void main(String[] args) { Adresse a = new Adresse(); a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; Adresse b = a; b.ort = "Nuernberg";
System.out.println(a.str + ", " + a.plz + " " + a.ort); System.out.println(b.str + ", " + b.plz + " " + b.ort); } }
Klassen Adresse a = new Adresse(); a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; Adresse b = a; b.ort = "Nuernberg";
System.out.println(a.str + ", " + a.plz + " " + a.ort); System.out.println(b.str + ", " + b.plz + " " + b.ort);
a str
plz
ort
Klassenschablone legt neue Karteikarte an:
Klassen Adresse a = new Adresse(); a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; Adresse b = a; b.ort = "Nuernberg";
System.out.println(a.str + ", " + a.plz + " " + a.ort); System.out.println(b.str + ", " + b.plz + " " + b.ort);
a str
plz
ort
Am Hubland
97074
Wuerzburg
Karteikarte wird ausgefuellt:
Klassen
Adresse a = new Adresse(); a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; Adresse b = a; b.ort = "Nuernberg";
System.out.println(a.str + ", " + a.plz + " " + a.ort); System.out.println(b.str + ", " + b.plz + " " + b.ort);
a str
plz
ortb
Am Hubland
97074
Wuerzburg
b zeigt auf dieselbe Instanz wie a:
Klassen
Adresse a = new Adresse(); a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; Adresse b = a; b.ort = "Nuernberg";
System.out.println(a.str + ", " + a.plz + " " + a.ort); System.out.println(b.str + ", " + b.plz + " " + b.ort);
a str
plz
ortb
Am Hubland
97074
Nuernberg
aktualisiere b.ort und damit auch a.ort
Klassen
Adresse a = new Adresse(); a.str = "Am Hubland"; a.plz = 97074; a.ort = "Wuerzburg"; Adresse b = a; b.ort = "Nuernberg"; System.out.println(a.str + ", " + a.plz + " " + a.ort); System.out.println(b.str + ", " + b.plz + " " + b.ort);
Ausgabe:
a str
plz
ortb
Am Hubland
97074
Nuernberg
Am Hubland, 97074 NuernbergAm Hubland, 97074 Nuernberg
Zusammenfassung
Felder und Klassen sind Referenzdatentypen!
Aufgabe
• Erstellt ein Programm, das– zunächst ein Feld vom Typ int mit n Feldern zufällig
mit Zahlen zwischen 0 und 100 füllt(verwendet zum Erzeugen der Zahlen folgenden Ausdruck: (int)(Math.random() * 101))
– dieses Feld anschließend sortiert und ausgibt (Felder können in Java automatisch mithilfe der Methode Arrays.sort(int[] a) sortiert werden.) schließlich folgende Dinge bestimmt und ausgibt:
• den Mittelwert, den Median, das Minimum und das Maximum der Werte im Feld
• alle Werte die mindestens doppelt vorkommen• die am häufigsten vorkommende Zahl
Aufgabe
• Erstellt eine Klasse AutoQuartettKarte, die die Attribute Name, Länge, Hubraum, Leistung und Höchstgeschwindigkeit besitzt.
• Erzeugt 2 Instanzen der Klasse mit beliebigen Werten und vergleicht diese in Bezug auf ein Attribut eurer Wahl.
• Gebt den Namen der besseren Karte aus.
Aufgabe
• ZUSATZ: Erstellt ein Programm, das alle Primzahlen im Intervall 1 bis 100 ermittelt und ausgibt.Das Programm soll das Sieb des Eratosthenes implementieren: – In einem Feld mit 100 Zellen entspricht jede Zelle einer
Zahl.– Es werden alle Zellen markiert, deren Zahl ein
Vielfaches von 2, 3, 4,… ist. – Die Zahlen der nicht markierten Zellen werden
ausgeben. Hinweis: Versucht euch zunächst auf einem Blatt Papier manuell an dem Algorithmus!