Informatik für Nebenfächler

Größe: px
Ab Seite anzeigen:

Download "Informatik für Nebenfächler"

Transkript

1 Informatik für Nebenfächler Priv.-Doz. Dr. Frank Huch Institut für Informatik, Technische Fakultät, Christian-Albrechts-Universität zu Kiel. Skript zur Vorlesung im Wintersemester 2011/12.

2 Stand vom: 10. Februar 2012 Eine erste Version dieses Skripts wurde durch Jana Bork erstellt. Anmerkungen und Korrekturen bitte an Freundlichem Dank an Torsten Krause für das Layout der Titelseite.

3 Inhaltsverzeichnis 1 Einleitung 5 2 Technische Grundlagen der Informatik Rechnerarchitektur Zahlensysteme und binäre Arithmetik Umwandlung von Dezimalzahlen in Binärzahlen Rechnen mit Binärzahlen Einerkomplement/Stellenkomplement Zweierkomplement Brüche (rationale Zahlen) Gleitpunktzahlen (floating point numbers) Grundbegriffe Programmierung Ausdrücke (Erweiterte) Backus-Naur-Form (BNF und EBNF) Termdarstellungen Ausdrücke zur Implementierung einfacher Programme Boolesche Werte Anweisungen while-schleife: Größter gemeinsamer Teiler Aufzählen und Testen Euklidischer Algorithmus for-schleife Ausdrucksstärke unterschiedlicher Statements Objektorientierte Programmierung Zeichenketten Abstraktion durch Prozeduren Rekursion Objekte und ihre Identität Objektorientierte Datenmodellierung Datenstrukturen und Algorithmen Lese- und Schreibzugriff auf Dateiinhalten Reguläre Ausdrücke Backtracking Internet und HTML Sortieren Sortieren durch Auswählen Sortieren durch Einfügen Die Fibonacci-Funktion

4 Inhaltsverzeichnis 4.5 O-Notation Suchen von Elementen Binäre Suche Effizientes Sortieren Andere effiziente Sortieralgorithmen Schwere Probleme Halteproblem Besonderheiten von Ruby Semikolon Anweisungen und Ausdrücke Zuweisung statt Gleichheit Datenkompression

5 1 Einleitung Die Informatik ist die Wissenschaft von der systematischen Verarbeitung von Informationen, insbesondere die automatische Verarbeitung mit Rechenanlagen (Computer). Ursprünge Mathematik Berechnen von Folgen, Lösung von Gleichungssystemen Elektrotechnik Computer als Weiterentwicklung von Schaltkreisen Nachrichtentechnik Datenübertragung im Rechner oder im www Disziplinen der Informatik Theoretische Informatik Grundlagen, z.b. Komplexitätstheorie, Berechenbarkeit, Graphentheorie Technische Informatik Hardwarenahe Aspekte, z.b. Mikroprozessortechnik, Rechnerarchitekturen, Netzwerksysteme Praktische Informatik Lösen von konkreten Problemen durch Algorithmen/Programme hierbei wichtige Aspekte: Effizienz, Softwaretechnik, Programmiersprachen, Datenbanken 5

6 2 Technische Grundlagen der Informatik Erste Computer wurden von Konrad Zuse 1937 konstruiert: Z1 - mechanisches Rechenwerk - Kontrolleinheit, Speicher, Mikrobefehle, Fließkommaberechnung Erster elektronischer Rechner 1941: Z3 - Trennung von Befehls- und Datenspeicher - Ein- / Ausgabepult Parallel fanden Entwicklungen in Großbritannien und den USA statt. Wichtigster Akteur hierbei: John von Neumann der die prinzipiell heute noch verwendete Von- Neumann-Architektur von Computern entwarf. Zu Beginn der 60er Jahre lösten Transistoren die Röhrentechnik ab, wodurch die Leistungsfähigkeit extrem erhöht wurde. Die Mikroprozessortechnik auf Siliziumbasis ermöglichte dann in den 70er Jahren eine zunehmende Miniaturisierung der Computer. Heutzutage werden Prozessoren nicht nur in herkömmlichen PCs oder Großrechnern eingesetzt, sondern zunehmend als integrierte Schaltkreise in z.b. Waschmaschinen, Aufzügen oder Autos (mehr als 100 Prozessoren möglich), sogenannte eingebettete Systeme. 2.1 Rechnerarchitektur Die meisten Computer basieren auf der Von-Neumann-Architektur, welche in den 40er Jahren entwickelt wurde. Komponenten: - Zentralprozessor (CPU) Steuerwerk: Abarbeitung der Maschinenbefehle Rechenwerk (ALU - Arithmetic Logical Unit) Register: Speichern einzelner Werte - Arbeitsspeicher(beliebige Daten, die unterschiedlich interpretiert werden können) auszuführende Programme in Maschinencode Festwertspeicher (ROM) mit wichtigen Basisroutinen Datenspeicher zur Speicherung von Datenstrukturen einzelner Programme 6

7 2.1 Rechnerarchitektur - Bus (Verbindung zwischen Speicher und Prozessor) Datenbus zum Transport der Daten vom Speicher zur CPU und zurück Adressbus zum Einstellen der Adresse, aus der Daten geholt werden sollen oder geschrieben werden sollen Steuerbus um den Speicher vorzubereiten, um entsprechende Daten liefern zu können oder zu speichern Genereller Aufbau: Weitere Komponenten: Tastatur, Grafik- und Soundkarte, externe Speichermedien In der Regel auch über Bussysteme an das Hauptsystem angeschlossen, so dass ebenfalls Werte adressiert und ausgelesen werden können. In der Regel aber nur Adress- und Datenbus, kein Steuerbus. Beachte aber, dass das Bussystem zu Massenspeichermedien in der Regel um ein Vielfaches langsamer ist, als zum Speicher. Zugriff geregelt über das Betriebssystem, so dass unterschiedliche Komponenten gleich angesprochen werden können (Treiber). Grafik- und Soundkarten sind eigentlich wieder eigene Computer z.t. mit Prozessor und Speicher, oder auch in CPU/Mainboard integriert. Weitere Aspekte: - Taktfrequenz (z.b. 200 MHz) gibt an, wie viele Operationen ein Computer pro Sekunde ausführen kann. Allerdings benötigen viele Maschinenbefehle mehrere 7

8 2 Technische Grundlagen der Informatik Schritte. Zur Zeit wenig Verbesserungen wegen physikalischen Grenzen. Moores Law: Verdopplung der Rechenleistung alle Jahre (gilt seit 1940!) Heute Performancesteigerung durch mehrere Prozessorkerne - Cache: Schneller in den Prozessor integrierter Speicher, der Teile des Hauptspeichers spiegelt. Ermöglicht nicht immer Beschleunigung (Betriebssystem, Anwendung) - Multitasking: Mehrere Programme können gleichzeitig auf einem Computer ausgeführt werden. Verteilung der Prozessorzeit durch Scheduler auf BS-Ebene sehr wichtig bei graphischen Benutzeroberflächen - Multicore-Architektur: Mehrere Prozessoren (meist 2 oder 4) können über Bus auf Speicher zugreifen. Ausnutzung für eine Anwendung schwer parallele Algorithmen 2.2 Zahlensysteme und binäre Arithmetik In Digitalrechnern werden eigentlich nur zwei Werte (Ziffern) kodiert: 0 = kein Strom 1 = Strom } Dieser Wert wird auch Bit (binary digit) genannt. Aufbauend hierauf können kompliziertere Werte, wie allgemeine Zahlen, Zeichen oder auch Prozessorbefehle kodiert werden. Das Dezimalsystem (dekadisches Ziffernsystem, natürliche Zahlen) Zahlen des Dezimalsystems können dargestellt werden als n = z k 10 k +...+z z mit Ziffern z i {0,1,...,9} für 0 i k Beispiel: 1278 = Um eine eindeutige Darstellung zu haben, lässt man führende Nullen in der Regel weg (z k 0) außer z 0 = 0. Betrachtet man nur die Ziffern 0 und 1, so kann man ganz analog Zahlen des binären Ziffernsystems oder Binärsystems definieren: Binärsystem mit Ziffern z i {0,1} für 0 i k n = z k 2 k +...+z z

9 2.2 Zahlensysteme und binäre Arithmetik Beispiel: 330 = ( = = 330) Binärzahlen können natürlich auch kompakt wie Dezimalzahlen notiert werden: 330 dez = bin. Hierbei notieren wir das Zahlensystem als Index um Verwechslungen auszuschließen: 100 dez 100 bin. Bei Dezimalzahlen lassen wir das Zahlensystem aber oft weg. Neben dem Dezimal- und dem Binärsystem können beliebige weitere n-adische Ziffernsysteme definiert werden. Wichtig ist noch das Hexadezimalsystem (16-adisches Ziffernsystem): Hexadezimalsystem Als Ziffern verwendet man in der Regel {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}. Beispiel: 1278 dez = = 4FE hex ( = = = 1278) NR: 1278 : 16 = 79 R14 = E 79 : 16 = 4 R15 = F 4 : 16 = 0 R 4 = 4 Warum ist dieses Zahlensystem wichtig? Da 16 eine Zweierpotenz ist und damit ein Vielfaches von 2, können Ziffernblöcke des Binärsystems eindeutig auf Hexadezimalziffern abgebildet werden: Binär Hexadezimal Binär Hexadezimal A B C D E F Somit können Binärzahlen sehr einfach in Hexadezimalzahlen umgewandelt werden und umgekehrt. 9

10 2 Technische Grundlagen der Informatik Beispiel: 330 dez = }{{} }{{} 1010 }{{} bin = 14A hex 1 4 A 1278 dez = 4FE hex = }{{} }{{} 1110 }{{} bin 4 F E Gleiches gilt für das Oktalsystem (8-adische Zahlensystem), da 8 = 2 3. In der Praxis wird dieses allerdings seltener verwendet, da es Zahlen weniger kompakt kodiert Umwandlung von Dezimalzahlen in Binärzahlen Beispiel: Also 276 dez = }{{} }{{} bin = 8A hex. 8 A 276 = = = 16+4 = = 4 = 2 2 Unschön: Man benötigt alle 2er-Potenzen und muss diese schrittweise(beginnend mit der grössten passenden) abziehen. Alternative: Horner-Schema Horner-Schema n = z k 2 k +...+z z = (z k 2 k z ) 2+z 0 = ((z k 2 k z ) 2+z 1 ) 2+z 0 =... = ((...((z k 2+z k 1 ) 2+z k 2 ) 2+...)+z 2 ) 2+z 1 ) 2+z 0 Als Beispiel können wir schreiben: 330 dez = ((...(1 2+0) 2+1) 2+0) 2+0) 2+1) 2+1) 2+1) 2+0 D.h. um diese 1 zu erhalten müssen wir umgekehrt 8 mal durch 2 dividieren, Der Rest ergibt jeweils die 1 oder die : 2 = 165 R0 165 : 2 = 82 R1 82 : 2 = 41 R0 41 : 2 = 20 R1 20 : 2 = 10 R0 10 : 2 = 5 R0 5 : 2 = 2 R1 2 : 2 = 1 R0 1 : 2 = 0 R1 höchstes Bit

11 2.2 Zahlensysteme und binäre Arithmetik Entsprechend können wir auch ins Hexadezimalsystem umrechnen: 330 : 16 = 20 R10 20 : 16 = 1 R4 1 : 16 = 0 R1 Also 14A hex Dieser Algorithmus läßt sich für beliebige n-adische Zahlensysteme verallgemeinern Rechnen mit Binärzahlen Das Prinzip ist identisch mit dem im Dezimalsystem: Addition: 0+0 = = = = 10 (oder 0 mit 1 Übertrag) Für die Stelle entspricht + also dem booleschen XOR und der Übertrag dem AND Dann: 1278 dez bin dez bin 1608 dez }{{} }{{} 1000 }{{} bin hex Probe: 1608 : 16 = 100 R8 100 : 16 = 6 R4 6 : 16 = 0 R6 = 648 hex Subtraktion: 0 0 = = 1 Übertrag = = 0 Dann: 1278 dez bin 330 dez bin 948 dez }{{} }{{} 0100 }{{} bin = 3B4 hex 3 4 hex 11=B Probe: 948 : 16 = 59 R4 59 : 16 = 3 R11 3 : 16 = 0 R3 = 3B4 hex 11

12 2 Technische Grundlagen der Informatik Multiplikation von Binärzahlen: Beispiel: Implementierbar durch schrittweises Addieren und Shiften ( = Verdoppeln). Im Beispiel: shift shift shift Division auch einfach möglich: : = Bem: Das kleine 1 1 ist hier sehr übersichtlich: 0 0 = = = = 1 Das hier vorgestellte Verfahren zur Addition/Subtraktion durchläuft beide Zahlen schrittweise von hinten nach vorne. Im Prozessor wird dies parallelisiert. Hierzu in der Regel Verwendung von Zahlen fester Stelligkeit (früher 8 Bit = 1 Byte, heute eher 16 32, 64 Bit) (Datenwort). =1DOUBLE WORD =1Quadrupelword Zusatzinhalt, der für 5 ECTSler nicht relevant ist Mit 8 Bit können die Zahlen von 0 dez bis 255 dez kodiert werden: 0 dez = bin 128 dez = bin 255 dez = bin =1WORD, 12

13 2.2 Zahlensysteme und binäre Arithmetik Wie können dann auch negative Zahlen dargestellt werden? Erste Idee: verwende erstes Bit als Vorzeichen, also 32 dez = bin 48 dez = bin } bin = 80 dez Dann können negative Zahlen aber leider nicht so einfach addiert werden. Betrachte eine einfache Aufgabe (hier Datenwörter mit 4 Bit): 1+( 2) = ( 1) also 0001 bin bin 1011 bin = 3 dez 1+( 1) = 0 also 0001 bin bin 1010 bin = 2 dez Es wäre also besser, wenn die negativen Zahlen anders herum sortiert wären: Einerkomplement/Stellenkomplement Also: 7 = = = = = = = = 1111? Beachte: Negative Zahlen durch Inverses der Positiven. kleinste negative Zahl ( 7) = 1000 und größte negative Zahl ( 1) = ( 7) = 6 also = 6 dez 1+( 2) = 1 also = 1 dez 6+( 2) = 4 also shift around carry 0100 Beachte: Es kann auch ein Übertrag auftreten Übung 1+( 1) = 0 aber = 0 Aber nicht D.h. wir haben zwei Darstellungen für die Null, was unschön ist. Lösung: Verschiebe negative Zahlen um eins (Zweierkomplement) 13

