Übersicht. Einführung in die Programmierung. Zeichenketten. Zeichenketten. Zeichenketten. Arrays und Zeichenketten. Arrays und Zeichenketten

Ähnliche Dokumente
C- Kurs 07 Höhere Datentypen

2. Programmierung in C

einlesen n > 0? Ausgabe Negative Zahl

F Zeiger, Felder und Strukturen in C

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

Pointer und Arrays. INE1, Montag M. Thaler, Office TG208. ZHAW, M. Thaler, K. Rege, G.

Algorithmen und Datenstrukturen

INE1 Arrays, Zeiger, Datenstrukturen

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

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

4.2 Programmiersprache C

Die Programmiersprache C Eine Einführung

Physische Datenstrukturen

Praxis der Programmierung

Teil 6: Strukturen und Unionen Gliederung

C-Propädeutikum Höhere Datentypen

Teil 6: Strukturen und Unionen Gliederung

8. Referenzen und Zeiger

Arrays (Felder/Vektoren)

Das folgende Programm demonstriert, wie man Speicheradressen von Variablen ermittelt.

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Operatoren in C. Gastvorlesung Andreas Textor

Variablen, Konstanten und Datentypen

2. Programmierung in C

Programmierung mit C Zeiger

Praxis der Programmierung

2.8 Klassen. Nichtgleichartige Elemente können in Klassen zu einem neuen Typ zusammengefasst werden. Beispiel: Die drei Komponenten

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

C-Kurs 2010 Pointer. 16. September v2.7.3

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

Propädeutikum. Dipl.-Inf. Frank Güttler

Programmiersprachen Einführung in C

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

Zeiger und dynamischer Speicher

Einführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher

Zeiger: Der Adressoperator &

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Programmierkurs C++ Datenstrukturen Seite 1

Informatik. Strukturen und Aufzählungstypen. Vorlesung

Einführung in die Programmierung für Physiker. Die Programmiersprache C Strukturen ("struct...")

Einführung in die Programmierung für Physiker. Die Programmiersprache C Strukturen ("struct...")

Zeiger in C und C++ Zeiger in Java und C/C++

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

Zeiger (engl. Pointer)

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

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

Programmieren 1 C Überblick

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

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff

C++ Teil 6. Sven Groß. 23. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 15

Pointer. Variablen. Pointer. Ein elementares Beispiel. Pointer in C

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

2. Datentypen und Deklarationen

Kapitel 3: Variablen

Dynamische Speicherverwaltung

Kontrollfragen Mikrocontroller Programmiersprache C H1203 Felix Rohrer

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

2. Programmierung in C

6 ZEIGER UND REFERENZEN - ALLGEMEINES

Dynamische Speicherverwaltung

Kapitel 2/3: Darstellung von Information / Kontrollstrukturen. Inhalt. Zusammengesetzte Datentypen Wiederholungen (in Programmen)

C-Programmierung: Ausdrücke und Operatoren#Division.2F

C++ Teil 5. Sven Groß. 8. Mai IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai / 16

Probeklausur Name: (c)

int i=1; //Integerzahl i anlegen und mit 1 initialisieren float wert; //Floatzahl deklarieren scanf( %f,&wert); //Wert über Tastatur eingeben

Die verschiedenen Programmierparadigmen von C++ Software-Technik: Vom Programmierer zur erfolgreichen

Dr. Monika Meiler. Inhalt

Kapitel 4: Zeiger. Inhalt. Zeiger Zeigerarithmetik

9. Vektoren. (auch Felder/array)

Strukturierte Datentypen

Praxis der Programmierung

Wertebereich und Genauigkeit der Zahlendarstellung

RO-Tutorien 15 und 16

U3 3. Übung U3 3. Übung. Systemnahe Programmierung in C Übungen Moritz Strübe Universität Erlangen-Nürnberg Informatik 4, 2009 U3.fm

Besprechung Aufgabe 1. Pointer. Register und Ports. SPiC - Ü U3.1

Software Entwicklung 1

