• Keine Ergebnisse gefunden

¨Ubungspaket 14 Eindimensionale Arrays

N/A
N/A
Protected

Academic year: 2021

Aktie "¨Ubungspaket 14 Eindimensionale Arrays"

Copied!
8
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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.

(2)

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

(3)

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

(4)

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 ]

(5)

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 }

(6)

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 ;

(7)

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 ])

(8)

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 }

Referenzen

ÄHNLICHE DOKUMENTE

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

” eben“ eine kleine ¨ Ubung zu mehrdimensionalen Arrays nachschieben. Mehrdimensionale Arrays sind eine einfache Er- weiterung der eindimensionalen Arrays und eigentlich jedem aus

Ziel dieser Aufgabe ist es, beide Funktionen in eine generalisierte Initialisierungs- funktion zu ¨ uberf¨ uhren.. Dazu m¨ ussen wir sie lediglich um zwei Parameter erweitern, die

” eben“ eine kleine ¨ Ubung zu mehrdimensionalen Arrays nachschieben. Mehrdimensionale Arrays sind eine einfache Er- weiterung der eindimensionalen Arrays und eigentlich jedem aus

Aufgabe : eine generalisierte Funktion zur Initialisieren eines Zeichen-Arrays Parameter : drei Parameter: Anfangswert, Array, Gr¨ oße.. Ausgabe : die Inhalte der beiden

läuft durch die array Elemente setzt das erste array Element auf 500 setzt das zweite array Element auf 1000 setzt das dritte array Element auf 3000. setzt das vierte

Methode kontoEroeffnen in der Klasse Bank public boolean kontoEroeffnen(int kontoNr,.

For one sin- gle plane wave, the conversion improves the performance in terms direction dependent loudness, source width, and angular mapping accuracy. The improvement compared to