• Keine Ergebnisse gefunden

Zeichenketten und Strukturen

N/A
N/A
Protected

Academic year: 2022

Aktie "Zeichenketten und Strukturen"

Copied!
5
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Einf¨ uhrung in die Programmierung

Bachelor of Science

Prof. Dr. Rethmann

Fachbereich Elektrotechnik und Informatik Hochschule Niederrhein

WS 2009/10

Ubersicht ¨

Arrays

Datentypen, Operatoren und Kontrollstrukturen Funktionen und Zeiger

Zeichenketten und Strukturen

Dateioperationen und Standardbibliotheken strukturierte Programmierung

modulare Programmierung

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 2 / 67

Zeichenketten

Zeichenketten belegen einen zusammenh¨angenden Speicherbereich und k¨onnen daher als Array betrachtet werden.

# include < stdio .h >

void main (void) {

char str1 [] = { ’H ’ , ’a ’ , ’l ’ , ’l ’ , ’o ’ , ’ \0 ’ };

char str2 [] = " Welt " ;

printf ( " %s , % s !\ n " , str1 , str2 );

}

H a l l o \0 W e l t \0

str1 str2

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 3 / 67

Zeichenketten

Eine Array-Deklaration definiert einen Zeiger auf das erste Element des Arrays.

# include < stdio .h >

void main (void) {

char str1 [] = " Hallo " ; char * str2 = " Welt " ;

printf ( " %s , % s !\ n " , str1 , str2 );

}

W e l t \0 str1 str2

H a l l o \0

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 4 / 67

Zeichenketten

# include < stdio .h >

int s t r l e n g t h (char * str ) { int n = 0;

while ( str [ n ] != ’ \0 ’) n += 1;

return n ; }

void main (void) {

char * wort = " D u d e l s a c k p f e i f e " ; int len = s t r l e n g t h ( wort );

printf ( " length (% s ) = % d \ n " , wort , len );

}

\0 str

wort

D u d e l s a . . . f e

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 5 / 67

Arrays und Zeichenketten

Ist das folgende Programm korrekt? Kann ein Zeiger wie ein Array benutzt werden?

# include < stdio .h >

void main (void) { int i ;

char * captain = " Picard " ;

printf ( " captain = % s \ n " , captain );

printf ( " captain = " );

for ( i = 0; i < 6; i ++) printf ( " % c " , captain [ i ]);

printf ( " \ n " );

}

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 6 / 67

Arrays und Zeichenketten

Ist das folgende Programm korrekt? Kann ein Zeiger auf einen anderen Speicherbereich zeigen?

# include < stdio .h >

void main (void) {

char * captain = " Picard " ;

printf ( " captain = % s \ n " , captain );

captain = " Sisco " ;

printf ( " captain = % s \ n " , captain );

}

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 7 / 67

Arrays und Zeichenketten

Ist das folgende Programm korrekt?

# include < stdio .h >

void main (void) { int i ;

char * c a p t a i n 1 = " Picard " ; char * c a p t a i n 2 = " Sisco " ;

printf ( " 1. captain = % s \ n " , c a p t a i n 1 );

printf ( " 2. captain = % s \ n " , c a p t a i n 2 );

for ( i = 0; i < 6; i ++) c a p t a i n 1 [ i ] = c a p t a i n 2 [ i ];

printf ( " 1. captain = % s \ n " , c a p t a i n 1 );

printf ( " 2. captain = % s \ n " , c a p t a i n 2 );

}

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 8 / 67

(2)

Arrays und Zeichenketten

Vorsicht:Eindimensionale Arrays k¨onnen auch als Zeiger deklariert werden, aber

Zeichenkonstanten liegen imProgrammsegment, Arrays werden imDatensegmentabgelegt.

Beispiel:

char ar [] = " Riker " ; char * st = " Worf " ; ar [0] = ’X ’; /* o . k .! */

st = " Troi " ; /* o . k .! */

st [0] = ’X ’; /* s e g m e n t a t i o n fault ! */

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 9 / 67

Arrays und Zeichenketten

# include < stdio .h >

/* P r o t o t y p e n */

void output (int *a , int n );

void tausche (int *a , int n );

/* H a u p t p r o g r a m m */

main () {

int b [6] = {1 , 2 , 3 , 4 , 5 , 6};

output (b , 6);

tausche (b , 6);

output (b , 6);

}

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 10 / 67

Arrays und Zeichenketten

void output (int *a , int n ) { int i ;

for ( i = 0; i < n ; i ++) printf ( " %4 d \ n " , a [ i ]);

}

