Mehrere if else schleifen hintereinander

Für Fragen von Einsteigern und Programmieranfängern...
Lorz
Beiträge: 4
Registriert: Mi 8. Jun 2022, 19:59

Mehrere if else schleifen hintereinander

Beitrag von Lorz »

Guten Abend,
ich bin gerade dabei ein Programm zu schreiben, bei dem man Variablen eingibt die in eine allgemeine Quadratische Funktion eingesetzt werden und dann für die stellen X=-5 bis x=5 die Y werte ausgibt. Das klappt auch ganz gut, nur will ich nun machen, dass wenn ein Feld leer bleibt der Wert für die Variable = 1 gesetzt wird. Bei der ersten Variable hat es geklappt, aber bei den folgenden irgendwie nicht, kann gut sein, dass ich die Schleifen falsch benutze.

Code: Alles auswählen

procedure TForm1.BitBtn1Click(Sender: TObject);
var F, A, B, C : Real; I : integer;
begin
  if Edit1.Text = '' then
  A:=1
  else
  if Edit2.Text = '' then
  B:=1
  else
  if Edit3.Text = '' then
  C:=1
  else


  A:=StrToFloat(Edit1.Text);
  B:=StrToFloat(Edit2.Text);
  C:=StrToFloat(Edit3.Text);

  ListBox1.Items.Clear;

  for I := (-5) to 5 do
    begin
    F := A * I**2 + B * I + C;
    ListBox1.Items.Add(FloatToStr(F));

LG
Zuletzt geändert von m.fuchs am So 12. Jun 2022, 20:12, insgesamt 1-mal geändert.
Grund: Highlighter gesetzt

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Mehrere if else schleifen hintereinander

Beitrag von Epcop »

Lass das else weg:

Code: Alles auswählen

if Edit1.Text = '' then begin
A:=1
end;

if Edit2.Text = '' then begin
B:=1
end;

if Edit3.Text = '' then begin
C:=1
end;


Aber bei dem Aufbau wird es schwierig, weil die Variable A dann wieder erneut eingelesen wird und wieder leer sein kann.

Deshalb am besten beide Abschnitte vertauschen, und nur die Variable prüfen:

Code: Alles auswählen

A:=StrToFloat(Edit1.Text);
B:=StrToFloat(Edit2.Text);
C:=StrToFloat(Edit3.Text);

if A = '' then begin
A:=1
end;

if B = '' then begin
B:=1
end;

if C = '' then begin
C:=1
end;

Und wenn du dem komplett aus dem Weg gehen willst:

Lass den Benutzer nicht in ein Edit.text Feld eingeben, sondern besser in ein SpinEdit Feld (Misc). Dort sind nur Zahlenwerte erlaubt. Leerzeichen o.ä. gar nicht möglich. Dann kannst du dir die Prüfung ganz sparen.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Mehrere if else schleifen hintereinander

Beitrag von Winni »

Hi!

Spar die ganzen "else" Arien:

Code: Alles auswählen

...
if Edit1.Text = '' then Edit1.text := '1';
if Edit2.Text = '' then Edit2.text := '1';
if Edit3.Text = '' then Edit3.text := '1';

A:=StrToFloat(Edit1.Text);
B:=StrToFloat(Edit2.Text);
C:=StrToFloat(Edit3.Text);
...
Winni

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Mehrere if else schleifen hintereinander

Beitrag von theo »

Auf die Gefahr hin, pingelig zu erscheinen; IF - THEN - ELSE ist keine Schleife.
Was du weiter unten hast ( for I := (-5) to 5 do), ist eine Schleife.
Es kann nicht schaden, das zu wissen.

https://de.wikipedia.org/wiki/Schleife_(Programmierung)
https://de.wikipedia.org/wiki/Bedingte_ ... erzweigung

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mehrere if else schleifen hintereinander

Beitrag von Mathias »

Code: Alles auswählen

if A = '' then begin
  A:=1
end;
Das wird sicher nicht funktionieren A kann nicht Interger in String gleichzeitig sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Mehrere if else schleifen hintereinander

Beitrag von siro »

Code: Alles auswählen

F := A * I**2 + B * I + C; 
ist hier nicht ein Sternchen zu viel ?
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Mehrere if else schleifen hintereinander

Beitrag von wp_xyz »

