Inhalt. 4.4 Fortsetzung: Zeiger (engl. Pointer)

Größe: px
Ab Seite anzeigen:

Download "Inhalt. 4.4 Fortsetzung: Zeiger (engl. Pointer)"

Transkript

1 Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) und Zeigern 4.5 Zeichen und Zeichenketten 4.6 Funktionen 4.7 Strukturen 4.8 Typen, Variable und Konstante Peter Sobe Fortsetzung: Zeiger (engl. Pointer) Zeiger Ein Zeiger (engl. Pointer) speichert eine Adresse, unter der ein Wert im Speicher des Computers gespeichert werden kann. Eine Variable im Gegensatz speichert einen Wert. Der Name eines Zeigers ist mit einer Adresse verbunden, ein Variablenname dagegen mit einem bestimmten Wert. Zeiger werden z.b. für folgende Zwecke benutzt: Dynamische Speicherverwaltung Parameterübergabe in Funktionen Zeichenkettenverarbeitung Peter Sobe 73

2 Definition von Zeigervariablen Bei der Definition eines Zeigers wird ein Stern ("*") vor den Bezeichner geschrieben. Werden die Bezeichner mit Kommas getrennt in einer Definitionsliste angegeben, so muss der Stern vor jeden einzelnen Bezeichner geschrieben werden, der als Zeiger definiert werden soll. long *LZ, LZ2; // LZ ist ein Zeiger, LZ2 eine Variable float summe, * psumme; // summe ist eine Variable, // psumme ein Zeiger Für eine gute Übersichtlichkeit, besser Variablen und Zeiger in jeweils einer eigenen Zeile definieren! float summe; float* psumme; Peter Sobe 74 Veranschaulichung einer Zeigervariablen Der Speicher eines Rechners wird über Adressen verwaltet, die die Speicherstellen (Bytes) linear durchnummerieren. Die Nummer des angesprochenen Bytes ist die Adresse. Hier ein Beispiel (stark vereinfacht) : float summe; float* psumme = &summe; // Zeiger mit Adresse von summe 4 Inhalt summe 12 psumme Adresse Zugriff auf summe wird durch Compiler mit Zugriff auf Adresse 4 ersetzt Peter Sobe 75

3 Der &-Operator Zeiger - Adressoperator Dieser Operator ermittelt von einer Variable deren Adresse im Speicher. Er wird mit dem Zeichen "&" (Ampersand) symbolisiert. Zum Beispiel: int Io = 1024; int* IZ = &Io; // IZ erhält die Adresse von Io // und nicht den Wert 1024 Ein Zeiger kann auch mit einem anderen Zeiger desselben Typs initialisiert werden. // jetzt enthält auch IZ2 die Adresse von Io int* IZ2 = IZ; int ** IZ4 = &IZ; // Zeiger auf Zeiger Peter Sobe 76 Ein Beispiel zur Benutzung von Zeigern void swap(float* x1, float* x2) { // zwei Werte vertauschen float temp = *x1; *x1 = *x2; *x2 = temp; void swap2(float** x1, float** x2) { // zwei Zeiger vertauschen float* temp = *x1; *x1 = *x2; *x2 = temp; int main(void) { float a, b, *pa, *pb; a = 1.0, b = 2.0, pa = &a, pb = &b; swap(&a, &b); /* Tauscht die Werte a und b wirklich* / swap2(&pa, &pb); /* tauscht nur die Pointer */ Peter Sobe 77

4 Der * - Operator * ist der Inhaltsoperator. Damit kann ein Zeiger dereferenziert werden, d.h. auf den Wert der Variable (auf die gezeigt wird) zugegriffen werden. int i = 1234; int* pi; // pi ist also vom Typ Zeiger auf int pi = &i; // pi zeigt jetzt auf i *pi = 5678; // i hat jetzt den Wert 5678, // der Zugriff auf i erfolgt hier durch Dereferenzieren // des Zeigers pi. Dereferenzierung: Typ* ptr; // hier wird eine Zeigervariable definiert *ptr =...;... = *ptr; // hier wird ptr dereferenziert // und damit auf den Inhalt zugegriffen Peter Sobe 78 Zeiger und Typen Jeder Zeiger ist mit einer Variablen eines bestimmten Typs verbunden Der Datentyp gibt den Typ des Datenobjekts an, das mit Hilfe dieses Zeigers adressiert wird. Ein Zeiger des Typs int zeigt zum Beispiel auf ein Objekt des Typs int. int intvar; int* intzeiger = &intvar; Um auf ein Objekt des Typs double zu zeigen, muss der Zeiger mit dem Datentyp double definiert werden. double dvar; double* dzeiger = &dvar; Peter Sobe 79

5 Zeiger - Speicherbedarf von Zeigern Der Speicherplatz, der für einen Zeiger reserviert wird, muss eine Speicheradresse aufnehmen können. Das bedeutet, dass ein Zeiger des Typs int und ein Zeiger auf einen Datentyp double normalerweise gleich groß sind. Der Typ, der einem Zeiger zugeordnet ist, gibt den Inhalt und damit auch die Größe des adressierten Speicherbereichs an. int* pint ; // pint belegt 4 Byte double* pdouble; // pdouble belegt auch 4 Byte Der Speicherplatz der für Zeiger verwendte wird ist implementierungsabhängig und typischerweise 32 oder 64 Bit (d.h. 4 oder 8 Byte lang). Peter Sobe 80 Zugriff auf Felder durch Zeiger (1) In C sind Variablen für Felder und Zeiger zuweisungskompatibel. Beispiel: int zahlenfeld[20]; int einzelzahl; int *iptr; iptr = zahlenfeld; // dem Zeiger kann der Name eines Feldes // zugewiesen werden einzelzahl = iptr[5]; // Ein Zeiger kann wie ein Feld benutzt werden Ein Feld mit Elementen eines bestimmten Typs wird als Variable wie ein Zeiger auf ein Element des Typs behandelt. Gleichzeitig kann ein Zeiger auch wie ein Feldbezeichner mit Indexklammern versehen werden. Peter Sobe 81

6 Zugriff auf Felder durch Zeiger (2) Hintergrund: int feld[10]; int* ptr = feld; // entspricht: int* ptr = &feld[0] Der Feldname entspricht damit der Adresse des ersten Feldelementes, d.h. dem mit dem Index 0. Der Zusammenhang zwischen Feldern und Zeigern wird oft bei der Übergabe von Feldern in Funktionsparametern ausgenutzt: void auswahlfunktion( int *feld, int index, int *wert ) { *wert = feld [index]; Details zu Funktionen und deren Parametern folgen später! Peter Sobe 82 Addition und Subtraktion bei Zeigern Bei der Addition (oder Subtraktion) eines ganzzahligen Wertes (z.b. 2), wird der Wert der entsprechenden Adresse um die Größe von z.b. zwei Objekten dieses Datentyps (hier int) erhöht (oder erniedrigt). Wenn z.b. ein char 1 Byte, ein int 4 Byte und ein double 8 Byte belegt, dann erhöht sich bei einer Addition um 2 zu einem Zeiger, der Wert der im Zeiger gespeicherten Adresse um 2, 8 bzw. 16 Byte. Beispiele: int i; // z.b. Adresse 0x0100 int j; // z.b. Adresse 0x0104 int k; // z.b. Adresse 0x0108 int feld[10]; // z.b. Adresse 0x010C, 0x0110, 0x int* ptr = & i; // ptr enthält Adresse von i, d.h 0x0100 ptr = ptr + 2; // ptr enthält nun 0x0108, d.h. Adresse von k ptr++; // ptr enthält nun 0x010C, d.h. Adresse feld[0] Peter Sobe 83

7 Operationen mit Zeigern (1) Einem Zeiger kann man einen Zeiger des gleichen Typs zuweisen. int* ptr1 = &i; int* ptr2 = ptr1; Ein Zeiger kann auch inkrementiert oder dekrementiert werden. So bedeutet z.b. +5 hier eine Inkrementierung um 5 Schritte mit der Schrittweite sizeof(int) : int* ptr3 = ptr2 + 5; Eine Zuweisung eines anderen Typs ist nur über Typecast möglich: char* pchar = (char*) ptr2; // typecast Peter Sobe 84 Operationen mit Zeigern (2) Es kann die Differenz zweier Zeiger gebildet werden: int feld[10]; int* ptr1 = &feld[1]; int* ptr8 = &feld[8]; int anzahl = ptr8 ptr1; // ergibt den Wert 7 // Besser: ptrdiff_t anzahl = ptr8 ptr1; ( ptrdiff_t ist in cstddef bzw. stddef.h vereinbart ) Einem Zeiger darf der Wert 0 (NULL) zugewiesen werden. Dadurch wird der Zeiger als nicht initialisierter Zeiger gekennzeichnet: int* ptr = 0; // oder: int* ptr = NULL; Die Vergleichsoperationen == und!= sind zulässig, um zwei Zeiger auf Gleichheit zu testen, d.h. ob sie auf die gleiche Adresse verweisen. Dieses hat nichts mit den Werten zu tun, die die Adressen enthalten. Peter Sobe 85

8 NULL - Zeiger Es gibt einen besonderen Zeigerwert, der als Konstante NULL definiert ist. Die interne Darstellung der NULL ist implementierungsabhängig, aber kompatibel zur ganzzahligen Null (0). NULL kann jeder Zeigervariablen zugewiesen werden, und jede Zeigervariable kann auf NULL getestet werden; p = NULL; /* Beide Anweisungen sind */ p = 0; /* korrekt und bedeutungsgleich! */... if (p==null)... /* Alle drei */ if (!p)... /* Abfragen sind korrekt */ if (p==0)... /* und bedeutungsgleich! */ Diese Operationen können auch dazu verwendet werden, um zu ermitteln, ob ein Zeiger bereits initialisiert wurde: int *ptr = 0, *ptr2;... if (ptr == 0) { // initialisiere jetzt ptr Peter Sobe 86 Weitere Bedeutung von Zeigern Zeiger zur Übergabe von Parametern an Funktionen Call by Reference Parameter sind Zeiger void function(int x, int *y) { *y = 2*x*x 3*x +5; // der Wert auf den y zeigt wird verändert Zeiger für dynamische Speicherstrukturen int *p; int anzahl_werte; // konkreter Wert ergibt sich zur Laufzeit p = malloc(anzahl_werte*sizeof(int)); Peter Sobe 87

9 Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) und Zeigern 4.5 Zeichen und Zeichenketten 4.6 Funktionen 4.7 Strukturen 4.8 Typen, Variable und Konstante Peter Sobe Zeichen und Zeichenketten (engl. Strings) Motivation - Textoperationen werden immer wichtiger Das menschliche Leben besteht zum großen Teil aus Sprache und Schrift und nur wenigen Zahlen. Informationsverarbeitung geht zunehmend auf Klartextdaten über. Internet/HTML/XML ist eine reine Textgenerierung Typische Aufgaben bei der Zeichenkettenverarbeitung Numerische Daten in Texte einfügen Textdaten analysieren und Teile extrahieren Datenbankinformationen als HTML-Text kodieren Befehlsanweisungen an Server zusammenbauen (SQL) Peter Sobe 89

