Autor Beitrag
AlA
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 03.04.03 11:46 
Hallo, habe noch ein kleines Problem.
In meinem Quelltext gibt es zu viele IF-Anweisungen.
Ich muss z.B. abfragen, ob eine Variable zwischen
jeweils 2 verschiedenen Zahlenwerten liegt:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
m:=(abs(sy-y1))/(abs(sx-x1));
 if (m > 2)    and (m < 1000) then begin sz:= r1 ; end;
 if (m > 1.5)  and (m < 2)    then begin sz:= r2 ; end;    
 if (m > 0.75) and (m < 1.5)  then begin sz:= r3 ; end;
 if (m > 0.25) and (m < 0.75) then begin sz:= r4 ; end;
  if (m > 0)    and (m < 0.25) then begin sz:= r5 ; end;


Ein aderes Problem wäre dieser Block

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
if schus1=true then begin d11:=round(sqrt((abs(x2-sx11))+(abs     
   (y2sy11))));dsmm11:=round(sqrt((abs(sx-sx11))+(abs(sy-
   sy11))));  end else begin d11:=20;dsmm11:=20; end;          
if schus2=true then begin d12:=round(sqrt((abs(x2-sx12))+(abs(y2- 
   sy12))));dsmm12:=round(sqrt((abs(sx-sx12))+(abs(sy-sy12))));    
   end else begin d12:=20;dsmm12:=20; end;          
if schus3=true then begin d13:=round(sqrt((abs(x2-sx13))+(abs(y2-     
   sy13))));dsmm13:=round(sqrt((abs(sx-sx13))+(abs(sy-sy13))));    
   end else begin d13:=20;dsmm13:=20; end;          
if schus4=true then begin d14:=round(sqrt((abs(x2-sx14))+(abs(y2-
   sy14))));dsmm14:=round(sqrt((abs(sx-sx14))+(abs(sy-sy14))));    
   end else begin d14:=20;dsmm14:=20; end;


Kann ich ihn irgendwie mit einer Case-Anweisung
wiedergeben???

Moderiert von user profile iconKlabautermann: Code-Tags hinzugefügt.

_________________
ala
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 03.04.03 12:13 
Ich will Dir ja nicht zu nahe treten, aber Dein Programmierstil finde ich grauenvoll. Die Anweisungen hintereinander weg zu schreiben, ist nicht schön. Besser ist: für jede Anweisung eine Zeile. Bei kurzen Anweisung ab und zu mal zwei davon in eine Zeile.

Den ersten Code kannst Du nicht in eine Case-Anweisung packen, da es sich dabei nicht um einen aufzählbaren Variablentyp handelt.

Beim zweiten Code handelt es sich immer wieder um unterschiedliche Variablen, daher geht auch das nicht (sinnvoll) mit einer Case-Anweisung.

In den FAQs zu Object Pascal hier im Forum gibt es übrigens einen Beitrag zu IF-THEN-ELSE- und CASE-Anweisungen.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 03.04.03 12:41 
Kannst das =true weg lassen, da if-abfragen sowieso boolean werte erwarten:
ausblenden Quelltext
1:
2:
3:
if schus4 then...
//oder für =false
if not schus4 then...

:wink:

_________________
mfg.
mâximôv
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 03.04.03 14:23 
Jo, stimmt, habe ich gar nicht dran gedacht!

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
AlA Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 03.04.03 14:33 
Also das mit dem Programmierstil:
1.Hinter jedem if stehen nur 2 Anweisungen(und die else-Anweisung):
Ich lasse einfach den Satz des Pythagoras ausführen!!!
Leider kann ich den Quelltest nicht anders ausgeben da die Anzahl der
Zeilen begrenzt ist.
2.Es ist meine erste umfassende Delphi-Arbeit (12 Klasse, Inf GK)

_________________
ala
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 03.04.03 14:50 
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
  if schus1=true then
  begin
    d11:=round(sqrt((abs(x2-sx11))+(abs(y2sy11))));
    dsmm11:=round(sqrt((abs(sx-sx11))+(abs(sy-sy11))));
  end else
  begin
    d11:=20;
    dsmm11:=20;
  end;

  if schus2=true then
  begin
    d12:=round(sqrt((abs(x2-sx12))+(abs(y2-sy12))));
    dsmm12:=round(sqrt((abs(sx-sx12))+(abs(sy-sy12))));
  end else
  begin
    d12:=20;
    dsmm12:=20;
  end;

  if schus3=true then
  begin
    d13:=round(sqrt((abs(x2-sx13))+(abs(y2-sy13))));
    dsmm13:=round(sqrt((abs(sx-sx13))+(abs(sy-sy13))));
  end else
  begin
    d13:=20;
    dsmm13:=20;
  end;

  if schus4=true then
  begin
    d14:=round(sqrt((abs(x2-sx14))+(abs(y2-sy14))));
    dsmm14:=round(sqrt((abs(sx-sx14))+(abs(sy-sy14))));
  end else
  begin
    d14:=20;
    dsmm14:=20;
  end;

Siehst Du den Unterschied in der Lesbarkeit?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
AlA Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 03.04.03 16:28 
Danke für den Tip.

_________________
ala
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 03.04.03 17:30 
ausblenden Quelltext
1:
2:
d11:=round(sqrt((abs(x2-sx11))+(abs(y2sy11)))); 
    dsmm11:=round(sqrt((abs(sx-sx11))+(abs(sy-sy11))));

Kannst dir auch diverse klammern sparen:
ausblenden Quelltext
1:
2:
d11:=round(sqrt(abs(x2-sx11)+abs(y2sy11))); 
dsmm11:=round(sqrt(abs(sx-sx11)+abs(sy-sy11)));

:wink:

_________________
mfg.
mâximôv
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 03.04.03 17:43 
Und wenn man sx11..sx14 und sy11..sy14 ein Array verwendet, kann man das ganze in eine Schleife verfrachten.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var
  sx1, sy1, d1, dsmm1: array[1..4] of Double;
  schus: array[1..4] of Boolean;
  ...

var
  Index: Integer;
begin
  for Index := 1 to 4 do
    if schus[Index] then
    begin
      d1[Index] := Round(Sqrt(Abs(x2 - sx1[Index]) + Abs(y2 - sy1[Index])));
      dsmm1[Index] := Round(Sqrt(Abs(sx - sx1[Index]) + Abs(sy - sy1[Index])));
    end
    else
    begin
      d1[Index] := 20;
      dsmm1[Index] := 20;
    end;
end;

_________________
Ist Zeit wirklich Geld?