Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   If-Then oder Case-else (https://www.delphipraxis.net/131015-if-then-oder-case-else.html)

BAMatze 17. Mär 2009 15:27

Re: If-Then oder Case-else
 
Zitat:

Zitat von alleinherrscher
Hm, wenn du glänzen willst, würd könnte man es auch "etwas krank" aber interessant - so machen:

Delphi-Quellcode:

var
 temp_raum1, temp_raum2, temp_raum3:integer;
 diff_raum1, diff_raum2, diff_raum3:integer;
 referenz_temp:integer;
 summe,stufe:integer;
begin

//[zuvor noch temp_raum1 bis temp_raum3 einlesen...]

referenz_temp:=15;

diff_raum1:=int((temp_raum1-referenz_temp)/abs(temp_raum1-referenz_temp));
// =1, falls temp_raum1 > referenz_temp,sonst -1

diff_raum2:=int((temp_raum2-referenz_temp)/abs(temp_raum2-referenz_temp));
// =1, falls temp_raum2 > referenz_temp,sonst -1

diff_raum3:=int((temp_raum3-referenz_temp)/abs(temp_raum3-referenz_temp));
// =1, falls temp_raum3 > referenz_temp,sonst -1

summe:=int((diff_raum1+abs(diff_raum1)) / 2)  //addiert 1, falls diff_raum1=1 und addiert sonst 0
      +int((diff_raum2+abs(diff_raum2)) / 2)  //addiert 1, falls diff_raum2=1 und addiert sonst 0
      +int((diff_raum3+abs(diff_raum3)) / 2): //addiert 1, falls diff_raum3=1 und addiert sonst 0

// summe gibt an, in wievielen Räumen die Temperatur GRÖSSER als die Referenztemperatur ist.

Stufe:=(3-summe) - (3-summe) div 3;


//Mal überprüfen, obs überhaupt stimmt:
// Falls summe=0 => Stufe=2
// Falls summe=1 => Stufe=2
// Falls summe=2 => Stufe=1
// Falls summe=3 => Stufe=0

end;
Sorry, aber mir war grade danach :bouncing4: Und ohne eine If-Abfrage zu benutzen!!! :thumb:

//edit: code etwas besser kommentiert.

Die Lösung sieht ziemlich gut aus, du solltest aber eins noch abfangen, nämlich dass temp_raumX-referenz_temp = 0 ist. Ne Division durch 0 sollte zu einer Exception führen.

DeddyH 17. Mär 2009 15:36

Re: If-Then oder Case-else
 
Dazu braucht er aber wieder eine If-Abfrage :lol:

BAMatze 17. Mär 2009 15:38

Re: If-Then oder Case-else
 
Zitat:

Zitat von DeddyH
Dazu braucht er aber wieder eine If-Abfrage :lol:

Stimmt :dp:

alleinherrscher 17. Mär 2009 15:43

Re: If-Then oder Case-else
 
Zitat:

Zitat von BAMatze

Die Lösung sieht ziemlich gut aus, du solltest aber eins noch abfangen, nämlich dass temp_raumX-referenz_temp = 0 ist. Ne Division durch 0 sollte zu einer Exception führen.

Vollkommen richtig, das hab ich wohl vergessen und danke für das Lob!

Das müsste man irgendwie abfangen. Ich frag mich grade, wie man das am besten ohne eine If Abfrage zu verwenden. :gruebel:

//edit: Was passiert denn, wenn ich im Nenner sagen wir mal 0,1 addiere und am schluss runde anstatt INT zu verwenden...irgendwas kann man da sicher dran machen, sodass der nenner >0 bleibt...*grübel*

Win32.API 17. Mär 2009 15:47

Re: If-Then oder Case-else
 
Zitat:

Zitat von alleinherrscher
Das müsste man irgendwie abfangen. Ich frag mich grade, wie man das am besten ohne eine If Abfrage zu verwenden. :gruebel:

Delphi-Quellcode:
try
   [...]
except
   [...]
end;
Delphi-Quellcode:
assert([...] = 0);

alleinherrscher 17. Mär 2009 15:47

Re: If-Then oder Case-else
 
Zitat:

Zitat von Win32.API
Zitat:

Zitat von alleinherrscher
Das müsste man irgendwie abfangen. Ich frag mich grade, wie man das am besten ohne eine If Abfrage zu verwenden. :gruebel:

Delphi-Quellcode:
try
   [...]
except
   [...]
end;
Delphi-Quellcode:
assert([...] = 0);

Neee, das ist "unschön" :-D

alleinherrscher 17. Mär 2009 15:51

Re: If-Then oder Case-else
 
Delphi-Quellcode:
diff_raum1:=round((temp_raum1-referenz_temp)/(abs(temp_raum1-referenz_temp)+0.1);
1. temp_raum1=13 => round((13-15)/(abs(13-15)+0.1))=round(-2/2.1) = -1
2. temp_raum1=14 => round((14-15)/(abs(14-15)+0.1))=round(-1/1.1) = -1
3. temp_raum1=15 => round((15-15)/(abs(15-15)+0.1))=round(0) = 0 diese null macht aber nix kaputt
4. temp_raum1=16 => round((16-15)/(abs(16-15)+0.1))=round(1/1.1) = 1
usw...

Falls nämlich temp_raum1=15 ist, ist die Temperatur insgesamt noch hoch genug, und es muss nichts zu summe addiert werden

DeddyH 17. Mär 2009 15:52

Re: If-Then oder Case-else
 
Zitat:

Delphi-Quellcode:
diff_raum1:=int((temp_raum1-referenz_temp)/abs(temp_raum1-referenz_temp));

Das müsste doch dasselbe sein wie
Delphi-Quellcode:
diff_raum1 := Sign(temp_raum1-referenz_temp);

alleinherrscher 17. Mär 2009 15:53

Re: If-Then oder Case-else
 
Jo richtig...ups...diese funktion kannte ich nicht :D

Dann hier die shortversion:


Delphi-Quellcode:
var
summe,stufe:integer;
begin

summe:=int((Sign(temp_raum1-referenz_temp)+abs(Sign(temp_raum1-referenz_temp))) / 2)  
      + int((Sign(temp_raum2-referenz_temp)+abs(Sign(temp_raum2-referenz_temp))) / 2)
      + int((Sign(temp_raum3-referenz_temp)+abs(Sign(temp_raum3-referenz_temp))) / 2)

// summe gibt an, in wievielen Räumen die Temperatur GRÖSSER als die Referenztemperatur ist.

Stufe:=(3-summe) - (3-summe) div 3;
end;

Yeah, das nenn ich mal Code-Optimierung: :dp:

Cyf 17. Mär 2009 16:33

Re: If-Then oder Case-else
 
Da das hier eh schon nur noch Offtopic ist, isses jetzt auch egal. :stupid:
:mrgreen:
Nein Sign darfst du nicht nehmen, dann hast du wieder ein if drin. :wink:
Bei abs war das zumindest noch hinter cdq versteckt (statt nem Sprung), aber so geht's einfach nicht. :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz