Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - CASE-Anweisung


AlA - Do 03.04.03 11:46
Titel: CASE-Anweisung
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:


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


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.


Christian S. - 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


maximus - Do 03.04.03 12:41

Kannst das =true weg lassen, da if-abfragen sowieso boolean werte erwarten:

Quelltext
1:
2:
3:
if schus4 then...
//oder für =false
if not schus4 then...

:wink:


Christian S. - Do 03.04.03 14:23

Jo, stimmt, habe ich gar nicht dran gedacht!


AlA - 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)


Christian S. - Do 03.04.03 14:50


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?


AlA - Do 03.04.03 16:28

Danke für den Tip.


maximus - Do 03.04.03 17:30


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:

Quelltext
1:
2:
d11:=round(sqrt(abs(x2-sx11)+abs(y2sy11))); 
dsmm11:=round(sqrt(abs(sx-sx11)+abs(sy-sy11)));

:wink:


AndyB - 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.


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;