10 Erweiterung des C-Typkonzepts um Zeichen Kodierung von Zeichen Die Darstellung von Zeichen ist standardisiert, z.b. durch American Standards Council (ASC) Allgemein verwendet: ASCII 1-Byte Darstellung in C (American Standard Code for Information Interchange) Zukünftig: Unicode 2-Byte Darstellung zur Erfassung von Sonder-zeichen, virtuelle Tasten (z.b. Funktionstasten), Tastenkombinationen oder allgemein fremdsprachige Zeichen (diakritische Zeichen, kyrilisch, arabisch, asiatische Sprachen) Veraltet, aber noch in Benutzung: EBCDIC 1-Byte Darstellung (Großrechner) Peter Sobe 90 Zeichenkodierung am Beispiel ASCII ASCII: 1 Byte kodiert ein Zeichen (bei Unicode 1 Zeichen= 2bytes) genau binär, z.b Wertigkeit: d.h. 2 6 =64 Jedes Zeichen (auch nichtdruckbare) hat eine eindeutige Binärdarstellung in ASCII. Infolge der Binärdarstellung ordnet man deshalb einem Zeichen auch einen Zahenlwert zu. Grobe Einteilung (Details siehe Codetabelle ASCII): 0-31 nichtdruckbare Zeichen (8=TAB neue Zeile) Ziffern (48 = 30H = entspricht Ziffer 0) (39H=Ziffer 9) Großbuchstaben A = Kleinbuchstaben a = 97 Peter Sobe 91

11 Definition von Zeichen in C (1) In C gibt es zwei unterschiedliche Zahlzuordnungen je nach Typdeklaration. Die Unterschiede wirken sich aber nur für spezielle Sonderzeichen, wie z.b. ö,ü,ß usw. aus. a) Deklaration mit char (signed char) Hier wird die Binärdarstellung als vorzeichenbehaftet gedeutet. Das werthöchste Bit (links) wird als Vorzeichen gedeutet (1 ist negativ). Der Darstellungsbereich ist damit 128 bis +127 Bsp. ö negative Zahl wird als 2er-Komplement gedeutet: Peter Sobe = -108 als Zahl oder ö als Buchstabe 92 Definition von Zeichen in C (2) b) Deklaration mit unsigned char Hier wird die Binärdarstellung als vorzeichenlos, d.h. als positiv gedeutet. Der Darstellungsbereich ist damit 0 bis 255 Bsp. ö Wert ist deshalb =148 Bei Benutzung von Vergleichsoperatoren in C in Zusammenhang mit Zeichen ist die Deklaration mit char oder unsigned char für das Ergebnis entscheidend. Peter Sobe 93

12 Zeichenkonstanten werden in einfache Apostrophzeichen eingeschlossen. Beispiele: a 1 % / # Bestimmte Zeichen können als sogenannte Escape-Sequenzen dargestellt werden, z.b. \n Zeilenvorschub \\ Backslash \ Apostroph Angabe von Zeichenkonstanten Nichtdruckbare Zeichen gibt man als Hexadezimalzahl ihrer Binärdarstellung ein: Bsp \x94 Peter Sobe 94 Deklarationsmöglichkeiten von Zeichen in C Deklarationen können in allen Gültigkeitsbereichen, d.h. auch auf globalem Niveau unter Angabe des Typs char oder unsigned char erfolgen. char a,z; bzw. unsigned char f,u2,z0; Eine Initialisierung mit einem Wert ist bei der Deklaration möglich: char a,z= % ; bzw. unsigned char f= \\,k1,z0; Namen für Zeichenkonstanten können durch eine Präprozessor define-anweisung festgelegt werden: #define kreuz # Peter Sobe 95

13 Ausgabe von Zeichen mit printf() oder putchar Bei Benutzung der Ein- u. Ausgabe muss immer #include <stdio.h> eingebunden werden Standardausgabe mit printf-funktion: char c,glob; printf( c=%5c glob=%2c \n,c,glob); % leitet Formatangabe ein 5 ist die Feldbreite für die auszugebenden Zeichen c ist das char-format Zeichenausgabe mit putchar putchar(glob); Peter Sobe 96 Eingabe von Zeichen mit scanf oder getchar Standardeingabe scanf Funktion, auch stdio.h einzubinden char glob; scanf( %c, &glob); // & bedeutet Adresse von glob % leitet Formatangabe ein c ist das char-format Einzugebende Zeichen werden mit ENTER abgeschlossen. Zeicheneingabe mit getchar glob = getchar(); Peter Sobe 97

14 Arbeit mit Zeichen Wie bei jedem Typ ist die Wertezuweisung definiert. char x, y;... x = y; Es können auch Vergleiche mit char-größen ausgeführt werden. Hierbei wird auf den Zahlenwert des Zeichens zurückgegriffen. Dies kann je nach char oder unsigned char unterschiedlich sein: if (x<y)... Peter Sobe 98 Zeichenketten Zeichenketten existieren in C nicht als eigener Typ. Es können nur Zeichenkettenkonstanten z.b. zur Ausgabe benutzt werden. Eine Zeichenkette kann aber in C über ein Feld von Zeichen ( char zk[20]; ) angelegt werden. Für Zeichenketten stehen eine Reihe von Funktionen, wie z.b. strcpy (string copy) zur Verfügung. Diese befinden sind in string.h deklariert. Konvention: Werden diese Funktionen auf char-felder angewandt, muss das letzte Zeichen immer ein Nullzeichen \0 sein! Peter Sobe 99

15 Zeichenkettenkonstante Zeichenketten Konstanten werden stets in Doppel-Apostroph eingeschlossen: Das ist eine nette Zeichenkette! Leerzeichen sind signifikant! Wird eine solche Zeichenkettenkonstante z.b. einem char-feld zugewiesen, wird automatisch das Abschlußzeichen '\0' angehängt. char zk[40] = Das ist eine nette Zeichenkette! ; // ergibt: zk={'d', 'a', 's', ' ', 'i', 's', 't',, 'k', 'e', 't', 't', 'e', '!','\0' Eine solche Zuweisung ist nur in Zusammenhang mit der Deklaration möglich! Sonst muss die Zuweisung über die Funktion strcpy (string copy) erfolgen. Peter Sobe 100 Felder von Zeichen Zeichenketten können in char-feldern gespeichert werden! Die Zuweisung erfolgt über den Copykonstruktor: char zk[20] = Das ist eine Kette! ; oder z.b.: char w[5]={ a, b, c, d, \0 ; Ausgabe von Zeichenketten erfolgt über printf: printf( Ausgabe: %s, zk); %s (string) ist das Format für Zeichenkette; diese muss durch \0 abgeschlossen sein! Peter Sobe 101

16 Eingabe von Zeichenketten erfolgt über scanf: scanf( %10s, zk); s(string) ist das Format-Umwandlungszeichen für eine Zeichenkette; 10 ist die maximale Länge der zu übernehmenden Zeichen Eingabe wird durch ENTER abgeschlossen! Achtung: Ein eingegebenes Leerzeichen beendet bei %s die zu übernehmenden Zeichen! scanf( %[^\n], zk); liest die Zeichen bis zum Zeilenumbruch in die Zeichenkette ein Peter Sobe 102 Standardfunktionen für Zeichenketten Voraussetzung: #include <string.h> Kopieren / Zuweisen strcpy() strcpy(ziel, quelle); Kopiert die Zeichenkette des char-feldes quelle auf das char-feld ziel und erzeugt ein Endezeichen \0. Der Rückkehrwert von strcpy ist vom Typ char *, d.h. ein Zeiger auf die Kette ziel. Verketten von Zeichenketten strcat() strcat(ziel, quelle); // ziel=ziel quelle Kettet die Zeichenkette des char-feldes quelle an das char-feld ziel. Der Rückkehrwert von strcat ist vom Typ char *, d.h. ein Zeiger auf die Kette ziel. Damit läßt sich auch ein Funktionsaufruf so gestalten: strcpy(text1, strcat( Das ist, eine Verkettung )); Peter Sobe 103

17 Standardfunktionen für Zeichenketten Vergleichen von Zeichenketten strcmp() strcmp(text1, text2); Vergleicht die Zeichenkette des char-feldes text1 mit der Zeichenkette des char-feldes text2 lexikographisch. Der Rückkehrwert von strcmp ist vom Typ int. Ergebnis : < 0 : text1 less than text2 ==0 : text1 identical to text2 > 0 : text1 greater than text2 Merke: Verglichen wird anhand des Zahlencodes der Zeichen!! Peter Sobe 104 Standardfunktionen für Zeichenketten Länge einer Zeichenkette strlen() int Laenge; Laenge=strlen(kette); Der Rückkehrwert ist die Länge der Zeichenkette, d.h. die Anzahl der Zeichen ohne das Abschlusszeichen \0. In der Standardbibliothek string.h gibt es noch zahlreiche weitere Funktionen für die Zeichenketten-Arbeit. Peter Sobe 105

