¨Ubungspaket 14 Eindimensionale Arrays

Werbung
Übungspaket 14
Eindimensionale Arrays
Übungsziele:
Deklaration und Verwendung eindimensionaler Arrays
Skript:
Kapitel: 33
Semester:
Wintersemester 2017/18
Betreuer:
Kevin, Theo, Thomas 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) Koeffizienten 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öße (innerhalb der [])
Aufgabe 2: Array-Größe und gültige Indizes
Nehmen wir an, wir hätten ein Array der Größe n (eines mit n Elementen), wobei n stellvertretend für eine ganzzahlige Konstante wie beispielsweise 14 ist.
Frage: Was sind die gültigen Indizes? 0 .. n-1
Aufgabe 3: Speicherbelegung
Wie viele Bytes belegt ein Array mit n 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
0x1018
0x1014
0x1010
0x100C
0x1008
0x1004
0x1000
14-1
Variable
a[
a[
a[
a[
a[
a[
5
4
3
2
1
0
]
]
]
]
]
]
Typ
Größe
int
int
int
int
int
int
4 Bytes
4 Bytes
4 Bytes
4 Bytes
4 Bytes
4 Bytes
Wintersemester 2017/18, Einführung in die Praktische Informatik
Teil II: Quiz
Aufgabe 1: Standard“ Arrays
”
Gegeben seien die folgenden vier Definitionen:
1.
2.
3.
4.
int
char
double
int
a[
b[
c[
d[
3
4
2
1
];
];
];
];
Welche Indizes sind bei den jeweiligen Arrays erlaubt und welche Werte haben die ArrayElemente unmittelbar nach der Definition?
Array
a
b
c
d
Indizes
Werte
0, 1, 2
nicht initialisiert
0, 1, 2, 3 nicht initialisiert
0, 1
nicht initialisiert
0
nicht initialisiert
Aufgabe 2: Implizit definierte Arrays
Die Größe eines Arrays kann man auch implizit“ durch eine zusätzliche Initialisierung
”
definieren. Gegeben seien die folgenden vier Definitionen:
1.
2.
3.
4.
int
int
double
double
e[]
f[]
g[]
h[]
=
=
=
=
{
{
{
{
3, 4, 5 };
-1, -3 };
, , 23.0, };
-3,0 , , 2.0 };
Welche Größen haben die Arrays, welche Indizes sind jeweils erlaubt und welche Werte
haben die einzelnen Elemente unmittelbar nach der Definition?
Array
Größe
e
f
g
h
3
2
4
4
Indizes
Werte
0,
0,
0,
0,
3, 4, 5
-1, -3
n.i., n.i., 23.0, n.i.
3.0, 0.0, n.i., 2.0
1, 2
1
1, 2, 3
1, 2, 3
n.i. =
ˆ nicht initialisiert
Einführung in die Praktische Informatik, Wintersemester 2017/18
14-2
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 hat Dr. One-Neuron wieder
diverse Fehler gemacht, die ihr finden und korrigieren sollt.
1 # include < stdioh >
2
3 # define N =10
4
5 int man ( int argc , char ** argv )
6
{
7
int i , sum , a [ N ];
8
for ( i = 0 , i < N , i = i + 1 )
9
{
10
printf ( Bitte Wert fuer a [ % d ] eingeben : , i ) ;
11
scanf ( " % d " , & ( a [ ] ) ) ;
12
}
13
for ( i = 1; sum = 0; i <= N ; i = i + 1 )
14
sum = sum + a { i };
15
printf ( " Die Summe der Zahlen betraegt % d \ n " , N , sum ) ;
16
}
Zeile
Fehler
Erläuterung
Korrektur
1
. fehlt
Der Name der Datei ist stdio.h
<stdio.h>
3
= zu viel
Die #define-Direktive hat zwei Argumente“, erst das, #define
”
was definiert werden soll, und dann die eigentliche De- N 10
finition; ein = ist hier nicht erlaubt.
..............................................................................................................................................
..............................................................................................................................................
5 Tippfehler:
man
Das Hauptprogramm heißt nicht man() sondern
main().
main
Die einzelnen Teile der for-Anweisung werden mittels
Semikolons getrennt.
for( ...;
...; ...)
..............................................................................................................................................
8
, statt ;
..............................................................................................................................................
10
" fehlen
Die Texte in der Ausgabeanweisung müssen in Gänse- "..."
füßchen eingeschlossen sein.
..............................................................................................................................................
11 Index i fehlt
14-3
Beim Zugriff auf die einzelnen Arrayelemente muss der
jeweilige Index angegeben werden.
a[ i ]
Wintersemester 2017/18, Einführung in die Praktische Informatik
Zeile
13
Fehler
Erläuterung
Korrektur
; statt ,
Werden bei der for-Anweisung in einem der drei Teile i = 1,
mehr als ein Ausdruck verwendet, müssen diese unter- sum = 0
einander mit Kommas getrennt werden.
..............................................................................................................................................
13/14 Laufindex
Da in Zeile 14 auf die Array-Elemente direkt mittels i = 0
a[ i ] zugegriffen wird, muss der Laufindex i von 0 i < N
bis N-1 laufen.
..............................................................................................................................................
14
{} statt []
Beim Zugriff auf die einzelnen Elemente eines Arrays a[ i ]
müssen eckige Klammern verwendet werden.
..............................................................................................................................................
15
N, zu viel
Der Parameter N ist zu viel.
", sum );
Programm mit Korrekturen:
1 # include < stdio .h >
2
3 # define N
10
4
5 int main ( int argc , char ** argv )
6
{
7
int i , sum , a [ N ];
8
for ( i = 0; i < N ; i = i + 1 )
9
{
10
printf ( " Bitte Wert fuer a [ % d ] eingeben : " , i ) ;
11
scanf ( " % d " , & ( a [ i ] ) ) ;
12
}
13
for ( i = 0 , sum = 0; i < N ; i = i + 1 )
14
sum = sum + a [ i ];
15
printf ( " Die Summe der % d Zahlen betraegt % d \ n " ,N , sum ) ;
16
}
Einführung in die Praktische Informatik, Wintersemester 2017/18
14-4
Teil IV: Anwendungen
Aufgabe 1: Deklaration einfacher Arrays
Die folgende Übungsaufgabe ist nicht wirklich sinnvoll, sondern dient hauptsächlich dem
Einüben des Hantierens mit eindimensionalen Arrays.
1. Aufgabenstellung
Ziel der Aufgabe ist es, ein Programm zu erstellen, das folgende Arrays enthählt:
1. ein Array mit 10 Elementen vom Typ int,
2. ein Array mit
3 Elementen vom Typ char und
3. ein Array mit 100 Elementen vom Typ double.
Des Weiteren sollen die Elemente dieser drei Arrays initialisiert werden. Dies geschieht vorzugsweise in einer Schleife. Diese Schleife soll so aufgebaut sein, dass eine
Größenänderung des Arrays keine weiteren Änderungen in den Initialisierungsschleifen nach sich ziehen sollte; mit anderen Worten: Eine Größenänderung sollte durch
eine einzige Modifikation vollständig realisiert sein.
2. Kodierung
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
14-5
# include < stdio .h >
# define A_SIZE
# define B_SIZE
# define C_SIZE
10
3
100
int main ( int argc , char ** argv )
{
int i , a [ A_SIZE ];
char b [ B_SIZE ];
double c [ C_SIZE ];
for ( i = 0; i < A_SIZE ; i = i + 1 )
a [ i ] = 0;
for ( i = 0; i < B_SIZE ; i = i + 1 )
b [ i ] = ’A ’;
for ( i = 0; i < C_SIZE ; i = i + 1 )
c [ i ] = 0.0;
}
Wintersemester 2017/18, Einführung in die Praktische Informatik
Aufgabe 2: Implizite Größendefinitionen
Wir haben gelernt, dass man in der Programmiersprache C die Größe eines Arrays auch
indirekt und zwar durch die initialisierte Definition festlegen kann. Gegenstand dieser Aufgabe ist das aktive Einüben dieses Konzeptes.
1. Aufgabenstellung
Entwickle ein kleines C-Programm, in dem die Größen von mindestens vier Arrays
implizit durch ihre Initialisierung definiert werden. Zwei Beispieldefinitionen sind
bereits weiter unten angegeben.
Zur weiteren Verwendung der Größen, beispielsweise in Initialisierungsschleifen, ist
die Größe jedes Arrays durch ein geeignetes #define-Makro zu berechnen“.
”
Zur Bestätigung, dass alles korrekt abgelaufen ist, sind die einzelnen Elemente mittels
geeigneter Schleifen auszugeben. In diesen Schleifen sind natürlich oben erwähnte
#define-Makros zu verwenden.
2. Pflichtenheft
Aufgabe :
Eingabe :
Ausgabe :
Sonderfälle :
Korrekte Definition von Arrays mittels Initialisierung
Eingaben werden nicht benötigt
Größe und Inhalt der Arrays als Gegenprobe“
”
Da es keine Eingaben gibt, können auch keine Problemfälle auftreten
3. Testdaten
Array
Typ
Initialwerte
C-Definitionen
a
int
1, 2, 3, 4
x
double
1.0, 2.0
int
a[] = {1, 2, 3, 4 }
#define A SIZE sizeof( a )/sizeof(a[
double x[] = { 1.0, 2.0 }
#define X SIZE sizeof( x )/sizeof(x[
char
c[] = { ’H’, ’i’ }
#define C SIZE sizeof( c )/sizeof(c[
char
m[] = { 98, 99, 100 }
#define M SIZE sizeof( m )/sizeof(m[
c
m
char
char
’H’, ’i’
98, 99, 100
Einführung in die Praktische Informatik, Wintersemester 2017/18
0 ])
0 ])
0 ])
0 ])
14-6
4. Kodierung
1 # include < stdio .h >
2
3 int main ( int argc , char ** argv )
4
{
5
int a [] = { 1 , 2 , 3 , 4 };
6
# define A_SIZE
sizeof ( a ) / sizeof ( a [0])
7
8
double x [] = { 1.0 , 2.0 };
9
# define X_SIZE
sizeof ( x ) / sizeof ( x [0])
10
11
char c [] = { ’H ’ , ’i ’ };
12
# define C_SIZE
sizeof ( c ) / sizeof ( c [0])
13
14
char m [] = { 98 , 99 , 100 };
15
# define M_SIZE
sizeof ( m ) / sizeof ( m [0])
16
17
int i ;
18
printf ( " a [ % d ]: " , A_SIZE ) ;
19
for ( i = 0; i < A_SIZE ; i = i + 1 )
20
printf ( " % d " , a [ i ] ) ;
21
printf ( " \ n " ) ;
22
printf ( " x [ % d ]: " , X_SIZE ) ;
23
for ( i = 0; i < X_SIZE ; i = i + 1 )
24
printf ( " % e " , x [ i ] ) ;
25
printf ( " \ n " ) ;
26
printf ( " c [ % d ]: " , C_SIZE ) ;
27
for ( i = 0; i < C_SIZE ; i = i + 1 )
28
printf ( " % c " , c [ i ] ) ;
29
printf ( " \ n " ) ;
30
printf ( " m [ % d ]: " , M_SIZE ) ;
31
for ( i = 0; i < M_SIZE ; i = i + 1 )
32
printf ( " % c " , m [ i ] ) ;
33
printf ( " \ n " ) ;
34
}
14-7
Wintersemester 2017/18, Einführung in die Praktische Informatik
Herunterladen