14 2 Technische Grundlagen der Informatik Zweierkomplement 7 = = = = = = = = 0000 Beachte: hierdurch wird die 1000 frei und kann als 8 interpretiert werden. Dann: 1+( 7) = 6 also = 6 dez 1+( 1) = 0 also = 0 dez Übertrag wird verworfen Somit kann bei Verwendung des Zweierkomplements die Subtraktion auf die Addition zurückgeführt werden. Beachte: bei Bereichsüberschreitung gibt es einen Überlauf: 6 dez +6 dez = 12 dez, was mit 4 Bit mit Vorzeichen nicht darstellbar ist: = 4 dez Negieren einer Zahl im Zweierkomplement: Einerkomplement (Inverses) + 1! Gilt in beide Richtungen: Allgemein gilt: mit n Stellen können die Zahlen 2 n 1 bis 2 n 1 1 dargestellt werden. { + + Beachte, dass dieses Verfahren auch in anderen Zahlensystemen funktioniert: Beispiel: 493 hat das Stellenkomplement = 506 (Datenwort von 3 Dezimalziffern). Das Zehnerkomplement ergibt sich dann als = 507. Aufgabe: = 385+( 493) = 108 Rechnung mit Zehnerkomplement: Beachte: , also negativ

15 2.2 Zahlensysteme und binäre Arithmetik Das Ergebnis 108 hat das Stellenkomplement = 891. Also im Zehnerkomplement = 892 Oder anders herum: 892 Stellenkomplement = 108, also 892 = 108. Übung: Umwandlung Zweierkomplement/Zehnerkomplement in wirkliche negative Zahl Brüche (rationale Zahlen) Häufig verwendet man zum Rechnen Dezimalbrüche (z.b. 1, 56 oder 2, 3462). Diese können nach dem gleichen Schema wie bisher in andere Zahlensysteme übertragen werden. Beispiel: 0,6875 dez = = 0,1011 bin Berechnung mit Horner-Schema: 0, = 1, ,375 2 = 0,75 0 0,75 2 = 1,5 1 0,5 2 = 1,0 1 Bem: 0, = 11 dez 11 dez = B (kein Rest!) = ( ) : = (( ) : ) = (((1 2 4 ) : ) : ) : ,01 = = (1 2 1 ) : ,011 = = ( ) : = ((1 2 1 ) : ) : Nachteil dieser Darstellung: 0,2 dez 2 = 0,4 0 0,4 2 = 0,8 0 0,8 2 = 1,6 1 0,6 2 = 1,2 1 0,2 0,2 dez = 0,0011 D.h. endliche Dezimalbrüche werden als Binärbruch periodisch. Weiteres Problem, wie kann man Binärbrüche in feste Datenwortgröße packen? Lösung: Gleitpunktzahlen (floating point numbers) 15

16 2 Technische Grundlagen der Informatik Gleitpunktzahlen (floating point numbers) Idee: Man beschränkt sich auf Zahlen einer bestimmten Genauigkeit, d.h. unterscheidbarer Stellen. Beispiel: Genauigkeit vier Stellen: , , Beachte: alle Zahlen könnten auch Zahlen einer größeren Genauigkeit sein. Für eine klarere Darstellung der Genauigkeit schreibt man besser: oder 0, , , , Analog für Binärzahlen (Float, 4 Byte) Lichtgeschwindigkeit e = 2, m/s = 2, e8m/s Beachte: Durch Rechnen mit Genauigkeit können Rundungsfehler auftreten Beispiel: = = Somit Floats niemals auf Gleichheit, Ungleichheit testen! Wofür werden im Rechner alles Zahlen verwendet? - Zum Rechnen: positive Zahlen fester Stelligkeit ganze Zahlen fester Stelligkeit (Zweierkomplement) 16

17 2.2 Zahlensysteme und binäre Arithmetik Floating Point Zahlen (als Näherung für rationale Zahlen) - Als Adressen: positive Zahlen Speicherplätze sind durchnummeriert von bis maximal Bei 32 Bit-Architekturen also maximal Speicherzellen 4,3 Milliarden Bytes = 4 GigaByte (GB) - Als Maschinencode: z.b. Sprung- oder Ladebefehle. Zusatzinhalt, der für 5 ECTSler nicht relevant ist Grundbegriffe Algorithmus ist die Beschreibung einer Vorgehensweise zur Lösung von Problemen. Beispiele Kochrezept, Berechnung der Quadratwurzel, Dekodierung von DNA-Sequenzen, Berechnung von π, Verwaltungsvorschriften Beachte dabei: - in der Regel löst ein Algorithmus eine Klasse von Problemen (d.h. er ist parameterisiert), z.b. Quadratwurzel für beliebige Zahlen, Verwaltungsvorschrift für Hausbau. Parameter legt konkretes Problem der Klasse fest. - die Vorgehensweise kann unterschiedlich detailliert formuliert werden, z.b. beim Kochrezept: Eiweiß steif schlagen oder Schüssel holen, Eiweiß und Eigelb trennen, Schneebesen nehmen,... Es ist eine Kunst den richtigen Grad an Genauigkeit zu finden. Wichtig hierbei: von Details abstrahieren. Abstraktion ist eines der wichtigsten Konzepte der Informatik. Beispiel Zählen von Weizenkörnern (alle gleich schwer), Apothekerwaage (ohne Gewichte), Papier, Bleistift Algorithmus - Teile Körner in zwei gleichschwere Haufen - Ist dies nicht möglich lege ein Korn zur Seite. Danach kannst Du sie aufteilen. { 1, falls du ein Korn zur Seite gelegt hast - Beschrifte den Zettel nach und nach wie folgt: 0, sonst - Wenn kein Korn mehr übrig ist, drehe die Zahl auf dem Zettel um und lies das Ergebnis als Binärzahl ab. Ggf. kannst du diese Zahl mit Horner-Schema in eine Dezimalzahl wandeln - sonst verfahre mit einem der beiden Haufen wie zuvor. Beispiel 13 : 2 = 6 R 1 6 : 2 = 3 R 0 3 : 2 = 1 R 1 1 : 2 = 0 R b = 13d Algorithmen werden in der Informatik häufig mit Hilfe von Programmiersprachen programmiert, so dass sie auf Rechnern/Computern ausgeführt werden können. Hierbei 17

18 2 Technische Grundlagen der Informatik ist zunächst keine Abstraktion mehr möglich. Ein Programm muss so konkret sein, dass ein Prozessor (winziger Befehlssatz) den Algorithmus ausführen kann. Programmierung zunächst nur in Maschinensprache. Feste Abstraktionen der höheren Programmiersprachen ermöglichen elegantere Programmierung auf abstrakterem Niveau. (In dieser Vorlesung werden wir die Sprache Ruby kennenlernen.) Weitere Abstraktion durch Programmiertechniken (Softwaretechnik) möglich. Programmierung ist heute die Kunst/Technik ein Problem und seine Lösung in Teile zu zerlegen, so dass sich ein kompositionelles System ergibt, welches leicht zu verstehen, zu ändern und zu konfigurieren ist. Programmiersprachen ermöglichen die Kommunikation mit dem Rechner auf möglichst natürliche Weise. Programme werden entweder mit Hilfe eines Compilers in Maschinensprache übersetzt (z.b. C) oder durch ein spezielles Programm (Interpreter) interpretiert (z.b. Ruby). Mischformen sind ebenfalls möglich. Bei der Programmierung unterscheidet man drei Bereiche: - Syntax beschreibt die zulässigen Zeichenfolgen der Programme - Semantik beschreibt, wie die Programme ausgeführt werden, also die Bedeutung der Sprachkonstrukte - Pragmatik beschreibt die Idee, wie die Programmiersprache verwendet werden soll (viele Wege führen nach Rom, aber welche sind gut). Hier spielt auch das Programmieren als Kunst/Technik hinein. Beachte, dass bisher wenig über die Effizienz von Programmen gesagt wurde. Diese ist in der Regel unwichtig! Wenige Ausnahmen: zeitkritische Algorithmen Wichtiger meist: Verständlichkeit, Wartbarkeit, Entwicklungszeit 18

19 3 Programmierung Algorithmus: abstrakte Beschreibung zur Lösung von Problemen Die meisten Algorithmen können automatisch durch Computer ausgeführt werden. Hierzu muss der Algorithmus in einer konkreten Programmiersprache implementiert werden. Zunächst wollen wir ein paar grundlegende Konzepte kennenlernen, die in vielen Programmiersprachen verwendet werden und mit deren Hilfe wir einfachste Algorithmen programmieren können. 3.1 Ausdrücke Aus der Mathematik kennt man Ausdrücke Woraus bestehen Ausdrücke? Basiselemente: - Werte (Konstanten) z.b. 3,4 N oder π R 3+4 x 2 +2x+1 (x+1) 2 - Variablen z.b. x,y repräsentieren beliebige Werte und können später mit konkreten Werten belegt werden. Zusammengesetzte Ausdrücke erhält man durch die Anwendung von Funktionen, z.b. +,, ( in der Informatik) auf bereits gebildete Ausdrücke. Diese Funktionen (auch Operatoren genannt) sind zweistellig und verknüpfen zwei Ausdrücke zu einem neuen Ausdruck: 3+4 Was ist aber mit x 2 +1 x? Auch hier finden wir mehrere Funktionsanwendungen, die aber ungewöhnlich notiert werden. Der Computer (die Programmiersprache) erwartet genormte Darstellung solcher Ausdrücke, deshalb somit können wir x 2 +1 x schreiben als: x 2 statt x 2 sqrt(x) statt x a a/b statt b sqrt(x 2+1)/x 19

20 3 Programmierung Vergleiche dies mit sqrt(x (2+1))/x Gibt es einen Unterschied? Ja, da die Funktion stärker bindet als +. Legt man also Präzedenzen (z.b. Punktvor-Strich-Rechnung: und / binden stärker als + und!) für die Funktionen fest, kann man auf Klammern verzichten. Wenn man solche Klammern wegläßt, werden durch den Computer (z.b. in der Programmiersprache oder Tabellenkalkulation) in der Regel die fehlenden Klammern hinzugefügt. Die vollständig geklammerte Schreibweise für unseren Ausdruck wäre also: (sqrt(((x 2)+1))/x) Jede Operatoranwendung wird geklammert. Als nächstes wollen wir einen Formalismus kennenlernen, mit welchem Sprachen formal beschrieben werden können und welchen wir im weiteren Verlauf der Vorlesung verwenden werden um die Syntax unserer Programmiersprache Ruby zu verstehen. 3.2 (Erweiterte) Backus-Naur-Form (BNF und EBNF) Die Backus-Naur-Form (BNF) stellt einen Formalismus zur formalen Beschreibung von Sprachen (insbesondere Programmiersprachen) dar. Es werden Nichtterminalsymbole (beginnen mit Großbuchstaben) und Terminalsymbole (Zeichen in ) unterschieden. Nichtterminalsymbole stellen keine Elemente der zu definierenden Sprache dar. Vielmehr sind sie Strukturelemente, welche weiter verfeinert und letzendlich zu einer Folge von Terminalsymbolen abgeleitet werden. Als erstes Beispiel betrachten wir eine BNF, die die Sprache aller vollständig geklammerten Ausdrücke Exp beschreibt: Exp ::= Var Val ( Exp Op Exp ) Fun ( Exps ) Exps ::= Exp Exp, Exps Op ::= + / Fun ::= sqrt Val ::= Num if then else Num Num ::= Digit Digit Num Digit ::= Var ::= x y z Aus einer BNF kann man gültige Wörter schrittweise ableiten. Hierbei beginnt man mit dem Nichtterminalsymbol, aus dem man ein Wort ableiten möchte. Als Beispiel 20

21 3.2 (Erweiterte) Backus-Naur-Form (BNF und EBNF) wollen wir zeigen, dass obiges Wort (sqrt(((x 2)+1))/x) ein vollständig geklammeter Ausdruck ist, d.h. dieses Wort aus dem Nichtterminal Exp abgeleitet werden kann. In jedem Ableitungsschritt darf jeweils nur ein vorkommendes Nichtterminalsymbol durch eine seiner rechten Seiten ersetzt werden. Kommen keine Nichtterminalsymbole mehr vor, hat man ein gültiges Wort der beschriebenen Sprache abgeleitet: Exp (Exp Op Exp) (Exp / Exp) (Exp / Var) (Exp / x) (Fun(Exps) / x) (Fun(Exp) / x) (sqrt(exp) / x) (sqrt((exp Op Exp)) / x) (sqrt((exp+exp)) / x) (sqrt((exp+val)) / x) (sqrt((exp+num)) / x) (sqrt((exp+digit)) / x) (sqrt((exp+1)) / x) (sqrt(((exp Op Exp)+1)) / x) (sqrt(((var Op Exp)+1)) / x) (sqrt(((x Op Exp)+1)) / x) (sqrt(((x Exp)+1)) / x) (sqrt(((x Val)+1)) / x) (sqrt(((x Num)+1)) / x) (sqrt(((x Digit)+1)) / x) (sqrt(((x 2)+1)) / x) Da diese Ableitungen häufig sehr aufwendig sind und sich immer nur wenig an den einzelnen Wörtern ändert, ist es oft praktischer die Ableitung in Baumform darzustellen. Wir nennen diese Ableitungsbaum für ein Wort. Als Beispiel hier der Ableitungsbaum für das Wort (3+x): Exp ( Exp Op Exp ) Val + Var Num x Digit 3 Die Nichtterminalsymbole bilden die inneren Knoten des Ableitungsbaums. Die Wurzel beschriften wir mit dem Nichtterminalsymol, aus welchem man das Wort ableiten möchte(hier z.b. Exp). Die Kinder eines Nichtterminalknotens, entsprechen jeweils den Symbolen der rechten Seite der verwendeten Regel. So wurde bei der Wurzel zunächst dieregelexp ::= ( ExpOpExp ) angewendet,weshalbdiewurzelfünfkindknoten hat, die von links nach rechts mit den entsprechenden Symbolen beschriftet sind. 21

22 3 Programmierung Im fertigen Ableitungsbaum sind alle Blätter mit Terminalsymbolen beschriftet. Das abgeleitete Wort ergibt sich, indem man die Front des Baumes von links nach rechts abliest, hier also das Wort (3+x). Die hier vorgestellte BNF werden wir auch in der weiteren Vorlesung wiederverwenden und auch noch erweitern. Um aber klar zu machen, dass der Formalismus BNF ein universeller Formalismus zur Beschreibung beliebiger Sprachen ist, betrachten wir als weiteres Beispiel die Sprache der Palindrome. Ein Palindrom ist ein Wort, welches von vorne und von hinten gelesen gleich ist. Beispiele sind otto, rentner oder (wenn man die Leer-/Satzzeichen ignoriert) o genie, der herr ehre dein ego. Wenn man Palindrome formal spezifizieren will, so kann man dies mit Hilfe folgender EBNF machen: Pal ::= a Pal a... z Pal z a... z ε Hierbei werden natürlich nicht nur gültige Palindrome der deutschen Sprache beschrieben, sondern vielmehr alle Wörter (über dem Alphabet a bis z ), die von vorne und hinten gleich aussehen. Die letzte Regel P al ::= ε wird verwendet um Palindrome ohne einen einzelnen Buchstaben in der Mitte zu bilden. ε steht hierbei für das leere Wort, also ein Wort der Länge 0, welches keine Zeichen enthält. Untersucht man die BNF für Terme genauer, fällt auf, dass immer wieder ähnliche Konstruktionen auftreten, wie z.b. das optionale Vorkommen oder die Wiederholung von Teilausdrücken. Um solche Strukturen einfacher ausdrücken zu können wurde die BNF um spezielle Konstrukte zur erweiterten BNF (EBNF) erweitert: Optionales Vorkommen eines Wertes: [e] Dann für unsere Definition von Ausdrücken: Val ::= [ ] Num Optionale Wiederholung {e}, d.h. e kann 0-mal, 1-mal, 2-mal,... vorkommen. Außerdem besteht noch die Möglichkeit die Alternative( ) auch in Gruppierungen zu verwenden. Ein Beispiel hierzu ist mit abd und acd aus S ableitbar. S ::= a ( b c ) d Mit diesen Abkürzungen können wir unsere BNF an einigen Stellen kompakter hinschreiben: Exp ::= Var Val ( Exp Op Exp ) Fun ( Exp {, Exp } ) Num ::= Digit { Digit } 22

23 3.2 (Erweiterte) Backus-Naur-Form (BNF und EBNF) Zusatzinhalt, der für 5 ECTSler nicht relevant ist Stellt diese Erweiterung eine echte Erweiterung dar, d.h. können Sprachen/Eigenschaften beschrieben werden, welche vorher nicht möglich waren? Nein, denn jede EBNF kann in eine BNF übersetzt werden, welche die gleiche Sprache beschreibt. Gehe hierzu wie folgt vor: Falls es eine Regel gibt mit N ::= α [ β ] γ Dann ersetze diese durch Falls es eine Regel gibt mit Dann ersetze diese durch N ::= α γ α β γ N ::= α { β } γ N ::= α M γ M ::= β M ε, wobei M ein neues Nichtterminalsymbol der EBNF ist, also noch nicht in der aktuellen EBNF verwendet worden sein darf. Die BNF wird auch von Compilern zur Analyse der Programmiersprache verwendet, Aufgabe ist es hierbei zu einem gegebenen Wort (Programm) einen passenden Ableitungsbaum zu konstruieren. Hierbei kann der Compiler alle möglichen Ableitungen ausprobieren: Bsp: Finde Ableitung für (3+4) Exp Var Num Digit Digit Num ( Exp Op Exp ) ( Num Op Exp ) Num ( Num Op Exp )... Diese Suchverfahren, bei denen der Reihe nach alle möglichen Kodierungen durchgetestet werden bezeichnet man als Backtracking Termdarstellungen Wie verfährt der Compiler nun weiter mit dem Ableitungsbaum? Er wird weiter vereinfacht zu einem Term-Baum. Hierbei steht die Funktion bzw. der Operator jeweils oberhalb seiner Argumente. Nichtterminalsymbole kommen nicht mehr vor: Bsp.: 3 + sqrt(x 2 + 1) + 3 sqrt + 1 x 2 23

24 3 Programmierung Repräsentiert exakt die Termstruktur, aber enthält nicht die Informationen aus der (E)BNF. Beachte: Es kommen keine Klammern mehr vor! Termstruktur = Baumstruktur (Klammerung) Gibt es noch andere Darstellungen für Terme? Bisher: f(g(x,y),3) und Infixoperatoren (3+4). Ist die Stelligkeit aller Funktionen bekannt, ist es auch möglich die Klammern und Kommata ganz wegzulassen. Man erhält die klammerfreie Präfixnotation: f g x y 3 mit f und g 2-stellig x = +(3, (4,x)) = (3+(4 x)) +sqrt x 1 / 4 2 = (+(sqrt(x),1),/(4,2)) = (sqrt(x)+1) (4/2) Entsprechend gibt es auch die klammerfreie Postfixnotation, bei der alle Funktionsanwendungen nach den Argumenten folgen: Wozu sind diese Termdarstellungen gut? x y g 3 f 3 4 x + x sqrt / Insbesondere die Postfixnotation kann gut zur automatischen Auswertung des Ausdrucks verwendet werden. Man verwendet hierzu eine sogenannte Stackmaschine. Ein Stack (oder Keller, Stapelspeicher) ist eine Struktur, in der beliebig viele Werte abgelegt und wieder herausgenommen werden können. Die Werte liegen hierbei übereinander, so dass immer nur oben auf die Werte zugegriffen werden kann. Operationen: push v, schiebt v auf den Stack pop, holt oberstes Element vom Stack Bsp.: push 3, push 4, pop, push 7, pop, pop 24

25 3.2 (Erweiterte) Backus-Naur-Form (BNF und EBNF) Es werden also der Reihe nach die Werte 4,7 und 3 vom Stack gepopt. Im folgenden werden wir Stacks auch horizontal notieren. Wichtig ist aber die Beachtung des LIFO-Prinzips (last-in-f irst-out) Einschub Es gibt auch das FIFO-Prinzip (f irst-in-f irst-out). Diese Struktur nennt man Queue (oder Schlange). Bei obigem Beispiel ergäbe sich: Also die Werte: 3,4,7 Später mehr zu Queues. Wie kann nun der Stack in der Stackmaschine verwendet werden, um den Wert eines Ausdrucks zu berechnen? Hierzu verwendet man am besten die Postfixnotation: Bsp.: (3+4) sqrt(2 2) Postfix: sqrt Startkonfiguration: leerer Keller ε sqrt sqrt sqrt sqrt sqrt sqrt 7 4 sqrt տ Ergebnis leere Eingabe Allgemein lässt sich dies mit folgenden Regeln beschreiben: Eine Konfiguration der Stackmaschine besteht aus einem Stack S und einer Eingabe p (einem Teil eines Postfixausdrucks). 25

26 3 Programmierung Die Startkonfiguration besteht aus einem leeren Stack und dem auszuwertenden Term in Postfixnotation p 0 : leerer Stack ց initialer, zu berechnender Term in Postfixnotation ւ ε p 0 Die Konfigurationsübergänge sind wie folgt definiert: S v p mit v ein Wert (z.b. Zahl, true, false) S v p S v 1...v n f p mit f eine n-stellige Funktion und f die Semantik von f S f(v 1...v n ) p Die Endkonfiguration hat die Form: v nur ein! Element auf Stack Das Ergebnis der Auswertung ist v leere Eingabe (Term komplett abgearbeitet) Weiteres Bsp.: if x>0 then x+1 else x 1 end +1 Term-Baum: + if then else 1 > x 0 + x 1 - x 1 Postfix-Notation: x 0 > x 1 + x 1 if then else 1 + Wir betrachten die Belegung: x = 40 26

27 3.2 (Erweiterte) Backus-Naur-Form (BNF und EBNF) Auswertung mit Stack-Maschine: 40 0 > if then else > if then else > if then else 1 + true if then else 1 + true if then else 1 + true if then else 1 + true if then else true if then else 1 + true if then else Beachte im Vergleich die Auswertung als Term: if 40 > 0 then 40+1 else 40 1 end + 1 if true then 40+1 else 40 1 end + 1 (40+1) Die Berechnung von 40 1 wurde gespart. Das if then else kann auch schon ausgewertet werden, bevor das zweite und dritte Argument ausgewertet wurden, man sagt if then else ist nicht strikt im 2. und 3. Argument. Im Gegensatz zu z.b. +, welches strikt im 1. und 2. Argument ist. if then else ist auch strikt im 1. Argument. Da if then else entweder das zweite oder das dritte Argument liefert ist es sinnvoll, diese vor der if then else-auswertung nicht zu berechnen. Hierzu sind kompliziertere Stack-Maschinen notwendig Informatik-Studium Es können so auch Fehler verhindert werden: if b == 0 then 0 else a/b end verhindert Division durch Null und liefert in diesem Fall das Ergebnis 0. Zusatzinhalt, der für 5 ECTSler nicht relevant ist Ausdrücke zur Implementierung einfacher Programme Nachdem wir nun gesehen haben, wie Ausdrücke formal definiert werden können, wollen wir uns die Verwendung von Ausdrücken zur Programmierung von Algorithmen genauer anschauen. Betrachte folgendes Problem: 27

28 3 Programmierung Gegeben: Radius r Aufgabe: Bestimme die Fläche eines Kreises mit Radius r Ausdruck: π r 2 Wie kann dieser Ausdruck nun für konkrete Radien ausgewertet werden? Bei gegebener Belegung von r können wir im Ausdruck r durch die Belegung ersetzen und dann ausrechnen: Bsp: r = 4 dann ergibt sich π 4 2 = π 16 50,264 r = 1 dann π 1 2 = π 1 3, In Ruby können wir diese Funktion mit folgendem Ausdruck definieren: 3.14 (r 2) Dann können wir für gegebene Radien den Flächeninhalt eines Kreises berechnen: r = (1 2) = 3.14 Bevor der Ausdruck ausgerechnet werden kann, müssen alle vorkommenden Variablen mit Werten belegt werden (Variablenbelegung hier: r=1). Erst danach kann der Ausdruck unter Berücksichtigung der Semantik der vordefinierten Funktionen zu einem Ergebniswert vereinfacht werden. Nun betrachten wir folgendes Problem: Gegeben: Zwei Zahlen n und m Aufgabe: Bestimme das Maximum von n und m Diese Aufgabe können wir mit den bisherigen Funktionen nicht lösen. Wir benötigen neue Funktionen: Erste Möglichkeit: max als genau die gesuchte Funktion, aber das geht so natürlich nicht immer. Alternative: Entwicklung des folgenden Algorithmus: Vergleiche n mit m Falls n < m ist, dann ist m das Maximum Sonst ist n das Maximum Boolesche Werte Welche neuen Funktionen benötigen wir hierfür? Zunächst den Vergleich <, aber was ist das Ergebnis von n < m? Eine Möglichkeit: 0 für nicht kleiner 1 für kleiner (So z.b. in C) Bessere Lösung: spezielle boolesche Werte: 28

29 3.2 (Erweiterte) Backus-Naur-Form (BNF und EBNF) f alse Ergebnis für nicht kleiner und true Ergebnis für kleiner Also: 3 < 4 true 4 < 4 false. Beachte, dass true und f alse zwar dem intuitiven wahr bzw. falsch entsprechen, aber dennoch Werte, wie 42 oder -15 sind. Genau wie 3+4 zu 7 reduziert wird, wird 3 < 4 zu true reduziert. Entsprechend stehen uns auch Funktionen <= (für ), > und >= (für ) zur Verfügung. Nun müssen wir aber noch eine Möglichkeit finden, wie wir das Falls...dann...sonst... umsetzen. Hierzu kann man eine Funktion if then else, welche drei Argumente benötigt verwenden. Ihre Semantik ist wie folgt definiert: Semantik von if then else if then else(true,e 1,e 2 ) = e 1 if then else(false,e 1,e 2 ) = e 2 Beachte, dass das erste Argument ein boolescher Wert sein muss, damit diese Funktion ausgewertet werden kann. D.h. es können hier z.b. Vergleiche verwendet werden. Damit können wir nun den Maximumsalgorithmus als Ausdruck implementieren: if then else (n>m,n,m) Werten wir diesen Ausdruck nun für unterschiedliche Variablenbelegungen aus, so ergibt sich: n = 7,m = 42 if then else(7 > 42,7,42) = if then else(false,7,42) = 42 und n = 42,m = 8 if then else(42 > 8,42,8) = if then else(true,42,8) = 42 In Ruby wird das if then else nicht als Applikation einer dreistelligen Funktion notiert, sondern in einer Mixfixnotation geschrieben: if e 0 then e 1 else e 2 end anstelle von if then else(e 0,e 1,e 2 ) In der Anwendung in unserem Ausdruck für die Maximumsberechnung also if n > m then n else m end Auch in Tabellenkalkulationsanwendungen verwendet man Ausdrücke zur Definition von Formeln. Auf Suns: staroffice Variablen = Feldnummern (z.b. A7, B16) Mit = können für Felder Formeln definiert werden, z.b. A7+B16 oder SQRT(A5) 29

30 3 Programmierung Hier wird das if-then-else auch tatsächlich als 3-stellige Funktion IF THEN ELSE oder WENN DANN SONST (in der deutschen Variante) notiert. Als weiteres Beispiel betrachten wir XOR (exklusives Oder). Gegeben: zwei boolesche Werte in x und y Gesucht: XOR(x, y) mit XOR x = true x = false y = true false true y = false true false Ruby-Ausdruck, der XOR berechnet: if x then if y then false else true end else if y then true else false end end oder mit if then else als dreistellige Funktion: if then else (x, if then else (y, false, true ), if then else (y, true, false )) Es gibt aber auch noch kompaktere Definitionen: if x==y then false else true end oder noch einfacher: x!=y Sprich die Funktionen!= und xor verhalten sich auf booleschen Werten identisch. 3.3 Anweisungen Ausdrücke können keine Wiederholungen von Vorgängen ausdrücken, welche aber notwendig sind, um viele Algorithmen zu implementieren. Beispiel: Fakultätsfunktion n! = n Bsp: 5! = = 120 2! = 1 2 = 2 D.h. der Ausdruck zur Fakultätsberechnung ist unterschiedlich groß für unterschiedliche Argumente n (wächst mit wachsendem n). 30

31 3.3 Anweisungen Wie kann das Problem aber algorithmisch gelöst werden? Eine Lösung ist die schrittweise Multiplikation der Faktoren. n n! = = = = Hierbei ist es nicht nötig sich alle vorherigen Ergebnisse zu merken. Das jeweils letzte Ergebnis reicht aus. Man kann von einem Ergebnis auf das nächste schließen: n! = (n 1)! n In Programmiersprachen können Werte in Variablen gespeichert werden, wodurch man sich in einem Programm Werte merken kann (Belegung von Variablen mit Werten). In imperativen Programmiersprachen können Variablenbelegungen durch Zuweisung geändert werden: Beispiele: x = 3 y = if x>z then x else z end y = y 2 Hierbei dürfen auf der rechten Seite der Zuweisung beliebige Ausdrücke stehen. Sind alle verwendeten Variablen belegt, so kann der Ausdruck zu einem Wert ausgewertet werden und die Variable wird mit diesem Wert belegt. Hierbei wird der Ausdruck stets mit der Belegung vor der Anweisung ausgewertet. y = y 2 < Wenn hier y mit 2 belegt ist, so ist < hier y mit 4 belegt. Nun ist es wichtig, Zuweisungen auch zusammenzuhängen, so dass sie hintereinander ausgeführt werden: fac = fac n; n = n+1; Anweisungen werden hierzu durch Semikolons abgeschlossen, damit klar ist, wo die nächste Anweisung beginnt. fac = 2; n = 3; fac = fac n; n = n+1; < 1 < 2 < 3 < 4 Programmausführung: 31

32 3 Programmierung Programmpunkt (PP) f ac n 1 2 Anfangsbelegung der Variablen f ac 2 3 Anfangsbelegung der Variablen n 3 6 neue Belegungen 4 4 ւ Im Folgenden werden wir die Programmpunkte immer als Kommentar an die Semikolons heften, also im Beispiel: fac = 2; #1 n = 3; #2 fac = fac n; #3 n = n+1; #4 Um nun nach und nach die Fakultät zu berechnen benötigen wir noch eine Wiederholungsmöglichkeit, auch Schleife genannt while-schleife: Bsp: n = 1; #1 while n<4 do n = n+1; #2 #3 Hierbei nennt man den Teil zwischen while und do die Bedingung und den Teil zwischen do und end den Rumpf der Schleife. Bedeutung: So lange die Bedingung gilt (also zu true ausgewertet wird), wird der Rumpf wiederholt. Die Bedingung wird vor Ausführung des Rumpfs überprüft. Programmausführung: PP n

33 3.3 Anweisungen Nun können wir die Fakultät berechnen: nmax = 4; #1 #zu berechnende Fakultaet n = 0; #2 #Zaehler fac = 1; #3 #(Teil )Ergebnis while n < nmax do n=n+1; #4 fac = fac n; #5 #6 puts(fac ); #7 Die Anweisung puts gibt das Ergebnis eines Ausdrucks auf dem Bildschirm aus, hier also die finale Belegung der Variablen fac. Programmausführung: Hierzu haben wir in unserem Programm alle Semikolons durchnummeriert (im Kommentar): PP nmax n fac Das Ergebnis lautet also 24 und wird ausgegeben, was wir mit dem Pfeil andeuten. Programmausführung mit Ruby: Speichern als fac.rb Dann ausführen mit: ruby fac.rb Zuweisungen, Sequenzen und while-schleifen nennt man auch Anweisungen (Statements) und sie sind neben Ausdrücken eine weitere wichtige Struktur in imperativen Sprachen. Ihre Syntax können wir wie folgt formalisieren: Stm ::= Var = Exp ; Stm Stm while Exp do Stm end ; Beachte, dass sowohl in Zuweisungen, als auch in Bedingungen beliebige Ausdrücke stehen können (bei der Bedingung der while-schleife muss das Ergebnis natürlich ein boolescher Wert sein). Neben dem if-then-else auf Ausdrucksebene kann if-then-else auch auf Anweisungsebene verwendet werden. 33

34 3 Programmierung Stm ::=... if Exp then Stm else Stm end ; Hier ist es dann auch möglich den else-fall wegzulassen: Stm ::=... if Exp then Stm end ; Bsp.: Berechnung des Maximums von x und y: x =... ; y =... ; if x >= y then max = x; else max = y; Oder aber: x =... ; y =... ; max = x; if y>max then max = y; Betrachten wir noch einmal die Fakultätsberechnung. Anstatt die Faktoren hochzuzählen können wir auch runterzählen (mit Kommutativität von ): n = n (n 1) Im Programm können wir diese Idee verwenden, um die Hilfsvariable n bzw. nmax zu sparen: n = 4; #1 fac = 1; #2 while n>0 do fac = fac n; #3 n=n 1; #4 #5 puts(fac ); #6 #zu berechnende Fakultaet PP n fac Ausgabe: 24 Beachte: Zwischenergebnisse sind keine Fakultätsergebnisse mehr. Die Eingabevariable n wird verändert Wert geht verloren. Ungünstig, falls er nochmals benötigt wird! 34

35 3.3 Anweisungen Größter gemeinsamer Teiler Um das Programmieren mit Schleifen weiter zu üben wollen wir uns die Bestimmung des größten gemeinsamen Teilers zweier gegebener Zahlen anschauen. Der größte gemeinsame Teiler zweier Zahlen wird z.b. beim Kürzen von Brüchen verwendet, wo man Nenner und Zähler durch ihren größten gemeinsamen Teiler dividiert. Def.: (ggt) Gegeben: a,b N Gesucht: ggt(a,b) = c N, so dass c teilt a ohne Rest und c teilt b ohne Rest und für alle weiteren Teiler d von a und b gilt c > d. Als Beispiel betrachten wir folgende Zahlen: 21 hat die Teiler: 1, 3, 7, hat die Teiler: 1, 2, 3, 6, 9, 18 Somit ist der größte gemeinsame Teiler: ggt(18, 21) = 3 0 hat die Teiler: 1, 2, 3, 4, 5, 6, 7,... Somit gilt für alle a 0: ggt(a,0) = ggt(0,a) = a. ggt(0,0) ist nicht definiert, da alle Zahlen die 0 ohne Rest teilen und es somit keine größte Zahl gibt, die 0 teilt. Wie könnte nun eine mögliche Lösung dieses Problems aussehen? Bevor wir eine geschickte Lösung mit einem etwas geschickteren Algorithmus verwenden, lernen wir eine Methode kennen, die in vielen Fällen (allerdings oft nicht besonders geschickt) zum Ziel führt Aufzählen und Testen Ein großer Vorteil eines Computers gegenüber einem Menschen ist die Fähigkeit, viele Werte sehr schnell aufzählen und gewisse Eigenschaften für diese Werte testen zu können. Somit können viele Probleme, bei denen der Bereich der möglichen Lösungen endlich ist und aufgezählt werden kann, mit der Programmiertechnik Aufzählen und Testen gelöst werden. Dies ist auch für den ggt der Fall. Der ggt von zwei Zahlen n und m liegt sicherlich zwischen 1 und der kleineren der beiden Zahlen. Wir können also diese Werte der Reihe nach aufzählen und jeweils testen, ob die entsprechende Zahl beide gegebenen Zahlen ohne Rest teilt. Für die Überprüfung, ob eine Zahl eine andere ohne Rest teilt ist der Modulo-Operator sehr hilfreich, welcher den Rest einer ganzzahligen Division liefert. Falls a und b ganzzahlige Werte sind, so liefert/ die ganzzahlige Division und% den Rest der ganzzahligen Division. Bsp.: 12/9 1 12%9 3 16/3 5 16%3 1 35

36 3 Programmierung In der Vorlesung wurde zunächst vorgeschlagen, von 1 bis zum Minimum von a und b zu zählen, was zu folgendem Algorithmus führt: a = 12; #initiale Werte b = 9; max = if a<b then a else b i = 1; ggt = 1; while i<=max do if a%i==0 && b%i==0 then ggt=i ; i = i+1; puts(ggt); Beachte, dass der Ausdruck a%i==0 && b%i==0 wegen der Präzedenzen der verwendeten Operatoren, so geklammert ist: ((a%i)==0) && ((b%i)==0), d.h. &&(logisches Und) bindet schwächer als == bindet schwächer als %. Da wir den größten gemeinsamen Teiler suchen ist es für diese Aufgabe aber sinnvoller die Zahlen von oben nach unten aufzuzählen, da man dann bei der ersten Zahl, die beide gegebenen Zahlen ohne Rest teilt aufhören kann und den ggt ausgeben kann. Das Speichern des letzten Teilers wird überflüssig. Es ergibt sich folgendes, einfacheres ggt-programm: a = 12; #initiale Werte b = 9; ggt = if a<b then a else b while a%ggt!=0 b%ggt!=0 do ggt = ggt 1; puts(ggt); Beachte wieder, dass der Ausdruck a%ggt!=0 b%ggt!=0 wegen der Präzedenzen der verwendeten Operatoren, so geklammert ist: ((a%ggt)!=0) ((b%ggt)!=0), d.h. (logisches Oder) bindet schwächer als!= bindet schwächer als %. Problematisch sind nun noch die Randfälle a = 0 und/oder b = 0. Hier liefert das Programm einen Laufzeitfehler. Diese müssen nun noch explizit vor der Schleife abgefangen werden, was das Programm aber leider etwas aufbläht: a = 12; #initiale Werte b = 9; if a==0 then if b==0 then puts( ggt nicht definiert ); else puts(b); else if b==0 then puts(a); else ggt = if a<b then a else b while a%ggt!=0 b%ggt!=0 do 36

37 3.3 Anweisungen ggt = ggt 1; puts(ggt); Hier zeigt sich, dass es beim Testen der Programme auch wichtig ist, alle Randfälle systematisch zu überprüfen Euklidischer Algorithmus Bei großen Zahlen liefert die Aufzählen und Testen Methode die Lösung leider nicht mehr in akzeptabler Zeit. Wir betrachten deshalb eine effizientere Lösung, wie sie bereits ca. 300 v. Chr. von dem griechischen Mathematiker Euklid gefunden wurde. Gegeben zwei Strecken Bestimme eine Strecke, mit der man beide Strecken messen kann, d.h. die in beide Strecken ganz hineinpasst. Beide gegebenen Strecken sollen also Vielfache der gesuchten Strecke sein. Hier: Wie findet man so eine Strecke? Wenn beide Strecken gleich lang sind, passen sie natürlich in die jeweils andere hinein und es ist die gesuchte Strecke. Wenn nicht: ziehe die kürzere Strecke von der längeren ab. und suche nach einer Strecke, die in die kürzere Strecke und in die Strecke, die durch Abziehen der kürzeren von der längeren Strecke entsteht, hineinpasst. Da die gesuchte Strecke sowohl in die kürzere als auch in die längere Strecke hineinpassen soll, muss sie auch in die Differenz der beiden Strecken hineinpassen. Verfahre also weiter, bis beide Strecken gleich lang sind. Der Euklidische Algorithmus eignet sich also insbesondere auch zur Bestimmung des ggts. Wir arbeiten ähnlich wie bei der Idee mit den Strecken, allerdings enden wir nicht wenn beide Zahlen gleich sind, sondern erst, wenn eine der beiden 0 ist. Damit können wir den Fall, dass beide Zahlen 0 sind, separat abprüfen. Bsp.: ggt(15,10) 37

38 3 Programmierung = = = 0 Also ggt(15,10) = 5. Bsp.: ggt(12,9) = = = = 0 Also ggt(12,9) = 3. Implementierung des Euklidischen Algorithmus nicht definiert, falls a = 0 und b = 0 a, falls b = 0 und a 0 ggt(a,b) = b, falls a = 0 und b 0 ggt(a,b a), falls a < b und b 0 ggt(a b,a), falls a b und a 0 ggt(12,9) = ggt(3,9) = ggt(3,6) = ggt(3,3) = ggt(0,3) = 3 Wie können wir diese mathematische Definition nun in Ruby realisieren? Zunächst fällt auf, dass die letzten beiden Fälle mit einer Iteration abgedeckt werden können. Die while-schleife sollte so lange wiederholt werden, bis a oder b den Wert Null erhält. Im Rumpf der Schleife mus entweder a = a b; oder b = b a; gerechnet werden, je nachdem, welcher Wert größer ist: a = 12; #1 b = 9; #2 while a!=0 && b!=0 do if a<b then b=b a; #3 else a=a b; #4 #5 #6 #initiale Werte Wenn wir also den Programmpunkt 6 erreichen, wissen wir, dass mindestens eine der Variablen a und b den Wert Null hat. Nun müssen wir nur noch die ersten drei Fälle unserer ggt-definition unterscheiden und haben das gesuchte Programm: 38

39 3.3 Anweisungen a = 12; #1 b = 9; #2 while a!=0 && b!=0 do if a<b then b=b a; #3 else a=a b; #4 #5 #6 #initiale Werte if a==0 then if b==0 then puts( ggt nicht definiert ); #7 else puts(b); #8 #9 else puts(a); #10 #11 Die Programmausführung sieht dann wie folgt aus: PP a b Betrachte initiale Belegung: a = 3;b = 0; PP a b Weitere sinnvolle Testfälle wären: a = 0, b = 3 und a = 0, b = 0. Außerdem können wir auch für größere Werte die Ausgaben unserer unterschiedlichen ggt-implementierungen vergleichen und uns so von der Korrektheit unser Programme überzeugen. Der Algorithmus kann auch noch weiter optimiert werden, wenn man die Subtraktion durch eine Division mit Restbildung ersetzt. Näheres hierzu in der Übung. 39

40 3 Programmierung f or-schleife Bei vielen Iterationen weiß man genau, wie oft der Schleifen-Rumpf ausgeführt werden soll. Außerdem benötigt man oft eine Zählvariable, welche die Iterationen zählt und automatisch inkrementiert wird (i bei der ersten Version der Fakultät). Zu diesem Zweck kann man f or-schleifen verwenden: Stm ::=... for Var in Exp.. Exp Stm end Bsp.: PP n fac i Ausgabe: 24 Die Zählvariable wird vor der nächsten Iteration hochgezählt, falls Endwert noch nicht erreicht wurde. Beachte: Eine f or-schleife wird immer beendet (terminiert immer), im Gegensatz zu while-schleifen: Bsp.: while true do... end terminiert nicht oder wenn vergessen wird, die Zählvariable zu verändern: while n>0 do fac = fac n; #n=n 1; vergessen kann die while-schleife ebenfalls nicht terminieren. Dies ist bei der f or-schleife nicht möglich. Selbst wenn wir im Rumpf die Zählvariable verändern (was man aber auf keinen Fall machen sollte, da es zu unverständlichen Programmen führt!), wird der 40

Zahlensysteme Seite -1- Zahlensysteme

Zahlensysteme Seite -1- Zahlensysteme Zahlensysteme Seite -- Zahlensysteme Inhaltsverzeichnis Dezimalsystem... Binärsystem... Umrechnen Bin Dez...2 Umrechnung Dez Bin...2 Rechnen im Binärsystem Addition...3 Die negativen ganzen Zahlen im Binärsystem...4

Mehr

Grundlagen der Informatik

Grundlagen der Informatik Mag. Christian Gürtler Programmierung Grundlagen der Informatik 2011 Inhaltsverzeichnis I. Allgemeines 3 1. Zahlensysteme 4 1.1. ganze Zahlen...................................... 4 1.1.1. Umrechnungen.................................

Mehr

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

1. Das dekadische Ziffernsystem (Dezimalsystem) Eine ganze Zahl z kann man als Summe von Potenzen zur Basis 10 darstellen: Zahlensysteme. Das dekadische Ziffernsystem (Dezimalsystem) Eine ganze Zahl z kann man als Summe von Potenzen zur Basis darstellen: n n n n z a a... a a a Dabei sind die Koeffizienten a, a, a,... aus der

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

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?

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? 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? 3. Gegeben ist der Bitstrom: 10010110 Was repräsentiert

Mehr

Eine Logikschaltung zur Addition zweier Zahlen

Eine Logikschaltung zur Addition zweier Zahlen Eine Logikschaltung zur Addition zweier Zahlen Grundlegender Ansatz für die Umsetzung arithmetischer Operationen als elektronische Schaltung ist die Darstellung von Zahlen im Binärsystem. Eine Logikschaltung

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität Carolo Wilhelmina zu Brauschweig Institut für rechnergestützte Modellierung im Bauingenierwesen Prof. Dr.-Ing. habil. Manfred Krafczyk Pockelsstraße 3, 38106 Braunschweig http://www.irmb.tu-bs.de

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

Daten verarbeiten. Binärzahlen

Daten verarbeiten. Binärzahlen Daten verarbeiten Binärzahlen In Digitalrechnern werden (fast) ausschließlich nur Binärzahlen eingesetzt. Das Binärzahlensystem ist das Stellenwertsystem mit der geringsten Anzahl von Ziffern. Es kennt

Mehr

Zahlensysteme: Oktal- und Hexadezimalsystem

Zahlensysteme: Oktal- und Hexadezimalsystem 20 Brückenkurs Die gebräuchlichste Bitfolge umfasst 8 Bits, sie deckt also 2 8 =256 Möglichkeiten ab, und wird ein Byte genannt. Zwei Bytes, also 16 Bits, bilden ein Wort, und 4 Bytes, also 32 Bits, formen

Mehr

Einführung in die Informatik I

Einführung in die Informatik I Einführung in die Informatik I Das Rechnen in Zahlensystemen zur Basis b=2, 8, 10 und 16 Prof. Dr. Nikolaus Wulff Zahlensysteme Neben dem üblichen dezimalen Zahlensystem zur Basis 10 sind in der Informatik

Mehr

Zahlensysteme. Digitale Rechner speichern Daten im Dualsystem 435 dez = 1100110011 binär

Zahlensysteme. Digitale Rechner speichern Daten im Dualsystem 435 dez = 1100110011 binär Zahlensysteme Menschen nutzen zur Angabe von Werten und zum Rechnen vorzugsweise das Dezimalsystem Beispiel 435 Fische aus dem Teich gefischt, d.h. 4 10 2 + 3 10 1 +5 10 0 Digitale Rechner speichern Daten

Mehr

Zahlensysteme. von Christian Bartl

Zahlensysteme. von Christian Bartl von Inhaltsverzeichnis Inhaltsverzeichnis... 2 1. Einleitung... 3 2. Umrechnungen... 3 2.1. Dezimalsystem Binärsystem... 3 2.2. Binärsystem Dezimalsystem... 3 2.3. Binärsystem Hexadezimalsystem... 3 2.4.

Mehr

Grundbegriffe der Informatik

Grundbegriffe der Informatik Grundbegriffe der Informatik Einheit 15: Reguläre Ausdrücke und rechtslineare Grammatiken Thomas Worsch Universität Karlsruhe, Fakultät für Informatik Wintersemester 2008/2009 1/25 Was kann man mit endlichen

Mehr

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

Informationssysteme Gleitkommazahlen nach dem IEEE-Standard 754. Berechnung von Gleitkommazahlen aus Dezimalzahlen. HSLU T&A Informatik HS10 Informationssysteme Gleitkommazahlen nach dem IEEE-Standard 754 Berechnung von Gleitkommazahlen aus Dezimalzahlen Die wissenschaftliche Darstellung einer Zahl ist wie folgt definiert: n = f * 10 e. f ist

Mehr

Technische Informatik - Eine Einführung

Technische Informatik - Eine Einführung Martin-Luther-Universität Halle-Wittenberg Fachbereich Mathematik und Informatik Lehrstuhl für Technische Informatik Prof. P. Molitor Ausgabe: 2005-02-21 Abgabe: 2005-02-21 Technische Informatik - Eine

Mehr

Programmiersprachen und Übersetzer

Programmiersprachen und Übersetzer Programmiersprachen und Übersetzer Sommersemester 2010 19. April 2010 Theoretische Grundlagen Problem Wie kann man eine unendliche Menge von (syntaktisch) korrekten Programmen definieren? Lösung Wie auch

Mehr

Ein polyadisches Zahlensystem mit der Basis B ist ein Zahlensystem, in dem eine Zahl x nach Potenzen von B zerlegt wird.

Ein polyadisches Zahlensystem mit der Basis B ist ein Zahlensystem, in dem eine Zahl x nach Potenzen von B zerlegt wird. Zahlensysteme Definition: Ein polyadisches Zahlensystem mit der Basis B ist ein Zahlensystem, in dem eine Zahl x nach Potenzen von B zerlegt wird. In der Informatik spricht man auch von Stellenwertsystem,

Mehr

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

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

2.11 Kontextfreie Grammatiken und Parsebäume

2.11 Kontextfreie Grammatiken und Parsebäume 2.11 Kontextfreie Grammatiken und Parsebäume Beispiel: Beispiel (Teil 3): Beweis für L(G) L: Alle Strings aus L der Länge 0 und 2 sind auch in L(G). Als Induktionsannahme gehen wir davon aus, dass alle

Mehr

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

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Im Original veränderbare Word-Dateien

Im Original veränderbare Word-Dateien Binärsystem Im Original veränderbare Word-Dateien Prinzipien der Datenverarbeitung Wie du weißt, führen wir normalerweise Berechnungen mit dem Dezimalsystem durch. Das Dezimalsystem verwendet die Grundzahl

Mehr

Daten, Informationen, Kodierung. Binärkodierung

Daten, Informationen, Kodierung. Binärkodierung Binärkodierung Besondere Bedeutung der Binärkodierung in der Informatik Abbildung auf Alphabet mit zwei Zeichen, in der Regel B = {0, 1} Entspricht den zwei möglichen Schaltzuständen in der Elektronik:

Mehr

Grundlagen der Informatik Übungen 1.Termin

Grundlagen der Informatik Übungen 1.Termin : : : : : : : : : : : : : : : : : : : : : : Grundlagen der Informatik Übungen 1.Termin Dipl.-Phys. Christoph Niethammer Grundlagen der Informatik 2012 1 : : : : : : : : : : : : : : : : : : : : : : Kontakt

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 18

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 18 Kapitel 3 Datentypen und Variablen Seite 1 von 18 Datentypen - Einführung - Für jede Variable muss ein Datentyp festgelegt werden. - Hierdurch werden die Wertemenge und die verwendbaren Operatoren festgelegt.

Mehr

2. Negative Dualzahlen darstellen

2. Negative Dualzahlen darstellen 2.1 Subtraktion von Dualzahlen 2.1.1 Direkte Subtraktion (Tafelrechnung) siehe ARCOR T0IF Nachteil dieser Methode: Diese Form der Subtraktion kann nur sehr schwer von einer Elektronik (CPU) durchgeführt

Mehr

Mathematische Grundlagen der Kryptographie. 1. Ganze Zahlen 2. Kongruenzen und Restklassenringe. Stefan Brandstädter Jennifer Karstens

Mathematische Grundlagen der Kryptographie. 1. Ganze Zahlen 2. Kongruenzen und Restklassenringe. Stefan Brandstädter Jennifer Karstens Mathematische Grundlagen der Kryptographie 1. Ganze Zahlen 2. Kongruenzen und Restklassenringe Stefan Brandstädter Jennifer Karstens 18. Januar 2005 Inhaltsverzeichnis 1 Ganze Zahlen 1 1.1 Grundlagen............................

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

Binärdarstellung von Fliesskommazahlen

Binärdarstellung von Fliesskommazahlen Binärdarstellung von Fliesskommazahlen 1. IEEE 754 Gleitkommazahl im Single-Format So sind in Gleitkommazahlen im IEEE 754-Standard aufgebaut: 31 30 24 23 0 S E E E E E E E E M M M M M M M M M M M M M

Mehr

Theoretische Informatik SS 04 Übung 1

Theoretische Informatik SS 04 Übung 1 Theoretische Informatik SS 04 Übung 1 Aufgabe 1 Es gibt verschiedene Möglichkeiten, eine natürliche Zahl n zu codieren. In der unären Codierung hat man nur ein Alphabet mit einem Zeichen - sagen wir die

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Zahlensysteme. Zahl 0 0 0 0 0 5 5. Stellenwert Zahl 0 0 0 0 0 50 5. Zahl = 55 +50 +5

Zahlensysteme. Zahl 0 0 0 0 0 5 5. Stellenwert Zahl 0 0 0 0 0 50 5. Zahl = 55 +50 +5 Personal Computer in Betrieb nehmen 1/6 Weltweit setzen die Menschen alltäglich das Zehnersystem für Zählen und Rechnen ein. Die ursprüngliche Orientierung stammt vom Zählen mit unseren 10 Fingern. Für

Mehr

2 Darstellung von Zahlen und Zeichen

2 Darstellung von Zahlen und Zeichen 2.1 Analoge und digitale Darstellung von Werten 79 2 Darstellung von Zahlen und Zeichen Computer- bzw. Prozessorsysteme führen Transformationen durch, die Eingaben X auf Ausgaben Y abbilden, d.h. Y = f

Mehr

Übung zur Vorlesung Einführung in die Computerlinguistik und Sprachtechnologie

Übung zur Vorlesung Einführung in die Computerlinguistik und Sprachtechnologie Übung zur Vorlesung Einführung in die Computerlinguistik und Sprachtechnologie Wintersemester 2009/10, Prof. Dr. Udo Hahn, Erik Fäßler Übungsblatt 3 vom 19.11.2009 Abgabe bis 26.11.2009, 14:30 Uhr; per

Mehr

Zahlendarstellungen und Rechnerarithmetik*

Zahlendarstellungen und Rechnerarithmetik* Zahlendarstellungen und Rechnerarithmetik* 1. Darstellung positiver ganzer Zahlen 2. Darstellung negativer ganzer Zahlen 3. Brüche und Festkommazahlen 4. binäre Addition 5. binäre Subtraktion *Die Folien

Mehr

Zeichen bei Zahlen entschlüsseln

Zeichen bei Zahlen entschlüsseln Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren

Mehr

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

Jede Zahl muss dabei einzeln umgerechnet werden. Beginnen wir also ganz am Anfang mit der Zahl,192. Binäres und dezimales Zahlensystem Ziel In diesem ersten Schritt geht es darum, die grundlegende Umrechnung aus dem Dezimalsystem in das Binärsystem zu verstehen. Zusätzlich wird auch die andere Richtung,

Mehr

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

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage: Zählen und Zahlbereiche Übungsblatt 1 1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage: Für alle m, n N gilt m + n = n + m. in den Satz umschreiben:

Mehr

Kapitel 2: Formale Sprachen Kontextfreie Sprachen. reguläre Grammatiken/Sprachen. kontextfreie Grammatiken/Sprachen

Kapitel 2: Formale Sprachen Kontextfreie Sprachen. reguläre Grammatiken/Sprachen. kontextfreie Grammatiken/Sprachen reguläre Grammatiken/prachen Beschreibung für Bezeichner in Programmiersprachen Beschreibung für wild cards in kriptsprachen (/* reguläre Ausdrücke */)?; [a-z]; * kontextfreie Grammatiken/prachen Beschreibung

Mehr

Englische Division. ... und allgemeine Hinweise

Englische Division. ... und allgemeine Hinweise Das folgende Verfahren ist rechnerisch identisch mit dem Normalverfahren; es unterscheidet sich nur in der Schreibweise des Rechenschemas Alle Tipps und Anmerkungen, die über die Besonderheiten dieser

Mehr

Grundlagen der Theoretischen Informatik, SoSe 2008

Grundlagen der Theoretischen Informatik, SoSe 2008 1. Aufgabenblatt zur Vorlesung Grundlagen der Theoretischen Informatik, SoSe 2008 (Dr. Frank Hoffmann) Lösung von Manuel Jain und Benjamin Bortfeldt Aufgabe 2 Zustandsdiagramme (6 Punkte, wird korrigiert)

Mehr

Binär- und Hexadezimal-Zahl Arithmetik.

Binär- und Hexadezimal-Zahl Arithmetik. Binär- und Hexadezimal-Zahl Arithmetik. Prof. Dr. Dörte Haftendorn, MuPAD 4, http://haftendorn.uni-lueneburg.de Aug.06 Automatische Übersetzung aus MuPAD 3.11, 24.04.02 Version vom 12.10.05 Web: http://haftendorn.uni-lueneburg.de

Mehr

Zahlensysteme Das 10er-System

Zahlensysteme Das 10er-System Zahlensysteme Übungsblatt für die entfallende Stunde am 22.10.2010. Das 10er-System... 1 Umrechnung in das 10er-System... 2 2er-System... 2 8er-System... 2 16er-System... 3 Umrechnung in andere Zahlensysteme...

Mehr

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung.

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung. Lineare Gleichungen mit einer Unbekannten Die Grundform der linearen Gleichung mit einer Unbekannten x lautet A x = a Dabei sind A, a reelle Zahlen. Die Gleichung lösen heißt, alle reellen Zahlen anzugeben,

Mehr

Einführung in PHP. (mit Aufgaben)

Einführung in PHP. (mit Aufgaben) Einführung in PHP (mit Aufgaben) Dynamische Inhalte mit PHP? 2 Aus der Wikipedia (verkürzt): PHP wird auf etwa 244 Millionen Websites eingesetzt (Stand: Januar 2013) und wird auf etwa 80 % aller Websites

Mehr

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

Mathematik: Mag. Schmid Wolfgang Arbeitsblatt 3 1. Semester ARBEITSBLATT 3 RECHNEN MIT GANZEN ZAHLEN ARBEITSBLATT 3 RECHNEN MIT GANZEN ZAHLEN Wir wollen nun die Rechengesetze der natürlichen Zahlen auf die Zahlenmenge der ganzen Zahlen erweitern und zwar so, dass sie zu keinem Widerspruch mit bisher geltenden

Mehr

Erwin Grüner 09.02.2006

Erwin Grüner 09.02.2006 FB Psychologie Uni Marburg 09.02.2006 Themenübersicht Folgende Befehle stehen in R zur Verfügung: {}: Anweisungsblock if: Bedingte Anweisung switch: Fallunterscheidung repeat-schleife while-schleife for-schleife

Mehr

1.4.12 Sin-Funktion vgl. Cos-Funktion

1.4.12 Sin-Funktion vgl. Cos-Funktion .4. Sgn-Funktion Informatik. Semester 36 36.4.2 Sin-Funktion vgl. Cos-Funktion Informatik. Semester 37 37 .4.3 Sqr-Funktion Informatik. Semester 38 38.4.4 Tan-Funktion Informatik. Semester 39 39 .5 Konstanten

Mehr

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes. Binäre Bäume Definition: Ein binärer Baum T besteht aus einer Menge von Knoten, die durch eine Vater-Kind-Beziehung wie folgt strukturiert ist: 1. Es gibt genau einen hervorgehobenen Knoten r T, die Wurzel

Mehr

3 Rechnen und Schaltnetze

3 Rechnen und Schaltnetze 3 Rechnen und Schaltnetze Arithmetik, Logik, Register Taschenrechner rste Prozessoren (z.b. Intel 4004) waren für reine Rechenaufgaben ausgelegt 4 4-Bit Register 4-Bit Datenbus 4 Kbyte Speicher 60000 Befehle/s

Mehr

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt AMPEL-Steuerung(en) Die Beschreibung und Programmierung der Ampel (vor allem Ampel_5) können sehr kompliziert

Mehr

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

Skript und Aufgabensammlung Terme und Gleichungen Mathefritz Verlag Jörg Christmann Nur zum Privaten Gebrauch! Alle Rechte vorbehalten! Mathefritz 5 Terme und Gleichungen Meine Mathe-Seite im Internet kostenlose Matheaufgaben, Skripte, Mathebücher Lernspiele, Lerntipps, Quiz und noch viel mehr http:// www.mathefritz.de Seite 1 Copyright

Mehr

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel.

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel. Kontextfreie Kontextfreie Motivation Formale rundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen Bisher hatten wir Automaten, die Wörter akzeptieren Frank Heitmann heitmann@informatik.uni-hamburg.de

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Übung 9 - Lösungsvorschlag

Übung 9 - Lösungsvorschlag Universität Innsbruck - Institut für Informatik Datenbanken und Informationssysteme Prof. Günther Specht, Eva Zangerle Besprechung: 15.12.2008 Einführung in die Informatik Übung 9 - Lösungsvorschlag Aufgabe

Mehr

Binäre Gleitkommazahlen

Binäre Gleitkommazahlen Binäre Gleitkommazahlen Was ist die wissenschaftliche, normalisierte Darstellung der binären Gleitkommazahl zur dezimalen Gleitkommazahl 0,625? Grundlagen der Rechnerarchitektur Logik und Arithmetik 72

Mehr

Computerarithmetik ( )

Computerarithmetik ( ) Anhang A Computerarithmetik ( ) A.1 Zahlendarstellung im Rechner und Computerarithmetik Prinzipiell ist die Menge der im Computer darstellbaren Zahlen endlich. Wie groß diese Menge ist, hängt von der Rechnerarchitektur

Mehr

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

Mehr

Formale Sprachen und Grammatiken

Formale Sprachen und Grammatiken Formale Sprachen und Grammatiken Jede Sprache besitzt die Aspekte Semantik (Bedeutung) und Syntax (formaler Aufbau). Die zulässige und korrekte Form der Wörter und Sätze einer Sprache wird durch die Syntax

Mehr

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung M. Graefenhan 2000-12-07 Aufgabe Lösungsweg Übungen zu C Blatt 3 Musterlösung Schreiben Sie ein Programm, das die Häufigkeit von Zeichen in einem eingelesenen String feststellt. Benutzen Sie dazu ein zweidimensionales

Mehr

Konzepte der Informatik

Konzepte der Informatik Konzepte der Informatik Vorkurs Informatik zum WS 2011/2012 26.09. - 30.09.2011 17.10. - 21.10.2011 Dr. Werner Struckmann / Christoph Peltz Stark angelehnt an Kapitel 1 aus "Abenteuer Informatik" von Jens

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

1. Formale Sprachen 1.2 Grammatiken formaler Sprachen

1. Formale Sprachen 1.2 Grammatiken formaler Sprachen 1. Formale Sprachen 1.2 Grammatiken formaler Sprachen Die Regeln zur Bildung korrekter Wörter einer Sprache kann man in einer natürlichen Sprache formulieren. Da dies jedoch wieder Mehrdeutigkeiten mit

Mehr

7 Rechnen mit Polynomen

7 Rechnen mit Polynomen 7 Rechnen mit Polynomen Zu Polynomfunktionen Satz. Zwei Polynomfunktionen und f : R R, x a n x n + a n 1 x n 1 + a 1 x + a 0 g : R R, x b n x n + b n 1 x n 1 + b 1 x + b 0 sind genau dann gleich, wenn

Mehr

Lineare Gleichungssysteme

Lineare Gleichungssysteme Lineare Gleichungssysteme 1 Zwei Gleichungen mit zwei Unbekannten Es kommt häufig vor, dass man nicht mit einer Variablen alleine auskommt, um ein Problem zu lösen. Das folgende Beispiel soll dies verdeutlichen

Mehr

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at Inhalt SWP Funktionale Programme (2. Teil) Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at Interpreter für funktionale Sprache

Mehr

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

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.

Mehr

Repetitionsaufgaben Wurzelgleichungen

Repetitionsaufgaben Wurzelgleichungen Repetitionsaufgaben Wurzelgleichungen Inhaltsverzeichnis A) Vorbemerkungen B) Lernziele C) Theorie mit Aufgaben D) Aufgaben mit Musterlösungen 4 A) Vorbemerkungen Bitte beachten Sie: Bei Wurzelgleichungen

