Praxis der Programmierung

Ähnliche Dokumente
Praxis der Programmierung

Arrays (Felder/Vektoren)

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

INE1 Arrays, Zeiger, Datenstrukturen

Programmierung mit C Zeiger

Praxis der Programmierung

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Praxis der Programmierung

Klausur. 2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

2. Programmierung in C

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

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

Probeklausur Name: (c)

Tag 4 Repetitorium Informatik (Java)

einlesen n > 0? Ausgabe Negative Zahl

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

Vorkurs Informatik WiSe 16/17

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

+ C - Array (Vektoren, Felder)

C- Kurs 07 Höhere Datentypen

9. Vektoren. (auch Felder/array)

Informatik. Strukturen und Aufzählungstypen. Vorlesung

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy

Zeiger (engl. Pointer)

Einführung in die Programmiersprache C

Herzlich willkommen!

F Zeiger, Felder und Strukturen in C

Tag 4 Repetitorium Informatik (Java)

Vorkurs Informatik WiSe 17/18

Grundlagen und Konzepte von C Datenstrukturen

Mussten wir eine ganze Reihe solcher Zahlen speichern, haben wir das eindimensionale Array verwendet.

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

Einführung in die Programmierung Konstanten, dynamische Datenstrukturen. Arvid Terzibaschian

Anregungen zu Übung 2

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Übungspaket 14 Eindimensionale Arrays

Einführung in die Programmierung Arrays, Zeiger, Strings. Arvid Terzibaschian

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

Grundlagen C und C++ Einheit 02: Grundlagen in C. Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

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

Programmierkurs C++ Variablen und Datentypen

Abgeleitete Datentypen

Informatik Vorkurs - Vorlesung 2

4.2 Programmiersprache C

Strukturierte Datentypen (struct) 2006 Pearson Education, Inc. All rights reserved.

Informatik I (D-ITET)

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

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

Viel Erfolg bei der Bearbeitung der Aufgaben!

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

5. Abgeleitete Datentypen

5. Abgeleitete Datentypen

EINI LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 15/16

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

Informatik. Wiederholung Felder (Arrays), string. Vorlesung

Datenstrukturen. InE1 M. Thaler, Office TG ZHAW, M. Thaler, K. Rege, G. Burkert

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

Zeiger (1) Allgemeines

Programmierkurs C++ Datenstrukturen Seite 1

float *point(float a, float b); // Funktionsdeklaration Zeiger als Funktionswert // point liefert als Wert die Adresse seines Ergebnisses

Repetitorium Programmieren I + II

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

C/C++-Programmierung

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

Variablen, Konstanten und Datentypen

2. Datentypen und Deklarationen

Einführung in C. EDV1-04C-Einführung 1

Arrays 115. array-qualifier static restrict const volatile array-size-expression assignment-expression * simple-declarator identifier

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

Basiswissen in Informatik

Computergrundlagen Programmieren in C

2. Programmierung in C

Kontrollfragen Mikrocontroller Programmiersprache C H1203 Felix Rohrer

2. Aufgabe (3 Punkte) Ergänzen Sie die leeren Zellen derart, dass sich in einer Zeile die selben Zahlenwerte ergeben.

C-Crashkurs. Praktikum Systemmanagement und Sicherheit

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

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Felder (1) Allgemeines

Gedächtnis. Während der Abarbeitung eines Algorithmus müssen sich Dinge gemerkt werden bzw. auf Dingen wird gerechnet. Zugriff.

Java Referenzdatentypen genauer betrachtet

Grundlagen der OO- Programmierung in C#

Elementare Datentypen in C++

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

Operatoren in C. Gastvorlesung Andreas Textor

Felder, Zeiger und Adreßrechnung

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

Welche Informatik-Kenntnisse bringen Sie mit?

Algorithmen und Datenstrukturen

Einführung in die Programmierung

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

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

1. Referenzdatentypen: Felder und Strings

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

2. Programmierung in C

Martin Unold INFORMATIK. Geoinformatik und Vermessung

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

