Timm Grams Hochschule Fulda Fachbereich Elektrotechnik und Informationstechnik Rekursive Funktionen in C © Timm Grams, Fulda, 13.08.2002 (korr.: 15.05.2008)

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Zahlendarstellung in den Rechnern Z1 und Z3
Befehlssatz und Struktur
Forschungszentrum caesar
Funktionen und Module Einführung anhand des Beispiels Wörter sortieren Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik.
Invariante und Algorithmenentwurf
Hochschule Fulda – FB ET Sommersemester 2010
Verzweigung oder bedingte Anweisung Weiter mit PP.
Imperative Programmierung -Entwicklungswerkzeuge
der Universität Oldenburg
SWITCH - Anweisung.
SWITCH - Anweisung.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
ARRAY oder FELD oder VEKTOR
WHILE - Anweisung.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Polymorphie (Vielgestaltigkeit)
FOR Anweisung.
Der Präprozessor. Bevor der Compiler das Programm in Maschinencode übersetzt (nur dieser kann von der CPU, dem Herz des Computers, bearbeitet werden)
DO...WHILE Anweisung.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Perl-Grundlagen Teile der Präsentation von A. Grupp,
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Imperative Programmierung Funktionen und Parameter
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Batch-Programmierung Grundlagen
int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0);
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
Der C-Präprozessor 08-CPräprozessor.
Der VFP Debugger - Coverage und Profiling. © 1999 TMN-Systemberatung GmbH Der VFP Debugger n Neues Aussehen, eigene Task n Erweiterte Möglichkeiten n.
Einführung in die Programmiersprache C 1
Informatik 1 Übung 2.
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Präsentation C Tutorium von Daniel J. Nowak Folie 1 C Tutorium.
FORTRAN 77.
Grundlagen der Informatik 4 Lehrstuhl für Betriebssysteme 1 Wie werden Funktionen realisiert? Beispiel: int maximum(int x, int y) { int j = x; if (y >
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 5 Dr. W. Narzt u. Dr. A. Stritzinger.
C-Einstieg. Agenda 1Vorbereitung 2Aufbau eines Programms 2.1Header 2.2 Methoden 2.3Main 3Datentypen & Variablen 4Operatoren(+, -, *, /) 5Logik 5.1IF 5.2Switch.
Grundkonzepte des Programmierens (mit ActionScript)
Programmierung 1. Einführung Seite 1
Permanente Datenspeicherung
Informatik II Grundlagen der Programmierung Programmieren in C Programmstrukturen / Kontrollstrukturen Hochschule Fulda – FB ET Sommersemester 2014.
Algorithmen und Datenstrukturen Übungsmodul 8
Informatik II Grundlagen der Programmierung Programmieren in C Benutzerinteraktion / Ein- und Ausgabe Hochschule Fulda – FB ET Sommersemester
3. Lineare Befehle 3.1 Die Ausgabefunktion
BMEVIEEA100 Grundlagen der Programmierung
Paul, Morten, Yannick Blue J. Entwicklungsumgebung  versteht Java Programmcode  Für die Entwicklung eigener Software  Durch die Programmierung.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
1 // Laengste Zeile bestimmen // // Liest die Eingabe Zeichen fuer Zeichen, bis // das erscheint. // Die laengste Zeile wird ausgegeben (bei.
1 Tagesüberblick 5 Lösung Hausaufgabe/Fragen Assoziative Felder Funktionen zu Variablenbehandlung.
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
By Thorsten Zisler 1 SQL Datenbank Anbindung an den Supervisor.
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Rekursion – Speicherverwaltung
Das Programmfenster Menüleiste: Sie enthält Sammlungen mit Befehlen zur Bearbeitung von Texten.
Einführung in die Programmierung
 Präsentation transkript:

Timm Grams Hochschule Fulda Fachbereich Elektrotechnik und Informationstechnik Rekursive Funktionen in C © Timm Grams, Fulda, (korr.: )

Begriffe und deren Bedeutung Der Gültigkeitsbereich einer Funktion erstreckt sich vom Punkt, wo ihr Name deklariert ist, bis ans Ende der Compilierungseinheit (Datei). Es ist zulässig, eine Funktion bereits im Anweisungsteil der Funktion selbst aufzurufen. Funktionen, die sich selbst aufrufen, heißen rekursiv. Das kann auch auf Umwegen über andere Funktionen, also indirekt, passieren. Die Rekursion wird am C-Programm für Textinver- sion erläutert.

Textinversion - Beschreibung Das Programm nimmt von der Tastatur ein Zeichenfolge entgegen und gibt sie in umgekehrter Reihenfolge wieder aus.

Textinversion - ein C-Programm void ReadWrite(){ char x = getchar(); char x = getchar(); if (x!='\n'){ if (x!='\n'){ ReadWrite(); ReadWrite(); putchar(x); putchar(x); }} void main(){ printf("TEXTINVERSION (Eingabeende: CR)\n"); printf("TEXTINVERSION (Eingabeende: CR)\n"); ReadWrite(); ReadWrite(); }

Programmablauf im Papiercomputer Der Befehlszähler beinhaltet die Nummer der auszuführenden Anweisung (hochgestellte Ziffern). Der Stack ist anfangs leer. Der Cursor des Ausgabebildschirms (senkrechter Strich) steht auf der ersten Position. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 1 Stack: Eingabepuffer: Ausgabe (Bildschirm): |

Programmablauf im Papiercomputer Als Ergebnis des ersten Befehls erscheint die Kopfzeile auf dem Bild- schirm. Der Befehlszähler ist erhöht. Der Bediener hat den Text ABC eingetippt und die Eingabetaste gedrückt. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 2 Stack: Eingabepuffer: ´ABC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Die Funktion ReadWrite ist aufgerufen. Das Funktionssegment liegt auf dem Stack: Rücksprungadresse RA und lokale Variable x. In Klammern stehen die aktuellen Werte der Variablen. x ist vorerst noch undefiniert. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 3 Stack: RA(STOP) x(?) Eingabepuffer: ´ABC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 4 Stack: RA(STOP) x(´A´) Eingabepuffer: ´BC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Nach Auswertung der if-Bedingung - sie liefert den Wert 1 - ist der Be- fehlszähler auf die erste der If-Anweisungen gesetzt worden. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 5 Stack: RA(STOP) x(´A´) Eingabepuffer: ´BC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Die ReadWrite-Funktion ist aufgerufen worden. Das Funktionssegment ist auf dem Stack abgelegt und der Befehlszähler steht auf dem ersten Befehl der Funktion. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 3 Stack: RA(6) x(?) RA(STOP) x(´A´) Eingabepuffer: ´BC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 4 Stack: RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´C\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Nach Auswertung der if-Bedingung - sie liefert den Wert 1 - ist der Be- fehlszähler auf die erste der If-Anweisungen gesetzt worden. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 5 Stack: RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´C\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Das Funktionssegment ist auf dem Stack angelegt und der Befehlszähler steht auf dem ersten Befehl der Funktion. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 3 Stack: RA(6) x(?) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´C\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 4 Stack: RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Nach Auswertung der if-Bedingung - sie liefert den Wert 1 - ist der Be- fehlszähler auf die erste der If-Anweisungen gesetzt worden. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 5 Stack: RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Der Funktionsdeskriptor ist auf dem Stack angelegt und der Befehlszähler steht auf dem ersten Befehl der Funktion. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 3 Stack: RA(6) x(?) RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 4 Stack: RA(6) x(´\n´) RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Nach Auswertung der if-Bedingung - sie liefert den Wert 0 - ist die Funktion beendet. Der Befehlszähler ist auf die Rücksprungadresse gesetzt worden. Der Stack-Eintrag der Funktion ist gelöscht. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 6 Stack: RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC|

Programmablauf im Papiercomputer Die Funktion putchar(x) ist ausgeführt, die Funktion ist damit beendet. Der Befehlszähler ist auf die Rücksprungadresse gesetzt worden. Der Stack-Eintrag der Funktion ist gelöscht. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 6 Stack: RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABCC|

Programmablauf im Papiercomputer Die Funktion putchar(x) ist ausgeführt, die Funktion ist damit beendet. Der Befehlszähler ist auf die Rücksprungadresse gesetzt worden. Der Stack-Eintrag der Funktion ist gelöscht. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: 6 Stack: RA(STOP) x(´A´) Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABCCB|

Programmablauf im Papiercomputer Die Funktion putchar(x) ist ausgeführt, die Funktion ist damit beendet. Der Befehlszähler ist auf die Rücksprungadresse gesetzt worden. Der Stack-Eintrag der Funktion ist gelöscht. Das Programm ist beendet. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: STOP Stack: Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABCCBA|

Rekursive Funktionen in C Ende der Demonstration