Programmiervorkurs WS 2014 Referenzdatentypen Termin 4.

Post on 06-Apr-2015

104 views 0 download

Transcript of Programmiervorkurs WS 2014 Referenzdatentypen Termin 4.

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!