Algorithmisches Problemlösen mit Kara

Slides:



Advertisements
Ähnliche Präsentationen
Die Schulkonsole für Lehrerinnen und Lehrer
Advertisements

Einführung in die Informatik: Programmierung und Software-Entwicklung
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Zusammenfassung der Vorwoche
CPCP Institute of Clinical Pharmacology AGAH Annual Meeting, 29. Februar 2004, Berlin, Praktischer Umgang mit den Genehmigungsanträgen gemäß 12. AMG Novelle.
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
= = = = 47 = 47 = 48 = =
Scratch Der Einstieg in das Programmieren. Scatch: Entwicklungsumgebung Prof. Dr. Haftendorn, Leuphana Universität Lüneburg,
Sortierverfahren Richard Göbel.
Sortierverfahren Richard Göbel.
Algorithmus. Ein Kochrezept, zum Beispiel: Kartoffelbrei.
© 2006 W. Oberschelp, G. Vossen Rechneraufbau & Rechnerstrukturen, Folie 2.1.
Grundkurs Theoretische Informatik, Folie 2.1 © 2006 G. Vossen,K.-U. Witt Grundkurs Theoretische Informatik Kapitel 2 Gottfried Vossen Kurt-Ulrich Witt.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Imperative Programmierung
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
Algorithmisches Problemlösen mit Kara
AC Analyse.
Schieferdeckarten Dach.ppt
Bedingte Wiederholung (Buch S119)
Einführung in die Programmierung Anweisungen und Datentypen
Heute: Scherenzange zeichnen
Teil 4 Kontrollstrukturen.
Rechneraufbau & Rechnerstrukturen, Folie 12.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 12.
1. 2 Schreibprojekt Zeitung 3 Überblick 1. Vorstellung ComputerLernWerkstatt 2. Schreibprojekt: Zeitung 2.1 Konzeption des Kurses 2.2 Projektverlauf.
20:00.
Java programmieren mit JavaKara
„Küsse deine Freunde“ – FlexKom-App teilen
Wieder und wieder und wieder …. Nicht vor Pilz? ja Schritt vorwärts.
Algorithmisches Problemlösen mit Scratch
Kapitel 1 – Erste Schritte
Wenn Programme Entscheidungen fällen müssen, dann …
Virtueller Rundgang Casa Mariposa in Playa del Coco.
Programmieren Kapitel 3 – Variablen.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Guten Nachmittag!.
Wir haben gesehen Das Gerüst ist bei JavaKara fix vorgegeben
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Einführung in die Programmierung
Didaktische Programminterpreter
Konzepte imperativer Programmierung
Der Test fängt mit dem nächsten Bild an!
NEU! 1 2. Wo kommt diese Art von Rezeptor im Körper vor?
Analyse von Ablaufdiagrammen
PROCAM Score Alter (Jahre)
Einführung in JavaKara
Vorlesung Mai 2000 Konstruktion des Voronoi-Diagramms II
Informatik II Grundlagen der Programmierung Programmieren in C Programmstrukturen / Kontrollstrukturen Hochschule Fulda – FB ET Sommersemester 2014.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
PHP: Operatoren und Kontrollstrukturen
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
Gestern: Kara Steuerung: Endliche Automaten.
Technische Frage Technische Frage Bitte löse die folgende Gleichung:
1 IdeenSet Sonnensystem Ideenset Wann können Sonnenfinsternisse stattfinden? Erich Laager / 2014.
Es war einmal ein Haus
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Mehrfachausführungen Schleifen in VB 2010 ee. Programmidee: Der Anwender gibt eine Zahl ein, und das Programm gibt die Mehrfachen dieser Zahl aus (das.
Berechenbarkeit Klaus Becker Berechenbarkeit.
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Monatsbericht Ausgleichsenergiemarkt Gas – Oktober
Algorithmisches Problemlösen mit Kara
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Das Fach Informatik am SMG.  wird als Wahlfach in Klasse 9/10 angeboten,  wird als Grundfach in der MSS angeboten,  wird als Leistungsfach in der MSS.
Class HelloWorldApp { public static void main(String[] args) {... } Grundkurs Inf - wie einsteigen ?
JavaKara programmieren: Verzweigungen
 Präsentation transkript:

Algorithmisches Problemlösen mit Kara Klaus Becker 2008

Kara

Teil 1 Ausführsystem Kara

Kara, ein steuerbarer Marienkäfer Kara ist ein Marienkäfer. Kara lebt in einer Welt mit unbewegliche Baumstümpfen, mit Pilzen (die Kara verschieben kann) und mit Kleeblättern, die Kara hinlegen und aufnehmen kann.

Aufgabe Kara steht hier im Eingang seines Baus - das ist der Bereich, der von den Bäumen begrenzt wird. Kara soll jetzt einmal um den Bau laufen und den Weg mit Kleeblättern auslegen. Benutzen Sie die Schaltflächen im Kara-Fenster, um diese Aufgabe zu erledigen. vorher nachher

Aufgabe Kara steht hier im Eingang seines Baus - das ist der Bereich, der von den Bäumen begrenzt wird. Kara soll jetzt einmal um den Bau laufen und den Weg mit Kleeblättern auslegen. Benutzen Sie die Kara-Operationen, um diese Aufgabe zu erledigen. Programmfenster Karaweltfenster

Elementare Anweisungen Operation Bedeutung move() einen Schritt weiter gehen turnLeft() sich um 90° nach links drehen turnRight() sich um 90° nach rechts drehen putLeaf() ein Kleeblatt auf das aktuelle Feld legen removeLeaf() das Kleeblatt vom aktuellen Feld entfernen kara.move() elementare Anweisung Aufrufe von Operationen sind Beispiele für Anweisungen. Es handelt sich - genauer gesagt - um die elementaren Anweisungen, die das Ausführsystem Kara zur Verfügung stellt.

Übungen siehe www.inf-schule.de

Algorithmisches Problemlösen Teil 2 Algorithmisches Problemlösen

Allgemeines Problem Problem: vom Eingang des Baus in die hintere linke Ecke laufen vorher vorher großer Bau kleiner Bau nachher nachher

Lösung zum allgemeinen Problem Problem: vom Eingang des Baus in die hintere linke Ecke laufen vorher vorher SOLANGE nicht vor_baum: weiter_gehen links_drehen nachher nachher

Problemspezifikation / Algorithmus Problem: vom Eingang des Baus in die hintere linke Ecke laufen SOLANGE nicht vor_baum: weiter_gehen links_drehen Algorithmus Vorher: Kara steht im Eingang seines beliebig großen Baus und schaut in den Bau hinein. Nachher: Kara befindet sich in der linken hinteren Ecke des Baus (mit Blick gegen die Wand). Problemspezifikation Problemspezifikation Eine Problemspezifikation ist eine möglichst präzise Beschreibung eines Problems. Ein Algorithmus ist eine Verarbeitungsvorschrift, die so präzise formuliert ist, dass sie (zumindest im Prinzip) auch von einer Maschine abgearbeitet werden kann.

Algorithmus / Programm Problem: vom Eingang des Baus in die hintere linke Ecke laufen SOLANGE nicht vor_baum: weiter_gehen links_drehen while not kara.treeFront(): kara.move() kara.turnLeft() Vorher: Kara steht im Eingang seines beliebig großen Baus und schaut in den Bau hinein. Nachher: Kara befindet sich in der linken hinteren Ecke des Baus (mit Blick gegen die Wand). Programm Ein Algorithmus ist eine Verarbeitungsvorschrift, die so präzise formuliert ist, dass sie (zumindest im Prinzip) auch von einer Maschine abgearbeitet werden kann. Ein Programm ist ein Algorithmus zur Lösung eines Problems, der in einer vorgegebenen formalen Sprache verfasst ist.

Aufgaben Problem: Kara soll um den Bau laufen. Vorher: Kara steht im Eingang seines beliebig großen Baus und schaut aus dem Bau heraus. Nachher: Kara ist einmal um den Bau gelaufen und steht wieder im Eingang. Aufgabe: Entwickeln Sie einen Algorithmus zur Lösung des Problems.

Bausteine von Algorithmen Teil 3 Bausteine von Algorithmen

Aufgabe Was bewirken die Programme? Beschreiben Sie jeweils die Situation nach der Ausführung. vorher vorher while not kara.treeFront(): kara.move() kara.turnLeft() while not kara.treeFront(): if kara.onLeaf(): kara.removeLeaf() kara.move() kara.turnLeft()

Aufgabe Ändern Sie das Programm jeweils so ab, dass die folgenden Endsituationen erreicht werden. vorher * Kara soll im Eingang des Baus stehen bleiben. * Kara soll zusätzlich den zurückgelegten Weg mit Kleeblättern auslegen. * Kara soll zur hinteren Wand des Baus und wieder zurück in den Eingang seines Baus laufen. * Kara soll zur hinteren Wand des Baus laufen und dabei nur den Weg bis zum Eingang seines Baus mit Kleeblättern auslegen. while not kara.treeFront(): kara.move() kara.turnLeft() Überprüfen Sie auch, ob ihre entwickelten Programme das Gewünschte leisten.

Aufgabe Ändern Sie das Programm so ab, dass die folgende Endsituation erreicht werden. vorher * Kara soll zur hinteren Wand laufen und die Lücken zwischen den Kleeblättern mit weiteren Kleeblättern auffüllen. while not kara.treeFront(): if kara.onLeaf(): kara.removeLeaf() kara.move() kara.turnLeft() Überprüfen Sie auch, ob ihre entwickelten Programme das Gewünschte leisten.

Bedingungen Operation Bedeutung treeFront() Baum vorne? treeLeft() Baum links? treeRight() Baum rechts? onLeaf() auf einem Kleeblatt? kara.treeFront() elementare Bedingung True / False not kara.treeFront() logischer Operator Eine Bedingung wird mit Hilfe von elementaren Bedingungen und logischen Operatoren aufgebaut.

Exkurs: logische Operatoren a not a False True True False a b a and b False False False False True False True False False True True True a b a or b False False False False True True True False True True True True nicht Negation Konjunktion und Disjunktion oder SOLANGE nicht (Baum_links und Baum_rechts): weiter_gehen konmplexe Bedingung Eine Bedingung wird mit Hilfe von elementaren Bedingungen und logischen Operatoren aufgebaut.

Implementierung in PythonKara Solange-Anweisung solange [Bedingung]: [Anweisungssequenz] while [Bedingung]: [Anweisungssequenz] Implementierung in PythonKara solange nicht vor_baum: kleeblatt_hinlegen schritt_weiter Eine Solange-Anweisung dient dazu, wiederholte Abläufe zu beschreiben. Sie ist aus einer Bedingung und einer (eventuell einelementigen) Anweisungssequenz aufgebaut.

kein Schleifendurchlauf Solange-Anweisung kein Schleifendurchlauf Endlosschleife solange nicht vor_baum: kleeblatt_hinlegen schritt_weiter Eine Solange-Anweisung dient dazu, wiederholte Abläufe zu beschreiben. Sie ist aus einer Bedingung und einer (eventuell einelementigen) Anweisungssequenz aufgebaut.

Wenn-Anweisung WENN [Bedingung]: [Anweisungssequenz] SONST: if [Bedingung]: [Anweisungssequenz] else: zweiseitige Variante WENN auf_kleeblatt: kleeblatt_aufheben SONST: kleeblatt_hinlegen Eine Wenn-Anweisung dient dazu, alternative Abläufe bzw. Fallunterscheidungen zu beschreiben.

Wenn-Anweisung WENN [Bedingung]: [Anweisungssequenz] if [Bedingung]: einseitige Variante WENN auf_kleeblatt: kleeblatt_aufheben Eine Wenn-Anweisung dient dazu, alternative Abläufe bzw. Fallunterscheidungen zu beschreiben.

Kontrollstrukturen Flussdiagramme Programmablaufpläne Kontrollstrukturen dienen dazu, den Ablauf der Ausführungsschritte festzulegen. Wesentliche Kontrollstrukturen sind die Sequenzbildung, die Fallunterscheidung und die Wiederholung.

Kontrollstrukturen Struktogramme Sequenzbildung Fallunterscheidung Wiederholung Kontrollstrukturen dienen dazu, den Ablauf der Ausführungsschritte festzulegen. Wesentliche Kontrollstrukturen sind die Sequenzbildung, die Fallunterscheidung und die Wiederholung.

Aufgaben Problem: Kara soll Kleeblätter um den Bau legen. Aufgabe: Ergänze das Struktogramm zu einem Algorithmus zur Lösung des Problems. Bedingungen: * nicht Baum_links * nicht Baum_rechts Elementare Anweisungen: * weiter_gehen * rechts_drehen * Kleeblatt_hinlegen

Aufgaben siehe www.inf-schule.de

Teil 4 Teilalgorithmen

Problemzerlegung Problem: Kara soll mit den an der hinteren Wand abgelegten Blättern umziehen. Teilprobleme: in die rechte hintere Ecke laufen das nächste Kleeblatt suchen das gefundene Kleeblatt aufheben zum Ausgang des Baus laufen zum Eingang des anderen Baus laufen die Stelle suchen, an der das Blatt abgelegt werden kann das transportierte Kleeblatt ablegen, falls nicht schon ein Kleeblatt hier liegt

Teile und herrsche Problem: Kara soll mit den an der hinteren Wand abgelegten Blättern umziehen. laufe_in_die_rechte_hintere_Ecke SOLANGE auf_Kleeblatt: entferne_Kleeblatt laufe_zum_Ausgang laufe_zum_Eingang_des_anderen_Baus suche_einen_leeren_Platz WENN nicht auf_Kleeblatt: lege_Kleeblatt_ab laufe_zum_Ausgang suche_ein_kleeblatt Teile und herrsche ist eine Problemlösestrategie, bei der ein Problem immer weiter in Teilprobleme zerlegt wird, bis sich diese einfach lösen lassen. Aus den Lösungen der Teilprobleme wird dann die Lösung des Gesamtproblems zusammengesetzt.

Unterprogramme # Unterprogramme def bauWechseln(): kara.move() while not (kara.treeLeft() and kara.treeRight()): def inEcke(): ... def blattSuchen(): def zumAusgang(): def platzSuchen(): # Hauptprogramm inEcke() blattSuchen() while kara.onLeaf(): kara.removeLeaf() zumAusgang() bauWechseln() platzSuchen() if not kara.onLeaf(): kara.putLeaf() Prozedurdeklaration Prozeduraufruf Eine Prozedur ist ein Unterprogramm zur Lösung eines Teilproblems. Vorteile: klare Strukturierung; Vermeidung von Codeduplizierung

Unterprogramme mit Rückgaben Problem: Kara soll den Eingang des Baus suchen. laufe_in_die_rechte_hintere_Ecke SOLANGE auf_Kleeblatt: entferne_Kleeblatt laufe_zum_Ausgang laufe_zum_Eingang_des_anderen_Baus suche_einen_leeren_Platz WENN nicht auf_Kleeblatt: lege_Kleeblatt_ab laufe_zum_Ausgang suche_ein_kleeblatt Teile und herrsche ist eine Problemlösestrategie, bei der ein Problem immer weiter in Teilprobleme zerlegt wird, bis sich diese einfach lösen lassen. Aus den Lösungen der Teilprobleme wird dann die Lösung des Gesamtproblems zusammengesetzt.

Unterprogramme mit Rückgaben def bauGefunden(): if kara.treeFront() or kara.treeRight(): return True else: return False def imEingang(): if kara.treeLeft() and kara.treeRight(): def umBaum(): ... def umdrehen(): kara.turnLeft() # Hauptprogramm kara.putLeaf() while not bauGefunden(): kara.move() if kara.onLeaf(): kara.removeLeaf() kara.turnRight() kara.turnLeft() umdrehen() while not kara.onLeaf(): if kara.treeFront(): umBaum() Funktionsaufruf Funktionsdeklaration Prozeduraufruf Prozedurdeklaration Eine Funktion ist ein Unterprogramm, das einen Rückgabewert als Ergebnis liefert.

Verwendung von Unterprogrammen def bauGefunden(): ... def imEingang(): if kara.treeLeft() and kara.treeRight(): return True else: return False def umBaum(): while not imEingang(): if kara.treeRight(): kara.move() kara.turnRight() def umdrehen(): # Hauptprogramm kara.putLeaf() while not bauGefunden(): kara.move() if kara.onLeaf(): kara.removeLeaf() kara.turnRight() kara.turnLeft() umdrehen() while not kara.onLeaf(): if kara.treeFront(): umBaum() erst deklarieren dann aufrufen Eine Prozedur / Funktion muss deklariert sein, bevor sie aufgerufen werden kann.

Verwendung von Unterprogrammen ... ############################### # im Eingang() # es wird getestet, ob Kara sich im Eingang des # Baus befindet. def imEingang(): if kara.treeLeft() and kara.treeRight(): return True else: return False # Hauptprogramm kara.putLeaf() while not bauGefunden(): kara.move() if kara.onLeaf(): kara.removeLeaf() kara.turnRight() kara.turnLeft() umdrehen() while not kara.onLeaf(): if kara.treeFront(): umBaum() Kommentar sprechender Bezeichner Sprechende Bezeichner und Kommentare erleichtern das Verständnis.

Unterprogramme mit Parametern Problem: Kara soll ein rechteckiges Spielfeld mit Kleeblättern abstecken. Parameter aktueller Wert # Unterprogramme def vorwaerts(schritte): while schritte > 0: kara.move() schritte = schritte - 1 # Hauptprogramm vorwaerts(5) kara.turnRight() vorwaerts(3) Parameter sind Platzhalter, mit deren Hilfe man Daten zur Laufzeit an Unterprogramme übergeben kann.

Unterprogramme mit Parameter def vorwaerts(schritte): while schritte > 0: kara.move() schritte = schritte - 1 def rechteck(laenge, breite): vorwaerts(laenge) kara.putLeaf() kara.turnRight() vorwaerts(breite) # Hauptprogramm rechteck(5, 3) Mit Hilfe von Parametern kann man Prozeduren flexibel gestalten.

Algorithmen mit Variablen Teil 5 Algorithmen mit Variablen

Ein Zählproblem Problem: Kara soll die Welt mit Kleeblättern in zwei Bereiche aufteilen. Version 1: Kara läuft geradeaus los. Version 2: Kara läuft erst einmal um den Bau herum und legt dann die Trennlinie aus Kleeblättern bis zum Eingang.

Problemlösung mit einer Zählvariablen Problem: Kara soll die Welt mit Kleeblättern in zwei Bereiche aufteilen. kara.move() kara.turnRight() zaehler = 0 while kara.treeRight(): zaehler = zaehler + 1 while zaehler > 0: zaehler = zaehler - 1 kara.turnLeft() while not kara.treeLeft(): kara.putLeaf()

Variable Variablen dienen in der Informatik dazu, Daten zu verwalten, die in Speicherzellen abgelegt sind. Jede Variable hat einen Namen, mit dem man auf den in der zugehörigen Speicherzelle abgelegten Datenwert (den sog. Variablenwert) zugreifen kann. kara.move() kara.turnRight() zaehler = 0 while kara.treeRight(): zaehler = zaehler + 1 while zaehler > 0: zaehler = zaehler - 1 kara.turnLeft() ...

Wertzuweisung Eine Veränderung eines Variablenwerts bzw. des zugehörigen Speicherzelleninhalts kann mit Hilfe einer Wertzuweisung an die entsprechende Variable erfolgen. kara.move() kara.turnRight() zaehler = 0 while kara.treeRight(): zaehler = zaehler + 1 while zaehler > 0: zaehler = zaehler - 1 kara.turnLeft() ... zaehler = zaehler + 1 Variable Term Auswertung einer Wertzuweisung: Erst wird der Wert des Terms mit Hilfe des aktuellen Variablenzustands ermittelt. Dieser Wert wird dann der Variablen als neuer aktueller Wert zugewiesen.

Noch ein Zählproblem Problem: Kara soll die Schritte bis zum Eingang zählen und sich im Eingang so oft drehen, wie Schritte zum Erreichen des Baus erforderlich waren. gefunden = False abstand = 0 while not gefunden: kara.move() abstand = abstand + 1 gefunden = kara.treeLeft() and kara.treeRight() while abstand > 0: kara.turnLeft()

logische Verknüpfung mit Wahrheitswerten Datentypen Ein Datentyp beschreibt eine Menge von Datenobjekten, die alle die gleiche Struktur haben und mit denen die gleichen Operationen ausgeführt werden können. Zahl Wahrheitswert gefunden = False abstand = 0 while not gefunden: kara.move() abstand = abstand + 1 gefunden = kara.treeLeft() and kara.treeRight() while abstand > 0: kara.turnLeft() Zählvariable boolesche V. Rechnen mit Zahlen abstand = abstand + 1 logische Verknüpfung mit Wahrheitswerten gefunden = kara.treeLeft() and kara.treeRight()

Aufgaben siehe www.inf-schule.de

Miniprojekt - Kara lernt rechnen Teil 6 Miniprojekt - Kara lernt rechnen

Ein Zählproblem Problem: Kara soll Rechenaufgaben mit Kleeblättern ausführen. Einfach: Addition Nicht schwer: Subtraktion, Vergleich Eher schwer: Multiplikation, Division Herausforderung: Potenzierung, Wurzelziehen, ...

Auftrag Kara soll rechnen lernen. Entwickeln Sie Algorithmen und entsprechende Programme für verschiedene Rechenoperationen. * Benutzen Sie keine Variablen. Kara soll nur mit Kleeblättern operieren. * Wählen Sie mindestens zwei Rechenoperationen aus, für die Sie die Algorithmen und Programme entwickeln. Besonders einfach ist die Addition. Nicht sonderlich schwierig ist die Subtraktion. Hier müssen Sie sich nur überlegen, was man bei Aufgaben wie 3-5 macht. Schwieriger sind die Multiplikation und Division. Wer sich weit vorwagen möchte, kann auch das Potenzieren oder Wurzelziehen bearbeiten. * Alle wesentlichen Arbeitsergebnisse sollen dokumentiert werden. Was alles hier dazu gehört, wird auf der folgenden Folie gezeigt.

Arbeitsschritte und ihre Dokumentation Problem Auftrag Informelle Problembeschreibung: Kara soll Rechenaufgaben mit Kleeblättern ausführen. Ermittlung der Anforderungen Pflichtenheft (Prototyp) Präzise Problemspezifikation Beschreibung der Anforderungen an das Programm Entwicklung eines Modells Algorithmus Algorithmus in Struktogrammform / ... Implementierung des Modells Lauffähiges Programm Strukturiertes und kommentiertes Programm Testen des Programms Auftraggerechtes Produkt Testprotokoll über die untersuchten Testfälle