Transkript:

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 Gegeben: Durchschnittstemperaturen der Monate der letzten fünf Jahre Aufgabe: Berechnung von Durchschnittstemperaturen für Jahre, Monate, Jahreszeiten,... naiver Ansatz: double-variable für jeden Monat (12 x 5 Variablen); manuelle Berechnung Schleife zur Summenbildung??? keine gute Idee!!! 3

Arrays als besserer Ansatz Arrays fassen mehrere Variablen unter einem Namen zusammen Zugriff auf Werte über den gemeinsamen Namen + Nummer (Index) ähnlich zu Listen in Python Werte müssen einheitlichen Datentyp haben Größe des Arrays (Anzahl der Elemente) unveränderbar Datentyp und Größe bei der Deklaration der Array-Variablen festlegen 4

Array-Definition und -Zugriff Definition: Typname Arrayname [Größe]; Beispiele: int ar [5]; double temperaturen[12*5]; Zufriff: auf das i-te Array-Element: Arrayname[i] Beispiel: ar[3] Indizierung beginnt bei 0 letztes Element: Länge des Arrays minus 1 temperaturen: (Werte werden im Speicher direkt hintereinander abgelegt.) 5

Lösung des motivierenden Problems Beispiel: Durchschnitt aller Werte der letzten fünf Jahre: double avg = 0; int i; for (i = 0; i < 12*5; ++i) { avg += temperaturen[i]; } avg /= i; for-schleifen oft auch zur Initialisierung von Arrays: int i, ar[5]; for (i = 0; i < 5; ++i) { ar[i] = i+1; } ar[0] = 1, ar[1] = 2, ar[2] = 3, ar[3] = 4, ar[4] = 5 6

Mehrdimensionale Arrays Arrays können komplexe Daten speichern... auch Arrays Verwendung mehrfacher eckiger Klammern Elemente sind selbst Arrays (eine Dimension niedriger) Beispiel: int ar [3][4]; ar[0][0] ar[0][1] ar[0][2] ar[0][3] ar[1][0] ar[1][1] ar[1][2] ar[1][3] ar[2][0] ar[2][1] ar[2][2] ar[2][3] 7

Initialisierungslisten Elemente in geschweiften Klammern, durch Komma getrennt nur direkt bei der Definition int ar [4] = {1, 2, 3, 4}; Größe in eckigen Klammern darf fehlen (offenes Array) int ar [] = {1, 2, 3, 4}; fehlende Elemente werden mit 0 aufgefüllt: int ar [4] = {1, 2}; ar[0]=1; ar[1]=2; ar[2]=0; ar[3]=0; mehrdimensional:initialisierungslistevoninitialisierungslisten {{...},...,{...}} 8

Was können Arrays in C nicht? Ändern oder Bestimmen ihrer Größe Pointer!!! Vorlesung Dynamische Speicherverwaltung 9

Pointer und Arrays 10

Pointerarithmetik Vergleich (== und!=) Addition und Subtraktion (einer ganzen Zahl n) Verschieben des Zeigers um n Speicherobjekte des Typs, auf den der Pointer zeigt 11

Arrays und Pointer Name des Arrays ist konstanter Zeiger auf das erste Array-Element ar[0] ar[1] ar[2] ar[3] ar[4] ar &ar[2] ar[i] ist äquivalent zu *(ar+i) *ar *(ar+1) *(ar+2) *(ar+3) *(ar+4) ar Sei ptr ein Pointer. Dann ist *(ptr + i) äquivalent zu ptr[i]. 12