Mehr

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

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff Programmieren in C Felder, Schleifen und Fließkommaarithmetik Prof. Dr. Nikolaus Wulff Addition von Zahlen 1 2 3 4 5 #include int main() { int x,y,z,sum; x = 1; y = 2; z = 4; sum = x + y + z;

Mehr

Übungskomplex Felder (1) Eindimensionale Felder Mehrdimensionale Felder

Übungskomplex Felder (1) Eindimensionale Felder Mehrdimensionale Felder Übungskomplex Felder (1) Eindimensionale Felder Mehrdimensionale Felder Hinweise zur Übung Benötigter Vorlesungsstoff Ab diesem Übungskomplex wird die Kenntnis und praktische Beherrschung der Konzepte

Mehr

DHBW Karlsruhe, Vorlesung Programmieren, Klassen (2)

DHBW Karlsruhe, Vorlesung Programmieren, Klassen (2) DHBW Karlsruhe, Vorlesung Programmieren, Klassen (2) Aufgabe 3 Bankkonto Schreiben Sie eine Klasse, die ein Bankkonto realisiert. Attribute für das Bankkonto sind der Name und Vorname des Kontoinhabers,

Mehr

Einführung in die Informatik I

Einführung in die Informatik I Einführung in die Informatik I Algorithmen und deren Programmierung Prof. Dr. Nikolaus Wulff Definition Algorithmus Ein Algorithmus ist eine präzise formulierte Handlungsanweisung zur Lösung einer gleichartigen

