Lazarus/Verzweigungen und Lazarus/Felder (Arrays): Unterschied zwischen den Seiten

Aus ZUM-Unterrichten
< Lazarus(Unterschied zwischen Seiten)
main>Peterdauscher
 
main>Peterdauscher
(Die Seite wurde neu angelegt: „Bisher haben wir nur Variablen kennen gelernt, die aus einer einzigen Zahl (ganz oder reell) oder einem Wahrheitswert (wahr/falsch) bestanden haben. Für viele Di…“)
 
Zeile 1: Zeile 1:
{{Lazarus-Buch}}
Bisher haben wir nur Variablen kennen gelernt, die aus einer einzigen Zahl (ganz oder reell) oder einem Wahrheitswert (wahr/falsch) bestanden haben. Für viele Dinge reicht das auch, allerdings gibt es auch Probleme, zu deren Lösung viele Variablen benötigt werden. Statt nun jeder einzelnen davon einen Namen zu geben kann man auch viele Variablen unter einem Namen zusammenfassen und sie durchnummerieren.
== 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.
Denkt man an unser Beispiel mit dem Schubladenschrank wäre das also eine Schublade mit einem Namensetikett darauf. In der Schublade jedoch gäbe es jetzt viele kleine Unterfächer, die mit Nummern versehen sind. Eine solche Variable wird in der Informatik auch als <tt>Array</tt> bezeichnet.


=== Beispiel ===
Um eine solche Variable zu deklarieren, muss man in der Deklaration sagen, wie viele "Unterfächer" unsere "Schublade" tatsächlich hat, bzw., welche Nummern überhaupt vergeben werden. So besagt die Deklaration
<source lang="pascal">
var zahlen : array[1..10] of integer;
</source>
dass in der Schublade <tt>zahlen</tt> zehn einzelne Zahlen gespeichert werden können, die von 1 bis 10 durchnummeriert sind.


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!"
Angenommen, man möchte nun die Zahl mit der Nummer 7 auf den Wert 42 setzen, so erreicht man das mit der folgenden Zeile:
<source lang="pascal">
zahlen[7]:=42;
</source>


{{kasten_blau|<source  line highlight="35-39" lang="pascal">
Man beachte, dass die Klammern hinter dem Namen des Arrays tatsächlich eckige Klammern sein müssen.
unit passwort;


{$mode objfpc}{$H+}
=== Beispiel ===
 
Wir betrachten ein einfaches Beispiel aus der Schulwelt: Lehrer Lempel hat gerade seine Klassenarbeit korrigiert und möchte einen Notenspiegel erstellen. Dafür schreibt er sich ein Lazarus-Programm mit einem Edit-Feld <tt>edit1</tt> (zum Eingeben einer Zensur zwischen 1 und 6) und einem Knopf <tt>button2</tt>, um die Zahl in die Statistik aufzunehmen.
interface
Der Notenspiegel wird dann immer im Memo-Feld <tt>memo1</tt> ausgegeben. Vor dem Aufnehmen der Statistik jedoch, müssen alle Anzahlen der Noten natürlich auf Null gesetzt werden. Das geschieht mit dem Drücken von <tt>button1</tt>. Erst dann darf man mit der Eingabe beginnen.
 
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.
</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.
|}
 
Es ist häufig sinnvoll, die einzelnen Bedingungen selbst in Klammern zu setzen.
 
==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.
#'''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.
#'''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 27. Januar 2013, 12:00 Uhr

Bisher haben wir nur Variablen kennen gelernt, die aus einer einzigen Zahl (ganz oder reell) oder einem Wahrheitswert (wahr/falsch) bestanden haben. Für viele Dinge reicht das auch, allerdings gibt es auch Probleme, zu deren Lösung viele Variablen benötigt werden. Statt nun jeder einzelnen davon einen Namen zu geben kann man auch viele Variablen unter einem Namen zusammenfassen und sie durchnummerieren.

Denkt man an unser Beispiel mit dem Schubladenschrank wäre das also eine Schublade mit einem Namensetikett darauf. In der Schublade jedoch gäbe es jetzt viele kleine Unterfächer, die mit Nummern versehen sind. Eine solche Variable wird in der Informatik auch als Array bezeichnet.

Um eine solche Variable zu deklarieren, muss man in der Deklaration sagen, wie viele "Unterfächer" unsere "Schublade" tatsächlich hat, bzw., welche Nummern überhaupt vergeben werden. So besagt die Deklaration

var zahlen : array[1..10] of integer;

dass in der Schublade zahlen zehn einzelne Zahlen gespeichert werden können, die von 1 bis 10 durchnummeriert sind.

Angenommen, man möchte nun die Zahl mit der Nummer 7 auf den Wert 42 setzen, so erreicht man das mit der folgenden Zeile:

zahlen[7]:=42;

Man beachte, dass die Klammern hinter dem Namen des Arrays tatsächlich eckige Klammern sein müssen.

Beispiel

Wir betrachten ein einfaches Beispiel aus der Schulwelt: Lehrer Lempel hat gerade seine Klassenarbeit korrigiert und möchte einen Notenspiegel erstellen. Dafür schreibt er sich ein Lazarus-Programm mit einem Edit-Feld edit1 (zum Eingeben einer Zensur zwischen 1 und 6) und einem Knopf button2, um die Zahl in die Statistik aufzunehmen. Der Notenspiegel wird dann immer im Memo-Feld memo1 ausgegeben. Vor dem Aufnehmen der Statistik jedoch, müssen alle Anzahlen der Noten natürlich auf Null gesetzt werden. Das geschieht mit dem Drücken von button1. Erst dann darf man mit der Eingabe beginnen.