18 Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) und Zeigern 4.5 Arbeit mit Zeichenketten 4.6 Funktionen 4.7 Strukturen 4.8 Typen, Variable und Konstante Peter Sobe Funktionen Von den Struktogrammen und Programmablaufplänen ist das Konzept einer Prozedur bereits bekannt. Eine Prozedur fasst einen Teil des Algorithmus zusammen und erlaubt, diesen Teil in einem übergeordneten Programm aufzurufen. Die Prozedur wird durch Parameter mit Eingabedaten versorgt. Ausgabedaten werden ebenfalls über Parameter vermittelt. Ein Beispiel: Eingabe x Fakultaet(x,f) Ausgabe f Fakultaet(w,f) f = 1 ja w>1 i = 2 (1) w f = f * i nein Der Begriff Prozedur wird synonym zu Unterprogramm oder Subroutine (engl.) verwendet. In der Programmiersprache C werden Funktionen zur Realisierung von Prozeduren benutzt. R. Großmann, P. Sobe 107

19 Einsatzmöglichkeiten von Funktionen (1) Funktionen erlauben, dem Programmcode hierarchisch zu strukturieren ein Hauptprogramm steuert dabei die Abfolge von Schritten, die einzelnen Schritte können durch Funktionen realisiert werden mehrfach benötigte Programmteile nur einmal zu schreiben und mehrfach aufzurufen Programmteile mehrmals leicht variiert auszuführen, gesteuert durch Parameter Rekursive Algorithmen, indem eine Funktion sich selbst mit abgeänderten Parametern aufruft zur Laufzeit zu entscheiden, welches Unterprogramm aufgerufen wird (siehe Funktionen-Zeiger) R. Großmann, P. Sobe 108 Einsatzmöglichkeiten von Funktionen (2) Funktionen erlauben, Die Benutzung vorgefertigter Funktionen einer Standardbibliothek, z.b. für Ein- und Ausgabe, für Zeichenkettenverarbeitung usw. Zusammenstellung und Sammeln von Hilfs-Funktionen, die ein Programmierer persönlich oft benutzt R. Großmann, P. Sobe 109