Mehr

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

Sowohl die Malstreifen als auch die Neperschen Streifen können auch in anderen Stellenwertsystemen verwendet werden. Multiplikation Die schriftliche Multiplikation ist etwas schwieriger als die Addition. Zum einen setzt sie das kleine Einmaleins voraus, zum anderen sind die Überträge, die zu merken sind und häufig in

Mehr

Lösungen: zu 1. a.) 0 0 1 1 b.) 1 1 1 1 c.) 0 1 1 0 + 1 1 0 0 + 0 0 1 1 + 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1

Lösungen: zu 1. a.) 0 0 1 1 b.) 1 1 1 1 c.) 0 1 1 0 + 1 1 0 0 + 0 0 1 1 + 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 Lösungen: zu 1. a.) 0 0 1 1 b.) 1 1 1 1 c.) 0 1 1 0 + 1 1 0 0 + 0 0 1 1 + 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 vorzeichenlose Zahl: 15 vorzeichenlose Zahl: 18 vorzeichenlose Zahl: 13 Zweierkomplement: - 1

Mehr

Mikro-Controller-Pass 1

Mikro-Controller-Pass 1 Seite: 1 Zahlensysteme im Selbststudium Inhaltsverzeichnis Vorwort Seite 3 Aufbau des dezimalen Zahlensystems Seite 4 Aufbau des dualen Zahlensystems Seite 4 Aufbau des oktalen Zahlensystems Seite 5 Aufbau

