Free Pascal programmieren lernen.

Aktuelles

Herzlich willkommen auf freepascal.de


Free Pascal programmieren lernen.

If Else Anweisung

Allgemeines zur If Else Abfrage in Freepascal

Die IF Else Abfrage heißt auf Deutsch, wenn dann Abfrage. Es wird also ein Zustand der Abfragebedingung geprüft der true oder false ergibt. Trifft die Abfrage zu ist der Wert true deutsch wahr, trifft er nicht zu ist der Wert False deutsch fasch.

Abb. 1.01 Beispiel Software für IF Else Abfrage zum Download s.u.

Abb. 1.01 Beispiel Software für IF Else Abfrage zum Download s.u.

Als erstes sehen wir uns die einfache IF Abfrage an.

If Abfrage

Der Lazarus Programmcode  If Abfrage

Var
X,Y : integer;
X := 1
Y := 2

IF (X >= Y) then
Begin
// Mache etwas
END;

Im Quellcode können wir gut sehen das wir eine Bedingung in den runden Klammern haben die abgefragt wird. Gelesen wird das Ganze: Wenn X größer gleich > ist dann // mache etwas.

In einer Software mit GUI General User Interface im deutsch Benutzeroberfläche müssen wir von einem Editfeld Daten als Text auslesen und die in einen Integer umwandeln. Dies geht mit der Funktion StrToInt().

Das UML Diagramm dazu:

Abb. 1.02 Das IF Else UML Diagramm

Abb. 1.02 Das IF Else UML Diagramm

 

Abb. 1.03 If Abfrage Beispiel Software

Abb. 1.03 If Abfrage Beispiel Software

In der Beispiel Software prüfe ich ob Zahl1 kleiner ist als Zahl 2. Bei dieser Abfrage kann nur das Wahre Ergebnis ausgegeben werden. Sollte ein Ergebnis unwahr sein ändert sich nicht. Damit auch bei einer zweiten Abfrage das wahr sollte die erste Abfrage wahr gewesen sein.

Die Button Click Funktion des Quellcodes

procedure TForm1.Button1Click(Sender: TObject);
begin
if (StrToInt(EdtZahl1.text)) < (StrToInt(EdtZahl2.Text)) then
BEGIN
EdtErgebnis.Text := 'Wahr';
END;
end;

Das ist noch ziemlich unschön daher gibt es noch eine IF Else Anweisung. Diese sehen wir uns als nächstes an.

IF Else Anweisung in Freepascal

Der Quellcode zur IF Else Abfrage

Var
X,Y : integer;
X := 1
Y := 2
IF (X > Y) then
Begin
// Mache etwas
END ELSE
BEGIN
// mach etwas anderes
END;

Bei der IF Else Abfrage habe ich nun den Else Teil hinzugefügt. Gelsen wird das ganze wie folgt: Wenn X größer als y Ist dann mache etwas wenn nicht dann mache etwas anderes. In meiner Beispiel Software kann ich mit der IF Else Abfrage schon mehr abfragen.

Das UML Diagramm dazu:

Abb. 1.04 UML Diagramm zur IF Else Abfrage

Abb. 1.04 UML Diagramm zur IF Else Abfrage

Abb. 1.05 Beispiel 3 IF Else Abfrage wahr

Abb. 1.05 Beispiel 3 IF Else Abfrage wahr

Abb. 1.05 Beispiel 3 IF Else Abfrage unwahr

Abb. 1.06 Beispiel 4 IF Else Abfrage unwahr

Die Button Click Funktion des Quellcodes
procedure TForm1.BtnProofA2Click(Sender: TObject);
begin
if (StrToInt(EdtIEAZahl1.text)) > (StrToInt(EdtIEAZahl2.Text)) then
BEGIN
EdtIEAErgebnis.Text := 'Wahr';
END ELSE
BEGIN
EdtIEAErgebnis.Text := 'Unwahr';
END;
end;

wir können nun schon zwischen Wahr und unwahr unterscheiden. Wenn wir aber wissen möchten, ob Zahl 1 kleiner oder größer ist benötigen wir noch eine weitere Abfrage. Die IF ELSE IF Abfrage diese sehen wir uns als letztes an.

Die IF ELSE IF Abfrage in Freepascal

Der Quellcode zur IF Else Abfrage

Var
X,Y : integer;
X := 1
Y := 2
IF (X > Y) then
Begin
// Ausgabe X größer Y.
END ELSE IF (X < Y) then
BEGIN
// Ausgabe X kleiner Y.
END;