Nein, es ist im ersten Beitrag von einer quadratischen Funktion die Rede, und der Operator '**' bedeutet "Potenzierung", also: I**2 ist dasselbe wie I*I (https://www.freepascal.org/docs-html/ref/refch12.html).

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mehrere if else schleifen hintereinander

Beitrag von Mathias »

siro hat geschrieben:
Mo 13. Jun 2022, 14:31

Code: Alles auswählen

F := A * I**2 + B * I + C; 
ist hier nicht ein Sternchen zu viel ?
Es gibt eine overload Funktion, die dies zulässt, könnte Potenz sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Mehrere if else schleifen hintereinander

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mo 13. Jun 2022, 14:48
siro hat geschrieben:
Mo 13. Jun 2022, 14:31

Code: Alles auswählen

F := A * I**2 + B * I + C; 
ist hier nicht ein Sternchen zu viel ?
Es gibt eine overload Funktion, die dies zulässt, könnte Potenz sein.
Es heißt „überladener Operator” oder „operator overload”. „overload Funktion” ist was anderes.
FPC Compiler Entwickler

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Mehrere if else schleifen hintereinander

Beitrag von Epcop »

Mathias hat geschrieben:
Mo 13. Jun 2022, 14:16

Code: Alles auswählen

if A = '' then begin
  A:=1
end;
Das wird sicher nicht funktionieren A kann nicht Interger in String gleichzeitig sein.
Ja, ich war zu Faul... und Semikolon fehlt auch noch... ;-) War mehr Pseudo Code

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Mehrere if else schleifen hintereinander

Beitrag von Winni »

Hi!

Wenn Du so faul bist, warum schreibst Du so viel Überlüssiges???

Nach einem if .. then darf genau EINE Anweisung stehen,
Wenn dort mehrere stehen, müssen diese mit begin ... end umschlossen werden.
Bei einer Anweisung ist dies legal aber überflüssig.

Diese ist also völlig legaler Pascal Code:

Code: Alles auswählen

If a= 1 then ...
   else
    if a = 2 then .....
      else if a = 3 then ...
          else
           ....
           ;


Winni

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Mehrere if else schleifen hintereinander

Beitrag von siro »

entschuldigt, ich muss da nochmal nachfragen:
Mein Compiler meckert mich an wenn ich es so schreibe:

Code: Alles auswählen

var F:Real;
    I:integer;
begin
  F:=I**2;
end;           


Error: Operator is not overloaded:"LongInt"**"ShortInt"

Muss man da etwas in den Compiler Optionen einstellen ?
Zudem verstehe ich nicht warum man dies tut.
I*I ist doch viel einleuchtender und kürzer als I**2

da fällt mir grad ein, gibt es dafür nicht sqr
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mehrere if else schleifen hintereinander

Beitrag von Mathias »

siro hat geschrieben:
Di 14. Jun 2022, 08:27
entschuldigt, ich muss da nochmal nachfragen:
Mein Compiler meckert mich an wenn ich es so schreibe:

Code: Alles auswählen

var F:Real;
    I:integer;
begin
  F:=I**2;
end;           


Error: Operator is not overloaded:"LongInt"**"ShortInt"

Muss man da etwas in den Compiler Optionen einstellen ?
Zudem verstehe ich nicht warum man dies tut.
I*I ist doch viel einleuchtender und kürzer als I**2

da fällt mir grad ein, gibt es dafür nicht sqr
Muss da nicht die Unit Math eingebunden werden ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Mehrere if else schleifen hintereinander

Beitrag von PascalDragon »

siro hat geschrieben:
Di 14. Jun 2022, 08:27
Muss man da etwas in den Compiler Optionen einstellen ?
Der Operator ist in der Unit Math deklariert, also musst du diese auch einbinden.
siro hat geschrieben:
Di 14. Jun 2022, 08:27
Zudem verstehe ich nicht warum man dies tut.
I*I ist doch viel einleuchtender und kürzer als I**2

da fällt mir grad ein, gibt es dafür nicht sqr
Mit dem Operator bist du ja nicht auf 2 beschränkt. Du kannst ja auch i**3 oder i**5 machen. Oder i**-2, i**-3 oder gar i**2.4. Im Endeffekt das gleiche, was du mit den Power und IntPower Funktionen machen kannst und da ist ** definitiv kürzer. ;)
FPC Compiler Entwickler

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Mehrere if else schleifen hintereinander

Beitrag von Socke »

siro hat geschrieben:
Di 14. Jun 2022, 08:27
Error: Operator is not overloaded:"LongInt"**"ShortInt"

Muss man da etwas in den Compiler Optionen einstellen ?
Die Operatoren sind in der Unit math definiert. Nehme diese in deine uses-Klausel auf und schon funktionert es.
siro hat geschrieben:
Di 14. Jun 2022, 08:27
Zudem verstehe ich nicht warum man dies tut.
I*I ist doch viel einleuchtender und kürzer als I**2

da fällt mir grad ein, gibt es dafür nicht sqr
Überladene Operatoren sind auch nur syntaktischer Zucker und resultieren in regulären Funktionsaufrufen. Du hast einfach eine etwas andere Syntax.

Dabei ist ** allgemeiner und dabei besser optimiert:
  • sqr() ist eine einfache Multiplikation (I*I)
  • Der Operator ** nutzt intern die Funktionen power() und intpower() und kann alle Potenzen bilden
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten