Teile und Herrsche. Themen heute. Eigene Funktionen Parameter Fallunterscheidungen Fehlersuche. Programmieren für Ingenieure Sommer 2015

Ähnliche Dokumente
Teile und Herrsche. Themen heute. Eigene Funktionen Parameter Fallunterscheidungen Fehlersuche. Programmieren für Ingenieure Sommer 2014

Erste Schritte. Das Arduino-Board. Ihr Fundino-Board. Programmieren für Ingenieure Sommer Andreas Zeller, Universität des Saarlandes

Um überhaupt produktiv arbeiten zu können, sind eine Reihe grundlegender Vorbereitungen notwendig:

Erste Schritte. Programmieren für Ingenieure Sommer Andreas Zeller, Universität des Saarlandes

Daten verarbeiten. Binärzahlen

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Was meinen die Leute eigentlich mit: Grexit?

Zahlensysteme: Oktal- und Hexadezimalsystem

Diana Lange. Generative Gestaltung Operatoren

1 Vom Problem zum Programm

Java Einführung Operatoren Kapitel 2 und 3

Mathematik: Mag. Schmid Wolfgang Arbeitsblatt 3 1. Semester ARBEITSBLATT 3 RECHNEN MIT GANZEN ZAHLEN

BITte ein BIT. Vom Bit zum Binärsystem. A Bit Of Magic. 1. Welche Werte kann ein Bit annehmen? 2. Wie viele Zustände können Sie mit 2 Bit darstellen?

Zahlensysteme Seite -1- Zahlensysteme

Erwin Grüner

der Eingabe! Haben Sie das Ergebnis? Auf diesen schwarzen Punkt kommen wir noch zu sprechen.

Projekt Nr. 15: Einen elektronischen Würfel erstellen

Primzahlen und RSA-Verschlüsselung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Zeichen bei Zahlen entschlüsseln

Die Post hat eine Umfrage gemacht

Informationssysteme Gleitkommazahlen nach dem IEEE-Standard 754. Berechnung von Gleitkommazahlen aus Dezimalzahlen. HSLU T&A Informatik HS10

2. Negative Dualzahlen darstellen

2 Einfache Rechnungen

Excel Funktionen durch eigene Funktionen erweitern.

Übung 9 - Lösungsvorschlag

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Grundlagen der Informatik

Skript und Aufgabensammlung Terme und Gleichungen Mathefritz Verlag Jörg Christmann Nur zum Privaten Gebrauch! Alle Rechte vorbehalten!

Sowohl die Malstreifen als auch die Neperschen Streifen können auch in anderen Stellenwertsystemen verwendet werden.

Programmieren für Ingenieure Sommer Ein Rechner. Rechner sind überall. Gerät, das mittels programmierbarer Rechenvorschriften Daten verarbeitet.

Java: Vererbung. Teil 3: super()

Highspeedaufnahmen mit dem Arduino Uno Board

Kurzanleitung /Kompalitätstest Barcode. Sie haben zwei Möglichkeiten unsere Barcode/Strichcodes für Ihren eigenen stationären Einzelhandel zu nutzen.

Einführung in die Programmierung

Binärdarstellung von Fliesskommazahlen

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

Funktion Erläuterung Beispiel

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Einführung in die Java- Programmierung

Hier ist die Anleitung zum Flashen des MTK GPS auf der APM 2.0. Prinzipiell funktioniert es auch auf der APM 2.5 und APM 1.

1. Das dekadische Ziffernsystem (Dezimalsystem) Eine ganze Zahl z kann man als Summe von Potenzen zur Basis 10 darstellen:

Wie bekomme ich eine Adresse. Eva Lackinger, Rene Morwind Margot Campbell

Java Kurs für Anfänger Einheit 5 Methoden

Unterrichtsmaterialien in digitaler und in gedruckter Form. Auszug aus:

Facharbeit Informatik. Thema:

Zählen von Objekten einer bestimmten Klasse

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Berechnungen in Access Teil I

Jede Zahl muss dabei einzeln umgerechnet werden. Beginnen wir also ganz am Anfang mit der Zahl,192.

N Bit binäre Zahlen (signed)

Theoretische Grundlagen der Informatik WS 09/10

Informatik Repetitorium SS Volker Jaedicke

Erklärung zum Internet-Bestellschein

Tevalo Handbuch v 1.1 vom

Grundlagen der Theoretischen Informatik, SoSe 2008