Im ELSE Teil haben wir nun eine weitere IF Abfrage. Mit der wir prüfen können. Diese IF Else Anweisungen lassen sich auch weiter verschachteln. So könnten wir weiter prüfen ob Zahl 1 = Zahl 2 ist.

Das UML Diagramm dazu:

Abb. 1.06 Das UML Diagramm zur IF ELSE IF Diagramm

Abb. 1.07 Das UML Diagramm zur IF ELSE IF Diagramm

 

Kommen wir nun zu meiner Beispiel Software.

Abb. 1.05 Beispiel 3 IF Else Abfrage unwahr

Abb. 1.08 Beispiel 4 IF Else Abfrage unwahr

Abb. 1.08 IF ELSE If Abfrage Beispiel 2

Abb. 1.09 IF ELSE If Abfrage Beispiel 2

 

Die Klick Funktion des Buttons

procedure TForm1.Button2Click(Sender: TObject);

begin
if (StrToInt(EdtIEFZahl1.text)) < (StrToInt(EdtIEFZahl2.Text)) then
BEGIN
EdtIEFErgebnis.Text := 'Die Zahl1 ist kleiner!';
END ELSE IF (StrToInt(EdtIEFZahl1.text)) > (StrToInt(EdtIEFZahl2.Text)) then
BEGIN
EdtIEFErgebnis.Text := 'Die Zahl 2 ist größer!';
END;
end;

Allgemeines zum Artikel:

Die UML Diagramme wurden mit der kostenlosen Software draw.io erstellt. Die Beispiel Software ist mit 7Zip gepackt und enthält keine Exe Datei. Diese kannst du mit der Lazarus IDE selber erstellen. Einfach auf den grünen Play Button drücken oder die F9 Taste zum kompilieren und starten der Software drucken.

Hier geht es zum Herunterladen der Beispiel Software. Die Software ist 644kb groß.


Free Pascal programmieren lernen.

Wahrheitsoperatoren

In Freepascal gibt es vier Wahrheitsoperatoren das AND, das OR, das XOR und das NOT. Hiermit können wir alle logischen Operatoren nachbilden. Einschließlich das NAND (negatives UND) siehe Beispiel unten. Am Ende gibt es noch eine kleine Wahrheitsoperatoren Software um die Tabellen testen zu können.

Die Wahrheitsoperatoren kommen aus dem Bereich der Digitaltechnik. Der Vollständigkeitshalber zeige ich hier die Mathematischen Formen und die Digitalen Schaltbilder auf. Im Bereich der Digitaltechnik werden für TRUE eine 1 angegeben für FALSE eine 0. Im Bereich der Programmiersprache Free Pascal ist nur FALSE eine 0 und TRUE eine -1 bzw. alles andere.

Wahrheitsoperator loisches AND / logisches UND Gatter

Digitales AND Gatter mit Formel und Ergebnistabelle

Digitales AND Gatter mit Formel und Ergebnistabelle

Hier noch einmal die Tabelle mit der Wahrheitswerten TRUE und FALSE

 Eingang A Eingang B Ergebnis
true false false
true true true
false true false
false false false

Freepascal Code:

and

Wahrheitsoperator logisches OR Gatter / logisches Oder

Digitales OR Gatter mit Formel und Ergebnistabelle

Digitales OR Gatter mit Formel und Ergebnistabelle

Eingang A Eingang B Ergebnis
true false True
true true True
false true True
false false False

Freepascal Code

or

Wahrheitsoperator XOR  (antivalentes oder)

Digitales XOR Gatter mit Formel und Ergebnistabelle

Digitales XOR Gatter mit Formel und Ergebnistabelle

Eingang A Eingang B Ergebnis
true false False
true true TRUE
false true TRUE
false false FALSE

Freepascal Code

xor

Wahrheitsoperator NOT   logische Negation

Alle Eingabe die Null als Eingangs Signal haben werden in 1 Umgewandelt und umgekehrt. Bei einem Oder oder AND Gatter wird eine Negation als runder Kreis dargestellt. Das Oder Gatter wird dann zum NAND und das AND Gatter zum NAND.

Digitales NOT Gatter mit Formel und Ergebnistabelle

Digitales NOT Gatter mit Formel und Ergebnistabelle

E1 A
0 1
1 0

Freepascal Code

not

NAND negatives logisches AND Gatter / UND Gatter als Beispiel

