Top Banner
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
29

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

Apr 05, 2015

Download

Documents

Gomeric Gerstel
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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)