Grundlagen. Kapitel 1

Binär Codierte Dezimalzahlen (BCD-Code)

Algorithmische Kryptographie

Künstliches binäres Neuron

PCE-USM RS USB Logger

Bluetooth Low Energy Demo mit dem Apple iphone 4s

Übungen Programmieren 1 Felix Rohrer. Übungen

Wir machen neue Politik für Baden-Württemberg

3. LINEARE GLEICHUNGSSYSTEME

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Einrichtung des WS_FTP95 LE

Erstellen der Barcode-Etiketten:

Professionelle Seminare im Bereich MS-Office

Sin-Funktion vgl. Cos-Funktion

Was ich als Bürgermeister für Lübbecke tun möchte

Programmierkurs Java

Beschreibung Regeln z.b. Abwesenheitsmeldung und Weiterleitung

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Informationsblatt Induktionsbeweis

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

Der Kontowecker: Einrichtung

Erste Gehversuche mit ARDUINO (DL6OAA)

Was ist Arduino? Historie Der Kern Entwicklungsumgebung Hardware Software Und wozu das Ganze? Workshop Mikrorechner 2012 A.

Microcontroller Kurs Microcontroller Kurs/Johannes Fuchs 1

Leitfaden für das -Forum des ÖVGD. Wir würden uns freuen, auch Sie im -Forum begrüßen zu dürfen!

Übungsblatt 3: Algorithmen in Java & Grammatiken

Repetitionsaufgaben: Lineare Gleichungen

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

M a i l C r e d i t. \\Burt\user\Soutschek\FP\Technik\Frankiermaschinen\00_PC Software\MailCredit\Anleitung MailCredit Installation.

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Vorkurs Informatik WiSe 15/16

Gratis Excel SVERWEIS Funktions-Anleitung, Tutorial, ebook, PDF-E-Book

2 Darstellung von Zahlen und Zeichen

Anleitung zur Nutzung des SharePort Utility

Programmierung in C. Grundlagen. Stefan Kallerhoff

AZK 1- Freistil. Der Dialog "Arbeitszeitkonten" Grundsätzliches zum Dialog "Arbeitszeitkonten"

Rechnung wählen Lernstandserfassung

Version 0.3. Installation von MinGW und Eclipse CDT

Im Original veränderbare Word-Dateien

Chemie Zusammenfassung KA 2

Alle gehören dazu. Vorwort

Transkript:

Teile und Herrsche Programmieren für Ingenieure Sommer 2015 Andreas Zeller, Universität des Saarlandes C-Programm Vom Programm zum Prozessor Prüfen und Übersetzen Maschinen- Programm Hochladen über USB Galileo-Board Funktionsaufrufe Die meisten Funktionen haben Parameter, die ihre Funktionsweise bestimmen! digitalwrite(pin_number, value) Beim Aufruf muss für jeden Parameter ein Wert (Argument) angegeben werden Funktionsname digitalwrite(13, HIGH); Wert für pin_number Wert für value Variablen Variablen dienen dazu, Werte zu speichern. Mit der Anweisung int led = 13; wird led als eine Variable eingeführt, die mit dem Wert 13 belegt ist. Nach der Anweisung steht led stellvertretend für den Variablenwert Symbolisches Blinken // Pin 13 has an LED connected on most // Arduino boards. Give it a name: int led = 13; void setup() { pinmode(led, OUTPUT); void loop() { digitalwrite(led, HIGH); delay(1000); digitalwrite(led, LOW); delay(1000); Themen heute Eigene Funktionen Parameter Fallunterscheidungen Fehlersuche

Morse-Code Wikipedia Morse-Code Besteht aus drei Symbolen: Punkt (Dit) Strich (Dah) Schweigen

Morse-Code / Morse-Code dahdah dahdahdah ditdahdit dididit dit, dahditdahdit dahdahdah dahditdit dit. Morse-Code / MORSE CODE

Morse-Code Ein Dah ist dreimal so lang wie ein Dit. Die Pause zwischen zwei gesendeten Symbolen ist ein Dit lang. Zwischen Buchstaben in einem Wort wird eine Pause von der Länge eines Dah (oder drei Dits) eingeschoben. Die Länge der Pause zwischen Wörtern entspricht sieben Dits. Wikipedia int dit_delay = 500; // length of a dit in ms void loop() { // send a dit digitalwrite(led, HIGH); digitalwrite(led, LOW); int dit_delay = 500; // length of a dit in ms int dah_delay = dit_delay * 3; // length of a dah in ms void loop() { // send a dit digitalwrite(led, HIGH); Berechnung! digitalwrite(led, LOW); // send a dah digitalwrite(led, HIGH); delay(dah_delay); digitalwrite(led, LOW);