Beispiel Negation eines UND das sogenannte NAND (negatives UND) Freepascal benötigt hier ein NOT AND. bei einem OR Gatter wäre es dann ein NOR.

Wahrheitsoperator NOT Beispiel NAND Negation des AND Operators / UND Operators

Digitales NAND Gatter mit Formel und Ergebnistabelle

Digitales NAND Gatter mit Formel und Ergebnistabelle

 

Eingang A Eingang B Ergebnis
true false True
true true False
false true True
false false True

 

 


Free Pascal programmieren lernen.

Vergleichsoperatoren

Mit einem Vergleichsoperator können wie der Name schon sagt Vergleiche durchgeführt werden. Die Werte die daraus resultieren sind boolesche Werte (Wahr oder Falsch). Diese werden bei Freepascal wahr engl. true als 1 und falsch engl. false 0 dargestellt. Bei der Darstellung in unserer kleinen Vergleichsoperatoren Software werden die Informationen durch die Funktion boolTostr() in true -1 und false 0 dargestellt.

Abb. 1.01 Software-Vergleichsoperatoren

Abb. 1.01 Software-Vergleichsoperatoren

< Kleiner Operator Beispiele:

  • 5 < 6 gelesen 5 ist kleiner als 6 ergibt true -1
  • 6 < 5 gelesen 6 ist kleiner als 5 ergibt false 0

> Größer Operator Beispiele:

  • 5>6 gelesen 5 ist größer als 6 ergibt false 0
  • 6>5 gelesen 6 ist größer als 5 ergibt true -1

<= Kleiner Gleich Beispiele:

  • 5<=6 gelesen 5 ist kleiner gleich 6 ergibt true -1
  • 6<=5 gelesen 6 ist kleiner gleich 5 ergibt false 0

>= Größer Gleich Beispiele:

  • 5>=6 gelesen 5 ist größer gleich als 6 ergibt false 0
  • 6>=5 gelesen 6 ist größer gleich als 5 ergibt true -1

= Gleich Operator: Beispiele:

  • 5=5 gelesen 5 ist gleich 5 und ergibt true -1
  • 5=6 gelesen 5 ist gleich 6 und ergibt false 0

<>Ungleich Operator: Beispiele:

  • 5<>5 gelesen 5 ist ungleich 5 und ergibt false 0
  • 5<>6 gelesen 5 ist ungleich 6 und ergibt true -1

Meine Beispielsoftware Vergleichsoperatoren kannst du hier als .zip Archiv mit 7Zip erstellt herunterladen. Sie steht als Programmcode für die Lazarus IDE, ohne ausführbare .exe zur Verfügung. Diese kompilierst du indem du das Projekt (.lpi Datei) in Lazarus öffnest, indem du (f9) oder den grünen Play Button drückst.


Free Pascal programmieren lernen.

Mathematische Operatoren

Die Mathematischen Operatoren erklärt anhand eines Grundrechenarten Rechners.

Der Aufbau des Grundrechenarten Rechners.

Im Kopfbereich ist das Copyright mit Logo. Dies basiert auf einem TPanel Komponente und einem zentrierten TImage Komponente.

Der eigentliche Rechner hat als Basis Content Bereich ein TPageControl. Der Eingabe, Button und Ergebnisbereich sind zusätzlich mit jeweils einem TPabel hinterlegt und farblich gestaltet über die Eigenschaft Color. Die Caption der Komponente TPanel wird leer gelassen. Im Eingabebereich und Ergebnisbereich ist die Überschrift mit der Komponente TDividerBevel erstellt. Im Eingabebereich sind Zahl1 und Zahl2 zwei Komponenten vom Typ TLabel mit den Namen LblZahl1 und LblZahl2. Die Eingabefenster sind vom Typ TEdit und tragen den Namen EdtZahl1 und EdtZahl2. Im blauen Button Bereich sind vier Buttons mit der Aufschrift Addition +, Subtraktion -, Multiplikation *, und Division / die Namen der einzelnen Button lautet wie folgt: BtnAddition, BtnSubtraktion, BtnMultiplikation und BtnDivision. Damit wir auch bei einem größeren programm die Komponenten unterscheiden können werden zusätze wie Edt für Editfeld, Lbl für Label oder Btn für Button zu den eigentlichen Namen hinzugefügt. Bei großen Software Projekten beschriftet man die Komponenten zusätzlich noch mit dem Bereichsnamen. Als Beispiel wurde da der Button nicht BtnAddition, sondern BtnGrReRAddition heißen für die Abkürzung Button (Btn) Grundrechenarten Rechner (GrReR) Addition. So kommt es bei einem großen Programm nicht dazu das zwei Button den gleichen Namen tragen.

