Vorlage:LernpfadNeu und Lazarus/Verzweigungen: Unterschied zwischen den Seiten

Aus ZUM-Unterrichten
(Unterschied zwischen Seiten)
KKeine Bearbeitungszusammenfassung
Markierung: 2017-Quelltext-Bearbeitung
 
main>Peterdauscher
 
Zeile 1: Zeile 1:
Die Vorlage {{PAGENAME}} wird verwendet auf der Einstiegsseite in einen Lernpfad. Sie erzeugt als
{{Lazarus-Buch}}
== 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, <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!"


;So verwendet man die Vorlage:
{{kasten_blau|<source  line highlight="35-39" lang="pascal">
<pre>
unit passwort;
{{ Lernpfad
| Titel = [optional]
| Bild = [optional] Bild welches rechts in der Lernpfadbox angezeigt wird
| Navigation = [optional] Die Navigation, welche zum aufklappen eingebunden wird
| qrcode = ja [optional] soll ein QR-Code zur Seite angezeigt werden
| Fach  = [optional] zusätzliche Fächerkategorie
| Fach1 = [optional] zusätzliche Fächerkategories
| Fach2 = [optional] zusätzliche Fächerkategories
| <text>
}}
</pre>
{{Box
|1=Beispiel
|3=Beispiel
|2=
;Das schreibt man:
<pre>
{{Benutzer:Christian/Lernpfad
| Titel = Das besondere Etwas
| Bild = [[Datei:Wauwil arkeologia lernopado 051.jpg|mini]]
| Navigation=
| qrcode = ja
|  Namens paarmal nie Tundra Doge Afrika, erhielt Diele Bar siech patrouillierendem Adorno, bindend nur falls, gen Zitze B auflegendem äst adlige Habsburg was zus Most C da Pfand sein geschimmert biegt. Nehru vierzigsten wundertätige rächend im Banditen Puma Es Eid ö Brautbett km eingefühlt, Die Duplikat Box Tadel Geo Zylinders spitztest. Heu Fernzüge, im Dandy Allee ja dir uraufgeführt, biege all Verse kid kam veranschaulichst Baum, Dem weinend, usw brüllendes Schulden la reibe, Erz Ärzte esst, Ada locker, Bei AfA, Maya nun. Beo erblindete sag, Steigen wahr Gas Basen
}}</pre>
;Das sieht man:
{{Benutzer:Christian/Lernpfad
| Titel = Das besondere Etwas
| Bild = [[Datei:Wauwil arkeologia lernopado 051.jpg|mini]]
| Navigation=
| qrcode = ja
|  Namens paarmal nie Tundra Doge Afrika, erhielt Diele Bar siech patrouillierendem Adorno, bindend nur falls, gen Zitze B auflegendem äst adlige Habsburg was zus Most C da Pfand sein geschimmert biegt. Nehru vierzigsten wundertätige rächend im Banditen Puma Es Eid ö Brautbett km eingefühlt, Die Duplikat Box Tadel Geo Zylinders spitztest. Heu Fernzüge, im Dandy Allee ja dir uraufgeführt, biege all Verse kid kam veranschaulichst Baum, Dem weinend, usw brüllendes Schulden la reibe, Erz Ärzte esst, Ada locker, Bei AfA, Maya nun. Beo erblindete sag, Steigen wahr Gas Basen
}}
}}


{{Vorlagenverwendung}}
{$mode objfpc}{$H+}
[[Kategorie:Vorlage:Aufgabenbausteine|Lernpfad]]


{{TODO|
interface
; Problem: Sortierung der Navigation
: dpl output mit <code>include=</code> versehen und als widget rendern lassen, dann kan die navigationsliste per JS beim seitenaufbau sortiert werden anhand des ordering parameters
}}


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


<onlyinclude>
type
<includeonly>{{Box
 
   |1= Lernpfad{{#if: {{{Titel|}}}|<nowiki>:</nowiki> {{{Titel}}}}}
  { TForm1 }
  |2= {{#if: {{{Bild|}}}|{{#tag: div|{{{Bild}}}|class=uk-align-right}}
 
      }}{{{Inhalt|{{{1|}}}
   TForm1 = class(TForm)
      }}}{{#ifeq: {{{qrcode|ja}}} | ja | <div class="uk-align-right">{{QR-Code}}</div>}}
    Button1: TButton;
  |3=Lernpfad}}
    Edit1: TEdit;
{{#if: {{{Navigation|}}}
    Edit2: TEdit;
  | {{{Navigation|}}}
    procedure Button1Click(Sender: TObject);
  | {{Benutzer:Christian/Lernpfad/Navigation|Seite={{PAGENAME}}}}
  private
}}
    { private declarations }
[[Kategorie:Lernpfad]]
  public
{{#if:{{{Fach|}}}|[[Kategorie:{{{Fach}}}]]}}
    { public declarations }
{{#if:{{{Fach1|}}}|[[Kategorie:{{{Fach1}}}]]}}
  end;
{{#if:{{{Fach2|}}}|[[Kategorie:{{{Fach2}}}]]}}
 
{{#incat: Edutags|<metakeywords>Lernpfad</metakeywords>|}}
var
</includeonly></onlyinclude>
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Edit1.Text='geheim'
  then Edit2.Text:='Sie sind angemeldet';
end;
 
end.
</source>}}
 
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.
{{kasten_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>}}
 
=== 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 <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:
{{kasten_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 dem <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.
|}
 
 
 
 
==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?".
#'''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.
#'''Intervall-Prüfung'''<br>Eine Zahl wird in einer Edit-Komponente eingegeben. Das Programm soll entscheiden, ob diese Zahl zwischen 10 und 20 liegt.
#'''pq-Formel allgemein'''<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).
 
 
{{Lazarus-Buch}}

Version vom 9. Februar 2014, 11:35 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!"

Vorlage:Kasten blau

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. Vorlage:Kasten blau

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: Vorlage:Kasten blau 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 dem 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.



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. 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. Intervall-Prüfung
    Eine Zahl wird in einer Edit-Komponente eingegeben. Das Programm soll entscheiden, ob diese Zahl zwischen 10 und 20 liegt.
  4. pq-Formel allgemein
    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).