void tausche (int *a , int n ) { int i , j ;

for ( i = 0 , j = n -1; i < j ; i ++ , j - -) { int t = a [ i ];

a [ i ] = a [ j ];

a [ j ] = t ; }

}

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 11 / 67

Arrays und Zeichenketten

Vorsicht:Arrays lassen sich nicht mit==vergleichen.

Beispiel:

int a [3] = {1 , 2 , 3};

int b [3] = {1 , 2 , 3};

if ( a == b ) ...

Beispiel:

char c1 [10] , c2 [10];

scanf ( " % s " , c1 );

scanf ( " % s " , c2 );

if ( c1 == c2 ) ...

Beispiel:

char * c1 = " Picard " ; char * c2 = " Picard " ; if ( c1 == c2 ) ...

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 12 / 67

Arrays und Zeichenketten

Bei einem Vektor bedeutetconst, dass die Elemente nicht ver¨andert werden k¨onnen.

Beispiel:

const int arr[] = {1, 2, 3, 4};

Dann ist eine Zuweisung wiearr[0] = 0;verboten!

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 13 / 67

Arrays und Zeichenketten

Zeiger sind Adressen, also positive, ganze Zahlen. Daher sind auch Rechenoperationen wie Addition und Subtraktion erlaubt:

# include < stdio .h >

void main (void) { char * s = " Hallo " ; int i = 0;

while (*( s + i ) != ’ \0 ’) { printf ( " % c " , *( s + i ));

i += 1;

}

printf ( " \ n " );

}

s[i]wird vom Compiler ¨ubersetzt zu*(s+i)!

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 14 / 67

Arrays und Zeichenketten

# include < stdio .h >

void main (void) {

int values [] = { 6 , 5 , 4 , 3 , 2 , 1};

int *p , i = 0;

p = & values [0];

for ( i = 0; i < 6; i ++) printf ( " % d \ n " , *( p + i ));

p = & values [0];

for ( i = 0; i < 6; i ++) { printf ( " % d \ n " , * p );

p += 1;

} }

Sprachdefinition: Zeigtpauf ein Element eines Arrays, dann zeigt p + jauf dasj-te Element hinterp.

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 15 / 67

Arrays und Zeichenketten

Vorsicht:Es sind auch negative Werte f¨urjzul¨assig und es findet keine Bereichs¨uberpr¨ufung statt.

Beispiel:

char * cp ;

char z [4] = { ’1 ’ , ’2 ’ , ’3 ’ , ’4 ’ };

cp = & z [1]; /* cp zeigt auf z [1] */

cp ++; /* cp zeigt auf z [2] */

printf ( " z [2] = % c \ n " , * cp );

printf ( " z [ -8] = % c \ n " , *( cp -10));

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 16 / 67

(3)

Dynamische Speicheranforderung

Arrays: zur ¨Ubersetzungszeit muss bekannt sein, wie viele Elemente gespeichert werden sollen (nicht in C99) In der Regel ist diese Gr¨oße nicht vorhersagbar.

→Speicher wird zur Laufzeit (dynamisch) angefordert

void * malloc(size_t size)liefert Zeiger auf Speicherbereich der Gr¨oßesize, oderNULL, wenn die Anfrage nicht erf¨ullt werden kann. Der Bereich ist nicht initialisiert.

Beispiel:

int * pa , i , len ; ...

pa = (int *) malloc ( len * 4);

if ( pa != NULL ) ...

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 17 / 67

Dynamische Speicheranforderung

Der un¨are Operatorsizeofliefert die Anzahl der Bytes f¨ur ein Objekt oder einen Typ.

Syntax:

sizeof < object >

sizeof( type )

Beispiel:

int i , j ; j = sizeof i ; j = sizeof(int);

sizeofdarf nicht auf Operanden vom Typ Funktion, unvollst¨andige Typen (Felder ohne Gr¨oßenangabe) oder void-Typen angewendet werden.

Beispiel:

pa = (int *) malloc ( len * sizeof(int));

v = malloc ( len * sizeof(int [])); /* falsch ! */

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 18 / 67

Dynamische Speicheranforderung

Die Funktionvoid free(void *p)gibt den Speicherbereich, auf denpzeigt, wieder frei. Der Speicherbereich muss vorher ¨uber einen Aufruf vonmallocallokiert worden sein!

Beispiel:

int * array ; ...

array = (int *) malloc ( len * sizeof(int));

if ( array == NULL ) return -1;

