Modulnummer

403

Letzte Aktualisierung
12. Jan. 2020
Vorgaben
ICT-Modulidentifikation
ICT-LBV Modul 403-9
Modulbezeichnung

Programmabläufe prozedural implementieren (Version WPS)

Fachliteratur
Powershell
Sprache C
Voraussetzungen
Deutsche Sprache
Mathematisches Grundverständnis

Buchempfehlung: Windows Powershell 5 kurz & gut 4. Auflage (O'Reilly, ISBN 978-3-96009-027-4)

Inhalt

1. Einleitung
1.1 Spielerischer Einstieg mit dem Scratch-Hamster-Modell
1.2 Der SW-Entwicklungsprozess
1.3 Programmiersprachen

2. Nassi-Shneiderman-Struktogramme mit der Structorizer-SW erstellen und analysieren (Design)
2.1 Struktogramme analysieren
2.2 Struktogramm erstellen: "Verknüpfte Bedingung"
2.3 Struktogramm erstellen: "Wer ist älter?"
2.4 Struktogramm erstellen: "Schaltjahr bestimmen"
2.5 Struktogramm erstellen: "Zufallszahl erraten"
2.6 Weitere Struktogrammaufgaben

3. Datentypen anwenden und dokumentieren
3.1 Aufgaben zu Datentypen

4. LB1(Nur für Lernende von Jürg Arnold!)

5. Ablaufstruktur umsetzen und Powershell-Code erstellen (Implementation)
5.1 Bisherige Struktogramme in Powershell implementieren
5.2 Powershell-Implementation "Robuste Benutzereingabe"
5.3 Powershell-Implementation "Fibonacci-Folge"
5.4 Powershell-Implementation "Tannenbaum zeichnen"
5.5 Powershell-Implementation "Taschenrechner"
5.6 Powershell-Implementation "SinusBerechnen"
5.7 Powershell-Implementation "Zahlen sortieren"
5.8 Powershell-Implementation "KleinstesGemeinsamesVielfach"

6. LB2(Nur für Lernende von Jürg Arnold!)

7. Debuggen & Testen
7.1 Erste Erfahrung mit dem Debugger
7.2 Debugger beim Powershell-Skript "Potentieren" einsetzen
7.3 Debugger beim Powershell-Skript "Pi-Berechnung" einsetzen
7.4 Weitere Programme debuggen
7.5 Testen von SW - Testprotokoll erstellen

8. LB3-1(Nur für Lernende von Jürg Arnold!)

9. LB3-2(Nur für Lernende von Jürg Arnold!)

10. Musterlösungen (Passwortgeschützt)


1. Einleitung

1.1 Spielerischer Einstieg mit dem Scratch-Hamster-Modell

java-hamster-modell.de

1.2 Der SW-Entwicklungsprozess

IPERKA:

  • I=Informieren → ANALYSE
  • P=Planen → DESIGN
  • E=Entscheiden
  • R=Realisieren → IMPLEMENTATION
  • K=Kontrollieren → TEST
  • A=Auswerten (Debriefing)

1.3 Programmiersprachen

  • Compiler-Sprachen: Quellcode (Sourcecode) wird kompiliert (Übersetzt in maschinenlesbaren Code).
    Beispiel Programmiersprache: C/C++, VB, Sonderfall Java mit Laufzeitumgebung
  • Interpreter-Sprachen: Quellcode wird von einem Interpreter (z.B. Webbrowser fü Javascript, Webserver für php) direkt ausgeführt.
    Beispiel Programmiersprache: Powershell, Javascript, php, VBA

2. Nassi-Shneiderman-Struktogramme mit der Structorizer-SW erstellen und analysieren (Design)

Die dafür benötigte Applikation findet man hier: https://structorizer.fisch.lu/

2.1 Struktogramme analysieren

2.2 Struktogramm erstellen: "Verknüpfte Bedingung"

Eine Funktion soll nur dann ausgeführt werden, falls Motor 1 nicht eingeschaltet ist, oder Motor 2 nicht eingeschaltet ist, oder beide ausgeschaltet sind. Schreiben sie das erforderliche Programm.

2.3 Struktogramm erstellen: "Wer ist älter?"

Die Geburtsdaten (Dreiteilig als Geburtsjahr, Geburtsmonat und Geburtstag) zweier Personen sind gegeben. Stellen sie fest, welche von den beiden Personen die ältere ist.

2.4 Struktogramm erstellen: "Schaltjahr bestimmen"

Das Programm bzw. der Algorithmus soll bestimmen, ob es sich bei der vom Benutzer eingegebenen Jahreszahl um ein Schaltjahr handelt oder nicht. Für die Bestimmung eines Schaltjahrs gilt die folgende Regel:
Jedes vierte Jahr ist ein Schaltjahr. Alle hundert Jahre wird diese Regel gebrochen, um kleine Fehler zu korrigieren. Dabei entsteht wiederum ein winziger Fehler, der alle vierhundert Jahre korrigiert wird, indem dann ein vermeintlich ausgefallenes Schaltjahr doch wieder eines ist. Im Februar 2000 tritt genau dieser Fall ein.
Tipp: Verwenden Sie den Modulo-Operator %. Der Modulo-Operator gibt jeweils den Rest einer Division an. Bsp. 10 % 4 gibt den Wert 2

2.5 Struktogramm erstellen: "Zufallszahl erraten"

Der Benutzer soll eine vom Computer generierte Zufallszahl (Random Number) zwischen 100 und 999 erraten. Der Computer gibt ihm dazu folgende Hinweise:

  • Kalt: Wenn der Benutzer um mehr als 100 daneben liegt.
  • Warm: Wenn der Benutzer zwischen 100 und 51 daneben liegt.
  • Heiss: Wenn der Benutzer bis zu 50 daneben liegt.
  • Bingo: Bei einem Treffer
Zusatzaufgabe: Das Spiel soll, wenn vom Benutzer gewünscht, wiederholt werden. Ausserdem soll das Ratespiel zu jedem Zeitpunkt vom Benutzer abgebrochen werden können.

2.6 Weitere Struktogrammaufgaben

  • Erstellen Sie für die beiden Aufgaben je ein Struktogramm mit der SW Structorizer.
  • Aufgabe 1: Es soll ein dreidimensionales Feld entsprechend eingefärbt werden.
  • Aufgabe 2: Der Computer würfelt eine Zahl zwischen 1 und 100, die der User anschliessend erraten soll. Jeder Tipp wird mit der Meldung "Zahl ist grösser" ode "Zahl ist kleiner" quittiert. Nach 10 erfolglosen Rateversuche kann der User entscheiden, ob er ein neues Spiel wünscht.

3. Datentypen anwenden und dokumentieren

Ein Programm kommt kaum ohne Variablen aus. In einer Variable können verschiedene Dinge gespeichert werden: Zahlen, Zeichen, Texte usw. Allerdings muss man sich vorerst festlegen, welche Art von Daten man in einer bestimmten Variable speichern möchte. Das heisst, man muss den Datentyp der Variable festlegen. Für das erste beschränken wir uns auf die folgenden Datentypen:

  • Ganzzahl (Integer)
  • Fliesskommazahl (Floating Point Number)
  • Einzelnes Textzeichen A..Z, a..z, 0..9, +, -, !, ?, usw. (Charakter)
  • Text (String)
  • Logische Variable (Boolean)

3.1 Aufgaben zu Datentypen

  • Mit dem Programm sollen drei verschiedene Konsumartikel erfasst werden: 8-stellige Artikelnummer, Bezeichnung max. 50 Zeichen, Lagerhaltig [Y/N], Preis in CHF, Ablaufdatum dd-mm-yyyy.
  • Nachdem die Artikel erfasst worden sind, sollen sie der Reihe nach am Bildschirm ausgegeben werden.
  • ADVANCED für Schulklassen, die bereits Programmiererfahrung mitbringen: Fassen Sie die Artikeldaten in einem Datensatz / Record / struct zusammen. Die Datensätze müssen nicht dynamisch verwaltet werden. Gehen Sie von max. 10 zu erfassenden Artikel aus.
  • Anwenden der Programmiersprache: Verwenden Sie Variablen mit geeigneten Datentypen. Deklarieren und initialisieren Sie alle Variablen. Erstellen Sie eine fehlerresistente Benutzereingabe. (Keine Laufzeitfehler!)
  • Zusatzaufgabe: Sie möchten das Programm nun so erweitern, dass 100 verschiedene Artikel erfasst werden können. Was wäre der geeignete Datentyp? Implementieren sie! Tipp: Array

4. LB1

Mit diesem Test werden die bisher erworbenen Kenntnisse überprüft.

(Diese Prüfung steht leider nur Lernenden von Jürg Arnold an der TBZ-IT zur Verfügung!)

5. Ablaufstruktur umsetzen und Powershell-Code erstellen (Implementation)

In meinem Programmierkurs gelten die folgenden verbindlichen Abmachungen:

  • Jedes Programm enthält einen Programmheader mit Titel, Version, Autor, Datum und Kurzbeschrieb.
  • Jede Codestelle mit für Drittpersonen nicht sofort und eindeutig erkennbarem Zweck, muss mit einem kurzer und prägnanten Inlinekommentar versehen werden.
  • Alle Variablen müssen am Anfang des Skripts deklariert und auch initialisiert werden.
  • Umlaute wie ä, ö, ü, aber auch frendsprachige Zeichen wie é, è, à etc. sind im ganzen Programmskript nicht zugelassen, weder in Variablennamen noch in Kommentaren. Benutzen sie stattdessen ae, oe und ue!
  • Der Programmiermodus muss wie folgt eingeschränkt sein:
    set-psdebug -strict
    set-strictmode -version latest
Sie finden im Powershell-Theoriebeitrag ein entsprechendes Skript-Template zum herunterladen!

5.1 Bisherige Struktogramme in Powershell implementieren

In den vorangegangenen Aufgaben habe sie die folgenden Struktogramme erstellt, die sie nun in Powershell implementieren sollen:

  1. Aufgabe "Wer ist älter?"
  2. Aufgabe "Schaltjahr bestimmen"
  3. Aufgabe "Zufallszahl erraten"

5.2 Powershell-Implementation "Robuste Benutzereingabe"

Der Benutzer soll eine Zahl von 0 bis 10 eingeben. Anschliessend prüfen sie die Eingabe:

  • Wurde anstelle einer Zahl ein Text wie z.B. "zwei" eingegeben? Wenn zutreffend, Ausgabe der Fehlermeldung "Bitte keine Texteingabe!"
  • Wurde nur die ENTER-Taste gedrückt? Dann soll die Fehlermeldung "Keine Eingabe gemacht!" angezeigt werden.
  • Wurde eine Zahl von 0 bis 10 eingegeben? Wenn nicht: Fehlermeldung "Ihre Zahl ist zu hoch!" oder "Ihre Zahl ist zu tief!"
  • War die Eingabe korrekt, geben sie die eingegebene Zahl wie folgt aus: "Sie haben die Zahl <ihrZahl> eingegeben!"
  • Tipp: Mit try-catch können Fehler zur Laufzeit abgefangen werden.

5.3 Powershell-Implementation "Fibonacci-Folge"

Die Fibonacci-Folge ist die unendliche Folge von natürlichen Zahlen, die ursprünglich mit zweimal der Zahl 1 beginnt oder in der modernen Schreibweise zusätzlich mit einer führenden Zahl 0 versehen ist. Im Anschluss ergibt jeweils die Summe zweier aufeinanderfolgender Zahlen die unmittelbar danach folgende Zahl: Realisieren sie nun das entsprechende Programm wie folgt:

  • Der Benutzer gibt an, wie viele Fibonacci-Zahlen berechnet bzw. angezeigt werden sollen.
  • Die Berechnung der Zahlen soll mit einer Iteration gelöst werden.
  • Tipp: Zur Berechnung ein Array verwenden. Dabei aber eine allfällige Array-Bereichsüberschreitung beachten.

5.4 Powershell-Implementation "Tannenbaum zeichnen"

Fragen sie den Benutzer, wie hoch der Tannenbaun werden soll. (Anzahl Zeilen ab 1 bis 10) Erstellen bzw. "zeichnen" sie anschliessend diesen Tannenbaum. Benutzen sie im Programmcode dafür ausschliesslich die Iteration "for()". Wie die for-Schleife angewendet wird, erklärt ihnen der Fachbeitrag zu Powershell.

5.5 Powershell-Implementation "Taschenrechner"

  • Erstellen Sie einen einfachen Rechner mit den folgenden mathematischen Grundoperationen: + , - , * , / , % (% ist die Module oder Restwertfunktion)
  • Die Benutzereingabe soll nach UPN (Umgekehrte polnische Notation, wie sie bei HP-Taschenrechner Verwendung findet/fand) erfolgen: 1. Zahl , 2. Zahl, Operand
  • Nachdem das Resultat am Bildschirm erschienen ist, hat der User die Wahl, mit dem Buchstaben "X" (für Exit) das Programm zu verlassen oder mit einer weiteren Zahl und Operand die Rechnung fortzusetzen.
  • Die Berechnungen sollen mit doppelter Genauigkeit durchgeführt werden.
  • Die Resultatsausgabe soll mathematisch gerundet auf vier Nachkommastellen angezeigt werden.
  • Lauzeitfehler wie z.B die Division durch Null sollen abgefangen und entsprechend signalisiert werden.

5.6 Powershell-Implementation "SinusBerechnen"

  • Erstellen Sie das Programm "SinusBerechnen" anhand des Struktogramms im obigen Bild.
  • Der Sinuswert eines bestimmten Winkels lässt sich mit einer Reihenentwicklung näherungsweise berechnen. Umso mehr Durchgänge ausgeführt werden, desto präziser wird das Resultat. (Siehe Formel)
  • Die Reihenentwicklung verlangt eine Winkeleingabe im Bogenmass (360º entsprechen 2π)
  • Die Winkeleingabe soll für den User im Gradmass (0º bis 360º) erfolgen.
  • Nach der Resultatsausgabe soll eine Abfrage mit Weiter [Y/N] eine weitere Berechnung ermöglichen.

5.7 Powershell-Implementation "Zahlen sortieren"

  • Erstellen Sie das Programm "Zahlen sortieren" anhand des Struktogramms im obigen Bild.
  • Geben Sie die Zahlenreihe in aufsteigender und absteigender Reihenfolge an.
  • Nach erfolgter Sortierung soll der User mit Weiter [Y/N] gefragt werden, ob er den Vorgang mit anderen Zahlen wiederholen will.

5.8 Powershell-Implementation "KleinstesGemeinsamesVielfach"

  • Erstellen Sie das Programm "KleinstesGemeinsamesVielfach" anhand des Struktogramms im obigen Bild.
  • Mit Modulo ist die Restwertfunktion gemeint.
  • Nach erfolgter Resultatsausgabe soll der User mit Weiter [Y/N] gefragt werden, ob er eine weitere Berechnung wünscht.

6. LB2

Mit diesem Test werden die bisher erworbenen Kenntnisse überprüft.

(Diese Prüfung steht leider nur Lernenden von Jürg Arnold an der TBZ-IT zur Verfügung!)

7. Debuggen & Testen

7.1 Erste Erfahrung mit dem Debugger

Bei der Ausführung des folgenden Programms erwarten sie 2 Mal eine Reihe mit "*****". Leider tut es dies nicht. Suchen sie mit dem Debugger den Fehler: (Tipp: Haltepunkt richtig setzen und Variableninhalt überprüfen.)

# ******** TITEL: Debugger-Uebung 1 ********
# Version: V1.0
# Autor: ARJ
# Datum: 29.1.2020
# Beschreibung: Den Debugger einsetzen
# Programmiermodus einschraenken
set-psdebug -strict
set-strictmode -version latest
# Variablen-Deklaration & Initialisierung
[int]$i = 0
cls # Bildschirm loeschen
while($i -le 10)
{
  if( ($i % 5) -eq 0) # Nach fuenf "*" ... 
  {
    write-host "" # ... auf eine neue Zeile 
  }
  write-host -NoNewline "*" # write-host ohne Zeilenvorschub
  $i++
}
write-host ""
#Programmende

7.2 Debugger beim Powershell-Skript "Potentieren" einsetzen

Das folgende Programm ist eine Powershell-Implementierung (Algorithmus) für die Berechnung die Potenz-Berechnung und weist zwei Fehler auf. Spüren sie diese mit dem Debugger auf und beheben sie die Fehler!
Berechnugsbeispiele:

  • 32 = 3*3 = 9
  • x0 = 1 (x=beliebige Zahl)
  • 2-3 = 1 / (2*2*2) = 1/8 = 0.125
Kopieren sie den folgenden Script in ihren Powershell-Scripteditor und suchen sie mit dem Debugger die zwei Fehler! Der Debugger ermöglicht ihnen:
  • Das Programm in Einzelschritten zu durchlaufen.
  • Das Programm bis zu einem Breakpoint vorwärts laufen zu lassen.
    Tipp: Breakpoint an sinnvoller Stelle innerhalb der Iterationen setzen um Schleifendurchgänge zu prüfen.
  • Sich Variableninhalte anzeigen zu lassen.
Korrigieren sie anschliessend die Fehler und prüfen sie das Programm erneut.

# ******** TITEL: Potenzieren (Script ist absichtlich Fehlerhaft!) ********
# Version: 1.0
# Autor: ARJ
# Datum: 15. Januar 2020
# Beschreibung: Potenzieren mit Iteration
# Fehlerhaftes Programm fuer Debugg-Uebung
# Programmiermodus einschraenken
set-psdebug -strict
set-strictmode -version latest
# Variablen-Deklaration inklusive Initialisierung auf Null
[int64]$dieBasis = 0    # Basis der Potenz
[int64]$derExponent = 0 # Exponent der Potenz
[int64]$dasResultat = 0 # Resultat der Berechnung
[int64]$i = 0 # Laufvariable
cls #Bildschirm loeschen
# *** EINGABE ***
$dieBasis = Read-host "Basis"
$derExponent = Read-host "Exponent"

$dasResultat = 1
$i = 0
if( $derExponent -lt 0) # Exponent negativ
{
  while($i -ge $derExponent)
  {
    $dasResultat = $dasResultat * $dieBasis
    $i = $i - 1
  }
  # *** AUSGABE ***
  write-host "$dieBasis hoch $derExponent ergibt" (1/$dasResultat)
}
else # Exponent positiv
{
  while($i -lt $derExponent)
  {
    $dasResultat = $dasResultat
    $i = $i + 1
  }
  # *** AUSGABE ***
  write-host "$dieBasis hoch $derExponent ergibt" ($dasResultat)
}
# ******** Hier endet das Programm ********

7.3 Debugger beim Powershell-Skript "Pi-Berechnung" einsetzen

Das folgende Programm ist eine Powershell-Implementierung (Algorithmus) für die Berechnung der Kreiskonstanten Pi und weist zwei Fehler auf. Spüren sie diese mit dem Debugger auf und beheben sie die Fehler!
(Diese Formel stammt vom indischen Mathematiker und Astronomen Kelallur Nilakantha Somayaji 1444-1544) Kopieren sie den folgenden Script in ihren Powershell-Scripteditor und suchen sie mit dem Debugger die zwei Fehler. Korrigieren sie anschliessend die Fehler und prüfen sie das Programm erneut.

# ******** TITEL: Pi berechnen nach Somayaji (Script ist absichtlich fehlerhaft!) ********
# Version: 1.0
# Autor: ARJ
# Datum: 15. Januar 2020
# Beschreibung: Pi berechnen nach Somayaji
# Fehlerhaftes Programm fuer Debugg-Uebung
# Programmiermodus einschraenken
set-psdebug -strict
set-strictmode -version latest
# Variablen-Deklaration inklusive Initialisierung
[int]$anzTerme = 0 # Anzahl Terme oder Iterationen
[int]$aktTerm = 1 # Aktueller Term oder Durchgang
[bool]$numOK = $false # Eingabe ist Zahl
[double]$thePI = 3.0 # Wert von PI, Initialisiert mit Startwert (Bem.: Pi = 3.141562...)
[double]$theDivisor = 0.0 # Temporaerer Divisor
[int]$i # Hilfsvariable, Laufvariable
# *** EINGABE ***
do
{
  try
  { 
    cls #Bildschirm loeschen
    $numOk = $true
    $anzTerme = Read-host "Anzahl Iterationen 1..100"
  } # end try-Part
  catch
  {
    $numOK = $false
  } # end catch-Part
} until (($anzTerme -ge 1 -and $anzTerme -le 100) -and $numOK)

# *** VERARBEITUNG ***
while($aktTerm -le $anzTerme)
{
  # Divisor berechnen z.B. "3 hoch 3 minus 3"
  $i = 0          # $i zuruecksetzten
  $theDivisor = 0 # $theDivisor zuruecksetzten
  while($i -le 3)
  {
    $theDivisor = $theDivisor * (2 * $aktTerm + 1)
    $i++
  }
  $theDivisor = $theDivisor - (2 * $aktTerm + 1)
  # Ganzer Term berechnen und mit vorangegangenem Resultat verrechnen
  if($aktTerm % 2)  # Aktueller Term ungerade
  {
    $thePI = $thePI + (4 / $theDivisor)
  }
  else  # Aktueller Term gerade
  {
    $thePI = $thePI - (4 / $theDivisor)
  }
  $aktTerm++
}
# *** AUSGABE ***
write-host "Nach $AnzTerme Durchgaengen ergibt die Berechnung fuer Pi $thePi"
write-host "Die Pi-Konstante in Powershell lautet" ([math]::Pi)
write-host "Das ergibt eine Abweichung von " ($thePi - [math]::Pi)
 
# ******** Hier endet das Programm ********

7.4 Weitere Programme debuggen

  • Wählen sie einen ihrer bisher erstellten Powershell-Scripte aus. Dieser sollte verschachtelte Iteartionen beinhalten.
  • Starten sie den Debugger
  • Setzen sie geeignete Breakpoints innerhalb einer Iteration
  • Lesen sie die Variablenwerte beim Breakpoint aus
  • Lassen sie das Programm in Einzelschritten ablaufen (Step-by-Step)

7.5 Testen von SW - Testprotokoll erstellen

Als Basis soll Ihnen ein früher erstelltes Programm dienen. Das Programm sollte mindestens eine Iteration aufweisen, in der mehrere Variablen berechnet werden.

  • Erstellen Sie eine Testvorschrift mit einer geeigneten Anzahl reproduzierbarer Testfälle
  • Lassen Sie Ihr Produkt durch einen unabhängigen Tester gemäss Ihrer Testvorschrift durchprüfen. Der Tester erstellt ein Testprotokoll inklusive Testergebnisbericht (Lieferung akzeptiert/nicht akzeptiert, was muss zwingend nachgebessert und was kann auf einen nächsten Release aufgeschoben werden?) 

8. LB3-1

(Diese Prüfung steht leider nur Lernenden von Jürg Arnold an der TBZ-IT zur Verfügung!)

9. LB3-2

(Diese Prüfung steht leider nur Lernenden von Jürg Arnold an der TBZ-IT zur Verfügung!)