Schleifen. Auch das Berechnen von Produkten kann analog formuliert werden.

Ähnliche Dokumente
10 Lesen und Schreiben von Dateien

Anwendungssoftware III (MATLAB)

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

Erwin Grüner

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Programmierkurs Java

PHP 5.4 ISBN Stephan Heller, Andreas Dittfurth 1. Ausgabe, September Grundlagen zur Erstellung dynamischer Webseiten GPHP54

Grundlagen der Programmiersprache C++

Inhalt Streams Eingabe / Ausgbe in C Dateizugriff in C Eingabe / Ausgabe in C++ Dateizugriff in C++ Error Handling

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Termin 4: Programmieren in MATLAB

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

1 Vom Problem zum Programm

Objektorientiertes Programmieren für Ingenieure

Steuern des GSR-Interface mit QBasic

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Tag 9: Datenstrukturen

Einführung in die C-Programmierung

PIWIN 1 Übung Blatt 5

C Überlebenstraining

Zugriff auf Daten der Wago über eine Webseite

SQL-Loader. Prof. Dr. Waldemar Rohde Dipl.-Ing. Jörg Höppner

Unterprogramme, Pointer und die Übergabe von Arrays

Schmitt, Günter (1996): Fortran 90 Kurs technisch orientiert, R. Oldenbourg Verlag, München

Ingenieurinformatik Diplom-FA (Teil 2, C-Programmierung)

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

entweder: zeilenweise fgets() oder: zeichenweise fgetc()

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Informationsverarbeitung im Bauwesen

Funktionen in PHP 1/7

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Lernfeld 6: Entwickeln und Bereitstellen von Anwendungssystemen Fallbeispiel Baukredit

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Compilieren und Linken von C- und C++-Dateien

Einführung in VisualBasic for Applications. Stefan Mahlitz

Excel Funktionen durch eigene Funktionen erweitern.

Entwurf von Algorithmen - Kontrollstrukturen

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

Schleifenprogrammierung in C/C++, Fortran und Pascal

Handbuch Datenpunktliste - Auswerte - Tools

2. Interaktive Web Seiten. action in Formularen. Formular. Superglobale Variablen $ POST, $ GET und $ REQUEST. GET und POST

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

Einführung in Automation Studio

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Programmierung in Python

Linux Tutorium. 12. Shellprogrammierung. Version vom :38:56

MATLAB Onlinevorlesung. Dipl.-Inf. (FH) Patrick Rogge Seite 1

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

Erwin Grüner

Variablen - %Hashes Was ist ein Hash? 'Assoziative Arrays'

Propädeutikum zur Programmierung

TYPO3 und TypoScript

IT-Zertifikat: Allgemeine Informationstechnologien II PHP

Logische Verknüpfungen. while-schleifen. Zahlendarstellung auf dem Computer. Formatierung von Zahlen in MATLAB.

Grundlagen Programmierung

Einführung in die Java- Programmierung

Anwendungssoftware III (MATLAB)

Anwendungssoftware III (MATLAB)

Java Programmierung auf der Konsole / unter Eclipse

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Eine Einführung in C-Funktionen

Übersicht. Informatik 1 Teil 10 Dateien

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Modellierung und Programmierung 1

Fallunterscheidung: if-statement

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Linux Prinzipien und Programmierung

Einführung in die Programmierung

Praktische Mathematik: Lineare und Netzwerk-Optimierung (SS 2015) Praktikumsaufgaben

Text- und Excel-Dateien in GeoMedia

Einführung in MATLAB zur Veranstaltung Einführung in die Numerik

Informatik Grundlagen, WS04, Seminar 13

PHP 5.4 ISBN Fortgeschrittene Techniken der Web-Programmierung. Bastian Martin, Andreas Dittfurth. 1. Ausgabe, April 2013 GPHP54F

182. stdio stdio. Eingabe. Ausgabe. Typisch für Zeileneingabe und Analyse: #include <stdio.h>

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

PHP mit Dreamweaver MX bearbeiten 00

Stata I: Analyseorganisation und erste Schritte

Multimedia im Netz Wintersemester 2011/12

P r o g r a m m a b l a u f s t e u e r u n g

Grundlagen der Informatik 2

Programmierung in C. Grundlagen. Stefan Kallerhoff

Informatik I. Informatik I. 6.1 Programme. 6.2 Programme schreiben. 6.3 Programme starten. 6.4 Programme entwickeln. 6.1 Programme.

Modellierung und Programmierung

Die Programmiersprache C

Programmieren der Untersuchung

Visual Basic / EXCEL / Makroprogrammierung Unterrichtsreihe von Herrn Selbach

Mathematik am Computer 7. Vorlesung: Matlab, Teil II

Java Kurs für Anfänger Einheit 5 Methoden

3. Auflage. O Reillys Taschenbibliothek. Windows PowerShell 3.0. kurz & gut. Lee Holmes. Deutsche Adaption von Rolf Masuch O REILLY

Hinweise zur Bestellung anonymer Zählmarken

Kapitel 3. Mein erstes C-Programm

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

SOI Die Schweizer Informatikolympiade

Um einen neuen Konnektor anzulegen klicken sie in der Liste der Konnektoren auf die Schaltfläche Neue Konfiguration.

Fortgeschrittene Servlet- Techniken. Ralf Gitzel

Transkript:

Schleifen Oft ist es notwendig einen Befehl oder einen Befehlsblock mehrmals hintereinander auszuführen. Um dies zu ermöglichen, stellen Programmiersprachen das Steuerkonstrukt der Schleife zur Verfügung. Will man etwa die Summe 1+2+3+ +100 ausrechnen, so kann man iterativ folgende Vorgehensweise wählen: 1. Setzte summe=1 und zähler=1 2. Falls zähler=100 ende 3. Erhöhe Zähler um eins 4. erhöhe summe um Zähler 5. Fahre fort mit Schritt 2 Hier muss der Befehlsblock, der die Gesamtsumme vergrößert (2-5) so oft wiederholt werden, bis die Zählvariable einen gewissen Wert (100) erreicht. Auch das Berechnen von Produkten kann analog formuliert werden. 28

Zählschleifen Die for-schleife als Zählschleife dient zur Implementierung des Summenbeispiels und analoger Probleme in Matlab. Syntax: for schleifensteuerung anweisungsblock end Schleifensteuerung hat üblicherweise die Gestalt variable=anfangswert : schrittweite : zielgröße Rechts vom = Zeichen kann ein beliebiger Vektor stehen, dessen Werte die Variable dann nacheinander annimmt. Schachtelung möglich. Achtung! for-schleife iteriert über einen Vektor, das heißt: Beeinflussen der Zählvariable nicht möglich. (siehe Beispiele) Beispiele: for_demo.m, summe_demo.m, produkt_demo.m 29

Schleifen Es gibt noch einen andere Art von Aufgabenstellung, die es erfordert Befehlblöcke mehrmals hintereinander auszuführen. Will man etwa die Nullstelle von x^2-2 berechnen (mit Hilfe des Bisektionsverfahrens), so kann man folgendermaßen vorgehen: 1. Setzte a= 0 und b=3 (wegen 0^2-2<0 und 3^2+2>0 muss es eine Nullstelle im Intervall [a,b] geben) 2. Falls a^2-2 <epsilon akzeptiere a als Nullstelle Ende 3. Sonst wähle c=(a+b)/2 4. Falls c^2+2>0 setzte b=c und gehe zu 2 5. Sonst setzte a=c und gehe zu 2 Hier muss der Befehlblock, der das Intervall in dem die Nullstelle liegen muss sukzessive verkleinert, bis eine gewisse Bedingung (Approximation besser als epsilon) eintritt durchgeführt werden. 30

Bedingungsschleifen Die while-schleife als Bedingungsschleife dient im Matlab zur Implementierung von Schleifen, die so lange ausgeführt werden, wie eine Laufbedingung erfüllt ist. Syntax: while bedingung anweisungsblock end Man kann die aktuelle Schleife (for oder while) mit break verlassen, sollte dies jedoch zum erhalt der Lesbarkeit des Quelltextes möglichst vermeiden. Beispiele: bisektion_demo1.m, ggt.m 31

Schleifen Man sollte unbedingt darauf achten, die Art von Schleife zu verwenden, die geeignet ist. Offensichtlich kann nämlich jede for-schleife auch als while-schleife formuliert werden. Die for-schleife ist jedoch, bei Schleifen bei denen die Iterationsanzahl bereits vor betreten der Schleife bekannt ist, wesentlich leichter lesbar. Man sollte grundsätzlich sogenannte Endlosschleifen vermeiden. Nur in sehr seltenen Fällen (die im Rahmen dieser Einführungsveranstaltung nicht vorkommen) sind schwer lesbare Codefragmente wie while(1) Befehle if(abbruchbedingung) break end notwendig. 32

Rekursion Als Rekursion bezeichnet man den Aufruf oder die Definition einer Funktion durch sich selbst. Will man etwa eine Funktion Schreiben, die eine Summe 1+2+3+ +n berechnet, so kann man elternativ zur Variante mit Schleifen folgendermaßen vorgehen: function var=summe(n) if n==1 var=1; else var=n+summe(n-1); end Ruft man summe(4) auf, so wird folgendes geschehen: summe(4) =4+summe(3) =4+3+summe(2) =4+3+2+summe(1) =4+3+2+1 Es wird also das korrekte Ergebnis berechnet. 33

Rekursion Man beachte, dass der Quelltext zum Berechnen der Summe in der rekursiven Variante sehr knapp und prägnant ist. Wir wollen uns ein weiteres Beispiel ansehen. Will man eine Funtion Schreiben, die die Fakultät einer Zahl n berechnet, so kann man folgendermaßen vorgehen: function var=faktorielle(n) if n<=1 var=1; else var=n*faktorielle(n-1); end Ruft man faktorielle(3) auf, so wird folgendes geschehen: faktorielle(3)=3*faktorielle(2) =3*2*faktorielle(1) =3*2*1 Es wird also das korrekte Ergebnis berechnet. 34

Rekursion Als letztes Beispiel wollen wir die Fibonaccizahlen berechnen. Diese sind folgendermaßen definiert: f_1=1, f_2=1, f_(n)=f_(n-1)+f_(n-2) Will man eine Funktion Schreiben, die zu beliebigem n die Fibonaccizahl f_n berechnet, so kann man dies folgendermaßen tun: function var=fib(n) if n==1 n==2 var=1; else var=fib(n-1)+fib(n-2); end Ruft man fib(5) auf, so wird folgendes geschehen: fib(5) =fib(4)+fib(3) =fib(3)+fib(2)+fib(2)+fib(1) =fib(2)+fib(1)+1+1+1 =1+1+1+1+1=5 35

Rekursion Am Beispiel der Fibonaccizahlen kann man noch deutlicher erkennen, dass der Quelltext im Vergleich zu einer iterativen Implementierung sehr viel leichter lesbar ist. Allerdings fällt auch ein Makel auf. Der Aufruf von fib(2) und fib(1) erfolgt mehrfach. Das wäre bei einer induktiven Variante nicht der Fall. Das trifft auf Rekursive Programme generell zu. Sobald eine Rekursion mehr als einen vorangehenden Aufruf zur Definition benötigt werden Einträge mehrfach berechnet. Obwohl man die meisten Rekursionen auch induktiv programmieren kann, gibt es Beispiele, die sich nicht in eine Variante mit Schleifen umformulieren lassen. Als Prominentestes Beispiel sei hier das Spiel Die Türme von Hanoi genannt. Beispiele: summe.m, faktorielle.m, fib.m 36

Function-Handle Oft hat man Funktionen, die als Parameter selbst eine Funktion benötigen. Ein Beispiel dafür ist etwa das Bisektionsverfahren, das die Nullstelle einer gegebenen Funktion berechnet. Bis jetzt wurde es nur für die fix vorgegebene Funktion x^2-2 angegeben. Allerdings funktioniert dieselbe abstrakte Vorgehensweise für jede stetige Funktion. Um das Konzept zu verstehen, mit dessen Hilfe man einer Funktion eine Funktion als Parameter übergeben kann, muss man sich zunächst klar machen, dass jede Funktion als Datei abgelegt vorliegt. Will man also eine Referenz auf diese Funktion übergeben, so ermöglicht Matlab dies, indem man den Namen der Funktion als String übergibt. Beispiel: bisektion_demo2.m (funktion1.m, funktion2.m) 37

Function-Handle An Hand des Beispiels sieht man, dass man auf diese Weise Funktionen wie etwa das Bisektionsverfahren in großer Allgemeinheit programmieren kann. Weitere Beispiele sind etwa die Matlab Funktion quad, die das Bestimme Integral einer Funktion ausrechnet. Oft ist es mühselig für jede Funktion, für die man die Nullstelle finden möchte oder ein Integral ausrechnen will, eine eigene Datei anzulegen. Als Alternative bietet Matlab die Möglichkeit anonyme Funktionen zu deklarieren. Syntax: Varible=@(Parameter)(Berechnung) Bsp: f=@(x)(x^2) f(3) 9 Variable kann dann als Funktion-Handle verwendet werden. Beispiel: anon_func.m 38