for ( i = 0; i < len ; i ++) array [ i ] = rand () % 256;

...

free ( array );

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 19 / 67

Pointer Fun

www.cs.stanford.edu/cslibrary/PointerFunCppBig.avi

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 20 / 67

Aufz¨ ahlungstyp

Derenum-Typ: Konstanten werden Integer-Werte zugewiesen, Konstanten sind ansprechbar ¨uber Bezeichner.

Beispiel:

enum Tag { Mo , Di , Mi , Do , Fr , Sa , So };

Die Werte werden intern auf fortlaufende, nicht-negative ganze Zahlen abgebildet, beginnend bei 0.

Im Beispiel:Mo == 0,Di == 1,Mi == 2usw.

Eine solche Abbildung kann auch direkt definiert werden:

enum Tag { Mo = 1 , Di = 2 , Mi = 4 , Do = 8 , Fr = 16 , Sa = 32 , So = 64};

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 21 / 67

Aufz¨ ahlungstyp

Jeder Name darf nur einmal verwendet werden, d.h. Namen in verschiedenen Aufz¨ahlungen m¨ussen sich unterscheiden.

Die Werte in einer Aufz¨ahlung k¨onnen gleich sein.

Variablen k¨onnen mit Aufz¨ahlungstypen deklariert werden.

Sie unterliegen nicht notwendigerweise der Typpr¨ufung.

Eine Aufz¨ahlungskonstante des Typs kann als Wert zugewiesen werden.

Sie k¨onnen in logischen Ausdr¨ucken verglichen und in arithmetischen Ausdr¨ucken verkn¨upft werden.

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 22 / 67

Aufz¨ ahlungstyp

Beispiel:

enum Tag { MO , DI , MI , DO , FR , SA , SO };

enum Monat { JAN , FEB , MAR , APR , MAY , JUN , JUL , AUG , SEP , OCT , NOV , DEC };

enum Tag t = MO ; enum Monat m = JAN ; if ( t == DI )

...

if ( t == m ) /* TRUE , denn : Mo == 0 == Jan */

...

t = JAN + 3; /* kein Fehler , keine Warnung ! */

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 23 / 67

Strukturen

Motivation:

Oft sind Daten aus einfacheren Daten zusammengesetzt:

Buch: Autor, Titel, Verlag, Jahr, ISBN Adresse: Name, Vorname, Straße, HNr, PLZ, Ort

Um diese Zusammengeh¨origkeit auszudr¨ucken, k¨onnen wir Daten mittelsstructstrukturieren.

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 24 / 67

(4)

Strukturen

Zusammenfassung von Daten unterschiedlichen Typs.

Syntax:

struct < name > {

< member_1 >;

....

< member_n >;

}

Beispiel:

struct adresse { char * str , * ort ; int hnr , plz ; long tel ; }

Semantik:

<name>ist derTypname der Struktur(kann entfallen)

<member_i>ist eine Variablendeklaration

die Variablen der Struktur heißenKomponentenoder auch Attribute

ok: gleiche Komponente in verschiedenen Strukturen

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 25 / 67

Strukturen

Strukturen erm¨oglichen dieOrganisation von Daten.

Einestruct-Vereinbarung definiert einen Datentyp.

Hinter der Komponentenliste kann eine Liste von Variablen stehen, genau wie bei einem elementaren Datentyp:

Beispiel:

int a , b , c ; struct datum {

int tag , monat , jahr ; } x , y , z ;

Beide Definitionen vereinbaren Variablen des angegebenen Typs und reservieren Speicherplatz.

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 26 / 67

Strukturen

Die Komponenten einer Struktur werden mit dem Punktoperator. angesprochen.

linker Operand:Strukturvariable rechter Operand:Komponentenname

Beispiel:

struct datum {

int tag , monat , jahr ; } x , y , z ;

x . tag = 23;

x . monat = 10;

x . jahr = 2008;

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 27 / 67

Strukturen

Strukturen d¨urfen andere Strukturen enthalten:

struct m i t a r b e i t e r {

char * name , * vorname , * persnr ; struct adresse adresse ; int gehalt ;

}

Strukturen k¨onnen in Vektoren gespeichert werden:

struct m i t a r b e i t e r p e r s o n a l [20];

...

for ( i = 0; i < 20; i ++)

printf ( " Name [% d ] = % s \ n " , i , p e r s o n a l [ i ]. name );

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 28 / 67

Strukturen

Vorsicht:Strukturen d¨urfen sich nicht selbst enthalten!

