Ubungspaket 14 ¨
Eindimensionale Arrays
Ubungsziele: ¨
Deklaration und Verwendung eindimensionaler Arrays Skript:
Kapitel: 33 Semester:
Wintersemester 2021/22 Betreuer:
Thomas, Tim und Ralf Synopsis:
Nach dem wir nun die wesentlichen Datentypen kennengelernt haben,
kommt etwas neues dazu; die eindimensionalen Arrays. Mit Arrays
kann man mehrere Variablen gleichen Typs zusammenfassen, so wie
wir es aus der Mathematik in Form von Vektoren, (indizierten) Koef-
fizienten und dergleichen kennen.
Teil I: Stoffwiederholung
Aufgabe 1: Aufbau eines eindimensionalen Arrays
Aus welchen Komponennten besteht eine Array-Definition (ohne Initialisierung)?
1. Elementtyp 2. Array-Name
3. Eckige Klammern [] 4. Array-Gr¨oße (innerhalb der [])
Aufgabe 2: Array-Gr¨ oße und g¨ ultige Indizes
Nehmen wir an, wir h¨atten ein Array der Gr¨oße n (eines mit n Elementen), wobei n stell- vertretend f¨ur eine ganzzahlige Konstante wie beispielsweise 14 ist.
Frage: Was sind die g¨ultigen Indizes? 0 .. n-1
Aufgabe 3: Speicherbelegung
Wie viele Bytes belegt ein Array mitn Elementen mindestens im Arbeitsspeicher (RAM), wenn der Elementtyp genau b Bytes belegt? n×b Bytes
Skizziere ein Array a mit 6 Elementen vom Typ int unter der Annahme, dass ein int genau 4 Bytes belegt und die Startadresse des Arrays 0x1000 ist.
Definition: int a[ 6 ]; Adresse Variable Typ Gr¨oße
0x1018
0x1014 a[ 5 ] int 4 Bytes 0x1010 a[ 4 ] int 4 Bytes 0x100C a[ 3 ] int 4 Bytes 0x1008 a[ 2 ] int 4 Bytes 0x1004 a[ 1 ] int 4 Bytes 0x1000 a[ 0 ] int 4 Bytes
Teil II: Quiz
Aufgabe 1:
” Standard“ Arrays
Gegeben seien die folgenden vier Definitionen:
1. int a[ 3 ];
2. char b[ 4 ];
3. double c[ 2 ];
4. int d[ 1 ];
Welche Indizes sind bei den jeweiligen Arrays erlaubt und welche Werte haben die Array- Elemente unmittelbar nach der Definition?
Array Indizes Werte
a 0, 1, 2 nicht initialisiert b 0, 1, 2, 3 nicht initialisiert c 0, 1 nicht initialisiert d 0 nicht initialisiert
Aufgabe 2: Implizit definierte Arrays
Die Gr¨oße eines Arrays kann man auch
”implizit“ durch eine zus¨atzliche Initialisierung definieren. Gegeben seien die folgenden vier Definitionen:
1. int e[] = { 3, 4, 5 };
2. int f[] = { -1, -3 };
3. double g[] = { , , 23.0, };
4. double h[] = { -3,0 , , 2.0 };
Welche Gr¨oßen haben die Arrays, welche Indizes sind jeweils erlaubt und welche Werte haben die einzelnen Elemente unmittelbar nach der Definition?
Array Gr¨oße Indizes Werte e 3 0, 1, 2 3, 4, 5
f 2 0, 1 -1, -3
g 4 0, 1, 2, 3 n.i., n.i., 23.0, n.i.
h 4 0, 1, 2, 3 3.0, 0.0, n.i., 2.0 n.i. ˆ= nicht initialisiert
Teil III: Fehlersuche
Aufgabe 1: Arbeiten mit mehreren Zahlen
Das folgende Programm soll zehn Zahlen einlesen und in einem Array ablegen, anschließend die Summe ausrechnen und diese am Ende ausgeben. Leider hatDr. One-Neuronwieder diverse Fehler gemacht, die ihr finden und korrigieren sollt.
1 # i n c l u d e < stdioh >
2
3 # d e f i n e N =10 4
5 int man ( int argc , c h a r ** a r g v )
6 {
7 int i , sum , a [ N ];
8 for ( i = 0 , i < N , i = i + 1 )
9 {
10 p r i n t f ( B i t t e W e r t f u e r a [ % d ] e i n g e b e n : , i ) ; 11 s c a n f ( " % d " , & ( a [ ] ) ) ;
12 }
13 for ( i = 1; sum = 0; i <= N ; i = i + 1 )
14 sum = sum + a { i };
15 p r i n t f ( " Die S u m m e der Z a h l e n b e t r a e g t % d \ n " , N , sum ) ;
16 }
Zeile Fehler Erl¨auterung Korrektur
1 . fehlt Der Name der Datei ist stdio.h <stdio.h>
. . . .
3 = zu viel Die#define-Direktive hat zwei
”Argumente“, erst das, was definiert werden soll, und dann die eigentliche De- finition; ein = ist hier nicht erlaubt.
#define N 10
. . . .
5 Tippfehler:
man
Das Hauptprogramm heißt nicht man() sondern main().
main
. . . .
8 , statt ; Die einzelnen Teile der for-Anweisung werden mittels Semikolons getrennt.
for( ...;
...; ...)
. . . .
10 " fehlen Die Texte in der Ausgabeanweisung m¨ussen in G¨anse- f¨ußchen eingeschlossen sein.
"..."
. . . .
11 Index i fehlt Beim Zugriff auf die einzelnen Arrayelemente muss der a[ i ]
Zeile Fehler Erl¨auterung Korrektur 13 ; statt , Werden bei derfor-Anweisung in einem der drei Teile
mehr als ein Ausdruck verwendet, m¨ussen diese unter- einander mit Kommas getrennt werden.
i = 1, sum = 0
. . . .
13/14 Laufindex Da in Zeile 14 auf die Array-Elemente direkt mittels a[ i ] zugegriffen wird, muss der Laufindexi von 0 bis N-1laufen.
i = 0 i < N
. . . .
14 {} statt [] Beim Zugriff auf die einzelnen Elemente eines Arrays m¨ussen eckige Klammern verwendet werden.
a[ i ]
. . . .
15 N, zu viel Der Parameter N ist zu viel. ", sum );
Programm mit Korrekturen:
1 # i n c l u d e < s t d i o . h >
2
3 # d e f i n e N 10
4
5 int m a i n ( int argc , c h a r ** a r g v )
6 {
7 int i , sum , a [ N ];
8 for ( i = 0; i < N ; i = i + 1 )
9 {
10 p r i n t f ( " B i t t e W e r t f u e r a [ % d ] e i n g e b e n : " , i ) ; 11 s c a n f ( " % d " , & ( a [ i ] ) ) ;
12 }
13 for ( i = 0 , sum = 0; i < N ; i = i + 1 )
14 sum = sum + a [ i ];
15 p r i n t f ( " Die S u m m e der % d Z a h l e n b e t r a e g t % d \ n " ,N , sum ) ;
16 }
Teil IV: Anwendungen
Aufgabe 1: Deklaration einfacher Arrays
Die folgende ¨Ubungsaufgabe ist nicht wirklich sinnvoll, sondern dient haupts¨achlich dem Ein¨uben des Hantierens mit eindimensionalen Arrays.
1. Aufgabenstellung
Ziel der Aufgabe ist es, ein Programm zu erstellen, das folgende Arrays enth¨ahlt:
1. ein Array mit 10 Elementen vom Typint, 2. ein Array mit 3 Elementen vom Typchar und 3. ein Array mit 100 Elementen vom Typdouble.
Des Weiteren sollen die Elemente dieser drei Arrays initialisiert werden. Dies ge- schieht vorzugsweise in einer Schleife. Diese Schleife soll so aufgebaut sein, dass eine Gr¨oßen¨anderung des Arrays keine weiteren ¨Anderungen in den Initialisierungsschlei- fen nach sich ziehen sollte; mit anderen Worten: Eine Gr¨oßen¨anderung sollte durch eine einzige Modifikation vollst¨andig realisiert sein.
2. Kodierung
1 # i n c l u d e < s t d i o . h >
2
3 # d e f i n e A _ S I Z E 10 4 # d e f i n e B _ S I Z E 3 5 # d e f i n e C _ S I Z E 100 6
7 int m a i n ( int argc , c h a r ** a r g v )
8 {
9 int i , a [ A _ S I Z E ];
10 c h a r b [ B _ S I Z E ];
11 d o u b l e c [ C _ S I Z E ];
12 for ( i = 0; i < A _ S I Z E ; i = i + 1 )
13 a [ i ] = 0;
14 for ( i = 0; i < B _ S I Z E ; i = i + 1 )
15 b [ i ] = ’ A ’ ;
16 for ( i = 0; i < C _ S I Z E ; i = i + 1 )
17 c [ i ] = 0 . 0 ;
Aufgabe 2: Implizite Gr¨ oßendefinitionen
Wir haben gelernt, dass man in der Programmiersprache C die Gr¨oße eines Arrays auch indirekt und zwar durch die initialisierte Definition festlegen kann. Gegenstand dieser Auf- gabe ist das aktive Ein¨uben dieses Konzeptes.
1. Aufgabenstellung
Entwickle ein kleines C-Programm, in dem die Gr¨oßen von mindestens vier Arrays implizit durch ihre Initialisierung definiert werden. Zwei Beispieldefinitionen sind bereits weiter unten angegeben.
Zur weiteren Verwendung der Gr¨oßen, beispielsweise in Initialisierungsschleifen, ist die Gr¨oße jedes Arrays durch ein geeignetes#define-Makro zu
”berechnen“.
Zur Best¨atigung, dass alles korrekt abgelaufen ist, sind die einzelnen Elemente mittels geeigneter Schleifen auszugeben. In diesen Schleifen sind nat¨urlich oben erw¨ahnte
#define-Makros zu verwenden.
2. Pflichtenheft
Aufgabe : Korrekte Definition von Arrays mittels Initialisierung Eingabe : Eingaben werden nicht ben¨otigt
Ausgabe : Gr¨oße und Inhalt der Arrays als
”Gegenprobe“
Sonderf¨alle : Da es keine Eingaben gibt, k¨onnen auch keine Problemf¨alle auftreten 3. Testdaten
Array Typ Initialwerte C-Definitionen
a int 1, 2, 3, 4 int a[] = {1, 2, 3, 4 }
#define A SIZE sizeof( a )/sizeof(a[ 0 ]) x double 1.0, 2.0 double x[] = { 1.0, 2.0 }
#define X SIZE sizeof( x )/sizeof(x[ 0 ]) c char ’H’, ’i’ char c[] = { ’H’, ’i’ }
#define C SIZE sizeof( c )/sizeof(c[ 0 ]) m char 98, 99, 100 char m[] = { 98, 99, 100 }
#define M SIZE sizeof( m )/sizeof(m[ 0 ])
4. Kodierung
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int a [] = { 1 , 2 , 3 , 4 };
6 # d e f i n e A _ S I Z E s i z e o f ( a ) / s i z e o f ( a [ 0 ] ) 7
8 d o u b l e x [] = { 1.0 , 2.0 };
9 # d e f i n e X _ S I Z E s i z e o f ( x ) / s i z e o f ( x [ 0 ] ) 10
11 c h a r c [] = { ’ H ’ , ’ i ’ };
12 # d e f i n e C _ S I Z E s i z e o f ( c ) / s i z e o f ( c [ 0 ] ) 13
14 c h a r m [] = { 98 , 99 , 100 };
15 # d e f i n e M _ S I Z E s i z e o f ( m ) / s i z e o f ( m [ 0 ] ) 16
17 int i ;
18 p r i n t f ( " a [ % d ]: " , A _ S I Z E ) ;
19 for ( i = 0; i < A _ S I Z E ; i = i + 1 ) 20 p r i n t f ( " % d " , a [ i ] ) ;
21 p r i n t f ( " \ n " ) ;
22 p r i n t f ( " x [ % d ]: " , X _ S I Z E ) ;
23 for ( i = 0; i < X _ S I Z E ; i = i + 1 ) 24 p r i n t f ( " % e " , x [ i ] ) ;
25 p r i n t f ( " \ n " ) ;
26 p r i n t f ( " c [ % d ]: " , C _ S I Z E ) ;
27 for ( i = 0; i < C _ S I Z E ; i = i + 1 ) 28 p r i n t f ( " % c " , c [ i ] ) ;
29 p r i n t f ( " \ n " ) ;
30 p r i n t f ( " m [ % d ]: " , M _ S I Z E ) ;
31 for ( i = 0; i < M _ S I Z E ; i = i + 1 ) 32 p r i n t f ( " % c " , m [ i ] ) ;
33 p r i n t f ( " \ n " ) ;
34 }