Arithmetische Operatoren In aufsteigender Bindung: 1. Addition (+), Subtraktion ( ) Assoziativität: von links nach rechts 2. Multiplikation (*), Division (/), Modulus (%) Assoziativität: von links nach rechts 3. Vorzeichen (+, ) Assoziativität: von rechts nach links int y = -3 + 7 % 3 int y = (-3) + (7 % 3) Eigene Funktionen Wir wollen die Anweisungen für Dahs und Dits in eigene Funktionen zusammenfassen Eine eigene Funktion wird wie setup() und loop() als Folge von Anweisungen definiert: void name() { Anweisung 1; Anweisung 2; int dit_delay = 500; // length of a dit in ms int dah_delay = dit_delay * 3; // length of a dah in ms void loop() { // send a dit digitalwrite(led, HIGH); digitalwrite(led, LOW); // send a dah digitalwrite(led, HIGH); delay(dah_delay); digitalwrite(led, LOW);

void loop() { dit(); dah(); void dit() { // send a dit digitalwrite(led, HIGH); void dah() { // send a dah digitalwrite(led, HIGH); delay(dah_delay); digitalwrite(led, LOW); digitalwrite(led, LOW); Demo Teile und Herrsche Idee: Ein Problem in (kleinere) Teilprobleme zerlegen Grundprinzip der Informatik Grundprinzip politischer Machtausübung Gaius Julius Cäsar Wikipedia

Divide et Impera deditditdit dedahdahdah int dit_delay = 500; // length of a dit in ms int dah_delay = dit_delay * 3; // length of a dah in ms void dit() { // send a dit digitalwrite(led, HIGH); void dah() { // send a dah digitalwrite(led, HIGH); delay(dah_delay); digitalwrite(led, LOW); digitalwrite(led, LOW);

S senden void morse_s() { dit(); dit(); dit(); oder (kürzer) void morse_s() { dit(); dit(); dit(); Save Our Souls void morse_s() { dit(); dit(); dit(); void morse_o() { dah(); dah(); dah(); void morse_sos() { morse_s(); morse_o(); morse_s(); delay(dit_delay * 6); / / Wikipedia

morse_a() morse_b() morse_c() morse_d() morse_e() morse_f() morse_g() morse_h() morse_i() morse_j() morse_k() morse_l() morse_m() morse_n() morse_o() morse_p() morse_q() morse_r() morse_s() morse_t() morse_u() morse_v() morse_w() morse_x() morse_y() morse_z() morse_1() morse_2() morse_3() morse_4() morse_5() morse_6() morse_7() morse_8() morse_9() morse_0() SINK void morse_s() { dit(); dit(); dit(); void morse_i() { dit(); dit(); void morse_sink() { morse_s(); morse_i(); morse_n(); morse_k();

HEKA ISNNT ESRK SEAAA 5CT Si tacuisses void morse_s() { dit(); dit(); dit(); pause_letter(); void morse_i() { dit(); dit(); pause_letter(); void morse_sink() { morse_s(); morse_i(); morse_n(); morse_k(); pause_word(); Si tacuisses int dit_delay = 500; // length of a dit in ms int dah_delay = dit_delay * 3; // length of a dah in ms // dit() and dat() already include dit_delay int letter_delay = dah_delay - dit_delay; // letters already include letter delay int word_delay = dit_delay * 7 - letter_delay; void pause_letter() { delay(letter_delay); void pause_word() { delay(word_delay);

SINK CQD CQD SOS Titanic Position 41.44 N 50.24 W. Require immediate assistance. Come at once. We struck an iceberg. Sinking Demo We are sinking

Eigene Parameter Ziel: Eine Funktion send_number(n), die eine gegebene Zahl n per Morse ausgibt n wird zum Parameter der Funktion Eigene Parameter Parameter werden (mitsamt Typen) bei der Definition in Klammern angegeben void name(int p1, int p2,...) { Anweisungen ; Bei uns also: void morse_number(int n) { Anweisungen ; Fallunterscheidung Je nach Wert von n müssen unterschiedliche Anweisungen ausgeführt werden: Ist n = 1, dann senden Ist n = 2, dann senden usw.

Fallunterscheidung Die if-kontrollstruktur dient zum Programmieren von Fallunterscheidungen: if (Bedingung) { Anweisungen ; Die Anweisungen werden nur ausgeführt, wenn die Bedingung erfüllt ist. Vergleichsoperatoren In aufsteigender Bindung: 1. Logisches Oder ( ) 2. Logisches Und (&&) 3. Größenvergleiche (<, >, <=, >=) 4. Gleichheit = (==), Ungleichheit (!=) 5. Logisches Nicht (!) ==, nicht =! if (x >= y &&!(x == y)) Fallunterscheidung Je nach Wert von n müssen unterschiedliche Anweisungen ausgeführt werden: Ist n = 1, dann senden Ist n = 2, dann senden usw.

Fallunterscheidung // send n in morse code void morse_digit(int n) { if (n == 0) { Fallunterscheidung // send n in morse code void morse_digit(int n) { if (n == 0) { dah(); dah(); dah(); dah(); dah(); if (n == 1) { Fallunterscheidung // send n in morse code void morse_digit(int n) { if (n == 0) { dah(); dah(); dah(); dah(); dah(); if (n == 1) { dit(); dah(); dah(); dah(); dah(); if (n == 2) {

// send n in morse code void morse_digit(int n) { if (n == 0) { dah(); dah(); dah(); dah(); dah(); if (n == 1) { dit(); dah(); dah(); dah(); dah(); if (n == 2) { dit(); dit(); dah(); dah(); dah(); // usw. für 3 8 if (n == 9) { dah(); dah(); dah(); dah(); dit(); pause_letter(); Aufruf Einmal definiert, wird morse_digit() wie jede andere Funktion aufgerufen: void morse_digit(int n) { // wie oben void loop() { morse_digit(5); morse_digit(0); morse_digit(2); morse_digit(4); Position 41.44 N 50.24 W Demo

Von Ziffern zu Zahlen Wie geben wir mehrstellige Zahlen aus? Ziel: Funktion morse_number(n), die n durch Aufrufe an morse_digit() ausgibt morse_number(5024) morse_digit(5) morse_digit(0) morse_digit(2) morse_digit(4) Von Ziffern zu Zahlen Beobachtung: Will ich 5024 ausgeben, kann ich 502 ausgeben, gefolgt von 4. morse_number(5024) morse_number(502) morse_digit(4) Um 502 auszugeben, kann ich 50 ausgeben, gefolgt von 2. morse_number(502) morse_number(50) morse_digit(2) Von Ziffern zu Zahlen Allgemeines Prinzip: 1. Hat n mehr als eine Ziffer (d.h. n 10), gebe ich zuerst n / 10 aus 2. Anschließend gebe ich die letzte Ziffer aus (d.h. n mod 10)

Demo Von Ziffern zu Zahlen So sieht morse_number() aus: void morse_number(int n) { if (n >= 10) { morse_number(n / 10); morse_digit(n % 10); Von Ziffern zu Zahlen void morse_number(int n) { if (n >= 10) { morse_number(n / 10); morse_digit(n % 10); morse_number(5024) morse_number(502) morse_number(50) morse_number(5) morse_digit(5) morse_digit(0) morse_digit(2) morse_digit(4)

Demo Rekursion Ruft eine Funktion sich selbst erneut auf, nennt man dies Rekursion Jede Berechnung lässt sich durch ausschließlich Funktionen, Bedingungen und Rekursion ausdrücken Alles, was man (irgendwie) berechnen kann, können Sie jetzt programmieren (im Prinzip jedenfalls) Fehlersuche Während einer komplexen Berechnung ist es hilfreich, zu verfolgen, was geschieht Hierfür dient die serielle Ausgabe der Arduino-Plattform

USB-Anschluss Datenübertragung Verfolgen über Werkzeuge Serieller Monitor Serial.begin() Serial.begin(baud) richtet die serielle Schnittstelle ein, um mit Geschwindigkeit baud (bits/s) Daten zu übertragen Beispiel: void setup() { // Transfer at 9600 bits/s Serial.begin(9600);

Serial.print() Die Funktion Serial.print(x) gibt x auf der seriellen Schnittstelle aus Serial.println(x): Genauso, aber mit Zeilenende Beispiel: void morse_number(int n) { Serial.println(n); Anweisungen ; Text ausgeben Mit Serial.print() und Serial.println() kann man auch Text ausgeben Text wird in " " eingeschlossen Beispiel: void morse_number(int n) { Serial.print("morse_number("); Serial.print(n); Serial.println(")"); Anweisungen ; Text ausgeben void dit() { Serial.print("."); Anweisungen ; void dah() { Serial.print("-"); Anweisungen ; void pause_letter() { Serial.println(""); delay(letter_delay);

Serieller Monitor Demo Binärzahlen Rechner stellen Daten intern als Bits dar nur 0 und 1 Zahlen werden im Binärsystem gespeichert Die Zahl 37 etwa wird gespeichert als 100101 32 + 4 + 1 = 37

Von Ziffern zu Zahlen So sieht morse_number() aus: void morse_number(int n) { if (n >= 10) { morse_number(n / 10); morse_digit(n % 10); Kann ich auch eine andere Zahlenbasis als 10 nehmen? Zahlen binär morsen Um Zahlen im Binärsystem zu morsen: void morse_binary(int n) { if (n >= 2) { morse_number(n / 2); morse_digit(n % 2); Demo

Basis 10 und 2 void morse_decimal(int n) { if (n >= 10) { morse_decimal(n / 10); morse_digit(n % 10); void morse_binary(int n) { if (n >= 2) { morse_binary(n / 2); morse_digit(n % 2); Beliebige Zahlenbasis Zahlen in Basis base ausgeben: void morse_number(int n, int base) { if (n >= base) { morse_number(n / base, base); morse_digit(n % base); Demo

Ausblick Zuweisungen Eigene Schleifen Verkehrssteuerung Eingabeelemente Eigene Funktionen void loop() { dit(); dah(); void dit() { void dah() {! // send a dit! // send a dah! digitalwrite(led, HIGH);! digitalwrite(led, HIGH);!! delay(dah_delay);!!!! digitalwrite(led, LOW);! digitalwrite(led, LOW);!! Eigene Parameter Parameter werden (mitsamt Typen) bei der Definition in Klammern angegeben void name(int p1, int p2,...) { Anweisungen ; Bei uns also: void morse_number(int n) { Anweisungen ; Rekursion void morse_number(int n) { if (n >= 10) { morse_number(n / 10); morse_digit(n % 10); Ablauf verfolgen morse_number(5024) morse_number(502) morse_number(50) morse_number(5) morse_digit(5) morse_digit(0) morse_digit(2) morse_digit(4) Verfolgen über Werkzeuge Serieller Monitor Handouts

Eigene Funktionen Wir wollen die Anweisungen für Dahs und Dits in eigene Funktionen zusammenfassen Eine eigene Funktion wird wie setup() und loop() als Folge von Anweisungen definiert: void name() { Anweisung 1; Anweisung 2; ditditdit dahdahdah int dit_delay = 500; // length of a dit in ms int dah_delay = dit_delay * 3; // length of a dah in ms // dit() and dat() already include dit_delay int letter_delay = dah_delay - dit_delay; // letters already include letter delay int word_delay = dit_delay * 7 - letter_delay; void dit() { // send a dit digitalwrite(led, HIGH); void dah() { // send a dah digitalwrite(led, HIGH); delay(dah_delay); digitalwrite(led, LOW); void pause_letter() { delay(letter_delay); digitalwrite(led, LOW); void pause_word() { delay(word_delay);

SINK void morse_s() { dit(); dit(); dit(); pause_letter(); void morse_i() { dit(); dit(); pause_letter(); void morse_sink() { morse_s(); morse_i(); morse_n(); morse_k(); pause_word(); Eigene Parameter Parameter werden (mitsamt Typen) bei der Definition in Klammern angegeben void name(int p1, int p2,...) { Anweisungen ; Bei uns also: void morse_number(int n) { Anweisungen ; // send n in morse code void morse_digit(int n) { if (n == 0) { dah(); dah(); dah(); dah(); dah(); if (n == 1) { dit(); dah(); dah(); dah(); dah(); if (n == 2) { dit(); dit(); dah(); dah(); dah(); // usw. für 3 8 if (n == 9) { dah(); dah(); dah(); dah(); dit(); pause_letter();

Rekursion void morse_number(int n) { if (n >= 10) { morse_number(n / 10); morse_digit(n % 10); morse_number(5024) morse_number(502) morse_number(50) morse_number(5) morse_digit(5) morse_digit(0) morse_digit(2) morse_digit(4) Ablauf verfolgen Verfolgen über Werkzeuge Serieller Monitor