INE1 Mehr zu Funktionen Ausserdem: Strings (Saiten) Call by value, struct's Call by reference Array Parameter Strings und Stringfunktionen

Ähnliche Dokumente
Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1

Übersicht. C Funktionen. Funktion main. Funktionen. Funktionsdefinition und und Funktionsaufruf Deklaration von Funktionen

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

Arrays (Felder/Vektoren)

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

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

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

Arrays,Strings&Pointer in C/C++

Betriebssysteme, Rechnernetze und verteilte Systeme 1. Crashkurs C (2)

einlesen n > 0? Ausgabe Negative Zahl

Programmierung mit C Zeiger

Praxis der Programmierung

Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

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

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

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

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

2. Programmierung in C

F Zeiger, Felder und Strukturen in C

Vorkurs C++ Programmierung

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Arrays. Einleitung. Deklarieren einer Array Variablen

1. Definition. 2. Interne Speicherung der Zeichenketten. 3. Vereinbarung von Zeichenketten

C-Pointer (Zeiger, Adressen) vs. C++ Referenzen

6. Bearbeitung von Strings in C Bearbeitung von Strings in C

Programmierkurs C++ Datenstrukturen Seite 1

Organisatorisches. Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Definition Datenstruktur. Nächste Woche keine Vorlesung!

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

Algorithmen und Datenstrukturen

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

Zusammenfassung des Handzettels für Programmieren in C

8. Referenzen und Zeiger

Einführung in die Programmiersprache C

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

Deklarationen in C. Prof. Dr. Margarita Esponda

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Datei: svn/ckurs/trunk/c_texte/c_arrptr.txt, Datum: 30. Juni Felder und Zeiger

C-Crashkurs. Praktikum Systemmanagement und Sicherheit

Zeiger, Arrays und Strings in C und C++

Systempraktikum im Wintersemester 2009/2010 (LMU): Vorlesung vom Foliensatz 2

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

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

2. Programmierung in C

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Funktionen und Parameter

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

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Übersicht. Informatik 1 Teil 9: komplexe Datentypen (Strukturen, Enumerationen, Unions)

Grundlagen der Informatik 11. Zeiger

Modellierung und Programmierung

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

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

Rechenzentrum. Programmieren in C. Simone Knief Rechenzentrum der CAU

Informatik II Übung 05. Benjamin Hepp 3 April 2017

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

Datentypen printf und scanf. Programmieren in C Dr. Michael Zwick

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Algorithmen und Datenstrukturen

6 ZEIGER UND REFERENZEN - ALLGEMEINES

Grundlagen der Informatik 12. Strukturen

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Programmieren in C. Zeiger auf Funktionen. Prof. Dr. Nikolaus Wulff

Übung zur Vorlesung Programmieren in C

Elementare Datentypen in C++

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

GI Vektoren

pue13 January 28, 2017

Zeichenketten (Strings)

Unterlagen. CPP-Uebungen-08/

Einführung in die C-Programmierung

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

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Funktionen, Zeiger und Arrays in C Software Entwicklung 1

C++ - Funktionen und mehr -

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

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Tag 5. Repetitorium Informatik (Java) Dozent: Marius Kamp Lehrstuhl für Informatik 2 (Programmiersysteme)

Folien zur AG: Objektorientiertes Programmieren in C++ Einheit 5: Funktionen. Michael Hahsler, Gottfried Rudorfer und Werner J.

Einstieg in die Informatik mit Java

Variablen in C++ Einfache Variablen Strukturen Arrays und Zeichenketten Zeiger und Referenzen Parameter Dynamische Speicherverwaltung

Abgeleitete Datentypen

Einführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher

Einführung in die Programmiersprache C

Algorithmen und Programmierung II

C/C++-Programmierung

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

4 Formelsammlung C/C++

Felder, Zeiger und Adreßrechnung

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Algorithmen und Datenstrukturen (für ET/IT)

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

Einstieg in die Informatik mit Java

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Zeiger: Der Adressoperator &

RO-Tutorien 3 / 6 / 12

