Lazarus/Spielen mit dem Zufall und Lazarus/Verzweigungen: Unterschied zwischen den Seiten

Aus ZUM-Unterrichten
< Lazarus(Unterschied zwischen Seiten)
main>Peterdauscher
Keine Bearbeitungszusammenfassung
 
K (Kasten blau/gelb -> blau/gelb)
 
Zeile 1: Zeile 1:
{{Lazarus-Buch}}
{{Lazarus-Buch}}
== Wenn-Dann-Sonst (If-then-else) ==


Bisher haben wir Zahlenwerte immer entweder fest im Programm vorgegeben (etwa a:=42),
Bisher wurden die Computerprogramme strikt von oben nach unten abgearbeitet. Das ist aber nicht immer wünschenswert. Zum Beispiel kann es sein, dass bestimmte Programmteile nur dann ausgeführt werden, wenn bestimmte Bedingungen auch erfüllt sind. Wir alle kennen z.B. Passwort-Abfragen, bei denen Funktionen eines Programms oder einer Website nur dann funktionieren, wenn man das richtige Passwort angibt.
vom Benutzer während der Eingabe erfragt (etwa mit <tt>a:=StrToInt(...)</tt>) oder aber irgendwie aus bereits bekannten Werten ausgerechnet (z.B. <tt>a:=sqrt(c)</tt>). Für viele Anwendungen – vor allem für die, die ein bisschen Spaß machen – wäre es jedoch nett, zufällige Zahlen zu haben. Das gilt z.B. für Glücksspiele genauso wie für Geschicklichkeitsspiele.


Für solche Fragen ist der Befehl <tt>random</tt> nützlich. Ohne Klammer hinter dem Befehl (also etwa <tt>x:=random;</tt>) “würfelt” der Befehl eine (reelle) Zufallszahl im Bereich zwischen 0 und 1. Damit ist es mit ein bisschen Mathematik nicht schwierig, auch natürliche Zufallszahlen in beliebigen Zahlenbereichen zu basteln. Allerdings nimmt Lazarus einem einen Teil dieser Arbeit ab, wenn man eine Zahl in Klammern hinter den Befehl schreibt (also etwa <tt>k:=random(bereich);</tt>). Der Computer würfelt dann eine ganzzahlige Zufallszahl zwischen 0 und <tt>bereich-1</tt>.
=== Beispiel ===


Wir betrachten das einfache Beispiel eines Lazarus-Programms mit zwei Edit-Feldern, <tt>Edit1</tt> und <tt>Edit2</tt> und einem Button <tt>Button1</tt>. Wenn der Button1 gedrückt wird, soll der Computer die Eingabe in <tt>Edit1</tt> überprüfen. Steht darin das richtige Passwort ("geheim"), so soll in <tt>Edit2</tt> angezeigt werden: "Sie sind angemeldet!"
{{blau|<source  line highlight="35-39" lang="pascal">
unit passwort;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;
type
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }


{{kasten_blau|<source  line start=30 highlight="3" lang="pascal">
procedure TForm1.Button1Click(Sender: TObject);
procedure TForm1.Button1Click(Sender: TObject);
begin
begin
   z:=random(100);
   if Edit1.Text='geheim'
   Edit1.Text:=IntToStr(z);
   then Edit2.Text:='Sie sind angemeldet';
end;    
end;
 
end.
</source>}}
</source>}}


Tatsächlich: Auf den ersten Blick kommt bei jedem Knopfdruck eine vollkommen zufällige Zahl heraus. Doch der Schein trügt: Wenn man sich die ersten 3 Zahlen nach dem ersten Knopfdruck notiert, dann das Programm neu startet und das Vorgehen noch ein paar mal wiederholt, wird man feststellen: Die Zahlenfolge ist nach dem Programm-Neustart immer die gleiche.
Das Programm ist allerdings noch nicht besonders benutzerfreundlich. Gibt der Benutzer z.B. ein falsches Passwort ein, so erhält er gar keine Nachricht. Es passiert einfach nichts.  