Function-Handle Man kann ein Function-Handle auch durch die Zuweisung fhandle=@funktionsname erzeugt werden, sofern die Funktion funktionsname für Matlab auffindbar ist. Das heißt also funktionsmane ist eine eingebaute Funktion oder eine in einer Datei abgelegte Funktion. Man beachte, dass nach Erstellung des Function-Handles der Gültigkeitsbereich der ursprünglichen Funktion verlassen werden kann ohne, dass der Handle seine Funktionalität verliert. Obwohl der Function-Handle ein eingebauter Datentyp ist, wird die Manipulation als Vektor bzw. Matrix nicht unterstützt. Will man ein Array von Handles anlegen, so ist das Cell-Array die einzige Möglichkeit. 39

Function-Handle Man kann ein Function-Handle auch durch die Zuweisung fhandle=@funktionsname erzeugt werden, sofern die Funktion funktionsname für Matlab auffindbar ist. Das heißt also funktionsmane ist eine eingebaute Funktion oder eine in einer Datei abgelegte Funktion. Man beachte, dass nach Erstellung des Function-Handles der Gültigkeitsbereich der ursprünglichen Funktion verlassen werden kann ohne, dass der Handle seine Funktionalität verliert. Obwohl der Function-Handle ein eingebauter Datentyp ist, wird die Manipulation als Vektor bzw. Matrix nicht unterstützt. Will man ein Array von Handles anlegen, so ist das Cell-Array die einzige Möglichkeit. 40

Input / Output Bis jetzt ist nur die Möglichkeit besprochen worden Information in Form von Parametern an eine Funktion zu übergeben. Eine Funktion kann Ergebnisse als Rückgabewerte ans System zurückliefern oder bewusst beim ausführen ein Echo erzeugen (durch Nichtverwenden eines Semikolons). Es gibt aber natürlich auch die Möglichkeit Information zur Laufzeit über die Tastatur oder aus einer Datei einzulesen. Hierfür bietet Matlab einige sehr einfache und elegante Lösungen. Auch die Ausgabe am Bildschirm oder das Schreiben in Dateien ist einfach möglich. Das Echo sollte eigentlich nicht als Mittel zur Informationsübertragung verwendet werden. Funktionen, die sich mit dem Austausch von Information befassen werden auch Input/Output oder kurz I/O Funktionen genannt. 41

Input Der Befehl input ermöglicht es einer Variable zur Laufzeit einen vom Benutzer über die Tastatur eingegebenen Wert zuzuweisen. Syntax Variable=input(String); Der Inhalt des Strings wird auf dem Bildschrim angezeigt. Er könnte etwa Formulierungen wie Bitte geben Sie eine natürliche Zahl ein: enthalten. Es ist denkbar, dass der Anwender keinen Wert eingibt. In diesem Fall bleibt die Variable leer. Dies kann mit dem Befehl isempty überprüft werden. if isempty(variable) Variable=Defaultwert; end Beispiele: input_demo.m 42

Ausgabe auf dem Bildschirm Der einfachste Matlab-Befehl um eine Ausgabe auf dem Bildschirm zu realisieren ist der Befehl disp. Syntax disp(variable); Mit disp werden Daten beliebigen Typs am Bildschirm ausgegeben. Die Variable kann also ein String sein, könnte aber auch ein Double oder eine Matrix sein. Die Ausgabe wird von Matlab jeweils entsprechend dem Datentyp sinnvoll formatiert. Die Ausgabeform von Double variablen hängt vom aktuellen Ausgabeformat ab. Dieses kann mit format verändert werden. (Für Details siehe Matlab-Hilfe bzw. Beispiel) Beispiele: disp_demo.m 43

Ausgabe auf dem Bildschirm Der Befehl fprintf, der in seiner Funktionsweise an den C- Befehl printf angelehnt ist, ermöglicht eine wesentlich genauere Kontrolle der Formatierung bei der Ausgabe auf dem Schirm. Syntax fprintf(formatstring,weitere Variable) Im Formatstring wird die Formatierung festgelegt. Hier werden mit Hilfe sogenannter Formatangaben Platzhalter für Variable festgelegt. Diese Platzhalter werden dann mit dem Inhalt der weiteren Variablen gefüllt. Ein Platzhalter hat folgende Gestalt: %<flag><width><.precission>char Alle Zeichen die nicht zu einem Platzhalter gehören, werden von fprintf unverändert ausgegeben. 44