→wieviel Speicherplatz soll bereitgestellt werden?

Rekursive Strukturen:In der Strukturdeklaration wird ein Zeiger auf die Struktur selbst vereinbart.

Beispiel:

struct liste {

struct m i t a r b e i t e r value ; struct liste * prev , * next ; } fischer , meier , schulze ;

prev value

next

prev value

next

prev value

next ...

...

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 29 / 67

Strukturen

Abk¨urzende Schreibweise f¨ur Zeiger auf Strukturen:

(*name).komponente entspricht name->komponente

Beispiel:

fischer . next = & meier ; fischer . prev = NULL ;

fischer . value . name = " Fischer " ; ...

schulze . next = NULL ; schulze . prev = & meier ;

schulze . value . name = " Schulze " ;

for ( l = & fischer ; l != NULL ; l = l - > next ) printf ( " % s \ n " , l - > value . name );

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 30 / 67

Strukturen

wird mittelstypedefeiner Struktur einSynonymzugewiesen, dann kann das Synonym wie ein einfacher Datentyp genutzt werden

Beispiel:

typedef struct { char * str , * ort ; int hnr , plz ; long tel ; } a d r e s s e _ t ; a d r e s s e _ t adr ; adr . str = " Waldweg " ; ...

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 31 / 67

Strukturen

eine Synonym-Vereinbarung kann andere bereits definierte Synonyme enthalten

Beispiel:

typedef struct {

char * name , * vorname , * persnr ; a d r e s s e _ t adresse ;

int gehalt ; } m i t a r b e i t e r _ t ; m i t a r b e i t e r _ t arb ; arb . name = " Maier " ; ...

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 32 / 67

(5)

Strukturen

Soll einer rekursiven Struktur mittelstypedefein Synonym zugewiesen werden, darf der Strukturnamenicht entfallen.

Beispiel:

typedef struct liste { m i t a r b e i t e r _ t value ; struct liste * prev , * next ; } liste_t ;

liste_t l ;

m i t a r b e i t e r _ t fischer , meier , schulze ;

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 33 / 67

Strukturen

Initialisierung:

Der Struktur-Definition folgt eine Liste von konstanten Ausdr¨ucken f¨ur die Komponenten.

Beispiele:

a d r e s s e _ t a = { " Am Bach " , " Aldrup " , 4 , 12345 , 4711};

m i t a r b e i t e r _ t m = { " Fischer " , " Anna " , " 08 F42W " , { " Am Bach " , " Aldrup " , 4 , 12345} , 2500};

liste_t l = {{ " Fischer " , " Anna " , " 08 F42W " , { " Am Bach " , " Aldrup " , 4 , 12345 , 4711}} , 0 , 0};

Anmerkungen:

Die Reihenfolge der Komponenten ist zu beachten!

Es m¨ussen nicht alle Komponenten initialisiert werden.

Einf¨uhrung in die Programmierung Zeichenketten und Strukturen 34 / 67

Referenzen

ÄHNLICHE DOKUMENTE

❏ Unplug the printer and refer servicing to qualified service personnel under the following conditions: The power cord or plug is damaged; liquid has entered the printer; the

Folgern Sie induktiv, daß daß f¨ ur jedes Polynom f ∈ k[X] ein Erweite- rungsk¨ orper existiert, in dem f Produkt linearer Polynome ist. Anleitung: Betrachten Sie den

Klepněte na tlačítko Start, v systému Windows XP přejděte na příkaz All Programs (Všechny programy) nebo v systému Windows ME, 98 a 2000 přejděte na příkaz

Aby z niego skorzystać, kliknij przycisk Start, wskaż pozycję All Programs (Wszystkie programy) w systemie Windows XP lub Programs (Programy) w systemach Windows Me, 98, 95 i

Pentru a face acest lucru, faceţi clic pe Start, indicaţi spre All Programs (Toate programele) în Windows XP sau spre Programs (Programe) în Windows Me, 98, 95 sau 2000, indicaţi

Bunun için, Start'ı (Başlat) tıklatın, Windows XP'de All Programs'ı (Tüm Programlar) veya Windows Me, 98 veya 2000'de Programs'ı (Programlar) seçin, EPSON'ı seçin, son olarak

Figure 1 shows the time series of the key variables of interest: the financial sector share of value added, the interest-rate spread, the average size (in terms of the number of

Male body size and paternal behaviour in smallmouth bass, Micropterus dolomieui (Pisces: Centrarchidae). A simple spatial alteration task for assessing memory function in