So großartig zufällig ist das nun wirklich nicht. Dem kann man jedoch abhelfen, wenn man gleich nach dem Programmstart den Befehl <tt>randomize;</tt> ausführen lässt. Der sorgt dafür, dass die Zufallszahlen tatsächlich bei jedem Programmlauf andere sind. Zusätzlich zum Click-Ereignis des Buttons bauen wir jetzt einfach noch ein Programmstück, was beim Erzeugen des Fensters ausgeführt wird.
Das kann man ändern. Im Falle, dass die Eingabe nicht 'geheim' lautet, soll in Edit2 die Bemerkung: 'Falsches Passwort' ausgegeben werden.
{{blau|<source  line start=35 highlight="1-6" lang="pascal">
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Edit1.Text='geheim'
  then Edit2.Text:='Sie sind angemeldet'
  else Edit2.Text:='Falsches Passwort';
end;             
</source>}}


{{kasten_blau|<source  line start=30 highlight="3" lang="pascal">
=== Wichtige Anmerkungen ===
procedure TForm1.FormCreate(Sender: TObject);
* Achtung: vor "else" steht nie ein Semiklon. Das Semikolon beendet einen Befehl; die ganze If-then-else-Konstruktion ist jedoch im Grunde ein einzelner Befehl; das Semikolon steht erst danach.
* Man beachte das Gleichheitszeichen in <tt><nowiki>if Edit1.Text='geheim'</nowiki></tt>. Es ist ein einzelnes Gleichheitszeichen '''ohne Doppelpunkt'''. Es beschreibt auch etwas ganz anderes als eine Wertzuweisung: Es beschreibt einen Bedingung. Es gibt nur zwei Möglichkeiten: Die Bedingung ist erfüllt (wahr, engl. true) oder eben nicht (falsch, engl. false).
* Wenn Du Dich an das Kapitel [[../Variablen_und_Komponenten]] erinnerst, kamen da Variablen vom Typ <tt>boolean</tt> vor, die genau diese beiden möglichen Werte hatten. Tatsächlich könnte man einer Variable <tt>b</tt> vom Typ <tt>boolean</tt> mit <tt>b:=(Edit1.Text='geheim');</tt> einen Wert zuweisen, je nachdem, ob der Text der richtige war oder nicht.
 
== Mehrere Anweisungen zu einem Block gruppieren==
Bisher wird in jedem der beiden Fälle genau eine einzelne Anweisung ausgeführt. Es kann aber leicht sein, dass nur im Fall einer erfüllten (oder auch nicht erfüllten) Bedingung gleich mehrere Anweisungen ausgeführt werden sollen.  Im nächsten Beispiel soll z.B. bei einer falschen Eingabe auf dem Button die Beschriftung zu 'Nochmal versuchen' geändert weden:
{{blau|<source  line start=36 highlight="1-9" lang="pascal">
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Edit1.Text='geheim'
  then Edit2.Text:='Sie sind angemeldet'
  else begin
      Edit2.Text:='Falsches Passwort';
      Button1.Caption:='Nochmal versuchen';
      end
end;               
</source>}}
Die beiden Anweisungen zum Verändern von <tt>Edit2.Text</tt> und <tt>Button1.Caption</tt> sind durch ein <tt>begin</tt> und ein <tt>end</tt> umrahmt. Manche Leute sprechen von einem '''Programm-Block'''. Natürlich kann auch hinter <tt>then</tt> ein Programm-Block stehen: Aber Vorsicht: Hinter diesem <tt>end</tt> steht dann wieder kein Semikolon.
 
== Vergleiche von Zahlen ==
 
Natürlich kann man nicht nur Zeichenketten miteinander vergleichen, sondern auch Zahlen. Neben der reinen Gleichheit gibt es auch andere Vergleichsoperatoren:
 
{| class ="wikitable toptextcells"
! Vergleichsoperator
! Bedeutung
|-
| <nowiki>=</nowiki> || gleich
|-
| <nowiki><=</nowiki> || kleiner oder gleich
|-
| <nowiki>>=</nowiki> || größer oder gleich
|-
| <nowiki><></nowiki> || ungleich
|}
 
 
== Verknüpfung von Bedingungen ==
 
In einer if-Abfrage können auch Bedingungen abgefragt werden, die aus mehreren Teilbedingungen bestehen, die durch logische Verknüpfungen verbunden sind. Diese Verknüpfungen sind
 
{| class ="wikitable toptextcells"
! Vergleichsoperator
! Bedeutung
|-
| Bedingung1 <tt>and</tt> Bedingung2 || Gilt dann und nur dann, wenn beide Bedingungen erfüllt sind.
|-
| Bedingung1 <tt>or</tt> Bedingung2 || Gilt bereits dann, wenn eine der beiden Bedingungen erfüllt sind, aber auch dann, wenn beide erfüllt sind.
|-
| Bedingung1 <tt>xor</tt> Bedingung2 || Gilt dann und nur dann, wenn genau eine der beiden Bedingungen erfüllt sind, aber nicht dann, wenn keine oder beide erfüllt sind.
|-
| <tt>not</tt> Bedingung|| Gilt dann, wenn die Bedingung selbst genau '''nicht''' gilt.
|}
 
Es ist generell sinnvoll, die einzelnen Bedingungen jeweils in Klammern zu setzen. Erstens erhöht es die Übersichtlichkeit und zweitens kann es bei fehlenden Klammern auch zu Problemen mit dem Compiler kommen.
 
 
== Mehrfach-Fallunterscheidungen ==
 
Bisher wurde nur immer eine Bedingung geprüft und je nachdem ob sie erfüllt war (oder auch nicht) eine bestimmte Abfolge von Befehlen ausgeführt. Damit lassen sich im Grunde alle möglichen Abfragen realisieren, wenn auch manchmal recht umständlich.
Angenommen, man wollte für einen Monat (angegeben wäre die Nummer des Monats im Jahr) wissen, wie viele Tage er hat (wir vernachlässigen Schaltjahre).
Folgendes Programmstück könnte die Aufgabe lösen. Trotzdem erscheint es eben etwas umständlich mit den ganzen or-Verknüpfungen zwischen den Einzelbedingungen.
 
{{blau|<source  line highlight="5-10" lang="pascal">
procedure TForm1.Button1Click(Sender: TObject);
var nummer, anzahltage : integer;
begin
  nummer:=StrToInt(Edit1.Text);
  if (nummer=2) then anzahltage:=28
  else  if ((nummer=4)
        or (nummer=6)
        or (nummer=9)
        or (nummer=11)) then anzahltage:=30
        else anzahltage:=31;
  label1.Caption:=IntToStr(anzahltage);
end;
     
</source>}}
 
Das Gleiche tut jedoch auch folgendes Programm, das für die Werte der Variablen "nummer" eine entsprechende Fallunterscheidung vornimmt.
 
{{blau|<source  line highlight="5-9" lang="pascal">
procedure TForm1.Button1Click(Sender: TObject);
var nummer, anzahltage : integer;
begin
begin
   randomize;
   nummer:=StrToInt(Edit1.Text);
end;    
  case nummer of
  2: anzahltage:=28;
  4,6,9,11 : anzahltage:=30;
  else anzahltage:=31;
  end; // Das "case" ist sozusagen das zugehörige "begin"
  label1.Caption:=IntToStr(anzahltage);
end;      
</source>}}
</source>}}