Mehr

Anmerkungen zur Übergangsprüfung

Anmerkungen zur Übergangsprüfung DM11 Slide 1 Anmerkungen zur Übergangsprüfung Aufgabeneingrenzung Aufgaben des folgenden Typs werden wegen ihres Schwierigkeitsgrads oder wegen eines ungeeigneten fachlichen Schwerpunkts in der Übergangsprüfung

Mehr

Informationsblatt Induktionsbeweis

Informationsblatt Induktionsbeweis Sommer 015 Informationsblatt Induktionsbeweis 31. März 015 Motivation Die vollständige Induktion ist ein wichtiges Beweisverfahren in der Informatik. Sie wird häufig dazu gebraucht, um mathematische Formeln

Mehr

Repetitionsaufgaben Negative Zahlen/Brüche/Prozentrechnen

Repetitionsaufgaben Negative Zahlen/Brüche/Prozentrechnen Kantonale Fachschaft Mathematik Repetitionsaufgaben Negative Zahlen/Brüche/Prozentrechnen Zusammengestellt von der Fachschaft Mathematik der Kantonsschule Willisau Inhaltsverzeichnis A) Lernziele... 1

Mehr

Grundlagen der Informatik I Informationsdarstellung

Grundlagen der Informatik I Informationsdarstellung Grundlagen der Informatik I Informationsdarstellung Einführung in die Informatik, Gumm, H.-P./Sommer, M. Themen der heutigen Veranstaltung. ASCIi Code 2. Zeichenketten 3. Logische Operationen 4. Zahlendarstellung