Arrays und Pointer als Parameter Problem: Größe kann nicht ermittelt werden muss vom Programmierer übergeben werden Beispiel: Summe der Arrayelemente int sum(int[] p, int n) { int s = 0, i = 0; for(i=0; i<n; ++i) { s += p[i]; } return s; int sum(int *p, int n) { int s = 0, i = 0; for(i=0; i<n; ++i) { s += *(p++); } return s; 13

Pointer auf void void * Pointername; untypisierter Pointer: Datentyp steht nicht fest darf nicht dereferenziert werden (zeigt nie auf Speicherobjekte) kann in jeden Pointertyp umgewandelt werden (Zuweisung) kein Verlust an Information oder Genauigkeit für die Zuweisung von Pointern auf anderen Typ verwenden 14

Verwendung von void-pointern Beispiel Abgreifen des ersten Bytes eines int-wertes (als unsigned char): int zahl = n; int * pointer1 = &zahl; unsigned char * pointer2; // soll auf dieselbe Adresse wie pointer1 zeigen! // pointer2 = pointer1; unmoeglich (verschiedene Typen) void * dummy; dummy = pointer1; pointer2 = dummy; // korrekt bei // Little-Endian-Byte-Anordnung 15

Byte-Anordnungen... abhängig von der Rechnerarchitektur: Bei High-Endian-Byte-Anordnung müssen Pointer mit Hilfe der Pointerarithmetik zum gewünschten Byte bewegt werden. 16

Pointer: Pros und Cons Pointer erlauben hardwarenahes Programmieren Pointer erlauben dynamische Datenstrukturen Vorlesung Dynamische Speicherverwaltung Pointer sind häufig Quelle von schwer auffindbaren Fehlern, z.b.: float v; float *p = &v; p[0] = 0.5; p[1] = 3.14; //??? Pointer können zu Datenverlust führen Schreiben von Werten an nicht referenzierte Adressen versehentliches Überschreiben von Werten,... 17

Konstanten 18

Konstanten Literale (vordefinierte Konstanten elementarer Typen) Variablen, die mit Typattribut const definiert sind const Datentyp Bezeichner; Variable nach Initialisierung schreibgeschützt Beispiel: const double PI = 3.1415927 Konvention: Bezeichner aus Großbuchstaben für Variablen, Pointer, Parameter Schutz vor unbeabsichtigten Änderungen Dingen einen Namen geben (z.b. PI, ROT, GELB, MONTAG, DIENSTAG,...) vereinfacht Lesbarkeit und Wartung des Quellcodes 19

Aufzählungstypen Konstanten (2) Definition mit Schlüsselwort enum und Mengenschreibweise Definition eines neuen Datentyps mit endlich vielen konstanten Werten Deklaration von Variablen dieses Typs mit Schlüsselwort enum enum ausbildung { int akademiker (enum ausbildung a) { HAUPTSCHULE, if (a == BACHELOR REALSCHULE, a == MASTER) ABITUR, return 1; BERUFSAUSBILDUNG, else BACHELOR, return 0; MASTER } }; 20

Aufzählungstypen Typ- und Variablendefinition können zusammen erfolgen: enum boolean {FALSE, TRUE} b; Vereinbarungen ohne Etikett: enum {FALSE, TRUE} b; Variablendefinition muss hier erfolgen; kein Typname vereinbart in C: keine Typprüfung durch den Compiler: b = TRUE; // o.k., typgerechte Verwendung b = 5; // weder Compiler- noch Laufzeitfehler!!! 21

Konstanten (3) symbolische Konstanten #define Name Wert Präprozessor ersetzt textuell alle Vorkommen von Name durch Wert Beispiel: #define PI 3.1415927 Konvention: Name aus Großbuchstaben keine Typprüfung durch den Compiler 22

Makros Verallgemeinerung des Vorgehens bei der Definition symbolischer Konstanten Textuelle Einsetzung funktioniert mit jeder Zeichenkette. Vermeidung lästiger Code-Wiederholungen durch Makro-Definition Beispiel: printf("\n") als Anweisung für den Zeilenvorschub #include <stdio.h> #define zv printf("\n") zv; printf("hallo Praeprozessor!"); zv; 23

Makros Beispiel #include <stdio.h> #define zv printf("\n") #define printar for (i=0;i<4;++i) printf("%d : %d\t", i, ar[i]) int main() { zv; int ar[4] = {10,20,30,40}; printar; zv; int i; for(i=1;i<4;++i) ar[i]++; printar; zv; return 0; } Soll das Ausgabeformat für das Array ar verändert werden, braucht nur die Makrodefinition angepasst werden. 24

Makros Beispiel #include <stdio.h> #define zv printf("\n") #define printar for (i=0;i<4;++i) printf("%d : %d\t", i, ar[i]) int main() { zv; int ar[4] = {10,20,30,40}; printar; zv; int i; for(i=1;i<4;++i) ar[i]++; printar; zv; return 0; } Soll das Ausgabeformat für das Array ar verändert werden, braucht nur die Makrodefinition angepasst werden. 24