ARRAY
oder
FELD
oder
VEKTOR
Aufgabe:
Drei über Tastatur
eingegebene ganzzahlige
Zahlen sollen in
umgekehrter Reihenfolge der
Eingabe wieder auf dem
Bildschirm ausgegeben
werden.
int main(){
int a;
int b;
int c;
//...
printf("1.Zahl eingeben\n");
scanf("%d", &a);
fflush(stdin);
printf("2.Zahl eingeben\n");
scanf("%d", &b);
fflush(stdin);
printf("3.Zahl eingeben\n");
scanf("%d", &c);
fflush(stdin);
printf("umgekehrt: %d %d %d",
c, b, a);
}
return 0;
Was ist der Nachteil ?
Schreibaufwendige
Lösung !
Warum nicht mit Schleife
lösbar ?
keine "nächste" Variable:
a  b  c
Man benötigt:
Eine Variable, die aus
mehreren Zellen
(Elementen) besteht und
deshalb gleichzeitig mehrere
Werte speichern kann.
Dies ist eine indizierte
Variable, ein sogenanntes
Feld (Array, Vektor).
13
17
19
23
27
0
1
2
3
4
Der Index der ersten Zelle (Element) ist 0
Die Feldlänge ist 5
C-Syntax
int v[3];
Diese Feldlänge ist eine Konstante und muß
dem Compiler bei der Übersetzung des
Programms bekannt sein.
Sie kann NICHT während des
Programmlaufs (z.B. durch den Anwender
über Tastatur) verändert werden !!!
Länge des Feldes: KONSTANTE
Variablenname
Datentyp: Jede Zelle hat den gleichen Datentyp
!!!
int main(){
v
int v[3],x,y; ?
v[2]=19;
v[0]=17;
v[1]=13;
x=2;
v[x]=23;
y=v[1];
v[x]=y;
?
17
17
17
17
17
17
?
?
?
13
13
13
13
13
?
19
19
19
19
23
23
13
x
y
?
?
?
?
2
2
2
2
?
?
?
?
?
?
13
13
int main(){
int len;
scanf("%d",&len);
fflush(stdin);
int v[len];
v[len-2]=123;
Warum ist dieses
return 0;
Programm syntaktisch
falsch ? (Compiler
}
meldet einen Fehler)
Weil Feldlänge len
eine Konstante sein
muß !!
int main(){
int v[3];
v[3]=56;
Warum macht diese
Anweisung
Probleme ?
Weil auf nicht reservierten Speicher
zugegriffen wird, konkret: auf die 4.
Zelle des Feldes !
Dies kann schwer
erkennbare Fehler nach sich
ziehen. Siehe später !
int main(){
int v[3];
size_t erg;
Liefert Speicherplatzbedarf
einer Variable.
erg = sizeof(v);
// Welchen Wert hat erg ?
// 12 = 3*Speicher(int)
return 0;
}
Initialisierung bei der
Deklaration
int zahlen[4]={23,7};
23
7
?
?
double d[4]={1.4,7.3,2,4};
1.4 7.3 2.0 4.0
int main(){
int v[2] = {10,20};
int w[3] Weil
= {50,60,70};
auf nicht reservierten Speicher
zugegriffen wird, konkret: auf die 5.
int r;
Zelle des Feldes w !
r=w[4];
printf("r=%d\n",r);
return 0;
Warum macht diese
}
Anweisung
Probleme ?
// mit VC++ 6.0 kompiliert.
// Ausgabe auf Bildschirm:
// 20
int main(){
int v[2] = {10,20};
int w[3] = {50,60,70};
int r;
r=w[4];
printf("r=%d\n",r);
return 0;
}
Der Teil des Speichers, in dem
diese Variablen gespeichert
werden, nennt man den
STACK.
Er „wächst“ in Richtung der
kleineren Adressen. Welche
Variablen werden also hier ab
dieser Adresse hintereinander
abgespeichert?
Arbeitsspeicher Ausschnitt
Adresse
...
r 0096
w[0] 0100
w[1] 0104
w[2] 0108
v[0] 0112
v[1] 0116
...
Inhalt
?
50
60
70
10
20
int main(){
int v[2] = {10,20};
int w[3] = {50,60,70};
int r;
r=w[4];
printf("r=%d\n",r);
return 0;
}
w[4] ist die 5. Zelle relativ zum
Feldbeginn bei w[0]. Deshalb ist
die nichtreservierte Zelle w[4]
gleich der Zelle v[1].
Was wird also in r gespeichert
und auf dem Bildschirm
ausgegeben?
Arbeitsspeicher Ausschnitt
Adresse
...
r 0096
w[0] 0100
w[1] 0104
w[2] 0108
v[0] 0112
v[1] 0116
...
Inhalt
?
50
60
70
10
20
int main(){
int v[2] = {10,20};
int w[3] = {50,60,70};
int r;
r=w[4];
printf("r=%d\n",r);
return 0;
}
w[4] ist die 5. Zelle relativ zum
Feldbeginn bei w[0]. Deshalb ist
die nichtreservierte Zelle w[4]
gleich der Zelle v[1].
Was wird also in r gespeichert
und auf dem Bildschirm
ausgegeben?
Arbeitsspeicher Ausschnitt
Adresse
...
r 0096
w[0] 0100
w[1] 0104
w[2] 0108
v[0] 0112
v[1] 0116
...
Inhalt
20
50
60
70
10
20
Aufgabe:
Drei über Tastatur
eingegebene Zahlen sollen
in umgekehrter Reihenfolge
der Eingabe wieder auf dem
Bildschirm ausgegeben
werden. EVA beachten !!
int main(){
int i; // Zähler
int v[3]; // Feld
i=0;
while(i<3){
printf("Zahl eingeben:");
scanf("%d", &v[i]);
fflush(stdin);
i=i+1;
}
printf("Zahlenausgaben\n");
i=2;
while(i>=0){
printf("%d\n", v[i]);
i=i-1;
}
return 0;
}
Aufgabe:
Verändern Sie das letzte
Programm so, daß 10 über
Tastatur eingegebene Zahlen
in umgekehrter Reihenfolge
der Eingabe wieder auf dem
Bildschirm ausgegeben
werden. EVA beachten !!
hier muß eine Änderung
int main(){
gemacht werden
int i;
int v[10];
i=0;
while(i<10){
printf("Zahl eingeben:");
scanf("%d", &v[i]);
fflush(stdin);
i=i+1;
}
hier muß eine Änderung
gemacht werden
hier muß eine Änderung
gemacht werden
printf("Zahlenausgaben\n");
i=9;
while(i>=0){
printf("%d\n", v[i]);
i=i-1;
Welchen Nachteil haben diese
}
vielen Änderungen für den
Programmierer ?
return 0;
}
Der Programmierer kann
eine zu tätigende Änderung
einfach übersehen.
Deswegen ist es besser mit
sogenannten Konstanten zu
arbeiten.
(Die Feldlänge muß eine
Konstante sein !)
int main(){ Länge des Feldes v ist
int v[10]; eine Konstante !
Kann während des
...
Programmlaufs
NICHT mehr
verändert werden.
Elegantere
Möglichkeit:
int main(){
Empfehlung:
const int LEN = 10;
Konstanten mit
int v[LEN];
Großbuchstaben schreiben !
LEN=LEN+1; // Fehler
Eine Konstante kann man
als eine schreibgeschützte
Variable auffassen.
(Deswegen ist sie im
eigentlichen Sinne des
Worts keine Variable mehr).
Aufgabe:
Benutzen Sie beim letzten
Programm statt der
Feldlänge 10 eine Konstante.
int main(){
const int LEN = 10;
int i;
int v[LEN];
i=0;
while(i<LEN){
printf("Zahl eingeben:");
scanf("%d", &v[i]);
falls die Feldlänge z.B. auf 100
fflush(stdin);
verändert werden soll, muß der
i=i+1;
Programmierer nur noch die 10
durch die 100 ersetzen (eine
}
einzige Änderung machen).
printf("Zahlenausgaben\n");
i= LEN-1;
while(i>=0){
printf("%d\n", v[i]);
i=i-1;
}
return 0;
}
Aufgabe:
Verändern Sie das CProgramm so, dass der
Anwender die Anzahl der
einzugebenden Zahlen
festlegen kann.
int main(){
int i;
int v[100];
int anz; // Anzahl
do{
printf("Anz. eing.\n");
scanf("%d", &anz);
fflush(stdin);
}
while((anz>100)||(anz<=0));
printf("Zahleneingaben\n");
i=0;
while(i<=anz-1){
printf("Zahleingabe:\n");
scanf("%d", &v[i]);
fflush(stdin);
i=i+1;
}
printf("Zahlenausgabe\n");
i=anz-1;
while(i>=0){
printf("%d\n", v[i]);
i=i-1;
}
return 0;
}
Besser mit einer Konstante...
int main(){
const int LEN = 100;
int i;
int v[LEN];
int anz; // Anzahl
do{
printf("Anz. eing.\n");
scanf("%d", &anz);
fflush(stdin);
}
while((anz>LEN)||(anz<=0));
printf("Zahleneingaben\n");
i=0;
while(i<=anz-1){
printf("Zahleingabe:\n");
scanf("%d", &v[i]);
fflush(stdin);
i=i+1;
}
printf("Zahlenausgabe\n");
i=anz-1;
while(i>=0){
printf("%d\n", v[i]);
i=i-1;
}
return 0;
}
Aufgabe:
Bestimmen Sie das
Maximum und das Minimum
der in der vorigen Aufgabe
eingegebenen Zahlen.
EVA beachten !!
int main(){
const int LEN = 100;
int i;
int anz;
int v[LEN];
int max;
int min;
// Programm von vorher ...
}
i = 0;
max = v[0];
min = v[0];
do{
if(v[i]>max)
max = v[i];
if(v[i] < min)
min = v[i];
i=i+1;
} while(i<anz);
printf("Maxim. = %d\n", max);
printf("Minim. = %d\n", min);
return 0;
Strings (Zeichenketten)
Strings sind Felder mit dem
Datentyp char.
Beispiel:
'M' 'E' 'S' 'K' ...
Wie wird dies in C++
realisiert ?
Gibt Zeichenkette aus
int main(){
char v[100];
v[0]='M';
Woher kennt printf
das Ende des Strings ?
v[1]='E';
v[2]='S';
v[3]='K';
v[4]='\0';
printf("%s",v);
return 0;
}
// Was wird ausgegeben ?
Zeichenkette beenden mit:
ASCII-Zeichen mit Wert 0
Dieses Zeichen bezeichnet
man als Zeichen '\0'
im Gegensatz zum Zeichen '0'
mit dem ASCII-Wert 48.
Ausgabe eines string:
printf mit dem
Formatierungszeichen %s
printf gibt so lange Zeichen
aus, bis es an das Zeichen
\0 kommt !
Eingabe eines string:
scanf mit dem
Formatierungszeichen %s
Eingabe wird durch
ENTER beendet und
eingelesene Zeichenkette
automatisch mit \0
abgeschlossen (beendet)
Bemerkung:
Das Drücken der ENTERTaste zum Beenden der
Eingabe eines Zeichens
oder einer Zeichenkette
veranlasst, dass noch der
ASCII-Wert 10 in den
Tastaturpuffer geschrieben
wird.
Dieser wird durch
scanf("%c",...);
oder
scanf("%s",...);
nicht automatisch aus dem
Tastaturpuffer entfernt.
Siehe folgendes Beispiel:
int main(){
char u;
char str[20];
}
Deswegen:
Nach jedem scanf den
Tastaturpuffer löschen mit:
printf("Name eingeben\n");
scanf("%s",&str);
fflush(stdin);
printf("Zeichen eingeben\n");
scanf("%c",&u);
fflush(stdin);
return 0;
Welchen Wert hat u ?
Das 1. scanf verschiebt die vom Anwender eingegebene Zeichenkette
vom Tastaturpuffer in str. Das sich dann noch im Tastaturpuffer
befindliche ENTER (ASCII-Code 10) verschiebt das 2.scanf in u.
Bemerkung:
Aus Platzgründen ist es
möglich, dass
fflush(stdin);
in dieser und den folgenden
Präsentationen weggelassen
wird !
Initialisierung bei der
Deklaration
char f[5]={'M','a'};
'M' 'a' '\0'
?
?
oder auch möglich:
char v[5]="karl";
'k' 'a' 'r' 'l' '\0'
Durch jede dieser
Initialisierungen wird
automatisch, ohne Zutun des
Programmierers, die
Zeichenkette mit '\0'
abgeschlossen.
Aufgabe:
Der Vorname und der
Nachname einer Person soll
in einem Programm
eingegeben werden. Die
Initialen sollen dann in
einem Feld gespeichert und
ausgegeben werden.
Hinweis:
scanf("%s", ...)
benutzen
int main(){
const int LEN = 20;
char vorname[LEN];
char nachname[LEN];
char kuerzel[3];
printf("Vorname eingeben\n");
scanf("%s",&vorname);
fflush(stdin);
printf("Nachn. eingeben\n");
scanf("%s",&nachname);
fflush(stdin);
kuerzel[0] = vorname[0];
kuerzel[1] = nachname[0];
kuerzel[2] = '\0';
printf("Initialen: %s\n",
kuerzel);
return 0;
}
Alternative Möglichkeit, die
Initialen des Feldes kuerzel
auszugeben:
Ist bei dieser Lösung nötig, dass das Feld kuerzel die Feldlänge 3 hat ?
Wenn nein, welche Feldlänge würde genügen?
Es würde genügen, als Feldlänge 2 zu nehmen. Allerdings könnte man
dann das Feld nicht mehr mit '\0' terminieren.
Welchen Nachteil hätte dies ?
Man könnte die Funktion printf mit %s nicht mehr benutzen, um den
Inhalt des Feldes auszugeben.
...
i=0;
while(i<2){
printf("%c", kuerzel[i]);
i=i+1;
}
Was ist der Nachteil dieses
Programms ?
Es wird nicht geprüft, ob das
Feld groß genug ist, die
Zeichenkette aufzunehmen
Aufgabe:
Ergänzen Sie das vorige
Programm so, dass es nicht
mehr Zeichen einlesen, wie
das Feld aufnehmen kann.
Verwenden Sie bei der
Eingabe scanf("%c",...) und
beachten Sie ...
... daß bei der Eingabe einer
Zeichenkette nach dem
Drücken der ENTER-Taste
das Zeichen mit dem
ASCII-Wert 10 im
Tastaturpuffer steht.
int main(){
const int LEN = 5;
const char ENTER = 10;
// Schleife nicht beenden
int beenden = 0;
int i;
char vorname[LEN];
char nachname[LEN];
char kuerzel[3];
char temp;
i = 0;
printf("Vorname eingeben\n");
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
fflush(stdin);
return 0;
}
// analoges mit nachname
Aufgabe:
1) Angenommen, der Anwender
hat im letzten Programm als
Vorname Udo eingegeben.
Was macht das Programm im
Einzelnen ?
Besprechung des Programms für die
Eingabe Udo:
Was steht nach dieser Eingabe im
Tastaturpuffer ?
ASCII-Wert 10
U d
o 10
Welche Werte haben die Variablen beenden, temp, i,
vorname nach Ausführung der jeweils folgenden Befehle ?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
temp:
i:
beenden:
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
temp: U
i: 0
beenden: 0
?
?
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
temp: U
i: 0
beenden: 0
?
?
?
?
U
?
0
ASCIIWert 10
4
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
temp: U
i: 0
beenden: 0
?
?
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: U
i: 0
beenden: 0
?
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: U
i: 0
beenden: 0
?
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: U
i: 1
beenden: 0
?
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: U
i: 1
beenden: 0
?
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: U
i: 1
beenden: 0
?
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: d
i: 1
beenden: 0
?
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: d
i: 1
beenden: 0
?
?
?
d
?
1
ASCIIWert 10
4
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: d
i: 1
beenden: 0
?
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: d
i: 1
beenden: 0
d
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: d
i: 1
beenden: 0
d
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: d
i: 2
beenden: 0
d
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: d
i: 2
beenden: 0
d
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: d
i: 2
beenden: 0
d
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: o
i: 2
beenden: 0
d
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: o
i: 2
beenden: 0
d
?
?
o
?
2
ASCIIWert 10
4
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: o
i: 2
beenden: 0
d
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: o
i: 2
beenden: 0
d
o
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: o
i: 2
beenden: 0
d
o
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: o
i: 3
beenden: 0
d
o
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: o
i: 3
beenden: 0
d
o
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: o
i: 3
beenden: 0
d
o
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: 10
i: 3
beenden: 0
d
o
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: 10
i: 3
beenden: 0
d
o
?
ASCIIWert 10
?
3
ASCIIWert 10
4
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: 10
i: 3
beenden: 0
d
o
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: 10
i: 3
beenden: 0
d
o
\0
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: 10
i: 3
beenden: 0
d
o
\0
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: 10
i: 3
beenden: 1
d
o
\0
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: 10
i: 3
beenden: 1
d
o
\0
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
U
temp: 10
i: 3
beenden: 1
d
o
\0
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
Aufgabe:
2) Angenommen, der Anwender
hat im letzten Programm als
Vorname Edgar eingegeben
und es wäre:
const int LEN = 3;
Was macht das Programm im
Einzelnen ?
Besprechung des Programms für die
Eingabe Edgar:
Was steht nach dieser Eingabe im
Tastaturpuffer ?
ASCII-Wert 10
E d
g
a
r 10
Welche Werte haben die Variablen beenden, temp, i,
vorname nach Ausführung der jeweils folgenden Befehle ?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
temp:
i:
beenden:
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
temp: E
i: 0
beenden: 0
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
temp: E
i: 0
beenden: 0
?
?
?
E
0
ASCIIWert 10
2
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
temp: E
i: 0
beenden: 0
?
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: E
i: 0
beenden: 0
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: E
i: 0
beenden: 0
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: E
i: 1
beenden: 0
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: E
i: 1
beenden: 0
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: E
i: 1
beenden: 0
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: d
i: 1
beenden: 0
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: d
i: 1
beenden: 0
?
?
d
1
ASCIIWert 10
2
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: d
i: 1
beenden: 0
?
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: d
i: 1
beenden: 0
d
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: d
i: 1
beenden: 0
d
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: d
i: 2
beenden: 0
d
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: d
i: 2
beenden: 0
d
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: d
i: 2
beenden: 0
d
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: g
i: 2
beenden: 0
d
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: g
i: 2
beenden: 0
d
?
g
2
ASCIIWert 10
2
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: g
i: 2
beenden: 0
d
?
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: g
i: 2
beenden: 0
d
\0
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: g
i: 2
beenden: 0
d
\0
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: g
i: 2
beenden: 1
d
\0
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: g
i: 2
beenden: 1
d
\0
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
vorname:
E
temp: g
i: 2
beenden: 1
d
\0
do{
scanf("%c", &temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}while (beenden == 0);
printf("Vorn. = %s\n", vorname);
Aufgabe:
Machen Sie das gleiche wie
in der vorigen Aufgabe.
Benutzen Sie aber statt scanf
die Funktion _getch().
Holen Sie sich Infos zu
dieser Funktion in der Hilfe
von MS VC++
Hinweise zu _getch():
1) liest ein Zeichen ein (über
Tastatur)
2) bringt es nicht auf den
Bildschirm (ohne Echo)
3) beim Beenden (mit ENTER)
der Eingabe des Zeichens wird
13 in den Tastaturpuffer
geschrieben.
#include "stdafx.h"
#include <conio.h>
// gleich geht es weiter ...
int main(){
const int LEN = 5;
const char ENTER = 13;
// Schleife nicht beenden
int beenden = 0;
int i;
char vorname[LEN];
char nachname[LEN];
char kuerzel[3];
int temp;
i = 0;
printf("Vorname eing.\n");
do{
temp = _getch(); // kein Echo
printf("%c",temp);
if ((temp == ENTER)
||(i == LEN-1)){
vorname[i] = '\0';
beenden = 1;
}
else{
vorname[i] = temp;
i = i+1;
}
}
while (beenden == 0);
printf("\n = %s\n", vorname);
}
return 0;
Tipp:
Mit scanf kann man auch die
maximale Anzahl der Zeichen
angeben, die gelesen werden
sollen:
char v[100];
scanf("%4s",&v);
Diese Zahl (hier 4) gibt die
maximale Anzahl Zeichen
an, die von scanf verarbeitet
werden.
Die 4 kann leider nicht durch
eine const-Konstante ersetzt
werden. Dies muß durch eine
define-Konstante gemacht
werden:
Bevor der Compiler das Programm übersetzt, ersetzt vorher der
sogenannte Präprozessor jede mit define definierte Konstante durch
den entsprechenden Wert, hier also LEN durch die Zeichenkette 4.
#define LEN "4"
int main(){
char v[100];
scanf("%" LEN "s",&v);
return 0;
}
C interpretiert hintereinander kommende Zeichenketten, wie z.B. "%"
"4" und "s" als eine Zeichenkette "%4s".
Diese Lösung ist nicht möglich:
Der Präprozessor nimmt innerhalb von Zeichenketten keine
Ersetzungen vor.
#define LEN "4"
int main(){
char v[100];
scanf("%LENs",&v);
return 0;
}
Weiterer Tipp:
Mit scanf kann man auch
festlegen, ab welchen Zeichen
die Eingabe beendet wird:
liest solange Zeichen ein, bis
ein x oder y auftaucht.
(x bzw. y wird nicht mehr
eingelesen)
char v[100];
scanf("%[^xy]",&v);
Mehrdimensionale
Felder
Zweidimensionale
Felder
Merke:
In der Programmiersprache
C fasst man ein
zweidimensionales Feld als
eindimensionales Feld auf,
dessen einzelne Zellen
(Elemente) aus
eindimensionalen Feldern
bestehen.
Beispiel
Dieses zweidimensionale
Feld besteht aus 3 Zellen.
Jede dieser Zellen ist wiederum
ein eindimensionales Feld, das
aus 4 Zellen besteht.
int v[3][4];
Anzahl der Elemente in der 2. Dimension:
Jede Zelle des eindimensionalen Feldes besteht
wiederum aus 4 Zellen.
Anzahl der Elemente in der 1. Dimension:
Das Feld besteht aus 3 eindimensionalen Feldern.
Variablenname des Feldes
Datentyp der Elemente:
Jede Zelle hat den gleichen Datentyp
int v[3][4];
besteht hier z.B. aus:
v[1][2] = 13;
besteht hier z.B. aus:
besteht hier z.B. aus:
Welche Stelle wird verändert ?
v[0]
v[1]
v[2]
12
43
49
11
27
52
37
42
73
89
67
69
int v[3][4];
Wieviel Speicher benötigt die
Variable v ?
v[1][2] = 13;
= 3 · 4 · Speicherbedarf
(int)
12
43
49
11
27
52
37
13
73
89
67
69
Initialisierung bei der Deklaration
int v[3][4]={{12,11,37,89},
{43,27,42,67},
{49,52,73,69}
};
v[0]
v[1]
v[2]
12
43
49
11
27
52
37
42
73
89
67
69
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.
Frage:
Was ist zu tun, dass zu 100
% garantiert ist, dass am
Feldende aller Felder
'\0'steht ?
Alle Zellen aller Felder
vorher mit '\0' auffüllen !
Warum ist dies bei einem
grossen Formular für den
Programmierer sehr
aufwendig (bei z.B. 100
Feldern) ?
Weil man dazu bei z.B. 100
eindimensionalen Feldern
100 FOR-Anweisungen
benötigt oder eine FORAnweisung, in der 100
eindimensionale Felder
benötigt (bearbeitet) werden
müssen, wie z.B:
...
for(i=0;i<100;i++){
v0[i]='\0';
}
v1[i]='\0';
v2[i]='\0';
//...
v99[i]='\0';
viel Schreibaufwand
Wie kann man dies
programmtechnisch
einfacher machen ?
Mit einem
zweidimensionalen Feld.
Aufgabe:
Schreiben Sie ein Programm, das
alle Zellen in einem
zweidimensionalen Feld mit '\0'
belegt.
int main(){
const int ZANZ = 3;
const int SANZ = 13;
int i, j;
char formular [ZANZ][SANZ];
}
for (i=0; i<ZANZ; i++){
for (j=0; j<SANZ; j++){
formular[i][j] = '\0';
}
}
return 0;
for (i=0; i<ZANZ; i++){
for (j=0; j<SANZ; j++){
formular[i][j] = '\0';
}
}
formular[0]
formular[1]
formular[2]
\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
AUFGABE
Genauso wie in einem vorigen
Programm soll der Vorname und der
Nachname einer Person in einem
Programm eingegeben (mit
scanf("%s",...), wobei vorausgesetzt
wird, daß das Feld groß genug ist, die
Zeichenketten aufzunehmen) und
gespeichert werden. Daraus sollen
dann die Initialen berechnet,
gespeichert und ausgegeben werden.
Dies soll durch ein zweidimensionales
Feld realisiert werden.
int main(){
const int ZANZ = 3;
const int SANZ = 13;
char formular [ZANZ][SANZ];
Im Folgenden soll
angenommen werden, dass als
Vorname "Dieder" und als
Nachname "Kaulitz"
eingegeben wird.
printf("Vorname eingeben\n");
scanf("%s", &formular[0]);
printf("Nachname eingeben\n");
scanf("%s", &formular[1]);
Was macht dies Anweisung?
// Initialen schreiben
Das zweidimensionale Feld besteht aus den 3 Zellen:
formular[2][0]
formular[0][0];
formular[0] bis=formular[2],
wobei jede Zelle ein
formular[2][1]
formular[1][0];
eindimensionales=Feld
ist. Dehalb muss bei scanf als
Formatierung
%s benutzt werden.
formular[2][2]
= '\0';
formular[0]
formular[1]
formular[2]
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ?
printf("Vorname eingeben\n");
scanf("%s", &formular[0]);
printf("Nachname eingeben\n");
scanf("%s", &formular[1]);
Was macht dies Anweisung?
// Initialen schreiben
formular[2][0] = formular[0][0];
formular[2][1] = formular[1][0];
formular[2][2] = '\0';
formular[0]
formular[1]
formular[2]
D i e d e r \0 ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ?
printf("Vorname eingeben\n");
scanf("%s", &formular[0]);
printf("Nachname eingeben\n");
scanf("%s", &formular[1]);
Was macht dies Anweisung?
// Initialen schreiben
formular[2][0] = formular[0][0];
formular[2][1] = formular[1][0];
formular[2][2] = '\0';
formular[0]
formular[1]
formular[2]
D i e d e r \0 ? ? ? ? ? ?
K a u l i t z \0 ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ?
printf("Vorname eingeben\n");
scanf("%s", &formular[0]);
printf("Nachname eingeben\n");
scanf("%s", &formular[1]);
Was macht dies Anweisung?
// Initialen schreiben
formular[2][0] = formular[0][0];
formular[2][1] = formular[1][0];
formular[2][2] = '\0';
formular[0]
formular[1]
formular[2]
D i e d e r \0 ? ? ? ? ? ?
K a u l i t z \0 ? ? ? ? ?
D ? ? ? ? ? ? ? ? ? ? ? ?
printf("Vorname eingeben\n");
scanf("%s", &formular[0]);
printf("Nachname eingeben\n");
scanf("%s", &formular[1]);
Was macht dies Anweisung?
// Initialen schreiben
formular[2][0] = formular[0][0];
formular[2][1] = formular[1][0];
formular[2][2] = '\0';
formular[0]
formular[1]
formular[2]
D i e d e r \0 ? ? ? ? ? ?
K a u l i t z \0 ? ? ? ? ?
D K ? ? ? ? ? ? ? ? ? ? ?
printf("Vorname eingeben\n");
scanf("%s", &formular[0]);
printf("Nachname eingeben\n");
scanf("%s", &formular[1]);
// Initialen schreiben
formular[2][0] = formular[0][0];
formular[2][1] = formular[1][0];
formular[2][2] = '\0';
formular[0]
formular[1]
formular[2]
D i e d e r \0 ? ? ? ? ? ?
K a u l i t z \0 ? ? ? ? ?
D K \0 ? ? ? ? ? ? ? ? ? ?
printf("Vorname = %s\n",
formular[0]);
printf("Nachname = %s\n",
formular[1]);
printf("Initialen = %s\n",
formular[2]);
return 0;
} // Ende main
War diese Anweisung
in der letzten Folie
unbedingt nötig ?
formular[2][2] = '\0';
formular[2][2] = '\0';
printf("Initialen = %s\n",
formular[2]);
Ja, wenn die Ausgabe wie hier
mit der Formatierung %s
gemacht wird !
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 InitialenZeichenkette kennen
for(i=0;i<2;i++)
printf("%c",formular[2][i]);
Aufgabe:
In einem Probeformular sollen
folgende Voreinträge für
Vornamen, Nachnamen und
Initialen (zu Demo-Zwecken)
gemacht werden:
Erika
Mustermann
Wie wird das programmtechnisch
gemacht ?
Besser mit Konstanten arbeiten !!
int main(){
char f[3][13]=
{{'M','u','s','t','e','r','m','a','n','n'},
{'E','r','i','k','a'}};
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.
Welche Werte haben die Zellen des Feldes f ?
// oder:
char f[3][13]={"Mustermann","Erika"};
f[1]
M u s t e r m a n n \0 ? ?
E r i k a \0 ? ? ? ? ? ? ?
f[2]
\0 ? ? ? ? ? ? ? ? ? ? ? ?
f[0]
Dreidimensionale
Felder
Merke:
In der Programmiersprache
C fasst man ein
dreidimensionales Feld als
eindimensionales Feld auf,
dessen einzelne Zellen
(Elemente) aus
zweidimensionalen Feldern
bestehen.
int v[3][4][5]; Welche Stelle
wird
verändert
?
v[0][2][3] = 18;
18
12
43
49
11
27
52
37
42
73
89
67
69
int v[3][4][5];
v[0][2][3] = 18;
Wieviel Speicher benötigt die
Variable v ?
= 3 · 4 · 5 · Speicherbedarf (int)
Vierdimensionales
Feld
Beispiel
Temperatur-Erfassung an
einer Wetterstation über
folgende Zeitdauer:
- 10 Jahre
- Monatlich
- Täglich
- Stündlich
Wie kann man diese Daten
"geschickt" anordnen, so
dass leicht darauf
zugegriffen werden kann ?
double v[10][12][31][24];
Wieviel Grad hat es im 3. Jahr am
Jahreswechsel (Silvester)?
Wie weist man dies der Variablen t
zu ?
t = v[2][11][30][23];
Wie wird auf den "darauffolgenden Datensatz“ zugegriffen
t = v[3][0][0][0];
double v[10][12][31][24];
Wieviel Speicher benötigt die Variable v ?
= 10·12·31·24 · Speicherbedarf
(double)
Welchen "Nachteil" hätte es, wenn
man statt des vierdimensionalen
Feldes die Daten in einem
eindimensionalen Feld verwalten
würde?
Man müsste sich viel mehr
Gedanken darüber machen
(überlegen), wo (welcher Index ?)
z.B. die Temperatur (Grad) im 3.
Jahr am Jahreswechsel (Silvester)
abgespeichert ist.
Beispiel
double v[10][12][31][24];
ist ein eindimensionales Feld, dessen
Zellen aus dreidimensionalen Feldern
besteht.
Wo kann dann z.B. der Wert
V[9][3][8][5]
In einem eindimensionalem Feld abgelegt
werden?
double v[10][12][31][24];
ist ein eindimensionales Feld, dessen
Zellen aus dreidimensionalen Feldern
besteht.
Wie kann z.B.
V[9][3][8][5]
in einem eindimensionalem Feld abgelegt
werden?
double v[10][12][31][24];
ist ein eindimensionales Feld, dessen
Zellen aus dreidimensionalen Feldern
besteht.
V[9][3][8][5]
Ist also das 10. dreidimensionale Paket.
Also belegen die schon davor liegenden 9
dreidimensionale Pakete der Länge
12*31*24 einen Speicher von
9*12*31*24 Speichereinheiten (SE)
(Speichereinheit = Speicherplatz für
double)
V[9][3][8][5]
Nach diesen 9*12*31*24 SE
wird nun das dreidimensionale Paket
V[.][3][8][5]
abgelegt. Dieses ist ein eindimensionales
Feld, dessen Zellen aus zweidimensionalen
Feldern besteht.
V[.][3][8][5]
Ist also das 4. zweidimensionale Paket.
Also belegen die schon davor liegenden 3
zweidimensionale Pakete der Länge 31*24
einen Speicher von 3*31*24 SE.
Also insgesamt:
9*12*31*24 + 3*31*24 SE
Nach diesen 9*12*31*24 + 3*31*24 SE
wird nun das zweidimensionale Paket
V[.][.][8][9]
abgelegt. Dieses ist ein eindimensionales
Feld, dessen Zellen aus zweidimensionalen
Feldern besteht.
V[.][.][8][5]
ist also das 9. eindimensionale Paket.
Also belegen die schon davor liegenden 8
eindimensionale Pakete der Länge 24
einen Speicher von 8*24 SE.
Also insgesamt:
9*12*31*24 + 3*31*24 + 8*24 SE
Nach diesen
9*12*31*24 + 3*31*24 + 8*24 SE
wird nun das eindimensionale Paket (Feld)
V[.][.][.][9]
abgelegt. Diese ist ein eindimensionales
Feld.
V[.][.][.][5]
ist also das 6. eindimensionale Paket
(= Zelle)
Also belegt dieses mit dem zuvor
berechneten Speicher insgesamt:
9*12*31*24 + 3*31*24 + 8*24 + 6 SE
Da ein Feld bei 0 beginnt, könnte man also
einen Wert wie z.B. V[9][3][8][5] in einem
eindimensionalen Feld v1 speichern:
v1[9*12*31*24 + 3*31*24 + 8*24 + 5] =
V[9][3][8][5]

0 - umaterialien.de