Ausgabe auf dem Bildschirm %<flag><width><.precission>char <flag> kann die Werte +,- oder 0 haben. + bedeutet Ausgabe eines Vorzeichens erzwingen. bedeutet linksbündige Formatierung. 0 bedeutet rechtsbündige Formatierung (es werden vorne Nullen eingefügt, bis die in <width> angegebene Breite erreicht ist. <width> gibt die Anzahl der Stellen, die die darzustellende Größe jedenfalls einnehmen soll. Das ist sehr hilfreich etwa beim erstellen von formatierten Tabellen. <precision> gibt an mit welcher Genauigkeit die Daten ausgegeben werden sollen. Das char bestimmt den Datentyp und die Ausgabeform: c=ein Zeichen, e=gleitpunktdarstellung, f=fixpunktdarstellung, s=string, x=hexadezimalnotation Beispiele: fprintf_demo.m 45

Ausgabe auf dem Bildschirm Um Fehlermeldungen auszugeben gibt es den eigens dafür konzipierten Befehl error. Syntax: error(message,weitere var ) Es werden die Fehlermeldung im String message angezeigt und die Funktion beendet aus der error aufgerufen wird. message ist als Formatstring im Sinne von fprintf zu verstehen, sodass auch weitere Variable angegeben werden können. Ein analoger Befehl um Warnungen am Bildschirm auszugeben, der die laufende Funktion aber nicht beendet ist warning(message,weitere var ). Wiederum ist message als Formatstring im Sinne von fprintf zu verstehen. 46

Zugriff auf Dateien Mit fopen können Dateien, die sich im Dateisystem befinden geöffnet werden. Syntax: fid=fopen(name,zugriff) Der String Name enthält den Namen der zu öffnenden Datei. Der Sting Zugriff muss eines der folgenden sein: r nur Lesezugriff w nur Schreibzugriff (Achtung! Bestehende Daten werden überschrieben) a Daten werden an bestehende Datei angehängt r+ Lese- und Schreibzugriff Ergebnis von fopen ist eine File-ID. Das ist ein Integer, das vom System bereitgestellt wird und die Datei eindeutig identifiziert. Fclose(fid) beendet den Dateizugriff. 47

Lesen von Textdateien Hat man die File-ID mit Hilfe von fopen ermittelt, so kann man sehr einfach den Inhalt von Textdateien auslesen. Hierfür kann man die Befehle fgetl, fgets und fscanf verwenden. Funktionsweise: fgetl Lesen einer ganzen Zeile inklusive Return fgets Lesen einer ganzen Zeile ohne Return fscanf Formatiertes Einlesen. Syntax von fscanf: var=fscanf(fid,format,feldgröße) fid ist die entsprechende File-ID. Format ist ein Formatstring, der genauso gebaut sein muss wie für fprintf. Die Feldgröße ist ein Array und gibt an, in welchem Matrix- Format auselesen wird. Beispiele: read_matrix.m (mit matrix.txt), 48

Lesen von Textdateien Eine weitere sehr einfache Möglichkeit gibt es in Matlab ganze Dateien auf ein Mal einzulesen, wenn sie nur Zahlen enthalten, load. Syntax: var=load(string) String gibt den Dateinamen an. load liest alle Zahlen der Datei ein und speichert sie in einer Matrix. Die Datei darf nur dann Zeichen enthalten, die zu keiner Zahl gehören, wenn diese als Matlab- Kommentar geschrieben werden (also mit vorangestelltem %-Zeichen). Beispiele: load_matrix.m (mit matrix.dat) 49

Schreiben von Textdateien Das Schreiben von Textdateien funktioniert genau so, wie das formatierte Schrieben auf dem Bildschirm, nämlich mit fprintf. Allerdings muss nun die File-ID auch als Parameter übergeben werden. Syntax: fprintf(fid,formatstring,weitere Variable) Abgesehen von der Angabe der fid bleibt der Gebrauch von fprintf unverändert. Beispiele: write_matrix.m 50

Mit dem Befehl save(dateiname) Mehr über load können alle Variablen des aktuellen Workspace in eine.mat-datei gespeichert werden. Die so auf der Festplatte gespeicherten Daten können anschließend mit load(dateiname) wieder hergestellt werden. save(dateiname, var1, var2, ) speichert nur die Variablen var1, var2 etc Defaultmäßig wird eine Binärdatei angelegt. Möchte man das Anlegen einer ASCII-Datei erzwingen, so kann man dies durch die Angabe des Optionalen Parameters ASCII tun. 51

Mehr über load Die Angabe des Dateityps beim Lesen von mit save abgelegten Daten ist notwendig, sofern ein alternativer Typ, z.b. ASCII, verwendet wurde. In diesem Fall muss load in der Form Mit load( -ASCII,Dateiname) aufgerufen werden. load(dateiname, var1, var2, ) Werden nur die Variablen var1, var2 etc eingelesen. 52