Mehr

Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer

Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer Allgemein: Das RSA-Verschlüsselungsverfahren ist ein häufig benutztes Verschlüsselungsverfahren, weil es sehr sicher ist. Es gehört zu der Klasse der

Mehr

6.2 Scan-Konvertierung (Scan Conversion)

6.2 Scan-Konvertierung (Scan Conversion) 6.2 Scan-Konvertierung (Scan Conversion) Scan-Konvertierung ist die Rasterung von einfachen Objekten (Geraden, Kreisen, Kurven). Als Ausgabemedium dient meist der Bildschirm, der aus einem Pixelraster

Mehr

Lineare Gleichungssysteme

Lineare Gleichungssysteme Brückenkurs Mathematik TU Dresden 2015 Lineare Gleichungssysteme Schwerpunkte: Modellbildung geometrische Interpretation Lösungsmethoden Prof. Dr. F. Schuricht TU Dresden, Fachbereich Mathematik auf der

Mehr

Mediator 9 - Lernprogramm

Mediator 9 - Lernprogramm Mediator 9 - Lernprogramm Ein Lernprogramm mit Mediator erstellen Mediator 9 bietet viele Möglichkeiten, CBT-Module (Computer Based Training = Computerunterstütztes Lernen) zu erstellen, z. B. Drag & Drop

