Programmierung

Modul 403 «Programmabläufe prozedural implementieren (Version Powershell)»

12. Juni 2021 , Modulidentifikation , LBV Modul-403-9
Buchempfehlung: Windows Powershell 5 kurz & gut 4. Auflage (O'Reilly, ISBN 978-3-96009-027-4)

Inhaltsverzeichnis

1. Einleitung

1.1 Spielerischer Einstieg mit dem Scratch-Hamster-Modell

Im folgenden werden wir 4 Lektionen investieren, um mit dem Hamster-Scratch spielerisch in das Fach Programmieren einzusteigen.
Laden sie dazu die folgende SW auf ihren Notebook: java-hamster-modell.de (Damit das Hamster-Programm laufen kann, muss die aktuelle Version von Java SE JDK installiert sein.)

Hamster-Scratch kurz erklärt

Auf der Hamster-Webseite finden sie ein ausführliches Handbuch. Das Wichtigste sei hier vorgestellt.
Starten sie das Hamster-Programm und erstellen sie mit Datei → Neu ein neues Dokument. Wählen sie unter "Typ des Programms" Scratch-Programm.
Mit diesem Programm lassen sich Programmierbausteine zu einem ausführbaren Programm zusammensetzen. Ziel ist es, den Hamster sicher durch ein Labyrinth zu führen und ihn Körner aufnehmen und ablegen zu lassen.

Folgende Bausteine stehen zur Verfügung:

Anweisungen → SEQUENZEN
  • Neue Prozedur: Damit lässt sich ein Ablauf so zusammenfassen, dass er als Prozedur an anderer Stelle und beliebig oft wiederverwendet werden kann.
  • liefere: Damit kreiert man in einer Funktion (Siehe Boolsche Ausdrücke "Neue Funktion") einen Rückgabewert "True" oder "False" in das aufrufende Programm. Die Funktion wird nach "liefere" verlassen. D.h.: Man kehrt in das aufrufende Programm zurück.
  • vor: Der Hamster macht einen Schritt vorwärts.
  • linksUm: Der Hamster dreht sich im Gegenuhrzeigersinn um 90°.
  • nimm: Der Hamster liest ein Korn auf.
  • gib: Der Hamster gibt ein Korn ab.
  • Alles weitere siehe Hamster-Manual.
Boolsche Ausdrücke → VARIABLEN bzw. KONSTANTEN, VERKNÜPFUNGSOPERATOREN
  • Neue Funktion: Ähnlich wie "Neue Prozedur" mit dem Unterschied, dass die Funktion ähnlich wie ein Sensor verwendet werden kann. (Siehe auch unter Anweisungen "liefere")(Function-Return-Value)
  • wahr: Der Sensor ist aktiv. (True)
  • falsch: Der Sensor ist nicht aktiv. (False)
  • nicht: Die Sensor-Aussage wird umgekehrt. (Not, Negation)
  • und: Zwei Sensor-Aussagen werden Und-Verknüpft. (And)
    D.h.: Nur wenn beide Sensoren aktiv sind passiert etwas.
  • oder: Zwei Sensor-Aussagen werden Oder-Verknüpft. (Or)
    D.h.: Nur wenn beide Sensoren nicht aktiv sind passiert nichts. In allen anderen Fällen passiert etwas.
  • vornFrei: Der vornFrei-Sensor ist aktiv.
    D.h.: Vor dem Hamster hat es kein Hindernis
  • kornDa: Der KornDa-Sensor ist aktiv.
    D.h.: Dort wo der Hamster gerade steht, hat es ein Korn, das er aufnehmen kann.
  • maulLeer: Der maulLeer-Sensor ist aktiv.
    D.h.: das Hamster-Maul ist leer bzw. der Hamster hat keine Körner in seinem Maul.
Steuerung → KONTROLLSTRUKTUREN
  • falls: Falls dies zutrifft tu das. (Einseitige Verzweigung)
    Die grüne Fläche muss mit einem boolschen Ausdruck versehen werden.
    Die Aussparung in der Mitte muss mit Inhalt (d.h Anweisungen, Steuerungen) gefüllt werden
  • falls-sonst: Falls dies zutrifft tu das, sonst das. (Zweiseitige Verzweigung)
    Die grüne Fläche muss mit einem boolschen Ausdruck versehen werden.
    Die Aussparung unter "falls" bzw. "sonst" muss mit Inhalt (d.h Anweisungen, Steuerungen) gefüllt werden
  • solange: Solange dies zutrifft tu das. (Kopfgesteuerte Schleife)
    Die grüne Fläche muss mit einem boolschen Ausdruck versehen werden.
    Die Aussparung in der Mitte muss mit Inhalt (d.h Anweisungen, Steuerungen) gefüllt werden
    Hinweis: Je nach Bedingung wir die Schleife nicht betreten.
  • wiederhole-solange: Wiederhole dies solange das zutrifft. (Fussgesteuerte Schleife)
    Die grüne Fläche muss mit einem boolschen Ausdruck versehen werden.
    Die Aussparung in der Mitte muss mit Inhalt (d.h Anweisungen, Steuerungen) gefüllt werden
    Hinweis: Die Schleife wird mindestens einmal durchlaufen.
Aufgaben
  1. Erstellen sie ein Programm, dass den Hamster den Gang entlang laufen lässt und am Schluss das Korn aufnimmt. Territorium 1 herunterladen
  2. Erstellen sie ein Programm, dass den Hamster den geknickten Gang entlang laufen lässt und am Schluss das Korn aufnimmt. Territorium 2 herunterladen
  3. Erstellen sie ein Programm, dass den Hamster den geknickten Gang entlang laufen lässt und alle Körner auf seinem Weg aufnimmt. Territorium 3 herunterladen
  4. Erstellen sie ein Programm, dass den Hamster alle Körner aufnehmen lässt und beim letzten Korn rechts unten stehen bleibt. Territorium 4 herunterladen
  5. Lösen sie folgende Aufgabe: Der Hamster steht am linken Spielrand und schaut nach rechts. Der Hamster läuft nun eine gerade, waagrechte Zeile ab und kehrt dann um, wenn er auf ein Feld mit exakt 2 Körner trifft. Begegnet er keinen Körner oder Körner mit der Anzahl ungleich 2, lässt ihn das unberührt und er läuft in derselber Richtung weiter bis zur rechten Wand. Dort dreht er um und läuft zurück zur Startposition auf der linken Seite. Am Schluss muss der Hamster wieder in der Ausgangsstellung stehen (Hamster schaut nach rechts) und das Territorium wiederhergestellt sein: D.h.: Alle Körner in der Anzahl und Position, wie vor Beginn des Programms.
  6. Erstellen sie ein eigenes Territorium mit Hindernissen und Körnen und programmieren sie den Hamster entsprechend.

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 [int], Geburtsmonat [int] und Geburtstag [int]) zweier Personen sind gegeben. Stellen sie fest, welche von den beiden Personen die ältere ist.
(Hinweis: Das Datum MUSS dreiteilig Tag/Monat/Jahr eingelesen werden. Datumsdatentypen sind nicht erlaubt.)

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: (Lichtkubus) Es soll ein dreidimensionales Feld entsprechend eingefärbt werden. Hinweis zum Koordinatensystem: Die unterste Kugel links hat die Position x=0, y=0, z=0. Erstellen die das Struktogramm für diese konkrete Lichtansteuerung.
    Hinweis zur Implementierung in Powershell: Da wir keinen ansteuerbaren Lichtkubus zur Verfügung haben, und eine behelfsmässige Ausgabe als Text in der Form von «write-host "Die Lampe an der Stelle $x, $y, $z brennt in blauer Farbe"» mit 7x7x7=343 Ausgaben eher umständlich ist, ändern wir die Aufgabe wie folgt ab: Es soll nur am Schluss ausgegeben werden, wieviele Lampen rot bzw, cyan leuchten.
  • 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. 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!