7.1 Der Additionsoperator, Plus Operator

Die erste Prozedur ist die Addition, diese ist bei der Button Eigenschaft im Objektinspektor hinterlegt. Die Eigenschaft die wir hier verwenden ist ein OnClick Ereignis.

Nachfolgend kann du dir den Quellcode ansehen.
procedure TForm1.BtnAddititionClick(Sender: TObject);
var
douErgebnis : double;
begin
douErgebnis := StrToFloat(EdtZahl1.Text) + StrToFloat(EdtZahl2.Text);
EdtErgebnis.Text := FloatToStr(douErgebnis);
end;
In Zeile eins siehst du den Prozedur Header mit dem zugehörigen Form1 und dem Prozedurnamen. Der Prozedur Name wird automatisch festgelegt, durch den Klick auf die Eigenschaft OnClick mit den drei Punkten. In der zweiten Zeile leite wir die Variablendeklaration ein. Die dritte Zeile ist für die Festlegung der Variablen da. Wir definieren die Variable douErgebnis als Double. Double ist eine Gleitkommazahl. Danach folgt in der vierten Zeile mit dem Wort begin, die Einleitung des Prozedur Rumpfes. In der fünften Zeile wird die eigentliche Operation durchgeführt, die Addition. Die in den Editfeldern hinterlegen Zahlen sind Texte, daher müssen sie mit der Funktion StrToFloat erst in eine Zahl umgewandelt werden. Danach wird die Addition ausgeführt und das Ergebnis in strErgebnis gespeichert. In Zeile sechs wird das Ergebnis von douErgebnis durch die Funktion FloatToStr() wieder in einen Text umgewandelt. Und im Editfeld EdtErgebnis gespeichert.

7.2 Der Subtraktionsoperator, Minus Operator

Nachfolgend kannst du dir den Code für den Subtraktionsoperator ansehen

procedure TForm1.BtnSubtraktionClick(Sender: TObject);
var
douErgebnis : double;
begin
douErgebnis := StrToFloat(EdtZahl1.Text) - StrToFloat(EdtZahl2.Text);
EdtErgebnis.Text := FloatToStr(douErgebnis);
end;

Die Prozedur sieht exakt gleich aus wie beim Plusoperator bis das in Zeile eins der Prozedurname ändert und in Zeile 5 ein Minuszeichen eingesetzt wird.

7.3 Der Multiplikationsoperator, Mal Operator
Nachfolgend kannst du dir den Code für den Subtraktionsoperator ansehen.

procedure TForm1.BtnMultiplikationClick(Sender: TObject);
var
douErgebnis : double;
begin
douErgebnis := StrToFloat(EdtZahl1.Text) * StrToFloat(EdtZahl2.Text);
EdtErgebnis.Text := FloatToStr(douErgebnis);
end;
Bei dem Multiplikationsoperator wiederholt sich das Ganze noch einmal.

7.4 Der Divisionsoperator, Teilen Operator
Nachfolgend kannst du dir den Code für den Subtraktionsoperator ansehen.

procedure TForm1.BtnDivisionClick(Sender: TObject);
var
douErgebnis : double;
begin
douErgebnis := StrToFloat(EdtZahl1.Text) / StrToFloat(EdtZahl2.Text);
EdtErgebnis.Text := FloatToStr(douErgebnis);
end;

Bei dem Divisionsoperator wiederholt sich das Ganze ein weiteres mal.

Fehler und Anzeigen im Debugger.

Abb. 1.01 Debugger Fehler 01

Abb. 1.01 Debugger Fehler 01

Hier im Bild seht ihr einen Quellcode Auszug der Prozedur BtnDivisionClick aus unserem Programm und das Nachrichtenfenster von Lazarus. In Zeile 81 fehlt am Ende ein Komma. Die Nachricht des Debuggerfensters lautet: Fatal: System error. “;“ expected but “identifier EDTERGEBNIS“ found. Der Debugger beschreibt damit den Fehler sehr gut er vermisst ein Semikolon vor EdtErgebnis.

Abb. 1.02 Debugger Fehler 02

Abb. 1.02 Debugger Fehler 02