20 Allgemeines Prinzip: Funktionsdefinition (1) Rückgabetyp Funktionsname (Parameterliste) { Block mit Deklarationen und Anweisungen return ausdruck ; R. Großmann, P. Sobe 110 Eine Funktion wird wie folgt definiert: Funktionsdefinition (2) Rückgabetyp Funktionsname ( Parameterliste ) { return ; Durch den Funktionsnamen wird die Funktion an anderer Stelle aufgerufen. Die Parameterliste enthält eine durch Komma getrennte Folge von Parametern, jeweils mit Typangabe und Variablenname. Eine Funktion kann einen Wert mit dem angegebenen Rückgabetyp zurückgeben. Dazu muss in der Funktion return Wert ausgeführt werden. R. Großmann, P. Sobe 111

21 C-Programme als Folgen von Funktionen Ein C-Programm stellt eine Folge von Funktionsdefinitionen dar, wobei eine Funktion als Hauptprogramm (main) gekennzeichnet sein muss. In den Funktionen befinden sich wiederum Aufrufe anderer Funktionen. Funktionsdefinitionen können in C nur global sein und dürfen nicht im Block einer anderen Funktion bzw. des Hauptprogramms stehen. R. Großmann, P. Sobe 112 Funktionen in C (1) Beispiel 1: Funktion mit float-rückkehrwert (return!) float max(float a, float b) { if (a>b) return a; else return b; Beispiel 2: Funktion ohne Rückkehrwert void druck(float x) { printf( \n x=%f,x); Beispiel 3: Hauptprogramm mit Funktions-Aufruf void main( ) { float c=4.0f, d=5.99f; druck(max(c,d)); R.Großmann, P.Sobe 113

22 Funktionen in C (2) Beispiel mit Ausgabeparameter in der Parameterliste: void fakultaet(int x, double *w) { int i; *w=1.0; for (i=2; i<=x; i++) *w = *w * (double)i; Aufruf der Funktion: int i; double y; for (i=0;i<40;i++) { fakultaet(i,&y); printf("i=%03d, fak(i) =%.0lf \n",i,y); R. Großmann, P. Sobe 114 Funktionen in C (3) Benennung einer Funktion: Funktionsnamen unterliegen den gleichen Einschränkungen wie Variablennamen. Beispielsweise darf keine Ziffer am Beginn eines Funktionsnamen stehen. Groß- und Kleinschreibung wird unterschieden, d.h. Myfun() und myfun() sind zwei unterschiedliche Funktionen. Parameter: Eine durch Komma getrennte Liste einzelner Typbezeichner und Variablenbezeichner beschreiben die Parameter. Die als Parameter angegeben Variablen sind innerhalb des Prozedurkörpers gültig und überlagern gleichnamige globale Variablen. Die Parameter werden bei Aufruf der Funktion auf diese Variablen kopiert (Call by Value). Parameter, die als Ausgabe einer Funktion agieren, sind als Zeiger zu übergeben (Call by Reference). Dann wird der Zeiger kopiert, die Änderung des Werts erfolgt auf dem Originalspeicherplatz. R. Großmann P. Sobe 115

23 Funktionen in C (4) Bei einer C-Funktionsdefinition stellen die Parameter quasi Platzhalter dar. Für diese Parameter werden dann beim Funktionsaufruf Argumente eingesetzt. Die Anzahl, die Reihenfolge und der Typ von Argumenten beim Funktionsaufruf muss immer mit Anzahl, Reihenfolge und Typ der Parameter bei der Funktionsdefinition übereinstimmen. Felder und Zeichenketten werden als Zeiger übergeben. Dabei wird ausgenutzt, dass der Feldbezeichner ein Zeiger auf das erste Element ist. void ausgabe_zeile(char *postitionsstring, int x, int y, float p) { printf( Luftdruck an Position %s (%d,%d): %f \n, postionsstring, x, y, p); ausgabe_zeile( Zugspitze, 51, 13, ); R. Großmann, P. Sobe 116 Funktionen in C (5) Rückgabewert: Funktionen können einen Wert zurückliefern. Das erlaubt Benutzung in Zuweisungen... wert = myfun(a,b); // myfun liefert einen Wert zurück Benutzung einer Funktion als Parameter einer anderen Funktion printf("der Funktionswert an der Stelle %f ist %f \n", x, fun(x) ); Wird die Angabe des Rückgabetyps weggelassen, nimmt der Compiler standardmäßig integer an. Funktionen, die keinen Wert zurückgeben sollen, werden mit den Rückgabetyp void gekennzeichnet. R. Großmann, P. Sobe 117

24 Funktion Typ des Rückkehrwertes Bei einer C-Funktionsdefinition muss vor dem Funktionsnamen ein Typ (des Rückkehrwertes) angegeben werden. Dieser Typ kann ein in C bekannter Standardtyp, wie z.b. int, unsigned long, char, double,... sein. Aber auch Zeigertypen, wie z.b. float *, int *, char *,... sind zulässig. Es ist darauf zu achten, dass der Typ des Ausdrucks in der return- Anweisung mit dem Typ des Rückkehrwertes kompatibel ist. Wird ein Zeigerwert zurückgegeben, darf die Adresse nicht auf eine lokale Variable der Funktion zeigen. R.Großmann, P. Sobe 118 Funktionen mit Feldern als Parameter Bislang wurde nach Eingabe- und Ausgabeparametern unterschieden: Eingabeparameter in der Parameterliste als Variable (Call-by-Value) Ausgabeparameter als Rückkehrwert, oder als Zeiger in der Parameterliste (Call-by-Reference) Bei Funktionen, die Felder (ein- oder mehrdimensional) als Parameter haben, ist in C/C++ eine Besonderheit zu beachten. Bei der Behandlung des Zeigerkonzeptes wurde festgestellt, dass die Namen von Feldern wie Zeiger zu behandeln sind. Aus diesem Grund wird bei Feldern nicht nach Eingabeparametern bzw. Ausgabeparametern unterschieden, da ohnehin die Adressen der Felder übergeben werden. In der Parameterliste wird ein Feld durch den Typ der Elemente, den Namen und ein Paar eckige Klammern gekennzeichnet, oder alternativ als Zeiger auf den Typ der Feldelemente. R.Großmann, P. Sobe 119

25 Beispiel mit eindimensionalen Feldern als Parameter Funktion zur Berechnung des arithmetischen Mittels eines Feldes von float-zahlen mit n Elementen: Funktionsdefinition: float amittel(int n, float feld[ ]) // auch float *feld möglich { int i; float s=0.0f; for (i=0;i<n;i++) s=s+feld[i]; // auch *(feld+i) möglich return s/(float)n; Beachte: bei eindimensionalen Feldern kann ein leeres Klammerpaar [ ] angegeben werden. R.Großmann, P. Sobe 120 Beispiel mit eindimensionalen Feldern als Parameter Funktionsaufruf: void main() { int dim; float mittel,messwerte[100]; // Anzahl dim und Messwerte werden // durch Einlesen belegt mittel=amittel(dim, messwerte) ; printf( \narithm.mittel=%f,mittel); R.Großmann, P.Sobe 121

26 Beispiel mit mehrdimensionalen Feldern als Parameter Funktion zum Transponieren einer quadratischen Matrix mit n² Elementen des Typs integer. Funktionsdefinition: void trans(int n, int ma[ ][10]) { int i,j,h; for (i=0;i<n;i++) for (j=0;j<i;j++) { h=ma[i][j]; ma[i][j]=ma[j][i]; ma[j][i]=h; Beachte: bei mehrdimensionalen Feldern müssen nach dem leeren ersten Klammerpaar [ ] (Anzahl der Zeilen) unbedingt die nachfolgenden Klammerpaare mit Konstanten, die die genaue Anzahl für diese Dimension darstellen (z.b. genaue Anzahl der Spalten usw.) angegeben werden. Die Anzahl bezieht sich auf die Deklarationsgrenzen des übergebenen Argumentes, nicht auf die möglicherweise geringere Anzahl benutzter Elemente! R.Großmann, P. Sobe 122 Beispiel mit mehrdimensionalen Feldern als Parameter Funktionsaufruf: void main() { int j,i,m; int x[10][10]; printf("\nm="); scanf("%d",&m); // m<=10 //Belegung der Matrix x for (i=0;i<m;i++) for (j=0;j<m;j++) {printf("\nx[%d][%d]=",i,j);scanf("%d",&x[i][j]); ; //Transponieren trans(m,x); for (i=0;i<m;i++) for (j=0;j<m;j++) printf("\nx[%d,%d]=%d",i,j,x[i][j]); R.Großmann, P. Sobe 123

27 Funktionszeiger In C/C++ können Funktionen über Zeiger, die die Aufruf-Adresse der Funktion enthalten, aufgerufen werden. Ein Funktionszeiger wird folgendermaßen deklariert: typ (*f)(); f ist der Name der Funktion und typ der Typ des Rückkehrwertes. Der Funktionszeiger muss aber unbedingt mit der Adresse einer definierten Funktion belegt werden! void main() { int i,dim; float mittel,messwerte[100]; float (*fk)(); //Deklaration eines Funktionszeigers fk fk=&amittel; //Zuweisen der Aufrufadresse der definierten Funktion amittel printf("\nanzahl Werte="); scanf("%d",&dim); for (i=0;i<dim;i++) { printf("\nwert[%d]=",i); scanf("%f",&messwerte[i]); mittel=(*fk)(dim, messwerte) ; //Aufruf der Funktion amittel printf("\narithm.mittel=%f",mittel); R.Großmann, P. Sobe 124 Funktionen als Parameter von Funktionen In C/C++ müssen Funktionen, die als Parameter an andere Funktionen übergeben werden sollen, in der Parameterliste als Funktionszeiger gekennzeichnet werden. Zusätzlich zur normalen Funktionszeigernotation müssen zusätzlich die Typen der Parameter dieser zu übergebenden Funktion aufgeführt sein. In Ergänzung zur Deklaration als Funktionszeiger muss die Parameterliste des Funktionszeigers die Typen der an die Funktion zu übergebenden Parameter enthalten. Beispiel: float (*f)(float) das wäre der Funktionszeiger einer Funktion f(x), die einen float- Parameter x hat und mit einem float-wert zurück kommt (z.b. cos(x) ). Anwendungsbereiche: Funktionen müssen an Funktionen übergeben werden bei Berechnung von beispielsweise Nullstellenberechnung von Funktionen bestimmten Integralen Interpolation von Funktionen R.Großmann, P. Sobe 125

28 Beispiel für Funktionen als Parameter von Funktionen float funkt(float x) { return cos(x); float halb(float a,float b, float (*f)(float)) //Halbierungsverfahren zur Nullst.-berechnung { float m; m=(a+b)/2.0f; while (fabs((*f)(m))> ) { m=(a+b)/2.0f; if ((*f)(m)*(*f)(b)<0.0f) a=m;else b=m; return m; void main() { float a,b,nullst; printf("halbierungsverfahren\n"); printf("eingabe Intervall\na="); scanf("%f",&a); printf("\nb="); scanf("%f",&b); nullst=halb(a,b,funkt); //Übergabe der Funktion funkt printf("\nnullstelle=%f\n",nullst); R.Großmann, P. Sobe 126 Rekursive Funktionen (1) In C/C++ können Funktionen rekursiv definiert werden. Das kann in direkter oder indirekter Form geschehen. Bei einer direkten Rekursion enthält die Funktionsdefinition einen Aufruf von sich selbst, während im indirekten Fall eine andere Funktion aufgerufen wird, die wiederum, die zu definierende Funktion ruft. Da die Verwaltung aller lokalen Größen ohnehin durch den Compiler in einem Runtime-Stack vorgenommen wird, muss der Programmierer bei der Definition rekursiver Funktionen nichts besonderes beachten. Allerdings müssen stets Anweisungen vorhanden sein, die den rekursiven Aufruf begrenzen, um ein Endlos-Aufrufen zu verhindern. R.Großmann, P. Sobe 127

29 Rekursive Funktionen Beispiel ( vgl. rekursive Algorithmen bei Struktogrammen FIBONACCI-Zahlen): fibo(n)= fibo(n-1) + fibo(n-2) Rekursionsabbruch fibo(1)=1 fibo(0)=1 int fibo(int n) //rekursive Definition { if (n<2) return 1;else return (fibo(n-1)+fibo(n-2)); void main() { int i=1,f=1; printf("\nberechnung der FIBONACCI-Zahlen im Intervall [0,100]"); printf("\n\n x fibo(x)\n "); while ((f=fibo(i))<=100) { printf("\n%2d %3d",i,f); i++; R.Großmann, P. Sobe 128 Funktionen - Zusammenfassung Eine Funktion besteht aus Rückgabetyp, Funktionsname, Parameterliste und einem Anweisungsblock, der in geschweifte Klammern {, eingefasst wird. Rückgabetyp kann jeder gültige Typ sein, auch selbstdefinierte Typen, Strukturen oder Zeiger. Die Anweisung return dient zur Rückgabe eines Wertes aus der Funktion. Die Ausführung wird dann mit der Anweisung fortgesetzt, die dem Funktionsaufruf folgt. Funktionen, die keinen Wert zurückgeben, erhalten den Rückgabetyp void. Funktionen können wie Variable gehandhabt werden. Funktionen können so als Parameter anderen Funktionen übergeben werden. Funktionen können sich selbst aufrufen: Rekursion R. Großmann, P. Sobe 129

30 Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) und Zeigern 4.5 Arbeit mit Zeichenketten 4.6 Funktionen 4.7 Strukturen 4.8 Typen, Variable und Konstante R. Großmann, P. Sobe Strukturen in C Aus C-Sicht stellen Strukturen eine Zusammenfassung von Datenelementen unterschiedlichen Typs unter einem Namen dar. Strukturen sind aus C++ Sicht Klassen (Typen) deren Elemente öffentlich (public) sind. Dadurch sind sie vergleichbar mit Feldern, die eine Zusammenfassung (Reihung) von Datenelementen gleichen Typs unter einem Namen darstellen. Der Zugriff auf Datenelemente ist allerdings unterschiedlich: bei Feldern über den Index hinter dem Feldnamen, z.b. feld[i] bei Strukturen durch den Datenelementnamen hinter dem Strukturnamen und einem Punkt (. ), z.b. Person.Name R.Großmann, P. Sobe 131

31 Aufbau und Deklaration einer Struktur Person Name Vorname Geschlecht Gehalt struct Person { char Name[30]; ; char Vorname[30]; int Geschlecht; float Gehalt; Person ist der Strukturname (und damit wie ein Typ) und Name, Vorname,... sind Komponentennamen. R.Großmann, P. Sobe 132 Aufbau und Deklaration einer Struktur (1) Deklaration von Struktur-Variablen Da die Deklaration einer Struktur wie eine Typdefinition wirkt, können Variable diesen Strukturtyps folglich unter Nennung von struct Strukturname deklariert werden. Beispiel: struct Person {...; struct Person p1,p2; Es wäre auch eine Kombination möglich: struct Person {... p1,p2; R.Großmann, P. Sobe 133

32 Aufbau und Deklaration einer Struktur (2) Deklaration von Struktur-Variablen mittels Typ- Definition typedef struct Person {... person_t; person_t p1,p2; Ein per typdef geschaffener Typ kann wie ein Standarddatentyp (int, float, usw.) zur Deklaration von Variablen und zur Deklaration weiterer Strukturen benutzt werden. R.Großmann, P. Sobe 134 Wertebelegung von Strukturvariablen Wertebelegung von Struktur-Variablen: Eine Möglichkeit besteht in der Initialisierung bei der Deklaration: Beispiel: struct Person p1={"krause","jens",1, , p2={"meier","ines",0, ; oder es erfolgt eine Wertezuweisung an die Komponenten: strcpy( p1.name, "Krause" ); p1.gehalt = ; R.Großmann, P. Sobe 135

33 Schachtelung von Strukturen Strukturen können wieder Strukturen enthalten Beispiel: struct Datum { int tag; char monat[10]; int jahr; ; struct Person { char name[30]; char vorname[20]; struct Datum beginn; // Struktur in Struktur int geschlecht; ; R.Großmann, P. Sobe 136 Schachtelung von Strukturen Die Schachtelung darf aber nur in der angegebenen Weise erfolgen, d.h. man darf eine Struktur-Deklaration nicht direkt in eine weitere Struktur aufnehmen, sondern ausschließlich über eine Strukturvariable. Zugriff auf geschachtelte Strukturen: z.b.: struct person p1; und person enthält die geschachtelte Struktur struct datum beginn; p1.name aber p1.beginn.monat R.Großmann, P. Sobe 137

34 Felder von Strukturen Strukturen können als Elemente in Feldern gereiht werden Beispiel: struct Person { char name[30]; char vorname[20]; struct Datum beginn; int geschlecht; ; struct Person mitarbeiter [5] ; Zugriff: mitarbeiter[1].name mitarbeiter[1].beginn.monat R.Großmann, P. Sobe 138 Ein Beispiel mit Strukturen (1) Auf Übungsblatt 8, Teilaufgabe 1 waren Messwerte und Orte im Speicher zu organisieren, zu sortieren und auszugeben. Bislang hatten wir zwei unabhängige Felder benutzt, sowie den Ort als Postleitzahl gespeichert. float werte[max_werte]; int plz[max_werte]; Hier bietet sich an, Wert und Ort in einer Struktur zusammenzufassen. struct messung { float wert; char ort[max_strlen]; // hier jetzt der Ort statt PLZ, da wir schon ; // mit Zeichenketten arbeiten können struct messung m[max_werte]; // Feld struct messung zws_messung; // Zwischenspeicher für Tausch R.Großmann, P. Sobe 139

35 Ein Beispiel mit Strukturen (2) i=0; ende=0; n_werte=0; while(!ende) { if (i<max_werte) { printf("eingabe Messwert Ort [%d]:",i); gets(eingabestring); sscanf(eingabestring,"%f", &m[i].wert); if (m[i].wert==999.0) ende=1; else { sscanf(eingabestring,"%s",dummystring); strcpy( m[i].ort, &eingabestring[strlen(dummystring)]); i = i + 1; n_werte ++; else // Gesamtanzahl der Messwerte erreicht ende = 1; R.Großmann, P. Sobe 140 Ein Beispiel mit Strukturen (3) Zuweisung von Strukturen, hier im Kontext des Tauschs der Elemente. if (tausch) { // Umspeichern der Strukturen zws_messung = m[i]; m[i] = m[i+1]; m[i+1] = zws_messung; Eine Zuweisung von Strukturvariable beinhaltet das Kopieren aller Komponenten auf die Zielstruktur. Hier werden auch die Zeichenketten kopiert. R.Großmann, P. Sobe 141

36 Zuweisen, Kopieren von Strukturvariablen Bei der Zuweisung von Strukturen a = b werden immer alle Elemente von b nach a kopiert. Das ist gleichbedeutend mit Kopieren der Speicherinhalte, die eine Strukturvariable einnimmt. Die Länge einer Struktur (hier kann der Typ oder die Strukturvariable benutzt werden) wird mit dem Operator size_t sizeof (strukturname); ermittelt. Vor dem C99-Standard wurde die Größe noch zur Übersetzungszeit ins Programm eingesetzt. Spätere Compiler erlauben, die Größe dynamisch zur Laufzeit zu bestimmen. R.Großmann, P. Sobe 142 sizeof - Operator size_t sizeof (name); wobei name eine Variable, eine Struktur, ein Typ oder eine Feld sein kann. Namen für Felder werden hier aber nicht wie die Anfangsadresse auf das erste Element gewertet, sondern stehen für den Gesamtspeicherplatz des Feldes. Beispiele: #define MAX_STRLEN 120 struct messung { float wert; char ort[max_strlen]; ; struct messung mvar, m[10]; int l1 = sizeof(messung); // ergibt 124 int l2 = sizeof(mvar); // ergibt auch 124 int l3 = sizeof(m); // ergibt 1240 R.Großmann, P. Sobe 143

37 Zeiger auf Strukturen (1) Es können Zeiger auf Strukturen erklärt werden Beispiel: struct datum { int tag; char monat[10]; int jahr; d1,d2; struct datum *zeiger; zeiger = &d1; // Adresse der Strukturvariablen d1 (*zeiger).tag //Zugriff auf Komponente zeiger->tag //Zugriff auf Komponente beide Schreibweisen sind identisch! R.Großmann, P. Sobe 144 Zeiger auf Strukturen (2) Das Kopieren von Strukturen, ausgehend von Zeigern: Beispiel: struct datum { int tag; char monat[10]; int jahr; d1,d2; datum *zeiger1 = &d1; // Adresse der Strukturvariablen d1 datum *zeiger2 = &d2; // Adresse d2 (*zeiger2) = (*zeiger1); // ist eine Möglichkeit memcpy(zeiger2,zeiger1,sizeof(datum)); // die andere Möglichkeit R.Großmann, P. Sobe 145

38 Zeiger auf Strukturen an Funktionen übergeben Es können Zeiger auf Strukturen als Parameter von Funktionen auftreten. Beispiel: struct datum { int tag; char monat[10]; int jahr; d[5]={{7, April,1981,{12, Juni,1979, {20, Mai,1980,{4, Juni,1974,{0,,0; int finde(int j,struct datum *p) { int i=0; while ((p->tag)!=0){if ((p->jahr)==j) return (p->tag);else p++;; return 0; Aufruf: finde(1980,d); R.Großmann, P. Sobe 146 Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) und Zeigern 4.5 Arbeit mit Zeichenketten 4.6 Funktionen 4.7 Strukturen 4.8 Typen, Variable und Konstante R. Großmann, P. Sobe 147

39 4.8 Typen, Variable und Konstante Überblick: Gültigkeitsbereiche von Variablen, Sichtbarkeit Speicherklassen Type-Umwandlungen durch Typecasts Präprozessorkonstanten und Makro-Funktionen durch #define P. Sobe 148 Gültigkeitsbereiche (1) Variablen können verschiedene Gültigkeitsbereiche besitzen: lokale Gültigkeit und globale Gültigkeit Lokale Gültigkeit Variablen können nur in der Funktion benutzt werden, in der sie deklariert werden. Eine lokale Gültigkeit kann auf die main-funktion, aber auf jede andere Funktion, oder auch auf Verbundanweisungen bezogen sein. Lokale Gültigkeit innerhalb der main()-funktion: Die Variablen sind nur innerhalb der main-funktion sichtbar. Andere Funktionen (Prozeduren) können nicht direkt auf diese Variablen zugreifen. Bei Bedarf muss der Wert der Variablen den Funktionen über Parameter vermittelt werden. P. Sobe 149

40 Gültigkeitsbereiche (2) Beispiel zur lokalen Gültigkeit innerhalb der main()-funktion: int berechne(int arg) { // b, c sind hier nicht sichtbar, a wird über arg vermittelt return arg*2; main() { int a, b, c; b = berechne(a); P. Sobe 150 Gültigkeitsbereiche (3) lokale Gültigkeit in einer Funktion (Prozedur): Nur der Code innerhalb der Funktion kann diese Variable benutzen. Wird aus der Funktion zurückgesprungen, sind die Variablen nicht mehr sichtbar. Ihr Speicherplatz wird freigegeben und für andere Zwecke verwendet. double fakultaet(int arg) { double f=1.0; int i; // ist nur lokal gültig if (arg<2) return 1.0; for (i=2;i<=arg;i++) f = f * (double)i; return f; main() { double y = fakultaet(42); printf( %lf, y); printf( %d,i); // Fehler: i ist hier nicht sichtbar P. Sobe 151

41 Gültigkeitsbereiche (4) lokale Gültigkeit in einer Funktion (Prozedur) Achtung: Bei mehrmaligem Aufruf einer Funktion bleibt der Wert einer lokalen Variablen i.a. nicht gespeichert (Ausnahme durch spezielle Speicherklasse). Die Variable verliert zwischenzeitlich ihre Gültigkeit und wird bei jedem neuen Eintritt in die Funktion neu erzeugt. Sichtbarkeit und Überdeckung lokaler Variable: void f1(int *a) { int x=5; *a = *a+f2(&x); void f2(int *a) { int x=77; *a = *a+x; Die Variable x in f2 überdeckt x aus f1. Innerhalb f2 wird mit dem Wert x=77 gearbeitet. Die Variable x innerhalb f1 bleibt bestehen, ist aber nicht sichtbar, wenn f2 abgearbeitet wird P. Sobe 152 Gültigkeitsbereiche (5) Globale Gültigkeit: Globale Variablen sind über alle Funktionen hinweg gültig. Eine Ausnahme ist die lokale Überdeckung durch gleich benannte Variablen in Funktionen oder Verbundanweisungen. Durch globale Variable können Daten zu und von Funktionen vermittelt werden: Vorteile: bequem für Programmierer; schnell, da kein Kopieraufwand bei Aufruf der Funktion Nachteil: Die Funktionsdeklaration enthält keine Information, welche globalen Daten zur Eingabe und/oder Ausgabe benutzt werden. Man verliert schnell den Überblick und kann nicht mehr einschätzen, ob der Aufruf von Funktionen eventuell unerwünschte Nebenwirkungen hat. Globale Variablen sehr sparsam verwenden! P. Sobe 153

42 Beispiel für globale Gültigkeit: Gültigkeitsbereiche (6) int vermoegen=0; // globale Variable void erbschaft( int betrag) { vermoegen = vermoegen + betrag; zahle_erb_steuer(betrag); void zahle_erb_steuer(int erb_betrag) { vermoegen = vermoegen (int)( (float)erb_betrag * (float) E_STEUERSATZ/100.0); main() {... vermoegen = X; erbschaft(y); if (vermoegen >= ) printf( Ich bin reich! \n ); P. Sobe 154 Speicherklassen (1) C besitzt vier Schlüsselworte, um die Speicherklasse von Variablen zu definieren. Sie teilen dem Übersetzer mit, wie eine Variable zu speichern ist. auto Standard für lokale Variablen register wie auto, Variable wird vorrangig in einem Prozessorregister gespeichert (anstatt im Hauptspeicher) auto und register nur für lokale Variablen static Variable behält den Wert auch zwischen Funktionsaufrufen extern Variable ist bereits an anderer Stelle deklariert und soll nur als Bezeichner noch einmal eingeführt werden sinnvoll bei mehreren Quelletextdateien. P. Sobe 155

43 Speicherklassen (2) Beispiel für static: int zaehlen() { static int zahl=0; zahl++; return zahl; main() { int x, ergebnis; for ( x=1;x<47;x++) ergebnis = zaehlen(); printf( Das Ergebnis lautet %d\n, ergebnis); P. Sobe 156 Typecasts Der Übersetzer wandelt Typen von einem in einen anderen um, wenn es notwendig wird. In einigen Fällen werden Warnungen generiert, falls es zu Genauigkeitsverlust kommt oder Zuweisungen mit unterschiedlichem Wertebereich angewiesen werden. Man kann durch Typcasts aber auch eine Typumwandlung explizit anweisen. Typischer Fall: int a=3,b=5; float x_verhaeltnis_ab = a/b; // ergibt Warnung und Ergebnis 0 float y_verhaeltnis_ab = (float) a/b; // ergibt Ergebnis 0.0 float z_verhaeltnis_ab = (float) a/(float) b; // ergibt 0.6 P. Sobe 157

44 Präprozessor-Konstanten (1) Für Parameter, die zur Übersetzungszeit festgelegt werden, bieten sich Präprozessorkonstanten an. Allgemeine Form: #define NAME WERT NAME ist der Konstantenname, der im Programm benutzt wird WERT ist dabei eine Zeichenkette, die aber auch einen Zahlenwert repräsentieren kann. Vor den eigentlichen Übersetzen wertet der Präprozessor die #define Anweisungen aus, und setzt überall dort, wo NAME als Bezeichner im Quellcode steht, die Zeichenkette WERT ein P. Sobe 158 Präprozessor-Konstanten (2) Beispiel: //#define STADT Dresden #define STADT Cuxhafen #define STEUERSATZ 19 #define PI //#define BEGRUESS_STRING Sehr geehrtes Publikum #define BEGRUESS_STRING Liebe Seeleute und Sportschiffer //#define BEGRUESS_STRING Liebe Parteigenossen #define RICHTUNG gesenkt //#define RICHTUNG erhoeht printf( %s, unabhaengig von der Zahl Pi mit dem Wert %f gilt in %s ein Steuersatz von %d Prozent.\n, BEGRUESS_STRING,PI,STADT,STEURSATZ); printf( Wir stehen dafuer, dass der Steuersatz in %s %s wird!\n, STADT, RICHTUNG); P. Sobe 159

45 Präprozessor-Konstanten (3) Beispiel: Maximale Anzahl von Pixeln in einem Bild #define MAX_HORIZ 4000 #define MAX_VERT 4000 struct { char r,g,b; pixel; pixel bild[max_vert][max_horiz]; for(int v=0;v<max_vert;v++) for(int h=0;h<max_horiz;h++) bild[v][h] = ; P. Sobe 160 Präprozessor-Makros (1) Der Präprozessor kann auch kleine Makro-Funktionen mit Parametern in dem Code ersetzen. #define ABS(x) ((x)<0?-(x):(x)). float a,b; int x,y;. b = ABS(a); // wird ersetzt durch: b = a<0?-a:a; y = ABS(x); // wird ersetzt durch: y = x<0?-x:x; Vorteil: Man kann Details in Funktionen verbergen. Der Aufwand eines Funktionsaufrufs wird aber zur Laufzeit vermieden. Programme laufen dadurch schneller! P. Sobe 161

46 Präprozessor-Makros (2) Unterschied von Makros gegenüber echten C-Funktionen: Makro-Funktionen werden durch Ersetzung im Quelltext realisiert. C-Funktionen werden zur Laufzeit aufgerufen und als ganzes ausgeführt. Wenn Operationen innerhalb und außerhalb der Makros/Funktionen verschiedene Prioritäten aufweisen, kann sich ein unterschiedliches Verhalten ergeben, je nachdem ob man eine Makro-Funktion oder eine echte C-Funktion benutzt. Beispiel: #define F(x,y) (x)+(y) a=1; b=2; c=3; int f(int x, int y) { return x+y; a=1; b=2; c=3; d=f(a,b)*c; // d = a+b*c; // d = 1+2*3 = P. Sobe d1=f(a,b)*c; // f(1,2) = 3 // d = 3* c = 9 162

Inhalt. Zeichen und Zeichenketten (engl. Strings)

Inhalt. Zeichen und Zeichenketten (engl. Strings) Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) 4.5 Arbeit mit Pointern

Mehr

Inhalt. 4.9 Typen, Variable und Konstante

Inhalt. 4.9 Typen, Variable und Konstante Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) 4.5 Arbeit mit Pointern

Mehr

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer) Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) 4.5 Arbeit mit Zeigern

Mehr

2. Programmierung in C

2. Programmierung in C 2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten Operatoren, Ausdrücke und Anweisungen Kontrollstrukturen (Steuerfluss)

Mehr

Zeiger (engl. Pointer)

Zeiger (engl. Pointer) Zeiger (engl. Pointer) Zeiger Ein Zeiger (engl. Pointer) speichert eine Adresse, unter der ein Wert im Speicher des Computers gespeichert werden kann. Eine Variable im Gegensatz speichert einen Wert. Der

Mehr

2. Programmierung in C

2. Programmierung in C 2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten, Operatoren und Ausdrücke Anweisungen und Kontrollstrukturen (Steuerfluss)

Mehr

Inhalt. 4.8 Strukturen in C

Inhalt. 4.8 Strukturen in C Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) 4.5 Arbeit mit Pointern

Mehr

Funktionen. mehrfach benötigte Programmteile nur einmal zu schreiben und mehrfach aufzurufen

Funktionen. mehrfach benötigte Programmteile nur einmal zu schreiben und mehrfach aufzurufen Funktionen Funktionen erlauben, dem Programmcode hierarchisch zu strukturieren ein Hauptprogramm steuert dabei die Abfolge von Schritten, die einzelnen Schritte können durch Funktionen realisiert werden

Mehr

2. Programmierung in C

2. Programmierung in C 2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten, Operatoren und Ausdrücke Anweisungen und Kontrollstrukturen (Steuerfluss)

Mehr

4.5 Arbeit mit Zeigern (engl. Pointer)

4.5 Arbeit mit Zeigern (engl. Pointer) Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) 4.5 Arbeit mit Zeigern

Mehr

2. Programmierung in C

2. Programmierung in C 2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten, Operatoren und Ausdrücke Anweisungen und Kontrollstrukturen (Steuerfluss)

Mehr

Programmierung in C: Vermischtes (Teil 1)

Programmierung in C: Vermischtes (Teil 1) Programmierung in C: Vermischtes (Teil 1) Gültigkeitsbereiche für Variablen C-Präprozessor (#define EPS 0.00001) Inkremtieren und Dekrementieren ( jahr++; restzeit--;) Speicherklassen (static) Typecasts

Mehr

Strukturen in C. Strukturen stellen eine Zusammenfassung von Datenelementen unterschiedlichen Typs unter einem Namen dar.

Strukturen in C. Strukturen stellen eine Zusammenfassung von Datenelementen unterschiedlichen Typs unter einem Namen dar. Strukturen in C Strukturen stellen eine Zusammenfassung von Datenelementen unterschiedlichen Typs unter einem Namen dar. Dadurch sind sie vergleichbar mit Feldern, die eine Zusammenfassung (Reihung) von

Mehr

2. Programmierung in C

2. Programmierung in C 2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten, Operatoren und Ausdrücke Anweisungen und Kontrollstrukturen (Steuerfluss)

Mehr

Inhalt. 4.7 Funktionen

Inhalt. 4.7 Funktionen Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) 4.5 Arbeit mit Pointern

Mehr

Zeichen und Zeichenketten (engl. Strings)

Zeichen und Zeichenketten (engl. Strings) Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Steuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) 4.5 Arbeit mit Pointern

Mehr

Zeichenketten. Peter Sobe

Zeichenketten. Peter Sobe Zeichenketten existieren in C nicht als eigener Typ. Es können nur Zeichenkettenkonstante z.b. zur Ausgabe benutzt werden. Beispiel: printf( Guten Tag!\n ); Eine Zeichenkette als Variable kann aber in

Mehr

2. Programmierung in C

2. Programmierung in C 2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten, Operatoren und Ausdrücke Anweisungen und Kontrollstrukturen (Steuerfluss)

Mehr

Zeichenketten (Strings)

Zeichenketten (Strings) Zeichenketten (Strings) Programme verarbeiten neben numerischen Daten oft auch Daten in Textform. Texte sind Zeichenketten, die auch als Strings bezeichnet werden In C gibt es keinen eigenständigen Datentyp

Mehr

Programmierung mit C Zeiger

Programmierung mit C Zeiger Programmierung mit C Zeiger Zeiger (Pointer)... ist eine Variable, die die Adresse eines Speicherbereichs enthält. Der Speicherbereich kann... kann den Wert einer Variablen enthalten oder... dynamisch

Mehr

Programmierung in C: Vermischtes

Programmierung in C: Vermischtes Programmierung in C: Vermischtes Gültigkeitsbereiche für Variablen C-Präprozessor (#define EPS 0.00001) Inkremtieren und Dekrementieren ( jahr++; restzeit--;) Speicherklassen (static) Typecasts Kommandozeilenparameter

Mehr

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung Felder (Arrays) Mehrdimensionale Felder Zeiger und Adressen Zeigerarithmetik Felder Mehrdimensionale Felder Zeiger und Adressen Zeigerarithmetik Felder

Mehr

Elementare Datentypen in C++

Elementare Datentypen in C++ Elementare Datentypen in C++ bool signed/unsigned char signed/unsigned short int signed/unsigned int signed/unsigned long int (signed/unsigned long long int) float double long double void enum char Der

Mehr

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15 Vorwort... 15 1 Einstieg in die Welt von C 17 1.1 Die Sprache C... 17 1.2 Die C-Standardbibliothek... 18 1.3 Die nötigen Werkzeuge für C... 21 1.4 Übersetzen mit der Entwicklungsumgebung... 23 1.5 Übersetzen

Mehr

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Teil 5: Zeiger, Felder, Zeichenketten Gliederung Teil 5: Zeiger, Felder, Zeichenketten Gliederung Zeiger und Adressen Felder (Arrays) Zeichenketten (Strings) Zeigerarithmetik Mehrdimensionale Felder Zeiger und Adressen Felder Zeichenketten Zeigerarithmetik

Mehr

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen Leibniz Universität IT Services Anja Aue Zeiger (Pointer) Verweis auf eine Speicherstelle. Speicherung einer Speicheradresse.

Mehr

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter}); S. d. I.: Programieren in C Folie 7-1 7 Funktionen 7.1 Definition Prototyp-Syntax: Speicherklasse Typ Name (formale Parameter); der Funktions-Prototyp deklariert eine Funktion, d.h. er enthält noch nicht

Mehr

Felder, Zeiger und Adreßrechnung

Felder, Zeiger und Adreßrechnung Felder, Zeiger und Adreßrechnung Felder bestehen aus Variablen eines einzigen Datentyps. Bisher kennen wir eindimensionale Felder. In C sind Felder mit beliebigen Dimensionen möglich. Unsere räumliche

Mehr

F Zeiger, Felder und Strukturen in C

F Zeiger, Felder und Strukturen in C F Zeiger, Felder und Strukturen in C F Zeiger, Felder und Strukturen in C F.1 Zeiger(-Variablen) 1 Einordnung Konstante: Bezeichnung für einen Wert a 0110 0001 Variable: Bezeichnung eines Datenobjekts

Mehr

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften Programmiertechnik Teil 4 C++ Funktionen: Prototypen Overloading Parameter C++ Funktionen: Eigenschaften Funktionen (Unterprogramme, Prozeduren) fassen Folgen von Anweisungen zusammen, die immer wieder

Mehr

Physische Datenstrukturen

Physische Datenstrukturen Elementare Datentypen Strukturierte Datentypen Zeiger Seite 1 Einfache Datentypen Datentyp char Verwendung: ASCII-Zeichen Wertebereich: alle darstellbaren Zeichen, 8 bit lange Ganzzahlen im Intervall -128

Mehr

Praxis der Programmierung

Praxis der Programmierung Arrays, Pointer, Parameterbergabe Institut für Informatik und Computational Science Henning Bordihn Einige Folien gehen auf A. Terzibaschian zurück. 1 Arrays (Felder/Vectoren) 2 Arrays: Motivation Gegeben:

Mehr

Arrays (Felder/Vektoren)

Arrays (Felder/Vektoren) Arrays (Felder/Vektoren) Zusammenfassung mehrerer Variablen des gleichen Typs unter einem Namen im Speicher direkt hintereinander abgelegt Definition: Typname Arrayname [Größe]; Beispiel: int ar [5]; Zugriff

Mehr

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach  10. Zeiger C-Kurs 2012, 2. Vorlesung Tino Kutschbach tino.kutschbach@campus.tu-berlin.de http://wiki.freitagsrunde.org 10. September 2012 This work is licensed under the Creative Commons Attribution-ShareAlike

Mehr

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Typ : void* aktuelle Parameter Pointer von beliebigem Typ 2. Funktionen - Prototypvereinbarung typangabe funktionsname(parameterliste); - Funktionsdefinition typ funktionsname(parameterliste){ Anweisung - Funktionstyp -> Typ der Funktionswertes zulaessige Typangaben

Mehr

Inhalt. Peter Sobe 63. Felder in C

Inhalt. Peter Sobe 63. Felder in C Inhalt Inhalt: 4. Programmiersprache C 4.1 Programmaufbau in C 4.2 Basisdatentypen und einfache Anweisungen 4.3 Streuerfluss-Konstrukte 4.4 Arbeit mit indizierten Größen (Felder) 4.5 Arbeit mit Pointern

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1 Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine

Mehr

GI Vektoren

GI Vektoren Vektoren Problem: Beispiel: viele Variablen vom gleichen Typ abspeichern Text ( = viele char-variablen), Ergebnisse einer Meßreihe ( = viele int-variablen) hierfür: Vektoren ( = Arrays = Feld ) = Ansammlung

Mehr

Zeiger (1) Allgemeines

Zeiger (1) Allgemeines Zeiger (1) Allgemeines In C häufig verwendet zur Realisierung mancher Programmierkonzepte Sehr enge Verknüpfung von Zeigern und Feldern Vielseitiges Hilfsmittel, birgt allerdings auch Gefahren für Programmierfehler

Mehr

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy PROCESSING EINE ZUSAMMENFASSUNG Created by Michael Kirsch & Beat Rossmy INHALT 1. Typen und Operatoren 1. Datentypen 3. Klassen und Objekte 1. Klassen und Objekte 2. Operatoren 2. Konstruktor 3. Typkonversion

Mehr

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom Einstieg in die Informatik mit Java, Vorlesung vom 2.5.07 Übersicht 1 2 definition 3 Parameterübergabe, aufruf 4 Referenztypen bei 5 Überladen von 6 Hauptprogrammparameter 7 Rekursion bilden das Analogon

Mehr

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C Übersicht Funktionen Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion Sinn von Funktionen Wiederverwendung häufig verwendeter nicht banaler Programmteile Wiederverwendung

Mehr

Programmiersprachen Einführung in C

Programmiersprachen Einführung in C Programmiersprachen Einführung in C Teil 8: Felder und Zeichenketten Prof. Dr. Gliederung Programmiersprachen 1. Von der Maschinensprache zu C 2. Die Struktur von C-Programmen 3. Variable und Datentypen

Mehr

Programmierung und Angewandte Mathematik

Programmierung und Angewandte Mathematik Programmierung und Angewandte Mathematik C++ /Scilab Programmierung und Einführung in das Konzept der objektorientierten Anwendungen zu wissenschaftlichen Rechnens SS 2012 Ablauf Was sind Funktionen/Methoden

Mehr

1 pulsierender Speicher

1 pulsierender Speicher 1 pulsierender Speicher 1.1 Aufgabentyp Gegeben sei das folgende C-Programm: [...] (a) Geben Sie den Gültigkeitsbereich jedes Objektes des Programms an. (b) Stellen Sie die Rechnung des Programms für die

Mehr

INE1 Arrays, Zeiger, Datenstrukturen

INE1 Arrays, Zeiger, Datenstrukturen INE1 Arrays, Zeiger, Datenstrukturen Arrays Felder von Elementen gleichen Typs Verwenden von Adressen: Zeiger Datenstrukturen mit struct Zeiger auf Datenstrukturen Spezielle Zeiger und komplexe Deklarationen

Mehr

Arrays,Strings&Pointer in C/C++

Arrays,Strings&Pointer in C/C++ Arrays,Strings&Pointer in C/C++ Vortrag Mathias Reich Am 21.5.2002 Pointer Da zur Zeit der Compelierung des Programms nicht immer der Umfang der zu bearbeitenden Daten feststeht muss man sich - in manchen

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf  Seite 1 von 29 Kapitel 2 Einführung in C++ Seite 1 von 29 C++ Zeichensatz - Buchstaben: a bis z und A bis Z. - Ziffern: 0 bis 9 - Sonderzeichen: ; :,. # + - * / % _ \! < > & ^ ~ ( ) { } [ ]? Seite 2 von 29 Höhere Elemente

Mehr

Variablen, Konstanten und Datentypen

Variablen, Konstanten und Datentypen Informatik für Elektrotechnik und Informationstechnik Benedict Reuschling benedict.reuschling@h-da.de Hochschule Darmstadt Fachbereich Informatik WS 2013/14 Variablen, Konstanten und Datentypen Überblick

Mehr

4.2 Programmiersprache C

4.2 Programmiersprache C 4.2.1. Elementare Datentypen (signed) int, unsigned int, (signed) short (int), unsigned short (int), (signed) long (int), unsigned long (int) Elementare Datentypen für ganze Zahlen mit oder ohne Vorzeichen.

Mehr

Felder (1) Felder (Arrays) speichern viele Datenelemente des gleichen Typs. Auf einzelne Elemente kann über einen Index zugegriffen werden

Felder (1) Felder (Arrays) speichern viele Datenelemente des gleichen Typs. Auf einzelne Elemente kann über einen Index zugegriffen werden Felder (1) Felder (Arrays) speichern viele Datenelemente des gleichen Typs. Auf einzelne Elemente kann über einen Index zugegriffen werden Dim arrayname (dim1,dim2, ) As Typ Bei eindimensionalen Feldern

Mehr

Hello World! Eine Einführung in das Programmieren Variablen

Hello World! Eine Einführung in das Programmieren Variablen Hello World! Eine Einführung in das Programmieren Variablen Görschwin Fey Institute of Embedded Systems Hamburg University of Technology Slide 2 Wie werden Daten in Programmen gespeichert und manipuliert?

Mehr

Die Sprache C# Datentypen, Speicherverwaltung Grundelemente der Sprache. Dr. Beatrice Amrhein

Die Sprache C# Datentypen, Speicherverwaltung Grundelemente der Sprache. Dr. Beatrice Amrhein Die Sprache C# Datentypen, Speicherverwaltung Grundelemente der Sprache Dr. Beatrice Amrhein Überblick Speicherverwaltung: Stack und Heap Ein- und Ausgabe über die Console Variablen und Operatoren Parameter

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 27 Einstieg in die Informatik mit Java Methoden / Funktionen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 27 1 Überblick 2 Zweck von Methoden 3 Methodendefinition

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 26 Einstieg in die Informatik mit Java Methoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 26 1 Methoden 2 Methodendefinition 3 Parameterübergabe, Methodenaufruf

Mehr

Praxis der Programmierung

Praxis der Programmierung Arrays, Pointerarithmetik, Konstanten, Makros Institut für Informatik und Computational Science Henning Bordihn Einige Folien gehen auf A. Terzibaschian zurück. 1 Arrays (Felder/Vektoren) 2 Arrays: Motivation

Mehr

2. Programmierung in C

2. Programmierung in C 2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten Operatoren, Ausdrücke und Anweisungen Kontrollstrukturen (Steuerfluss)

Mehr

Objekte werden eindeutig beschrieben durch ihren Typ und einen beliebig wählbaren Bezeichner.

Objekte werden eindeutig beschrieben durch ihren Typ und einen beliebig wählbaren Bezeichner. Grundlegende Deklarationen Seite 1 von 6 Jedes Programm benötigt Objekte. Ein Objekt ist ein reservierter Bereich im Systemspeicher in welchem Informationen abgelegt werden. Informationen sind z.b. Zahlen,

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Funktionen Rückblick Operatoren logische Verknüpfungen Zusammengesetzte Operatoren ( Zuweisungsoperatoren ) Kontrollstrukturen Bedingte Anweisungen (if-abfrage, switch-konstrukt)

Mehr

Kapitel 8. Adressen und Zeiger

Kapitel 8. Adressen und Zeiger Kapitel 8 Adressen und Zeiger 1 Gliederung Kapitel 8 Adressen und Zeiger 8.1 Definition 8.2 Einfache Beispiele 8.3 Zeigerarithmetik und Vektoren 8.4 Vektoren als Funktionsparameter 8.5 Messwertprogramm,

Mehr

C- Kurs 08 Zeiger. Dipl.- Inf. Jörn Hoffmann leipzig.de. Universität Leipzig Ins?tut für Informa?k Technische Informa?

C- Kurs 08 Zeiger. Dipl.- Inf. Jörn Hoffmann leipzig.de. Universität Leipzig Ins?tut für Informa?k Technische Informa? C- Kurs 08 Dipl.- Inf. Jörn Hoffmann jhoffmann@informa?k.uni- leipzig.de Universität Leipzig Ins?tut für Informa?k Technische Informa?k Überblick Datentyp zur Verwaltung von Adressen (auf Speicherplätze)

Mehr

einlesen n > 0? Ausgabe Negative Zahl

einlesen n > 0? Ausgabe Negative Zahl 1 Lösungen Kapitel 1 Aufgabe 1.1: Nassi-Shneiderman-Diagramm quadratzahlen Vervollständigen Sie das unten angegebene Nassi-Shneiderman-Diagramm für ein Programm, welches in einer (äußeren) Schleife Integer-Zahlen

Mehr

Praxis der Programmierung

Praxis der Programmierung Funktionen, Header-Dateien, Pointer Institut für Informatik und Computational Science Universität Potsdam Henning Bordihn 1 Organisatorische Bemerkungen 2 Modul Programmierung Pflichtmodul für BSc INF

Mehr

Rechenzentrum. Programmieren in C. Simone Knief Rechenzentrum der CAU

Rechenzentrum. Programmieren in C. Simone Knief Rechenzentrum der CAU Programmieren in C Simone Knief der CAU Gliederung Einleitung Komponenten eines C-Programms Daten speichern: Variablen und Konstanten Anweisungen und Ausdrücke Operatoren Kontrollstrukturen Felder und

Mehr

Felder in C. Felder stellen eine Reihung von Elementen gleichen Typs dar. Man spricht auch von Vektoren oder Arrays.

Felder in C. Felder stellen eine Reihung von Elementen gleichen Typs dar. Man spricht auch von Vektoren oder Arrays. Felder in C Felder stellen eine Reihung von Elementen gleichen Typs dar. Man spricht auch von Vektoren oder Arrays. Durch die Reihung (hintereinander speichern) kann ein Element über seine Nummer (Index)

Mehr

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08 Kapitel 4 Programmierkurs Birgit Engels, Anna Schulze Wiederholung Kapitel 4 ZAIK Universität zu Köln WS 07/08 1 / 23 2 Datentypen Arten von Datentypen Bei der Deklaration einer Variablen(=Behälter für

Mehr

Probeklausur Name: (c)

Probeklausur Name: (c) Einführung in die Praktische Informatik 30.1.2013 Probeklausur Name: Teil I: Datentypen (20 Punkte) Lösen sie die Probleme, indem sie die korrekten Lösungen ankreuzen bzw. in die vorgesehenen Freiräume

Mehr

6. Unterprogramme 6-1

6. Unterprogramme 6-1 6. Unterprogramme 6.1 Prozeduren und Funktionen 6.2 Deklaration und Aufruf 6.3 Call-by-Value / Call-by-Reference 6.4 Standardfunktionen in C 6.5 Gültigkeitsbereich von Namen 6.6 Rekursion 6. Unterprogramme

Mehr

Felder fester Länge (1)

Felder fester Länge (1) Felder fester Länge (1) Felder: Aneinanderreihung von mehreren Variablen gleichen Typs Ursprünglich als 1-dimensionale Organisationsform gedacht, aber auch zwei- und höherdimensional (Matrizen u.ä.) Benutzung

Mehr

Einheit Datentypen in der Programmiersprache C Schwerpunkt: Elementare (arithmetische) Datentypen

Einheit Datentypen in der Programmiersprache C Schwerpunkt: Elementare (arithmetische) Datentypen Einheit Datentypen in der Programmiersprache C Schwerpunkt: Elementare (arithmetische) Datentypen Kurs C/C++ Programmierung, WS 2008/2009 Dipl.Inform. R. Spurk Arbeitsgruppe Programmierung FR 6.2 Informatik

Mehr

Die Sprache C# Datentypen, Speicherverwaltung Grundelemente der Sprache. Dr. Beatrice Amrhein

Die Sprache C# Datentypen, Speicherverwaltung Grundelemente der Sprache. Dr. Beatrice Amrhein Die Sprache C# Datentypen, Speicherverwaltung Grundelemente der Sprache Dr. Beatrice Amrhein Überblick Speicherverwaltung: Stack und Heap Ein- und Ausgabe über die Console Variablen und Operatoren Parameter

Mehr

3.2 Datentypen und Methoden

3.2 Datentypen und Methoden Kap03.fm Seite 217 Dienstag, 7. September 2010 1:48 13 3.2 Datentypen und Methoden 217 3.2 Datentypen und Methoden Wie bei vielen höheren Programmiersprachen gibt es auch in Java einfache und strukturierte

Mehr

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny 9. Zeiger Arbeitsspeicher / Adressen Der Arbeitsspeicher des Computers (RAM) besteht aus einem Feld von Speicherzellen, beginnend bei Adresse

Mehr

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin Fakutltät IV Technische Universität Berlin 5. Mai 2014 Inhaltsverzeichnis 1 2 3 4 5 6 7 Überblick Beispielprogramm in Java Beispielprogramm in C 1 2 3 4 5 6 7 Beispielprogramm in Java Beispielprogramm

Mehr

C/C++-Programmierung

C/C++-Programmierung 1 C/C++-Programmierung Speicherverwaltung, 0, const Sebastian Hack Christoph Mallon (hack mallon)@cs.uni-sb.de Fachbereich Informatik Universität des Saarlandes Wintersemester 2009/2010 2 Speicherverwaltung

Mehr

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017 Informatik 1 für Nebenfachstudierende Grundmodul Java Methoden Kai-Steffen Hielscher Folienversion: 1. Februar 2017 Informatik 7 Rechnernetze und Kommunikationssysteme Inhaltsübersicht Kapitel 3 - Java

Mehr

9. Vektoren. (auch Felder/array)

9. Vektoren. (auch Felder/array) 9. Vektoren (auch Felder/array) Motivation Hat man mehrere Objekte gleichen Datentyps, so kann man sie explizit deklarieren, wenn die Anzahl bekannt ist double x1,x2,x3,x4; Nachteile: versagt, -wenn die

Mehr

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r 1. Felder und Strings Eigenschaften von Referenzdatentypen 1. Referenzdatentypen: Felder und Strings Referenzdatentypen sind Konstrukte, mit deren Hilfe wir aus einfachen Datentypen neue eigene Typen erzeugen

Mehr

1. Referenzdatentypen: Felder und Strings

1. Referenzdatentypen: Felder und Strings 1. Felder und Strings Eigenschaften von Referenzdatentypen 1. Referenzdatentypen: Felder und Strings Referenzdatentypen sind Konstrukte, mit deren Hilfe wir aus einfachen Datentypen neue eigene Typen erzeugen

Mehr

Dr. Monika Meiler. Inhalt

Dr. Monika Meiler. Inhalt Inhalt 3 C-Ausdrücke...3-2 3.1 Arithmetische Ausdrücke...3-3 3.2 Wertzuweisungen...3-5 3.3 Inkrementieren und Dekrementieren...3-6 3.4 Logische Ausdrücke (Bedingungen)...3-7 3.5 Bedingte Ausdrücke...3-8

Mehr

Aufgaben zur Klausurvorbereitung / Musterlösung

Aufgaben zur Klausurvorbereitung / Musterlösung Aufgabe 1: Schaltfunktionen Gesucht ist eine Schaltfunktion f(a,b,c,d) mit a,b,c,d ϵ 0,1, die 1 ergibt, wenn für genau zwei Eingabevariablen der Wert 1 anliegt, und sonst 0 ergibt. a) Geben Sie eine ausgefüllte

Mehr

8. Referenzen und Zeiger

8. Referenzen und Zeiger 8. Referenzen und Zeiger Motivation Variable werden in C++ an speziellen Positionen im Speicher abgelegt. An jeder Position befindet sich 1 Byte. Sie sind durchnummeriert beginnend bei 0. Diese Positionen

Mehr

6 ZEIGER UND REFERENZEN - ALLGEMEINES

6 ZEIGER UND REFERENZEN - ALLGEMEINES 6 ZEIGER UND REFERENZEN - ALLGEMEINES Leitideen: Zeiger sind Adressen mit zusätzlicher Typinformation über das dort gespeicherte Objekt. Die Vereinbarungssyntax soll der Ausdruckssyntax entsprechen und

Mehr

Dr. Monika Meiler. Inhalt

Dr. Monika Meiler. Inhalt Inhalt 12 Strukturierte Datentpen - Strukturen... 12-2 12.1 Definition und Deklaration von Strukturtpen und Strukturen... 12-2 12.2 Strukturen als Funktionsparameter und Funktionswert... 12-4 12.3 Felder

Mehr

C++ - Einführung in die Programmiersprache Funktionen. Leibniz Universität IT Services Anja Aue

C++ - Einführung in die Programmiersprache Funktionen. Leibniz Universität IT Services Anja Aue C++ - Einführung in die Programmiersprache Funktionen Leibniz Universität IT Services Anja Aue Subroutine (Unterprogramm) Lösung von Teilen einer Gesamtaufgabe. Kapselung von Anweisungen, die zu einer

Mehr

Vektoren 105. array-qualifier static restrict const volatile array-size-expression assignment-expression * simple-declarator identifier

Vektoren 105. array-qualifier static restrict const volatile array-size-expression assignment-expression * simple-declarator identifier Vektoren 105 direct-declarator simple-declarator ( simple-declarator ) function-declarator array-declarator array-declarator direct-declarator [ [ array-qualifier-list ] [ array-size-expression ] ] array-qualifier-list

Mehr

Programmierkurs C++ Variablen und Datentypen

Programmierkurs C++ Variablen und Datentypen Programmierkurs C++ Variablen und Datentypen Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer #2 Überblick Welche Datentypen gibt es in

Mehr

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4 Fakultät Verkehrswissenschaften Friedrich List, Professur für Verkehrsbetriebslehre und Logistik Modul Entscheidungsunterstützung in der Logistik Einführung in die Programmierung mit C++ Übung 4 SS 2016

Mehr

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services C# - Einführung in die Programmiersprache Methoden Leibniz Universität IT Services 02.07.12 Methoden... sind Subroutinen in einer Klasse. können einen Wert an den Aufrufer zurückgeben. verändern die Eigenschaften

Mehr

Zeichenketten (1) Literale von Zeichenketten werden in doppelte Anführungszeichen gesetzt

Zeichenketten (1) Literale von Zeichenketten werden in doppelte Anführungszeichen gesetzt Zeichenketten (1) Literale Literale von Zeichenketten werden in doppelte Anführungszeichen gesetzt "Hallo Welt" Mehrere solcher Literale gelten als eine Zeichenkette, wenn sie nur durch Whitespaces (Leerzeichen,

Mehr

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3 Programmieren mit Java Modul 3 Arrays Theorieteil Inhaltsverzeichnis 1 Modulübersicht 3 2 Eindimensionale Arrays 3 2.1 Arrays deklarieren.............................. 3 2.2 Arrays erzeugen................................

Mehr

6. Zeiger Allgemeines Definition eines Zeigers

6. Zeiger Allgemeines Definition eines Zeigers 6. Zeiger www.c-programme.de Stefan Thiemert Kapitel 6 - Seite 1 von 6 6. 1. Allgemeines Zeiger spielen in der Programmierung eine wichtige Rolle. Sie sind wichtig, bei der Arbeit mit Arrays und Funktionen.

Mehr