4.1 Erste Schritte: Implementieren mit Powershell

A: Zahl prüfen

  1. Ganze Zahl zwischen -100 und + 100 eingeben.
  2. Zahl prüfen und Ausgabe: Zahl ist negativ, Null oder positiv.

B: Zahlen zusammenzählen

  1. Geben sie eine positive, ganze Zahl $x ein.
  2. Zählen sie alle ganzen Zahlen ab 0 bis $x zusammen.
  3. Resultat ausgeben. Bsp.: Eingabe6 -> 1+2+3+4+5+6=21

C: Zeichenkolonne

Haben sie den Film The Matrix gesehen? Mit den vielen fallenden Buchstaben im Vorspann? Das wollen wir nun auch machen. Allerdings zuerst einmal beschränkt auf eine einzige Kolonne. Geben sie mit $k ein, wie hoch diese Kolonne werden soll. Die Kolonne soll sich in unserem Beispiel so darstellen:
X, dann 2 mal I, dann wiederholt sich das Ganze bis zur Höhe $k
Bsp:
Eingabe Kolonne $k -> 7
Ergibt die folgende Ausgabe: (in der vertikalen!)
X → I → I → X → I → I → X

D: Weitere Aufgaben

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"

4.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.

4.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.

4.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.

4.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.

4.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.

4.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.

4.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.

5. Debuggen & Testen

5.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

5.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 ********

5.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 ********

5.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)

5.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?)