'''Anmerkung:''' Es schadet nichts, zu wissen, was dieses <tt>randomize</tt> eigentlich tut. Eigentlich kann ein klassischer Computer keine wirklich zufälligen Zahlen erzeugen sondern nur [https://de.wikipedia.org/wiki/Pseudozufall Pseudozufallszahlen]. Diese berechnet man aus einer anfänglich gegebenen Zahl durch Gleichungen, die scheinbar ungeordnete, aber eben nicht wirklich zufällige Zahlen erzeugen. Da die Anfangszahl ohne die Verwendung von <tt>randomize</tt> immer die gleiche ist, ist auch die daraus berechnete Folge von Pseudozufallszahlen immer die gleiche. <tt>randomize</tt> ermittelt jetzt bei jedem Programmlauf eine andere Anfangszahl. Dafür benutzt der Befehl die Zeit der Computeruhr, die "Systemzeit". Die ist bei jedem Programmstart eine andere und sie hängt -- irgendwie dann doch zufällig -- davon ab, wann genau der Benutzer das Programm startet.
==Aufgaben==
#'''Abgestufte Höflichkeit'''<br>In dem Edit-Feld <tt>Edit</tt> soll ein Vorname eingegeben werden. Wenn es Dein eigener ist, dann soll der Computer gehorsam mit "Willkommen mein Herr und Meister" begrüßen; ansonsten (etwas unfreundicher) mit "Was willst Du?".
#'''Alltag: Volljährigkeit'''<br>Ist der Bürger 18 Jahre und älter, dann ist er volljährig. Ein Computerprogramm soll auf Knopfdruck das Alter eines Bürgers aus dem Feld <tt>Edit1</tt> einlesen und in das Feld <tt>Edit2</tt> ausgeben, ob er volljährig ist.
#'''Mathematik: Intervall-Prüfung'''<br>Eine Zahl wird in einer Edit-Komponente eingegeben. Das Programm soll entscheiden, ob diese Zahl zwischen 10 und 20 liegt.
#'''Informatik: Gefährliche Knöpfe'''<br>Manche Aktionen bei Computerprogrammen sind so risikoreich, dass der Benutzer nicht einmal, sondern dreimal auf den entsprechenden Button klicken sollte, bevor sie ausgeführt werden. Schreibe ein Programm mit dem Knopf "Selbstzerstörung starten", den man drei mal drücken muss, bevor in einem Label der Text: "Selbstzerstörung ist aktiviert" erscheint und der Button selbst unsichtbar wird.
#'''Mathematik: pq: Mission (im)possible'''<br>Eine quadratische Funktion sei definiert als <math>f(x)=x^2+px+q</math>. Die so genannte pq-Formel gibt an, welche Nullstellen eine solche Funktion hat: <br/> <math>x_{1/2}=-\frac{p}{2}\pm\sqrt{\frac{p^2}{4}-q}</math> <br/> Ein Programm soll geschrieben werden, das die Werte p und q aus zwei Edit-Komponenten ausliest und in zwei weitere Edit-Komponenten die Werte der beiden Nullstellen schreibt. Vorausgesetzt natürlich, dass die Funktion überhaupt (reelle) Nullstellen hat (was nicht immer der Fall ist).
#'''Alltag: Schaltjahr oder nicht'''<br>Führe eine Internet-Recherche durch, wie man bei einer gegebenen Jahreszahl herausbekommen kann, ob es sich um ein Schaltjahr handelt oder nicht. Schreibe ein Programm, das nach Angabe einer Jahreszahl eine entsprechende Ausgabe zurückliefert.
#'''Spiele: Farbe einer Roulette-Zahl'''<br>Im Roulette-Spiel gibt es Zahlen zwischen 0 und 36. Die Null hat keine Farbe, sie ist einfach die Null (ZERO). Die Farben der anderen Zahlen sind mehr oder weniger willkürlich, aber schließlich gibt es Abbildungen von Roulette-Tischen im Internet. Schreibe ein Programm, das die Farbe zu einer eingegebenen Roulette-Zahl ermittelt.


== Aufgaben ==
#Schreibe ein Lazarus-Programm zum Würfeln, bei dem nach dem Drücken eines Knopfes in einem Edit-Feld eine Zahl zwischen 1 und 6 erscheint.
#In manchen Würfelspielen wird mit zwei Würfeln gewürfelt. Schreibe ein Programm, das bei jedem Wurf mit zwei (gedachten) Würfeln würfelt und die Zahlen ausgibt; außerdem die Augensumme. Weiterhin soll das Programm ausgeben, wenn es bei einem Wurf ein „Pasch“ gegeben hat (Augenzahl bei beiden Würfeln gleich).
#Fred und George erfinden ein Würfelspiel. Jeder darf 10 mal würfeln (Zahlen zwischen 1 und 6). Es gewinnt, wessen größte Zahl am größen ist. Schreibe ein Programm, das auf Knopfdruck ein solches zehnmaliges Würfeln simuliert und die Werte in ein Memo-Feld schreibt. Außerdem soll es dann noch direkt sagen, welches die größte gewürfelte Zahl war: "Die größte Zahl war ..."
#Schreibe ein (sehr vereinfachtes) Roulette-Rad, das zufällig eine Zahl zwischen 0 und 36 erzeugt. Für die Zahlen zwischen 1 und 36 soll die Maschine ausgeben, ob die Zahl gerade ist (PAIR) oder ungerade (IMPAIR). Wenn sie Null ist, soll die Maschine ZERO ausgeben.
# Kartenlegerin Esmeralda steigt endlich auf moderne Technik um. Sie verwendet seit jeher Skat-Karten. Dort gibt es die “Farben” Kreuz, Pique, Herz und Karo. Außerdem gibt es die Zahlen bzw. Figuren 7, 8, 9, 10, Bube, Dame, König, Ass. <br />Insgesamt gibt es also 4 · 8 = 32 Karten. Schreiben Sie für Esmeralda ein Programm, das eine zuf¨allige Karte erzeugt (also zum Beispiel “Pique 10”). <br />Hinweis: Man kann es sehr umständlich machen und eine Zufallszahl zwischen 1 und 32 ziehen und entsprechend eine bestimmte Karte zuordnen. Es geht aber auch deutlich eleganter.
#Fülle die Bildoberfläche mit 5000 komplett zufällig verteilten und zufällig gefärbten Pixeln.
{{Lazarus-Buch}}
{{Lazarus-Buch}}

Version vom 18. April 2018, 21:39 Uhr

Wenn-Dann-Sonst (If-then-else)

Bisher wurden die Computerprogramme strikt von oben nach unten abgearbeitet. Das ist aber nicht immer wünschenswert. Zum Beispiel kann es sein, dass bestimmte Programmteile nur dann ausgeführt werden, wenn bestimmte Bedingungen auch erfüllt sind. Wir alle kennen z.B. Passwort-Abfragen, bei denen Funktionen eines Programms oder einer Website nur dann funktionieren, wenn man das richtige Passwort angibt.

Beispiel

Wir betrachten das einfache Beispiel eines Lazarus-Programms mit zwei Edit-Feldern, Edit1 und Edit2 und einem Button Button1. Wenn der Button1 gedrückt wird, soll der Computer die Eingabe in Edit1 überprüfen. Steht darin das richtige Passwort ("geheim"), so soll in Edit2 angezeigt werden: "Sie sind angemeldet!"

unit passwort;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Edit1.Text='geheim'
  then Edit2.Text:='Sie sind angemeldet';
end;

end.


Das Programm ist allerdings noch nicht besonders benutzerfreundlich. Gibt der Benutzer z.B. ein falsches Passwort ein, so erhält er gar keine Nachricht. Es passiert einfach nichts.

Das kann man ändern. Im Falle, dass die Eingabe nicht 'geheim' lautet, soll in Edit2 die Bemerkung: 'Falsches Passwort' ausgegeben werden.

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Edit1.Text='geheim'
  then Edit2.Text:='Sie sind angemeldet'
  else Edit2.Text:='Falsches Passwort';
end;


Wichtige Anmerkungen

  • Achtung: vor "else" steht nie ein Semiklon. Das Semikolon beendet einen Befehl; die ganze If-then-else-Konstruktion ist jedoch im Grunde ein einzelner Befehl; das Semikolon steht erst danach.
  • Man beachte das Gleichheitszeichen in if Edit1.Text='geheim'. Es ist ein einzelnes Gleichheitszeichen ohne Doppelpunkt. Es beschreibt auch etwas ganz anderes als eine Wertzuweisung: Es beschreibt einen Bedingung. Es gibt nur zwei Möglichkeiten: Die Bedingung ist erfüllt (wahr, engl. true) oder eben nicht (falsch, engl. false).
  • Wenn Du Dich an das Kapitel Lazarus/Variablen_und_Komponenten erinnerst, kamen da Variablen vom Typ boolean vor, die genau diese beiden möglichen Werte hatten. Tatsächlich könnte man einer Variable b vom Typ boolean mit b:=(Edit1.Text='geheim'); einen Wert zuweisen, je nachdem, ob der Text der richtige war oder nicht.

Mehrere Anweisungen zu einem Block gruppieren

Bisher wird in jedem der beiden Fälle genau eine einzelne Anweisung ausgeführt. Es kann aber leicht sein, dass nur im Fall einer erfüllten (oder auch nicht erfüllten) Bedingung gleich mehrere Anweisungen ausgeführt werden sollen. Im nächsten Beispiel soll z.B. bei einer falschen Eingabe auf dem Button die Beschriftung zu 'Nochmal versuchen' geändert weden:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Edit1.Text='geheim'
  then Edit2.Text:='Sie sind angemeldet'
  else begin
       Edit2.Text:='Falsches Passwort';
       Button1.Caption:='Nochmal versuchen';
       end
end;

Die beiden Anweisungen zum Verändern von Edit2.Text und Button1.Caption sind durch ein begin und ein end umrahmt. Manche Leute sprechen von einem Programm-Block. Natürlich kann auch hinter then ein Programm-Block stehen: Aber Vorsicht: Hinter diesem end steht dann wieder kein Semikolon.

Vergleiche von Zahlen

Natürlich kann man nicht nur Zeichenketten miteinander vergleichen, sondern auch Zahlen. Neben der reinen Gleichheit gibt es auch andere Vergleichsoperatoren:

Vergleichsoperator Bedeutung
= gleich
<= kleiner oder gleich
>= größer oder gleich
<> ungleich


Verknüpfung von Bedingungen

In einer if-Abfrage können auch Bedingungen abgefragt werden, die aus mehreren Teilbedingungen bestehen, die durch logische Verknüpfungen verbunden sind. Diese Verknüpfungen sind

Vergleichsoperator Bedeutung
Bedingung1 and Bedingung2 Gilt dann und nur dann, wenn beide Bedingungen erfüllt sind.
Bedingung1 or Bedingung2 Gilt bereits dann, wenn eine der beiden Bedingungen erfüllt sind, aber auch dann, wenn beide erfüllt sind.
Bedingung1 xor Bedingung2 Gilt dann und nur dann, wenn genau eine der beiden Bedingungen erfüllt sind, aber nicht dann, wenn keine oder beide erfüllt sind.
not Bedingung Gilt dann, wenn die Bedingung selbst genau nicht gilt.

Es ist generell sinnvoll, die einzelnen Bedingungen jeweils in Klammern zu setzen. Erstens erhöht es die Übersichtlichkeit und zweitens kann es bei fehlenden Klammern auch zu Problemen mit dem Compiler kommen.


Mehrfach-Fallunterscheidungen

Bisher wurde nur immer eine Bedingung geprüft und je nachdem ob sie erfüllt war (oder auch nicht) eine bestimmte Abfolge von Befehlen ausgeführt. Damit lassen sich im Grunde alle möglichen Abfragen realisieren, wenn auch manchmal recht umständlich. Angenommen, man wollte für einen Monat (angegeben wäre die Nummer des Monats im Jahr) wissen, wie viele Tage er hat (wir vernachlässigen Schaltjahre). Folgendes Programmstück könnte die Aufgabe lösen. Trotzdem erscheint es eben etwas umständlich mit den ganzen or-Verknüpfungen zwischen den Einzelbedingungen.

procedure TForm1.Button1Click(Sender: TObject);
var nummer, anzahltage : integer;
begin
  nummer:=StrToInt(Edit1.Text);
  if (nummer=2) then anzahltage:=28
  else   if ((nummer=4)
         or (nummer=6)
         or (nummer=9)
         or (nummer=11)) then anzahltage:=30
         else anzahltage:=31;
  label1.Caption:=IntToStr(anzahltage);
end;


Das Gleiche tut jedoch auch folgendes Programm, das für die Werte der Variablen "nummer" eine entsprechende Fallunterscheidung vornimmt.

procedure TForm1.Button1Click(Sender: TObject);
var nummer, anzahltage : integer;
begin
  nummer:=StrToInt(Edit1.Text);
  case nummer of
  2: anzahltage:=28;
  4,6,9,11 : anzahltage:=30;
  else anzahltage:=31;
  end; // Das "case" ist sozusagen das zugehörige "begin"
  label1.Caption:=IntToStr(anzahltage);
end;


Aufgaben

  1. Abgestufte Höflichkeit
    In dem Edit-Feld Edit soll ein Vorname eingegeben werden. Wenn es Dein eigener ist, dann soll der Computer gehorsam mit "Willkommen mein Herr und Meister" begrüßen; ansonsten (etwas unfreundicher) mit "Was willst Du?".
  2. Alltag: Volljährigkeit
    Ist der Bürger 18 Jahre und älter, dann ist er volljährig. Ein Computerprogramm soll auf Knopfdruck das Alter eines Bürgers aus dem Feld Edit1 einlesen und in das Feld Edit2 ausgeben, ob er volljährig ist.
  3. Mathematik: Intervall-Prüfung
    Eine Zahl wird in einer Edit-Komponente eingegeben. Das Programm soll entscheiden, ob diese Zahl zwischen 10 und 20 liegt.
  4. Informatik: Gefährliche Knöpfe
    Manche Aktionen bei Computerprogrammen sind so risikoreich, dass der Benutzer nicht einmal, sondern dreimal auf den entsprechenden Button klicken sollte, bevor sie ausgeführt werden. Schreibe ein Programm mit dem Knopf "Selbstzerstörung starten", den man drei mal drücken muss, bevor in einem Label der Text: "Selbstzerstörung ist aktiviert" erscheint und der Button selbst unsichtbar wird.
  5. Mathematik: pq: Mission (im)possible
    Eine quadratische Funktion sei definiert als . Die so genannte pq-Formel gibt an, welche Nullstellen eine solche Funktion hat:

    Ein Programm soll geschrieben werden, das die Werte p und q aus zwei Edit-Komponenten ausliest und in zwei weitere Edit-Komponenten die Werte der beiden Nullstellen schreibt. Vorausgesetzt natürlich, dass die Funktion überhaupt (reelle) Nullstellen hat (was nicht immer der Fall ist).
  6. Alltag: Schaltjahr oder nicht
    Führe eine Internet-Recherche durch, wie man bei einer gegebenen Jahreszahl herausbekommen kann, ob es sich um ein Schaltjahr handelt oder nicht. Schreibe ein Programm, das nach Angabe einer Jahreszahl eine entsprechende Ausgabe zurückliefert.
  7. Spiele: Farbe einer Roulette-Zahl
    Im Roulette-Spiel gibt es Zahlen zwischen 0 und 36. Die Null hat keine Farbe, sie ist einfach die Null (ZERO). Die Farben der anderen Zahlen sind mehr oder weniger willkürlich, aber schließlich gibt es Abbildungen von Roulette-Tischen im Internet. Schreibe ein Programm, das die Farbe zu einer eingegebenen Roulette-Zahl ermittelt.