5. Abgeleitete Datentypen

5. Abgeleitete Datentypen

Advanced Programming in C

RO-Tutorien 3 / 6 / 12

Dynamische Datentypen

Tag 8 Repetitorium Informatik (Java)

Grundlagen und Konzepte von C Datenstrukturen

C++ Teil 5. Sven Groß. 16. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Datentypen und Operatoren Ganzzahlige Numerische Datentypen Logischer Datentyp

2.1 Fundamentale Typen

RO-Tutorien 17 und 18

Vorkurs Informatik WiSe 16/17

Einführung Pointer. C-Kurs 2013, 2. Vorlesung. Nico Andy

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

Herzlich willkommen!

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Einführung in die Programmiersprache C

Transkript:

Übersicht Einführung in die Programmierung Bachelor of Science Prof. Dr. Rethmann Fachbereich Elektrotechnik und Informatik Hochschule Niederrhein Arrays Datentypen, Operatoren und Kontrollstrukturen Funktionen und Zeiger und Dateioperationen und Standardbibliotheken strukturierte Programmierung modulare Programmierung WS 2009/10 Einführung in die Programmierung und 2 / 67 belegen einen zusammenhängenden Speicherbereich und können daher als Array betrachtet werden. char str1[] = { H, a, l, l, o, \0 ; char str2[] = "Welt"; Eine Array-Deklaration definiert einen Zeiger auf das erste Element des Arrays. char str1[] = "Hallo"; char *str2 = "Welt"; printf("%s, %s!\n", str1, str2); printf("%s, %s!\n", str1, str2); H a l l o \0 W e l t \0 str1 str2 str1 str2 H a l l o \0 W e l t \0 Einführung in die Programmierung und 3 / 67 int strlength(char *str) { int n = 0; while (str[n]!= \0 ) n += 1; return n; char *wort = "Dudelsackpfeife"; int len = strlength(wort); Einführung in die Programmierung und 4 / 67 Ist das folgende Programm korrekt? Kann ein Zeiger wie ein Array benutzt werden? char *captain = "Picard"; printf("length(%s) = %d\n", wort, len); wort str D u d e l s a... f e \0 printf("captain = "); printf("%c", captain[i]); printf("\n"); Einführung in die Programmierung und 5 / 67 Ist das folgende Programm korrekt? Kann ein Zeiger auf einen anderen Speicherbereich zeigen? char *captain = "Picard"; captain = "Sisco"; Einführung in die Programmierung und 6 / 67 Ist das folgende Programm korrekt? char *captain1 = "Picard"; char *captain2 = "Sisco"; printf("1. captain = %s\n", captain1); printf("2. captain = %s\n", captain2); captain1[i] = captain2[i]; printf("1. captain = %s\n", captain1); printf("2. captain = %s\n", captain2); Einführung in die Programmierung und 7 / 67 Einführung in die Programmierung und 8 / 67

Vorsicht: Eindimensionale Arrays können auch als Zeiger deklariert werden, aber Zeichenkonstanten liegen im Programmsegment, Arrays werden im Datensegment abgelegt. char ar[] = "Riker"; char *st = "Worf"; ar[0] = X ; /* o.k.! */ st = "Troi"; /* o.k.! */ st[0] = X ; /* segmentation fault! */ /* Prototypen */ void output(int *a, int n); void tausche(int *a, int n); /* Hauptprogramm */ main() { int b[6] = {1, 2, 3, 4, 5, 6; output(b, 6); tausche(b, 6); output(b, 6); Einführung in die Programmierung und 9 / 67 void output(int *a, int n) { for (i = 0; i < n; i++) printf("%4d\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ührung in die Programmierung und 10 / 67 Vorsicht: Arrays lassen sich nicht mit == vergleichen. int a[3] = {1, 2, 3; int b[3] = {1, 2, 3; if (a == b) char *c1 = "Picard"; char *c2 = "Picard"; if (c1 == c2) char c1[10], c2[10]; scanf("%s", c1); scanf("%s", c2); if (c1 == c2) Einführung in die Programmierung und 11 / 67 Bei einem Vektor bedeutet const, dass die Elemente nicht verändert werden können. const int arr[] = {1, 2, 3, 4; Dann ist eine Zuweisung wie arr[0] = 0; verboten! Einführung in die Programmierung und 12 / 67 Zeiger sind Adressen, also positive, ganze Zahlen. Daher sind auch Rechenoperationen wie Addition und Subtraktion erlaubt: char *s = "Hallo"; int i = 0; while (*(s+i)!= \0 ) { printf("%c", *(s+i)); i += 1; printf("\n"); s[i] wird vom Compiler übersetzt zu *(s+i)! Einführung in die Programmierung und 13 / 67 int s[] = { 6, 5, 4, 3, 2, 1; int *p, i = 0; p = &s[0]; printf("%d\n", *(p+i)); p = &s[0]; { printf("%d\n", *p); p += 1; Einführung in die Programmierung und 14 / 67 Vorsicht: Es sind auch negative Werte für j zulässig und es findet keine Bereichsüberprüfung statt. 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)); Sprachdefinition: Zeigt p auf ein Element eines Arrays, dann zeigt p + j auf das j-te Element hinter p. Einführung in die Programmierung und 15 / 67 Einführung in die Programmierung und 16 / 67

Dynamische Speicheranforderung Arrays: zur Übersetzungszeit muss bekannt sein, wie viele Elemente gespeichert werden sollen (nicht in C99) In der Regel ist diese Größe nicht vorhersagbar. Speicher wird zur Laufzeit (dynamisch) angefordert void * malloc(size_t size) liefert Zeiger auf Speicherbereich der Größe size, oder NULL, wenn die Anfrage nicht erfüllt werden kann. Der Bereich ist nicht initialisiert. int *pa, i, len; pa = (int *) malloc(len * 4); if (pa!= NULL) Dynamische Speicheranforderung Der unäre Operator sizeof liefert die Anzahl der Bytes für ein Objekt oder einen Typ. Syntax: sizeof <object > sizeof(type) int i, j; j = sizeof i; j = sizeof(int); sizeof darf nicht auf Operanden vom Typ Funktion, unvollständige Typen (Felder ohne Größenangabe) oder void-typen angewendet werden. pa = (int *) malloc(len * sizeof(int)); v = malloc(len * sizeof(int [])); /* falsch! */ Einführung in die Programmierung und 17 / 67 Dynamische Speicheranforderung Die Funktion void free(void *p) gibt den Speicherbereich, auf den p zeigt, wieder frei. Der Speicherbereich muss vorher über einen Aufruf von malloc allokiert worden sein! 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ührung in die Programmierung und 18 / 67 Pointer Fun www.cs.stanford.edu/cslibrary/pointerfuncppbig.avi Einführung in die Programmierung und 19 / 67 Der enum-typ: Konstanten werden Integer-Werte zugewiesen, Konstanten sind ansprechbar über Bezeichner. enum Tag {Mo, Di, Mi, Do, Fr, Sa, So; Die Werte werden intern auf fortlaufende, nicht-negative ganze Zahlen abgebildet, beginnend bei 0. Im Mo == 0, Di == 1, Mi == 2 usw. 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ührung in die Programmierung und 20 / 67 Jeder Name darf nur einmal verwendet werden, d.h. Namen in verschiedenen Aufzählungen müssen sich unterscheiden. Die Werte in einer Aufzählung können gleich sein. Variablen können mit en deklariert werden. Sie unterliegen nicht notwendigerweise der Typprüfung. Eine Aufzählungskonstante des Typs kann als Wert zugewiesen werden. Sie können in logischen Ausdrücken verglichen und in arithmetischen Ausdrücken verknüpft werden. Einführung in die Programmierung und 21 / 67 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 */ Einführung in die Programmierung und 22 / 67 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örigkeit auszudrücken, können wir Daten mittels struct strukturieren. t = JAN + 3; /* kein Fehler, keine Warnung! */ Einführung in die Programmierung und 23 / 67 Einführung in die Programmierung und 24 / 67

Zusammenfassung von Daten unterschiedlichen Typs. Syntax: struct <name> { <member_1 >;. <member_n >; Semantik: struct adresse { char *str, *ort; int hnr, plz; long tel; <name> ist der Typname der Struktur (kann entfallen) <member_i> ist eine Variablendeklaration die Variablen der Struktur heißen Komponenten oder auch Attribute ok: gleiche Komponente in verschiedenen ermöglichen die Organisation von Daten. Eine struct-vereinbarung definiert einen Datentyp. Hinter der Komponentenliste kann eine Liste von Variablen stehen, genau wie bei einem elementaren Datentyp: int a, b, c; struct datum { int tag, monat, jahr; x, y, z; Beide Definitionen vereinbaren Variablen des angegebenen Typs und reservieren Speicherplatz. Einführung in die Programmierung und 25 / 67 Die Komponenten einer Struktur werden mit dem Punktoperator. angesprochen. linker Operand: Strukturvariable rechter Operand: Komponentenname struct datum { int tag, monat, jahr; x, y, z; x.tag = 23; x.monat = 10; x.jahr = 2008; Einführung in die Programmierung und 26 / 67 dürfen andere enthalten: struct mitarbeiter { char *name, *vorname, *persnr; struct adresse adresse; int gehalt; können in Vektoren gespeichert werden: struct mitarbeiter personal[20]; for (i = 0; i < 20; i++) printf("name[%d] = %s\n", i, personal[i]. name); Einführung in die Programmierung und 27 / 67 Vorsicht: dürfen sich nicht selbst enthalten! wieviel Speicherplatz soll bereitgestellt werden? Rekursive : In der Strukturdeklaration wird ein Zeiger auf die Struktur selbst vereinbart. struct liste { struct mitarbeiter ; struct liste *, *; fischer, meier, schulze; Einführung in die Programmierung und 28 / 67 Abkürzende Schreibweise für Zeiger auf : (*name).komponente entspricht name->komponente fischer. = &meier; fischer. = NULL; fischer..name = "Fischer"; schulze. = NULL; schulze. = &meier; schulze..name = "Schulze";.. for (l = &fischer; l!= NULL; l = l->) printf("%s\n", l->.name);.. Einführung in die Programmierung und 29 / 67 wird mittels typedef einer Struktur ein Synonym zugewiesen, dann kann das Synonym wie ein einfacher Datentyp genutzt werden typedef struct { char *str, *ort; int hnr, plz; long tel; adresse_t; adresse_t adr; adr.str = "Waldweg"; Einführung in die Programmierung und 30 / 67 eine Synonym-Vereinbarung kann andere bereits definierte Synonyme enthalten typedef struct { char *name, *vorname, *persnr; adresse_t adresse; int gehalt; mitarbeiter_t; mitarbeiter_t arb; arb.name = "Maier"; Einführung in die Programmierung und 31 / 67 Einführung in die Programmierung und 32 / 67

Soll einer rekursiven Struktur mittels typedef ein Synonym zugewiesen werden, darf der Strukturname nicht entfallen. typedef struct liste { mitarbeiter_t ; struct liste *, *; liste_t; liste_t l; mitarbeiter_t fischer, meier, schulze; Initialisierung: Der Struktur-Definition folgt eine Liste von konstanten Ausdrücken für die Komponenten. Beispiele: adresse_t a = {"Am Bach", "Aldrup", 4, 12345, 4711; mitarbeiter_t m = {"Fischer", "Anna", "08F42W", {"Am Bach", "Aldrup", 4, 12345, 2500; liste_t l = {{"Fischer", "Anna", "08F42W", {"Am Bach", "Aldrup", 4, 12345, 4711, 0, 0; Anmerkungen: Die Reihenfolge der Komponenten ist zu beachten! Es müssen nicht alle Komponenten initialisiert werden. Einführung in die Programmierung und 33 / 67 Einführung in die Programmierung und 34 / 67