G Felder und Strukturen

Werbung
G Felder und Strukturen
G.2 … Initialisierung eines Feldes (2)
■ Felder der Speicherklasse automatic (lokale Felder) können in altem
K&R-C nicht initialisiert werden
ANSI-C erlaubt die Initialisierung von Feldern
G.1 Eindimensionale Felder
■ eine Reihe von Daten desselben Typs kann zu einem Feld
zusammengefaßt werden
■ Felder des Typs char können auch durch String-Konstanten initialisiert
werden
■ bei der Definition wird die Anzahl der Feldelemente angegeben, die
Anzahl ist konstant!
char name1[5] = "Otto";
char name2[] = "Otto";
■ der Zugriff auf die Elemente erfolgt durch Indizierung, beginnend bei Null
■ Definition eines Feldes
Typ
Name
konstanter
Ausdruck
[
]
Initialisierung
;
■ Beispiele:
int x[5];
double f[20];
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.1
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
G.2 Initialisierung eines Feldes
{
konstanter
Ausdruck
G.3
G.3 Zugriffe auf Feldelemente
■ Indizierung:
,
=
G-Felder.doc 1998-06-24 10.04
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
Feldname
}
Ausdruck
[
]
wobei: 0 <= Wert(Ausdruck) < Feldgröße
■ Ein Feld kann durch eine Liste von konstanten Ausdrücken, die durch
Komma getrennt sind, initialisiert werden
■ Beispiele:
prim[0]
prim[1]
name[1]
name[4]
int prim[4] = {2, 3, 5, 7};
char name[5] = {’O’, ’t’, ’t’, ’o’, ’\0’};
■ wird die explizite Felddimensionierung weggelassen, so bestimmt die
Zahl der Initialisierungskonstanten die Feldgröße
float v1[4], v2[4], sum[4];
int i;
...
for ( i=0; i < 4; i++ )
sum[i] = v1[i] + v2[i];
for ( i=0; i < 4; i++ )
printf("sum[%d] = %f\n", i, sum[i]);
■ werden zu wenig Initialisierungskonstanten angegeben, so werden die
restlichen Elemente mit 0 initialisiert
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
’2’
’3’
’t’
’\0’
■ Beispiel Vektoraddition:
int prim[] = {2, 3, 5, 7};
char name[] = {’O’, ’t’, ’t’, ’o’, ’\0’};
C-Ing
==
==
==
==
G.2
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.4
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
G.4 Mehrdimensionale Felder
2 Initialisierung eines
mehrdimensionalen Feldes
■ neben eindimensionalen Felder kann man auch mehrdimensionale
Felder vereinbaren
G.4 Mehrdimensionale Felder
■ ein mehrdimensionales Feld kann - wie ein eindimensionales Feld durch eine Liste von konstanten Werten, die durch Komma getrennt sind,
initialisiert werden
◆ ihre Bedeutung in C ist gering
■ Definition eines mehrdimensionalen Feldes
■ wird die explizite Felddimensionierung weggelassen, so bestimmt die
Zahl der Initialisierungskonstanten die Größe des Feldes
Typ
Name
[
konstanter
Ausdruck
]
Initialisierung
;
■ Beispiel:
int feld[3][4]
{ 1, 3, 5,
{ 2, 4, 6
};
feld[1][3] und
■ Beispiel:
int matrix[4][4];
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.5
C-Ing
G.4 Mehrdimensionale Felder
■ Indizierung:
Feldname
feld[2][0-3] werden in dem Beispiel nicht initialisiert!
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
1 Zugriffe auf Feldelemente
= {
7}, /* feld[0][0-3] */
} /* feld[1][0-2] */
G-Felder.doc 1998-06-24 10.04
G.7
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
G.5 Eindimensionale Felder als Funktionsparameter
■ ganze Felder können in C nicht by-value übergeben werden
[
A1
]
[
An
■ wird einer Funktion der Feldname als Parameter übergeben, kann sie in
gleicher Weise wie der Aufrufer auf die Feldelemente zugreifen (und
diese verändern!)
]
wobei: 0 <= Ai < Größe der Dimension i des Feldes
n = Anzahl der Dimensionen des Feldes
■ bei der Deklaration des formalen Parameters wird die Feldgröße
weggelassen
■ Beispiel:
➤
die Feldgröße ist automatisch durch den aktuellen Parameter
gegeben
➤
ggf. ist die Feldgröße über einen weiteren int-Parameter der
Funktion explizit mitzuteilen
➤
die Länge von Zeichenketten in char-Feldern kann normalerweise
durch Suche nach dem \0-Zeichen bestimmt werden
feld[2][3] = 10;
■ wird ein Feldparameter als const deklariert, können die Feldelemente
innerhalb der Funktion nicht verändert werden (ANSI)
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.6
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.8
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
1 Beispiele
G.5 Eindimensionale Felder als Funktionsparameter
■ Bestimmung der Länge einer Zeichenkette (String)
G.6 Strukturen
1 Motivation
int strlen(const char string[])
{
int i=0;
while (string[i] != ’\0’) ++i;
return(i);
}
■
Felder fassen Daten eines einheitlichen Typs zusammen
➤
ungeeignet für gemeinsame Handhabung von Daten
unterschiedlichen Typs
■ Beispiel: Daten eines Studenten
– Nachname
– Vorname
– Geburtsdatum
– Matrikelnummer
– Übungsgruppennummer
– Schein bestanden
char nachname[25];
char vorname[25];
char gebdatum[10];
int matrnr;
short gruppe;
char best;
■ Möglichkeiten der Repräsentation in einem Programm
◆ einzelne Variablen
➔
sehr umständlich, keine "Abstraktion"
◆ Datenstrukturen
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.9
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
1 Beispiele (2)
G.5 Eindimensionale Felder als Funktionsparameter
G.11
G-Felder.doc 1998-06-24 10.04
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
2 Deklaration eines Strukturtyps
G.6 Strukturen
■ Durch eine Strukturtyp-Deklaration wird dem Compiler der Aufbau einer
Datenstruktur unter einem Namen bekanntgemacht
■ Konkateniere Strings
void strcat(char to[], const char from[])
{
int i=0, j=0;
while (to[i] != ’\0’) i++;
while ( (to[i++] = from[j++]) != ’\0’ )
;
}
➥ deklariert einen neuen Datentyp (wie int oder float)
■ Syntax
struct
Strukturtypname
{
Komponenten-Deklaration
}
;
■ Funktionsaufruf mit Feld-Parametern
➤
■ Strukturtypname
als aktueller Parameter beim Funktionsaufruf wird einfach der
Feldname angegeben
◆ beliebiger Bezeichner, kein Schlüsselwort
char s1[50] = "text1";
char s2[] = "text2";
strcat(s1, s2);/* ➞ s1= "text1text2" */
strcat(s1, "text3");/* ➞ s1= "text1text2text3" */
◆ kann in nachfolgenden Struktur-Definitionen verwendet werden
■ Komponenten-Deklaration
◆ entspricht normaler Variablen-Definition, aber keine Initialisierung!
◆ in verschiedenen Strukturen dürfen die gleichen Komponentennamen
verwendet werden (eigener Namensraum pro Strukturtyp)
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.10
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.12
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
2 Deklaration eines Strukturtyps (2)
G.6 Strukturen
4 Zugriff auf Strukturkomponenten
■ .-Operator
■ Beispiele
struct student {
char nachname[25];
char vorname[25];
char gebdatum[10];
int matrnr;
short gruppe;
char best;
};
➤ x.y
≡ Zugriff auf die Komponente y der Struktur x
➤ x.y
verhält sich wie eine normale Variable vom Typ der
Strukturkomponenten y der Struktur x
■ Beispiele
struct komplex c1, c2, c3;
…
c3.re = c1.re + c2.re;
c3.im = c1.im + c2.im;
struct komplex {
double re;
double im;
};
C-Ing
G.6 Strukturen
struct student stud1;
…
if (stud1.matrnr < 1500000) {
stud1.best = ’y’;
}
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.13
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
3 Definition einer Struktur
G.6 Strukturen
G-Felder.doc 1998-06-24 10.04
5 Initialisieren von Strukturen
G.6 Strukturen
◆ Name der Struktur zusammen mit dem Datentyp bekanntmachen
■ Srukturen können — wie Variablen und Felder — bei der Definition
initialisiert werden
◆ Speicherplatz anlegen
■ Beispiele
■ Die Definition einer Struktur entspricht einer Variablen-Definition
■ Eine Struktur ist eine Variable, die ihre Komponentenvariablen umfaßt
struct student stud1 = {
"Meier", "Hans", "24.01.1970", 1533180, 5, ’n’
};
■ Syntax
struct komplex c1 = {1.2, 0.8}, c2 = {0.5, 0.33};
,
struct
Strukturtypname
G.15
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
Strukturname
;
!!! Vorsicht
bei Zugriffen auf eine Struktur werden die Komponenten durch die
Komponentennamen identifiziert,
bei der Initialisierung jedoch nur durch die Postion
■ Beispiele
struct student stud1, stud2;
struct komplex c1, c2, c3;
➥ potentielle Fehlerquelle bei Änderungen der Strukturtyp-Deklaration
■ Strukturdeklaration und -definition können auch in einem Schritt
vorgenommen werden
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.14
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.16
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
6 Strukturen als Funktionsparameter
G.6 Strukturen
■ Strukturen können wie normale Variablen an Funktionen übergeben
werden
8 Strukturen in Strukturen
■ Die Komponenten einer Struktur können wieder Strukturen sein
■ Beispiel
◆ Übergabesemantik: call by value
struct name {
char nachname[25];
char vorname[25];
};
➤ Funktion erhält eine Kopie der Struktur
➤ auch wenn die Struktur ein Feld enthält, wird dieses komplett kopiert!
!!! Unterschied zur direkten Übergabe eines Feldes
struct student {
struct name name;
char gebdatum[10];
int matrnr;
short gruppe;
char best;
}
■ Strukturen können auch Ergebnis einer Funktion sein
➤
Möglichkeit mehrere Werte im Rückgabeparameter zu transportieren
■ Beispiel
struct komplex komp_add(struct komplex x, struct komplex y) {
struct komplex ergebnis;
ergebnis.re = x.re + y.re;
ergebnis.im = x.im + y.im;
return(ergebnis);
}
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.17
G.6 Strukturen
■ Von Strukturen können — wie von normale Datentypen — Felder gebildet
werden
struct prof {
struct name pname;
char gebdatum[10];
int lehrstuhlnr;
}
struct student stud1;
strcpy(stud1.name.nachname, "Meier");
if (stud1.name.nachname[0] == ’M’) {
…
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
7 Felder von Strukturen
G.6 Strukturen
G-Felder.doc 1998-06-24 10.04
G.19
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
9 Compilerabhängige Eigenschaften
G.6 Strukturen
■ Funktionsparameter
◆ alte C-Compiler erlauben die Übergabe ganzer Strukturen als
Funktionsparameter oder -rückgabewert nicht
■ Beispiel
➤ dann nur Zeiger auf Strukturen möglich
struct student gruppe8[35];
int i;
for (i=0; i<35; i++) {
printf("Nachname %d. Stud.: ", i);
scanf("%s", gruppe8[i].nachname);
…
gruppe8[i].gruppe = 8;
■ Zuweisungen
◆ moderne C-Compiler erlauben die Zuweisung kompletter Strukturen
◆ Beispiel
struct komplex c1, c2;
c2 = c1;
if (gruppe8[i].matrnr < 1500000) {
gruppe8[i].best = ’y’;
} else {
gruppe8[i].best = ’n’;
}
◆ wenn der Compiler dies nicht erlaubt, komponentenweise zuweisen
c2.re = c1.re; c2.im - c1.im;
■ Namen von Strukturkomponenten
}
C-Ing
◆ alte C-Compiler erlauben nicht gleiche Komponentennamen in
unterschiedlichen Strukturen
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.18
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
C-Ing
Einführung in die Programmierung für Ingenieure — C
 Jürgen Kleinöder, Universität Erlangen-Nürnberg, IMMD IV, 1998
G-Felder.doc 1998-06-24 10.04
G.20
Reproduktion jeder Art oder Verwendung dieser Unterlage, außer zu Lehrzwecken an der Universität Erlangen-Nürnberg, bedarf der Zustimmung des Autors.
Herunterladen