29
Adress Wert ... public static void main(...){ } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das v zeigen soll. Adress e Wert ... 0470 ? ? ? ? ? ? Aus Platzgründen wird hier der Arbeitsspeicher auf 2 Tabellen verteilt, obwohl eigentlich der ganze Speicher durch eine Tabelle dargestellt wird! Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest. ? Wie viel Byte Speicher werden reserviert? (Antwort nächste

V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Embed Size (px)

Citation preview

Page 1: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

v

Adresse Wert

...

0120...

public static void main(...){ int[] v; v=new int[2];}

Was veranlasst diese Anweisung im Arbeitsspeicher ?

Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das v zeigen soll.

Adresse Wert

...

0470 ??????

Aus Platzgründen wird hier der Arbeitsspeicher auf 2 Tabellen verteilt, obwohl eigentlich der ganze Speicher durch eine Tabelle dargestellt wird!

null

Auf die (Anfangs)Adresse dieses Speicherbereichs hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest.

??

Wie viel Byte Speicher werden reserviert? (Antwort nächste Folie)

Page 2: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Beispiel

Page 3: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Dieses zweidimensionale Feld besteht aus 3 Zellen.

Jede dieser Zellen ist wiederum ein eindimensionales Feld, das

aus 4 Zellen besteht.

Page 4: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

int v[3][4];

Datentyp der Elemente: Jede Zelle hat den gleichen Datentyp

Variablenname des Feldes

Anzahl der Elemente in der 1. Dimension:Das Feld besteht aus 3 eindimensionalen Feldern.

Anzahl der Elemente in der 2. Dimension:Jede Zelle des eindimensionalen Feldes besteht

wiederum aus 4 Zellen.

Page 5: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

int v[3][4];

49 52 73 6943 27 42 6712 11 37 89

v[1][2] = 13;

Welche Stelle wird verändert ?

v[0]

v[1]

v[2]

besteht hier z.B. aus:

besteht hier z.B. aus:

besteht hier z.B. aus:

Page 6: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

int v[3][4];

49 52 73 6943 27 13 6712 11 37 89

v[1][2] = 13;

Wieviel Speicher benötigt die Variable v ?

= 3 · 4 · Speicherbedarf (int)

Page 7: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Initialisierung bei der Deklaration int v[3][4]={{12,11,37,89}, {43,27,42,67}, {49,52,73,69} };

49 52 73 6943 27 42 6712 11 37 89v[0]

v[1]

v[2]

Page 8: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Problem:In einem Formular (z.B. EK-Steuerformular) sollen alle (eindimensionalen) Felder ausgefüllt werden.Dies geschieht durch eine Eingabefunktion, von der man nicht weiß, ob sie die Eingabe mit '\0' beendet.

Page 9: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Alle Zellen aller Felder vorher mit '\0' auffüllen !

Frage:Was ist zu tun, dass zu 100 % garantiert ist, dass am Feldende aller Felder '\0'steht ?

Page 10: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Warum ist dies bei einem grossen Formular für den Programmierer sehr aufwendig ?

Weil man dazu bei z.B. 100 eindimensionalen Feldern 100 FOR-Anweisungen benötigt.

Page 11: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Wie kann man dies programmtechnisch einfacher machen ?

Mit einem zweidimensionalen Feld.

Page 12: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Aufgabe:

Schreiben Sie ein Programm, das alle Zellen in einem zweidimensionalen Feld mit '\0' belegt.

Page 13: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

const int zanz = 3;const int sanz = 40;

int main(){ int i, j; char formular [zanz][sanz];

for (i=0; i<zanz; i++){ for (j=0; j<sanz; j++){ formular[i][j] = '\0'; } }}

Page 14: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Aufgabe:

Genauso wie in einem vorigen Programm soll der Vorname und der Nachname einer Person in einem Programm eingegeben (mit scanf("%s" ,...)) und gespeichert werden.Daraus sollen dann die Initialen berechnet, gespeichert und ausgegeben werden. Dies soll durch ein zweidimensionales Feld realisiert werden.

Page 15: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

const int zanz = 3;const int sanz = 40;

int main(){ char formular [zanz][sanz];

Page 16: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

printf("Vorname eingeben\n");scanf("%s", &formular[0]);printf("Nachname eingeben\n");scanf("%s", &formular[1]);

// Initialen schreibenformular[2][0] = formular[0][0];formular[2][1] = formular[1][0];formular[2][2] = '\0';

Page 17: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

printf("Vorname = %s\n", formular[0]);printf("Nachname = %s\n", formular[1]);printf("Initialen = %s\n", formular[2]);return 0;} // Ende mainWar diese Anweisung in der letzten Folie unbedingt nötig ?

formular[2][2] = '\0';

Page 18: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

formular[2][2] = '\0'; printf("Initialen = %s\n", formular[2]);

Ja, wenn die Ausgabe wie hier mit der Formatierung %sgemacht wird !

Page 19: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

for(i=0;i<2;i++) printf("%c",formular[2][i]);

Bei Ausgabe mit printf("%c",... )ist dies dagegen nicht nötig.Wie gibt man aber die Zeichenkette damit aus ?

Der Programmierer muß aber die Länge (=2) der Initialen-Zeichenkette kennen

Page 20: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Aufgabe:

In einem Probeformular sollen folgende Voreinträge für Vornamen, Nachnamen und Initialen (zu Demo-Zwecken) gemacht werden:ErikaMustermannWie wird das programmtechnisch gemacht ?

Page 21: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

int main(){ char f[3][13]= {{'M','u','s','t','e','r','m','a','n','n'}, {'E','r','i','k','a'}};

// oder:char f[3][13]={"Mustermann","Erika"};

Die Zeichenketten "Mustermann" und "Erika" werden jeweils automatisch durch '\0' beendet. Da die Zelle f[2] hier nicht angegeben wurde, wird für sie automatisch der leere String "" (eine Zeichenkette die nur aus der '\0' besteht) angenommen.

M u s t e r m a n n \0 ? ?

E r i k a \0 ? ? ? ? ? ? ?

\0 ? ? ? ? ? ? ? ? ? ? ? ?

f[0]

f[1]

f[2]

Welche Werte haben die Zellen des Feldes f ?

Page 22: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

DreidimensionaleFelder

Page 23: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Merke:In der Programmiersprache C fasst man ein dreidimensionales Feld als eindimensionales Feld auf, dessen einzelne Zellen (Elemente) aus zweidimensionalen Feldern bestehen.

Page 24: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

int v[3][4][5];

49 52 73 6943 27 42 6712 11 37 89

v[0][2][3] = 18;

18

Welche Stelle wird verändert ?

Page 25: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

int v[3][4][5];v[0][2][3] = 18;

Wieviel Speicher benötigt die Variable v ?

= 3 · 4 · 5 · Speicherbedarf (int)

Page 26: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

VierdimensionalesFeld

Beispiel

Page 27: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Temperatur-Erfassung an einer Wetterstation über

folgende Zeitdauer:

- 10 Jahre- Monatlich- Täglich- Stündlich

Page 28: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

Wie kann man diese Daten "geschickt" anordnen, so

dass leicht darauf zugegriffen werden kann ?

Page 29: V AdresseWert... 0120... public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher

double v[10][12][31][24];

t = v[2][11][30][23];

Wieviel Grad hat es im 3. Jahr am Jahreswechsel (Sylvester)?Wie weist man dies der Variablen t zu ?

Wieviel Speicher benötigt die Variable v ?

= 10·12·31·24 · Speicherbedarf (double)