Dr. Monika Meiler. Inhalt

Transkript:

INE1 Mehr zu Funktionen Ausserdem: Strings (Saiten) Call by value, struct's Call by reference Array Parameter Strings und Stringfunktionen 1

Call by Value, Structs 2 von 45

Call by value (Wiederholung) 3 von 45

Parameterübergabe (Call By Value) Die formalen Parameter der Funktion werden mit den aktuellen Parametern initialisiert Die formalen Parameter entsprechen lokalen Variablen in der Funktion Wenn diese in der Funktion geändert werden, hat dies keine Auswirkungen nach aussen Man arbeitet in der Funktion quasi mit Kopien der übergebenen Daten falls Ausdrücke übergeben werden, werden diese zuerst ausgewertet 4 von 45

Parameterliste (Wiederholung) /** */ double dreiecksflaeche(double a, double b, double c) {... return flaeche; Datenübergabe mit Hilfe von Parametern In der Funktion: Formale Parameter Beschreibung, Kommentar Typ der Funktion, d.h. der Typ des Rückgabewertes Name der Funktion Liste der Parameter, d.h. der Übergabewerte Anweisungsteil Liste von Variablendefinitionen Entsprechen lokalen Variablen in der Funktion (beim Aufruf der Funktion initialisiert) 5 von 45

Parameterübergabe von struct (by Value) typedef struct {int h, min; Zeit ; Ausgabe: int main (void) { 9:50 Zeit beginn = { 9, 50 ; 10:5 printf("%d:%d\n", beginn.h, beginn.min); 9:50 plusviertelstunde(beginn); printf("%d:%d\n", beginn.h, beginn.min); return 0; void plusviertelstunde(zeit zeit) { if (zeit.min >= 45) zeit.h += 1; zeit.min = (zeit.min + 15) % 60; printf("%d:%d\n", zeit.h, zeit.min); 6 von 45

Parameterübergabe von struct (by Value) Datenstrukturen werden bei der Parameterübergabe (wie bei der Zuweisung) kopiert Die Funktion arbeitet also mit einer lokalen Kopie void druckezeit(zeit zeit) {... 7 von 45

Call by Reference, Pointer 8 von 45

Call by Reference 9 von 45

Zeiger als Parameter (Call By Reference) Es werden nicht die Variablen übergeben, sondern lediglich Referenzen (Adressen, bzw. Zeiger) auf diese Die Variablen können dadurch innerhalb der Funktionen verändert werden Es ist also eine "Rückgabe" von Resultaten über die Referenz-Parameter möglich void inc(int *val) { (*val)++; int main() { int i = 4; inc(&i); printf("%d",i); // 5 10 von 45

Zeiger als Parameter m 80000 2 4 // Parameter sind Zeiger n 80004 4 2 void swap (int *a, int *b) { 80008 int temp = *a; 8000C *a = *b; 80010 *b = temp;......... // Aufruf mit Adressoperator a 80020 80000 int m=2, n=4; 80024 swap(&m, &n); Lokale Variablen von swap b 80028 80004 8002C 80030 2 80034 11 von 45

Zeiger als Parameter Vorteile Werte in der aufgerufenen Funktion gesetzt und verändert werden. Es ist klar zu sehen, dass es sich beim Zugriff um Objekte ausserhalb der Funktion handelt, die ggf. modifiziert werden Nachteile Parameter müssen in der Funktion dereferenziert werden Bei jedem Aufruf muss für jeden Parameter die Übergabeart berücksichtigt und ggf. der Adresse-Operator eingesetzt werden 12 von 45

Zeiger können auch übergeben werden Bestimme Zeit differenz mit Struct Zeit differenz(zeit t1, Zeit t2){ int d = abs((t1.sec+60*t1.min+3600*t1.h) -(t2.sec+60*t2.min+3600*t2.h)); Zeit t = {d/3600,d/60%60,d%60; return t; Struct können auch zurückgegeben werden Zeit differenz(zeit* t1, Zeit* t2){ int d = abs((t1->sec+60*t1->min+3600*t1->h) -(t2->sec+60*t2->min+3600*t2->h)); Zeit t = {d/3600,d/60%60,d%60; return t; 13 von 45

Rückgabe eines Zeigers: Beispiel Zeiger können auch zurückgegeben werden Zeit* besser(zeit* t1, Zeit* t2){ if(t1->sec+60*t1->min+3600*t1->h < t2->sec+60*t2->min+3600*t2->h)){ return t1; else { return t2; 14 von 45

Dangling References / Pointers Probleme entstehen, wenn eine Funktion einen Zeiger auf eine lokale Variable zurückgibt Dieser Speicher kann nach Beenden der Funktion bereits anderweitig genutzt werden Zeit* differenz(zeit* t1, Zeit* t2){ Zeit t; int d = abs((t1->sec+60*t1->min+3600*t1->h) -(t2->sec+60*t2->min+3600*t2->h)); t = {d/3600,d/60%60,d%60; return &t; dangling.c:3: warning: function returns address of local variable Sehr schwer zu findende Fehler! Compiler-Warnungen nicht ignorieren! 15 von 45

Array Parameter 17 von 45

Array-Parameter Bei der Übergabe von Arrays an Funktionen wird keine Kopie übergeben, sondern ein Zeiger auf das erste Array-Element Das bedeutet, dass in der Funktion keine lokale Kopie des Arrays zur Verfügung steht Änderungen das Arrays in der Funktion wirken sich auf das Originalarray aus 18 von 45

Array-Parameter: Beispiel void function(int feld[]) { feld[3] = 33; int main(void) { int feld[] = {1, 2, 3, 4, 5; printf(" %d", feld[3]); function(feld); printf(" %d", feld[3]); return 0; Ausgabe? 4 Ausgabe? 33 19 von 45

Array-Parameter: Beispiel void function(int *feld) { feld[3] = 33; gleich wie: function(int feld[]) int main(void) { int feld[] = {1, 2, 3, 4, 5; printf(" %d", feld[3]); function(feld); printf(" %d", feld[3]); return 0; 20 von 45

Array-Parameter: Beispiel Da die Grösse in der Funktion nicht bekannt muss sie als Parameter übergeben werden Zeit bestzeit(int teilnehmer, Zeit zeiten[]) { Zeit best = zeiten[0]; int bestsec = best.sec+60*best.min+3600*best.h; int i; for (i = 1; i < teilnehmer; i++){ int sec = zeiten[i].sec+60*zeiten[i].min+3600*zeiten[i].h; if (sec < bestsec) best = zeiten[i]; bestsec = sec; return best; 21 von 45

Strings und Stringfunktionen 22 von 45

Strings in C Bereits häufig verwendet: Stringliterale "Dies ist ein Text" Tatsächlich handelt es sich dabei um ein Array von char-werten Das Ende des Strings wird durch den Wert 0 markiert Als char Wert: '\0' Typ und Initialisierung: char meldung[100]; // Platz für String bis zu 99 Zeichen char fehler[] = "Error"; // char-array der Laenge 6 23 von 45

Char Konstanten Zeichen Konstanten wie in Java mit ' ' Werte char 7 Bit, ASCII (char: Latin 1) folgende Spezialzeichen sind definiert end of string NUL \0 0 audible alert (bell) BEL \a 7 backspace BS \b 8 horizontal tab HT \t 9 newline LF \n 10 vertical tab VT \v 11 formfeed FF \f 12 carriage return CR \r 13 double quote " \" 34 single quote ' \' 39 question mark? \? 63 backslash \ \\ 92 24 von 45

Arrays und Strings Grösse implizit durch Initialisierung bestimmen int i[] = {1,2,3,4,5; Strings Strings sind einfach Arrays of char letzte Position immer ein '\0' Zeichen C Beispiel char hallo[10]; char hallo[] = {'H','a','l','l','o','\0'; char hallo[] = "Hallo"; char hallo[10] = "Hallo"; '\0' '\0' Zeichen Zeichen für für Stringabschluss Stringabschluss Grösse Grösse für für Speicherallokation: Speicherallokation: muss muss gross gross genug genug sein, sein, kann kann aber aber auch auch wesentlich wesentlich grösser grösser sein sein Achtung:Array muss immer 1 grösser sein als String 25 von 45

Array von Zeichen, Strings Die String-Länge muss nicht immer Array-Länge minus 1 sein Häufig wird ein grösseres Array angelegt, das nach Bedarf mit einem String der Länge < Array-Länge belegt werden kann '\0' 26 von 45

Array von Zeichen, Strings Array von Zeichen: char c[] = {'0','1', '2', '3', '4', '5', '6', '7', '8', '9'; String: char d[]= "0123456789"; Worin unterscheiden sich c und d? Wie gross sind die Arrays jeweils? 27 von 45

String Funktionen int strlen (char strg[]) { int index; /* index into the string */ /* Loop until we reach the end of string character */ for (index = 0; strg[index]!= '\0'; index+=1); return index; Die Übergabe von Strings an eine Funktion entspricht der Übergabe von Arrays 28 von 45

Konstante Parameter int strlen (const char strg[]) { int index; /* index into the string */ /* Loop until we reach the end of string character */ for (index = 0; strg[index]!= '\0'; index+=1); return index; Parameter, die als const deklariert werden, können in einer Funktion nicht geändert werden 29 von 45

String-Bibliothek C bietet in der String-Bibliothek string.h einige Funktionen zum Umgang mit Strings an Beispiel: strcpy zum Kopieren eines Strings in ein char-array (Ersatz für nicht unterstützte Zuweisung) #include <string.h> int main (void) { char name[4] strcpy(name, "Sam");... return 0; 30 von 45

String Bibliothek String ist keine Klasse aber es gibt eine Bibliothek, mittels der Strings manipuliert werden können. Länge eines Strings: strlen int i = strlen(str) String kopieren strcpy char hallo[12] = "Hallo"; char welt[12]; strcpy(welt, hallo); // welt == "Hallo" String zusammenfügen strcat char welt[] = " Welt"; strcat(hallo, welt); // hallo == "Hallo Welt" Gefährlich, da Speicher überschrieben wird, wenn zweiter String zu gross Lösung: breche nach n-1 Zeichen ab strncpy(hallo,welt,12-1); hallo[11] = '\0'; strncat(hallo,welt,12-strlen(hallo)-1); // strncat fügt noch '\0' an 31 von 45

ANSI C String Bibliothek #include <string.h> int strlen (s) Returns the number of characters in s, excluding the terminating null. char *strcpy (s1, s2) Copies s2 to s1, returning s1. char *strncpy (s1, s2, n) Like strcpy, except at most `n' characters are copied. char *strcat (s1, s2) Concatenates s2 onto s1. null-terminates s1. Returns s1. char *strncat (s1, s2, n) Concatenates s2 onto s1, stopping after `n' characters or the end of s2, whichever occurs first. Returns s1. int strstr (s1, s2) Searches for the string s2 in s1. Returns a pointer if found, otherwise the null-pointer. 32 von 45

ANSI C String Bibliothek int strcmp (s1, s2) Compares strings s1 and s2. Returns an integer that is less than 0 is s1 < s2; zero if s1 = s2; and greater than zero is s1 s2. int strncmp (s1, s2, n) Like strcmp, except at most `n' characters are compared. char *strchr (s, c) Searches string s for character c. Returns a pointer to the first occurence, or null pointer if not. char *strrchr (s, c) Like strchr, except searches from the end of the string. int strspn (s1, s2) Returns the number of consecutive characters in s1, starting at the beginning of the string, that are contained within s2. C char *strpbrk (s1, s2) Returns a pointer to the first character in s1 that is present in s2 (or NULL if none). char *strerror (n) Returns a pointer to a string describing the error code `n'. long atol(s1) Converts String to long double atod(s1) Converts String to double 33 von 45

String-Bibliothek Dokumentation dieser Funktionen der String-Bibliothek strcpy, strncpy, strcat, strncat, strcmp, strlen Quellen: http://www.cplusplus.com/reference/clibrary/cstring/ http://openbook.galileocomputing.de/c_von_a_bis_z/030_c_anhang_b_020.htm 34 von 45

Übungen folgende Definition sei gegeben char h1[] = "Hello "; char h2[] = " World!!" Aufgabe bestimmen Sie die Länge der Strings h1 und h2 prüfen Sie die beiden Strings auf Gleichheit welches ist der letzte gültige Index-Positionen von h1 und h2 erstellen Sie einen String s, der den (zusammengehängten) Inhalt von h1 und h2 enthält (aufpassen wegen der Länge). 35 von 45

Array von Zeichen, Strings Was ist der Fehler? char t[4] = "abcd"; // mit dem abscliessenden '\0' ist // ein Array mit 5 Elementen noetig Der Zuweisungsoperator ist für Arrays und damit auch für Strings nicht definiert char name[4]; name = "Sam"; /* Fehler!! char neu[4] = "Sam" /* zulässig */ 36 von 45

Strings in Datenstrukturen Strings kommen auch häufig in Datenstrukturen vor Beispiel: typedef struct { char name[20]; int jahrgang; Person ; Person person; Person *pperson = &person; // Zeiger auf p scanf("%s", pperson->name); // Einlesen von name printf("%s", pperson->name); // Namen ausgeben 37 von 45

Strings in Main Funktion Die Argumente, die dem Programm auf der Kommandezeile übergeben werden, werden als Array von Strings übergeben Beispiel int main(int argc, char *argv[]) { if (argc == 2) { arg[0] arg[0] Name Name des des Programms, Programms, z.b. z.b. Hello.exe Hello.exe printf("%s %s",argv[0], argv[1]); arg[1] arg[1] erstes erstes Argument Argument return 0; > hello World hello.exe World 38 von 45

Noch Fragen? 39 von 45

Funktionszeiger 40 von 45

Funktionszeiger Der Name einer Funktion ist (wie ein Array-Name) eine Adresskonstante Es können deshalb Zeiger auf Funktionen definiert werden So kann man auch Funktionen als Parameter an Funktionen übergeben Zeiger fptr auf eine Funktion, die Typ zurückgibt: Typ (* fptr) (Parameterliste) 41 von 45

Funktionszeiger Diesem Zeiger kann ein Wert zugewiesen werden: fptr = &Funktionsname Aufruf (Dereferenzieren): (*fptr)(argumentliste) Achtung: Klammern bei der Deklaration notwendig Zeiger auf Funktion, die Typ zurückgibt Typ (* fptr) (Parameterliste) Name einer Funktion, die Zeiger auf Typ zurückgibt Typ * func (Parameterliste) 42 von 45

Beispiel (Teil 1) #include <stdio.h> typedef struct { char name[20]; unsigned int alter; Person; void geburtstag (Person * p){ p->alter += 1; printf("happy Birthday %s!\n", p->name); 43 von 45

Beispiel (Teil 2) /* Eine Person und ihr Alter ausgeben */ void zeigen (Person * p){ printf("%s \t ist %d\n", p->name, p->alter); /* Eine Funktion (zweiter Parameter) für alle Elemente eines Arrays von Personen ausführen Letztes Element hat Alter 0 oder negativ! */ int i; void mit_allen (Person p[ ], void (*mache)(person *) ) { for (i = 0; p[i].alter > 0; i++) { (*mache)(p+i); oder: &p[i] 44 von 45

Beispiel (Teil 3) int main (void) { Person freunde[ ] = {{"Hans", 10,{"Fritz", 11, {"Max", 12, {"Kurt", 13, {"Peter", 14,{"Ende", 0; /* Funktionen zeigen und geburtstag werden übergeben */ mit_allen(freunde, zeigen); mit_allen(freunde, geburtstag); mit_allen(freunde, zeigen); return 0; 45 von 45