Benutzer-Werkzeuge

Webseiten-Werkzeuge


schule:logikgatter

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
schule:logikgatter [2016-07-10 12:37] – [Wertetabelle] marco.bakeraschule:logikgatter [2021-01-26 08:23] (aktuell) – [Wertetabelle] xor trick marco.bakera
Zeile 1: Zeile 1:
 +====== Emulator für logische Schaltungen ======
  
 +===== Auftrag =====
 +
 +{{ :schule:prog:logikemulator_kundenauftrag.png?nolink|}}
 +
 +Sie haben den Auftrag erhalten, für die Elektro-Fachabteilung eines mittelständischen Unternehmens ein Programm zur Emulation logischer Schaltungen zu entwickeln.
 +
 +Die verschiedenen Grundbausteine können nach Eingabe von Wertbelegungen für die Eingänge getestet werden.
 +
 +Stelle Sie durch ein Objekt-Orientiertes Design des Programms sicher, dass auch komplexe Schaltungen simuliert werden können.
 +
 +===== Wertetabelle =====
 +
 +  - Erstelle eine Wertetabelle für alle [[wpde>Logikgatter]].
 +  - Das XOR hat in der Kryptographie eine besondere Bedeutung. Es kommt bei sogenannten One-Time-Pads zum Einsatz. Diese werden in dem PDF von [[http://www.crypto101.io/|Crypto 101]] gut beschrieben.\\ Wie funktionieren One-Time Pads? Welche Angriffsmöglichkeiten bzw. Schwachstellen gibt es und wie funktionieren diese?
 +  - Weitere Anwendungen von XOR beschreibt der Artikel [[https://florian.github.io//xor-trick/|The XOR Trick]]
 +
 +Das Wissen können wir gemeinsam in einem [[https://play.kahoot.it/#/k/8e8b2ecd-ae34-4695-b73c-189b5ce61de0|Kahoot]] überprüfen.
 +===== Und-Gatter =====
 +
 +  - Wie könnte eine Klasse für ein UND-Gatter aufgebaut sein? 
 +  - Welche Attribute und [[Methoden]] gibt es?
 +  - Implementiere die Klasse ''UndGatter'' und die anderen Gatter.
 +
 +===== Vererbung =====
 +
 +  - Bei der Implementierung gibt es Wiederholungen im Quelltext. An welchen Stellen?
 +  - Wie können solche Wiederholungen vermieden werden?
 +  - Nutze Vererbung, um die Wiederholungen zu vermeiden.
 +  - Bearbeite das //Arbeitsblatt Vererbung//
 +
 +Das Wissen können wir gemeinsam in einem [[https://play.kahoot.it/#/k/00feb39d-6c52-4272-a390-f601a5c730e1|Kahoot]] überprüfen.
 +===== Tests =====
 +
 +Die Gatter sollen getestet werden.
 +
 +  - Welches Ziel verfolgt ein [[wpde>Komponententest]]?
 +  - Was ist der Unterschied zwischen einem Blackbox- und einem Whitebox-Test?
 +  - Erstelle ein neues Projekt "LogikgatterTest" in der selben Projektmappe.
 +  - Füge als Verweis das bisherige Projekt hinzu.
 +  - Erstelle für jedes Gatter einen Testklasse: Für das ''UndGatter'' also z.B. ''UndGatterTest'' und teste darin das Und-Gatter mit allen möglichen Eingabe.
 +
 +Ein [[https://media.giphy.com/media/3o7rbPDRHIHwbmcOBy/giphy.gif|lustiges kurzes Video]], das den Unterschied zwischen einem Unit-Test und einem Integrationstest visualisiert.
 +===== Komposition und Aggregation =====
 +
 +Einige Gatter können die Funktionalität anderer Gatter wiederverwenden. So kann das Nicht-Und-Gatter z.B. aus einem Nicht- und einem Und-Gatter aufgebaut werden.
 +
 +  - Skizziere ein Klassendiagramm, das die Wiederverwendung nutzt.
 +  - Stelle deine Implementierung auf die Verwendung von Aggregation um und veröffentliche den Quelltext unten.
 +  - Was ist der Unterschied zwischen Aggregation und Komposition? Wie wird dies im Klassendiagramm verdeutlicht?
 +  - Was sind Multiplizitäten?
 +  - Bearbeite das {{:schule:prog:arbeitsblatt_klassenbeziehungen.pdf|Arbeitsblatt Klassenbeziehungen}}
 +
 +===== Halb-Addierer und Addierer =====
 +
 +Oben ist ein [[wpde>Halbaddierer]] dargestellt. Er kann einstellige 1-Bit-Zahlen addieren. In dem Video [[https://www.youtube.com/watch?v=lNuPy-r1GuQ|Domino Addition (Kanal Numberphile)]] wird der Halbaddierer mit Dominosteinen nachgebaut und damit //begreifbar// gemacht. In einem [[https://www.youtube.com/watch?v=OpLU__bhu2w|weiteren Video]] werden sogar noch größere Zahlen mit 10000 Dominosteinen addiert.
 +
 +  - Informiere dich über die Funktionsweise eines Halbaddierers und implementiere ihn als neue Klasse ''Halbaddierer'' mit Hilfe der vorhandenen Klassen.
 +  - Teste ihn in dem Testprojekt.
 +  - Veröffentliche deinen Quelltext.
 +  - Du kannst aus zwei Halbaddierern und einem weiteren Gatter einen [[wpde>Volladdierer]] konstruieren. Damit kann ein Addierwerk für z.B. zwei 2-Bit-Zahlen erstellt werden. Gelingt es dir?
 +
 +
 +===== Unterschiedliche Ausgaben der Gatter mit Hilfe des Strategy-Patterns =====
 +
 +Das Gatter soll bei der Ausgabe des Ergebnisses (z.B. über eine Methode ''public string showResult()'') unterschiedliche Ausgaben unterstützen. Bitausgabe:1,0 und Boolsche Ausgabe:true, false
 +
 +**Vorgehen**
 +
 +  - Informiere dich über das //Strategy Pattern//.
 +  - Entwickle ein Klassendiagramm für das Logikgatterprojekt.
 +  - (Wir vergleichen)
 +  - Setze das Klassendiagramm in Quelltext um.
 +  - In welchen Situationen kommt das Strategy Pattern zum Einsatz?
 +  - Welche anderen Entwurfsmuster (Pattern) findest du noch? vgl. z.B. [[https://dzone.com/refcardz/design-patterns|Refcard Designpatterns]] oder [[http://www.heise.de/developer/artikel/Episode-1-Ueber-den-Einsatz-von-Patterns-353072.html|Episode 1 - Über den Einsatz von Patterns]] vom heise developer podcast.
 +
 +
 +===== GUI für die Logikgatter =====
 +
 +Das Projekt soll um eine GUI ergänzt werden, so dass der Benutzer Gatter mit der Maus auswählen und die Eingänge selbst setzen kann.
 +
 +Entwirf eine einfache GUI und veröffentliche sie. 
 +
 +Eine mögliche GUI und die zugehörige Klasse:
 +
 +{{:schule:prog:klasse_multifenster.png?direct&200|}}
 +
 +===== Hardware-Ansteuerung  =====
 +
 +Die Logikgatter können auch über ein Hardwaremodul über den [[Raspberry Pi]] angesteuert werden. Das zugehörige Python-Modul heißt [[https://github.com/pintman/ea_rpi_modul|eapi]].
 +
 +  - Installiere das Modul ''eapi''.
 +  - Steuere das Modul so an, dass die beiden Taster mit den Eingängen und die LEDs mit den Ausgängen verschiedener Gatter wie folgt verbunden werden: rot=Und-Gatter, gelb=Oder-Gater, grün=XOder-Gatter.
 +  - Verbinde die Module über das Netzwerk (''pydoc3 eapi.net'' gibt hierzu Hilfestellungen), so dass weitere Gatter mit LEDs auf den anderen PIs verbunden werden.
 +
 +===== Webinterface  =====
 +
 +Webseiten können auf zwei Arten ausgeliefert werden: //statisch// und //dynamisch//. Statisch bedeutet dabei, dass lediglich Dateien auf dem Webserver an den Client (z.B. Browser) gesendet werden. Bei dynamischen Seiten werden die Ergebnisse "berechnet" und an den Client gesendet -- die Seite wird dynamisch erzeugt und liegt nicht bereits irgendwo auf dem Server.
 +
 +Die Logikgatter sollen nun dynamisch über ein Webinterface zugänglich gemacht werden. Hierfür bieten sich drei unterschiedliche Ansätze an.
 +
 +  - Einen bestehenden Webserver wie Apache verwenden und das Programm über ein [[wpde>Common Gateway Interface]] (CGI) ansteuern.
 +  - Einen eigenen [[Webserver programmieren]].
 +  - Ein Webframework für Python benutzen wie z.B. Django oder [[http://bottlepy.org/|Bottle]]. Findest du in ''bottle.py'' die Stellen, die Aufgaben realisieren, die wir schon selbst programmiert haben: Socket erstellen, an Adresse binden, auf request reagieren?
 +===== MVC Muster =====
 +
 +Das MVC-Muster ([[wpde>Model View Controller]]) wird für viele Anwendungen verwendet.
 +
 +  - Informiere dich darüber, was die Begriffe und Pfeile jeweils bedeuten und erstelle eine kurze Präsentation, die MVC am Beispiel der Logikgatter vorstellt.
 +  - Finden sich die Bereiche Model, View und Controller in eurer Anwendung wieder? Falls ja, stelle dies dar.
 +
 +//Literatur//: Kapitel zu MVC aus //Patterns kompakt-Entwurfsmuster für effektive Software Entwicklung-MVC//.
 +
 +===== Links =====
 +
 +  * Mit Hilfe von Minecraft lassen sich die Schaltkreise auch mit Redstone nachbilden -- sogenannte [[http://technic-de.gamepedia.com/Redstone-Schaltkreise|Redstone-Schaltkreise]]. Auch dort findet man eine [[http://technic-de.gamepedia.com/Redstone-Schaltkreise/Logikgatter|Liste mit verschiedenen Logikgattern]].