Studierende für das Lehramt Informatik müssen laut Lehramtsprüfungsordnung ein Programmierprojekt vorweisen. Mit diesem zeigen sie, dass Sie selbstständig Prinzipien der Softwareentwicklung anwenden können – Entwicklungsmodelle, Testverfahren, Entwurfsmuster. Inhaltlich kann das alles mögliche sein, solange die Studierenden einen Betreuer für das Projekt finden. Ein potentieller solcher Betreuer bin ich. Ab und zu werde ich auch nach möglichen Themen für solche Programmierprojekte gefragt.
Programmieraufträge, die mich interessieren, betreffen hauptsächlich Software, die man irgendwie für die Schule nutzen könnte. Und oft, wenn mir da etwas Schönes einfällt, das es noch nicht gibt und das ein Student in einem Semester programmieren könnte und das für den Unterricht nützlich wäre – oft genug, wenn ich dann mal recherchiere, dann gibt es so eine Software schon. Zefix!
(Falls einer von euch einen Wunsch hat für eine Software, bitte mir sagen. Ich hab da eine Liste, auf die ich Ideen setze, die ich Studierenden anbiete.)
So ging es mir auch mit dieser Software:
1. Orinoco von Christoph Gräßl
Das ist das beste Programm zur Datenflussmodellierung, das ich für die Schule kenne. In Bayern braucht man das in der 9. Klasse.
Das Programm läuft – wichtig für die Schule – ohne Installation (wenn auch nur unter Windows). Mit Drag & Drop kann man Funktions-Ellipsen anlegen, Kästen für Ein- und Ausgabewert, und gerichtete Verbindungen dazwischen. Man kann außerdem probeweise Werte eingeben und sich alle Zwischenergebnisse anzeigen lassen, sogar animiert, so dass die Daten wirklich der Reihe nach von oben nach unten fließen. (Das sieht man hier natürlich nicht.)

Wenn man die Funktion für die Berechnung des Blutalkoholgehalts gespeichert hat, kann man sie wie die anderen, vorgebenenen Standardfunktionen benutzen:

Und als Term gibt er die Funktion auch aus:
Blutalkoholgehalt = PRODUKT(PRODUKT(Menge ; Alkoholgehalt) ; 0.8) / PRODUKT(WENN(Geschlecht = w ; 0.6 ; 0.7) ; Körpermasse)
Da fehlen mir eigentlich nur ein paar Kleinigkeiten. Datentypen. Die Möglichkeit, im umgekehrten Weg aus einer Termnotation die Grafik erstellen zu lassen. Aber im Prinzip wär’s das gewesen mit meiner Idee für mein Programmierprojekt.
2. AuDeSe – auch von Christoph Gräßl
(Vom gleichen Autor, auf der gleichen Seite.)
Programme zum Erstellen von endlichen Automaten kenne ich einige. Dieses hier ist einfach zu bedienen, die Grafik nicht ganz so schön wie bei Orinoco, aber okay. Hier ein kleiner Automat, der eine Wache in einem Comotuerspiel steuert. Normalerweise patroulliert die Wache um ihre Wachposition herum. Hört sie ein Geräusch, bleibt sie stehen, sieht sie einen Gegner, verfolgt sie ihn. Wenn Zeit vergeht, nähert sich die Wache wieder nach und der Normalität – solange der einmal gesehene Gegner in Reichweite ist, verfolgt sie ihn aber.

Das mit den Bedingungen ist noch nicht optimal gelöst, aber für die meisten Schulfälle reicht es.
Das besondere an diesem Programm: Es generiert sehr einfach den Java-Code zu dem entworfenen Automaten, und wenn man will, gleich das ganze BlueJ-Projekt dazu.
public class AUTOMAT
{
// Attribute
private String Zustand;
// Bedingungen
private boolean nicht_in_Reichweite;
private boolean in_Reichweite;
// Methoden
// Konstruktor
public AUTOMAT()
{
// Startzustand setzen
Zustand = "auf Patrouille";
System.out.println("Startzustand: auf Patrouille"); }
// Ausgelöste Aktion "stehen bleiben"
private void stehen_bleiben( )
{
// Hier den Code für die ausgelöste Aktion eingeben!
System.out.println("Ausgelöste Aktion stehen_bleiben() wurde aufgerufen!");
}
// Ausgelöste Aktion "Patrouille aufnehmen"
private void Patrouille_aufnehmen( )
{
// Hier den Code für die ausgelöste Aktion eingeben!
System.out.println("Ausgelöste Aktion Patrouille_aufnehmen() wurde aufgerufen!");
}
// Ausgelöste Aktion "verfolge Gegner"
private void verfolge_Gegner( )
{
// Hier den Code für die ausgelöste Aktion eingeben!
System.out.println("Ausgelöste Aktion verfolge_Gegner() wurde aufgerufen!");
}
// Ausgelöste Aktion "gehen nach Wachposition"
private void gehen_nach_Wachposition( )
{
// Hier den Code für die ausgelöste Aktion eingeben!
System.out.println("Ausgelöste Aktion gehen_nach_Wachposition() wurde aufgerufen!");
}
// Auslösende Aktion "hört Geräusch"
public void hört_Geräusch()
{
if ( Zustand.equals("auf Patrouille"))
{
stehen_bleiben();
Zustand = "misstrauisch";
System.out.println("Neuer Zustand: misstrauisch");
return;
}
}
// Auslösende Aktion "Zeit vergeht"
public void Zeit_vergeht()
{
if ( Zustand.equals("misstrauisch"))
{
Patrouille_aufnehmen();
Zustand = "auf Patrouille";
System.out.println("Neuer Zustand: auf Patrouille");
return;
}
if ( Zustand.equals("verfolgend") && nicht_in_Reichweite==true)
{
gehen_nach_Wachposition();
Zustand = "misstrauisch";
System.out.println("Neuer Zustand: misstrauisch");
return;
}
if ( Zustand.equals("verfolgend") && in_Reichweite==true)
{
verfolge_Gegner();
Zustand = "verfolgend";
System.out.println("Neuer Zustand: verfolgend");
return;
}
}
// Auslösende Aktion "sieht Gegner"
public void sieht_Gegner()
{
if ( Zustand.equals("misstrauisch"))
{
verfolge_Gegner();
Zustand = "verfolgend";
System.out.println("Neuer Zustand: verfolgend");
return;
}
if ( Zustand.equals("auf Patrouille"))
{
verfolge_Gegner();
Zustand = "verfolgend";
System.out.println("Neuer Zustand: verfolgend");
return;
}
}
}
Schreibe einen Kommentar