Der zweite Fehler zeigt das unsere definierte Variable in Zeile 79 kein Double, sondern ein Integer ist. Ein Integer ist eine Ganzzahl. Bei einer Division von Ganzzahlen kann auch eine Zahl mit Komma herauskommen. Ein Beispiel 5 / 2 = 2,5.
Im Nachrichtenfenster siehst du den Fehler: Use DIV instead to get an integer result = Verwenden Sie DIV um ein Integer Resultat zu erhalten. Der zweite Fehler Error: Incompatible types: got “Double“ expected LongInt. Inkompatible Typen bekam Double erwarte Integer. Das liegt daran das ich in Zeile 79 unsere Variable von Double nach Integer geändert habe. Er erwartet einen Integer Wert in Zeile 81 bekommt durch die Funktion StrToFloat aber einen Double Wert.
Gut, das soll es auch zu den Mathematischen Operatoren gewesen sein. Ich hoffe ich konnte euch ein wenig Neues beibringen und es geht im nächsten Kapitel weiter mit den Vergleichsoperatoren.


Free Pascal programmieren lernen.

Zeichen ersetzen

Zeichen ersetzen die Funktion

Du kannst ein Zeichen oder auch ein Wort durch die Funktion stringreplace() ersetzen. Dieser Befehl ist wie folgt aufgebaut:
Quellcode:

<code>stringreplace(stringEingabe, word1, word2, [rfReplaceAll, rfIgnoreCase]);</code>

  1. Stringreplace ist die Funktion
  2. String Eingabe der Text bei dem Zeichen oder Wörter ausgetaucht werden sollen
  3. Word1 ist das Wort das im Text ersetzt werden soll
  4. Word2 ist das Wort durch das Wort1 ersetzt werden soll
  5. rfReplaceAll sagt dem Programm das alle Zeichen und Wörter im String ausgetauscht werden sollen.
  6. rfIgnoreCase = Suche unabhängig von Groß- und Kleinschreibung

Zeichen ersetzen ein kleines Beispiel:

Abb. 1.01 String Replace / String ersetzten

Abb. 1.01 String Replace / String ersetzten

Wir möchten eine Benutzeroberfläche entwickeln in der wir einen beliebigen String eingeben können und in diesem String X beliebige Zeichen und Wörter ersetzen. In Abbildung 1.00 String Replace siehst du eine GUI mit 4 Editfeldern für die Eingabe und Ausgabe. Das Editfeld unter dem Label mit der Caption String Eingabe trägt den Namen EdtEingabe. Das Editfeld unter dem Label mit der Caption Zu ersetzendes Wort trägt den Namen EdtErsetzendesWort. Das Editfeld unter dem Label mit der Beschriftung Ersetzen durch trägt den Namen EdtErsetzenDurch. Das Editfeld unter dem Label mit dem Namen String Ergebnis trägt den Namen EdtStringErgebnis. Der Button trägt den Namen BtnErsetzen. Nachfolgend findest du nun den Quelltext für das Austauschen der Zeichen und Wörter. Die Prozedure ist eine in der Button Komponenten gespeicherten ONClick() Ereignis.

Quelltext:

procedure TForm1.BtnErsetzenClick(Sender: TObject);
var
stringEingabe : string;
word1, word2 : string;
stringErgebnis : string;
begin
stringEingabe:= EdtEingabe.Text;
word1 := EdtErsetzendesWort.Text;
word2 := EdtErsetzenDurch.Text;
stringErgebnis := stringreplace(stringEingabe, word1, word2, [rfReplaceAll, rfIgnoreCase]);
EdtStringErgebnis.Text := stringErgebnis;
end;

In der Zeile 03 bis 05 lege ich die variablen fest mit denen ich in der Prozedure arbeiten möchte. Man kann auch anstelle die Variablen, sofort den Namen des Editfeldes nehmen und die Eigenschaft Text anhängen. Bei späteren Programmen wirst du allerdings die Usereingaben für einen DAU Nutzer absichern. Ein DAU Nutzer ist der dümmste anzunehmende Nutzer. In Zeile 07 bis 09 übergebe ich die Inhalte der Editfeldern den String Variablen. Zeile 10 speichert das Ergebnis als String vor dem ist Zuweisungszeichen. Rechts neben dem Zuweisungszeichen ist die Funktion stringreplace(String,word1,word2, [rfReplaceAll, rfIgnoreCase]);). Die Beschreibung dazu findest du oben. In Zeile 11 wird das Ergebnis dem Edfitfeld für die Ausgabe zugewiesen. Zeile 12 beendet die Funktion.


1 6 7 8 9 10 15