Mehr

Übungsaufgaben. - Vorgehensweise entsprechend dem Algorithmus der schriftlichen Multiplikation

Übungsaufgaben. - Vorgehensweise entsprechend dem Algorithmus der schriftlichen Multiplikation Übungsaufgaben Anmerkung Allen Beispielen soll noch hinzugefügt sein, dass wertvolle Hinweise, also die Tipps und Tricks die der schnellen maschinellen Multiplikation zu Grunde liegen, neben dem toff zur

Mehr

Diana Lange. Generative Gestaltung Operatoren

Diana Lange. Generative Gestaltung Operatoren Diana Lange Generative Gestaltung Operatoren Begriffserklärung Verknüpfungsvorschrift im Rahmen logischer Kalküle. Quelle: google Operatoren sind Zeichen, die mit einer bestimmten Bedeutung versehen sind.

Mehr

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen Übungen if / else / else if... 2... 2 Aufgabe 2:... 2 Aufgabe 3:... 2 Aufgabe 4:... 2 Aufgabe 5:... 2 Aufgabe 6:... 2 Aufgabe 7:... 3 Aufgabe 8:... 3 Aufgabe 9:... 3 Aufgabe 10:... 3 switch... 4... 4 Aufgabe

Mehr

1.Unterschied: Die Übungen sind nicht von deinem Mathe-Lehrer...

1.Unterschied: Die Übungen sind nicht von deinem Mathe-Lehrer... mit den Spezialkursen so funktioniert es! Liebe Schülerinnen und Schüler, wenn ihr jetzt sagt: Mathe üben mit dem PC? Cool, wie funktioniert das denn? dann seid ihr hier im Mathe-Online-Center genau richtig.

Mehr

N Bit binäre Zahlen (signed)

N Bit binäre Zahlen (signed) N Bit binäre Zahlen (signed) n Bit Darstellung ist ein Fenster auf die ersten n Stellen der Binär Zahl 0000000000000000000000000000000000000000000000000110 = 6 1111111111111111111111111111111111111111111111111101

Mehr

15 Optimales Kodieren

15 Optimales Kodieren 15 Optimales Kodieren Es soll ein optimaler Kodierer C(T ) entworfen werden, welcher eine Information (z.b. Text T ) mit möglichst geringer Bitanzahl eindeutig überträgt. Die Anforderungen an den optimalen

Mehr

Programmierung mit NQC: Kommunikation zwischen zwei RCX

Programmierung mit NQC: Kommunikation zwischen zwei RCX Programmierung mit NQC: Kommunikation zwischen zwei RCX Teil : Grundlagen Martin Schmidt 7. Februar 24 Teil : Grundlagen Zahlensysteme : Binärsystem Ziffern: und Bit = binary digit (Binärziffer) Einfach

Mehr

Informatik A ( Frank Hoffmann)

Informatik A ( Frank Hoffmann) Teillösungen zum 1. Aufgabenblatt zur Vorlesung Informatik A ( Frank Hoffmann) 1. Improvisieren Stellen Sie die Zahl 6 dar durch einen Ausdruck, der genau dreimal die Ziffer i enthält und ansonsten neben

Mehr

Plotten von Linien ( nach Jack Bresenham, 1962 )

Plotten von Linien ( nach Jack Bresenham, 1962 ) Plotten von Linien ( nach Jack Bresenham, 1962 ) Ac Eine auf dem Bildschirm darzustellende Linie sieht treppenförmig aus, weil der Computer Linien aus einzelnen (meist quadratischen) Bildpunkten, Pixels

Mehr

VBA-Programmierung: Zusammenfassung

VBA-Programmierung: Zusammenfassung VBA-Programmierung: Zusammenfassung Programmiersprachen (Definition, Einordnung VBA) Softwareentwicklung-Phasen: 1. Spezifikation 2. Entwurf 3. Implementierung Datentypen (einfach, zusammengesetzt) Programmablaufsteuerung

Mehr

Tangentengleichung. Wie lautet die Geradengleichung für die Tangente, y T =? Antwort:

Tangentengleichung. Wie lautet die Geradengleichung für die Tangente, y T =? Antwort: Tangentengleichung Wie Sie wissen, gibt die erste Ableitung einer Funktion deren Steigung an. Betrachtet man eine fest vorgegebene Stelle, gibt f ( ) also die Steigung der Kurve und somit auch die Steigung

Mehr

4 Binäres Zahlensystem

4 Binäres Zahlensystem Netzwerktechnik achen, den 08.05.03 Stephan Zielinski Dipl.Ing Elektrotechnik Horbacher Str. 116c 52072 achen Tel.: 0241 / 174173 zielinski@fh-aachen.de zielinski.isdrin.de 4 inäres Zahlensystem 4.1 Codieren

Mehr

Semantik von Formeln und Sequenzen

Semantik von Formeln und Sequenzen Semantik von Formeln und Sequenzen 33 Grundidee der Verwendung von Logik im Software Entwurf Syntax: Menge von Formeln = Axiome Ax K ist beweisbar Formel ϕ beschreiben Korrektkeit Vollständigkeit beschreibt

Mehr

Aufgaben zu Stellenwertsystemen

Aufgaben zu Stellenwertsystemen Aufgaben zu Stellenwertsystemen Aufgabe 1 a) Zähle im Dualsystem von 1 bis 16! b) Die Zahl 32 wird durch (100000) 2 dargestellt. Zähle im Dualsystem von 33 bis 48! Zähle schriftlich! Aufgabe 2 Wandle die

Mehr

1. LPC - Lehmanns Programmier Contest - Lehmanns Logo

1. LPC - Lehmanns Programmier Contest - Lehmanns Logo Aufgabe ist die Entwicklung einer vereinfachten Variante der beliebten Programmiersprache Logo. Die Aufgabe ist in drei Stufen zu erledigen, von der wir zunächst nur die erste Stufe bekannt geben. Die

Mehr

Tipp III: Leiten Sie eine immer direkt anwendbare Formel her zur Berechnung der sogenannten "bedingten Wahrscheinlichkeit".

Tipp III: Leiten Sie eine immer direkt anwendbare Formel her zur Berechnung der sogenannten bedingten Wahrscheinlichkeit. Mathematik- Unterrichts- Einheiten- Datei e. V. Klasse 9 12 04/2015 Diabetes-Test Infos: www.mued.de Blutspenden werden auf Diabetes untersucht, das mit 8 % in der Bevölkerung verbreitet ist. Dabei werden

Mehr

Wir basteln einen Jahreskalender mit MS Excel.

Wir basteln einen Jahreskalender mit MS Excel. Wir basteln einen Jahreskalender mit MS Excel. In meinen Seminaren werde ich hin und wieder nach einem Excel-Jahreskalender gefragt. Im Internet findet man natürlich eine ganze Reihe mehr oder weniger

Mehr