Delphi-PRAXiS

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)

MatthiasxD 17. Mär 2009 14:32


If-Then oder Case-else
 
Hallo ihr lieben :-D ich hab delphi gerade im info unterricht und bin kein experte, mir wurde follgende Aufgabe gestellt:
Drei miteinander verbundene Räume weden durch eine zweistufige Heizung versorgt. Sobalt in lediglich einem Raum die Temperatur unter 15°c sinkt, schaltet sich die Stufe I ein. Liegt in mindestens zwei Rämen die Temperatur unter 15°c, so schaltet sich die Stufe II ein. Nach Eingabe der drei Temperaturen soll die Schaltstufe der Heizungausgegeben werden.
Mein Problem ist nun ich weis nicht sorichtig wie ich das nun im Qelltext schreiben soll. Ist das nun eine If-Then oder case-else oder was anderes? Und wenn ja wie genau mach ich das am besten? Also vom Qelltext her was genau schreibe ich zwischen "begin" und "end"?

b00gie 17. Mär 2009 14:36

Re: If-Then oder Case-else
 
paar Infos brauchen wir. Wie wird die Temperatur übergeben? Hast du 3 Edit-Felder? Oder wie sieht das Ganze aus?

b00gie 17. Mär 2009 14:41

Re: If-Then oder Case-else
 
Also eine ganz "banale Lösung", jedoch denke ich mal für den Infounterricht gut nachzuvollziehen.
Du brauchst 3 Edits für die Temperaturen, 1 Label für das Ergebnis und 1 Button zum berechnen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i:=0;
  if Edit1.Text<'15' then i:=i+1;
  if Edit2.Text<'15' then i:=i+1;
  if Edit3.Text<'15' then i:=i+1;

  if i=1 then Label1.Caption := 'Stufe 1';
  if i>1 then Label1.Caption := 'Stufe 2';
end;

Cyf 17. Mär 2009 14:41

Re: If-Then oder Case-else
 
Den fertigen Quelltext wird dir sicher niemand geben [Edit: ok doch :evil: und auchnoch imho mies formatiert und mit ifs wo ein case hingehört], aber du musst erst überlegen wie du die Sache angehen willst, im Wesentlichen hast du ja zwei Möglichkeiten.

1. Du überprüfst beginnend mit jedem Raum einzeln beginnend (also 3x), ob die Temperatur höher ist und prüfst falls ja, ob einer der beiden anderen Räume auch noch über 15°C liegt und reagierst entsprechend.

2. Du zählst erst in wie vielen Räumen die Temperatur höher liegt und überprüfst hinterher einmal auf die Anzahl.

Version 1 führt zu ziemlichen Spaghetti-Code und ist unflexibler, falls es z.B. mehr Räume geben soll, deswegen dürfte die 2te schöner sein.

b00gie 17. Mär 2009 14:44

Re: If-Then oder Case-else
 
ja ich sagte ja, so wird er es wenigstens verstehen, hoffe ich zumindestens...

Frankfurtoder 17. Mär 2009 14:51

Re: If-Then oder Case-else
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, ii: Integer;
begin
  i:=0;
  for ii := 1 to 3 do
  begin
    if strtoint(TEdit(FindComponent('Edit'+ IntToStr(ii))).text) < 15 then
    i:=i+1
  end;
  if i=1 then Label1.Caption := 'Stufe 1'
  else if i>1 then Label1.Caption := 'Stufe 2';
end;
Ungetestet, aber sollte gehen.

Tyrael Y. 17. Mär 2009 14:56

Re: If-Then oder Case-else
 
b00gie und Frankfurtoder ihr beiden habt ihm gerade null komma nix geholfen.
Ihr habt ihn eher näher zu ner 5 bei der nächsten Arbeit gebracht.

Totalen Anfängern sollte man tunlichst keinen fertigen Code vorsetzen,
sondern sie Schritt für Schritt zum Ziel begleiten.

Ich hoffe in Zukunft macht ihr das nicht, kurzfristige Hilfe in so einem Fall
ist eher ein Langzeitgift, daß sich rächen wird.

alleinherrscher 17. Mär 2009 15:00

Re: If-Then oder Case-else
 
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.

Frankfurtoder 17. Mär 2009 15:00

Re: If-Then oder Case-else
 
Mich hats nur kurz in den Fingern gejuckt.

Zu b00gies Lösung: funktioniert dise überhaupt?

Delphi-Quellcode:
Edit1.Text<'15'
Immerhin ist das eine mathematische Operation mit strings.

quendolineDD 17. Mär 2009 15:19

Re: If-Then oder Case-else
 
Nein, da hier nicht wie in C dann der ASCII-Code verglichen wird. Aber du könntest

StrToInt(Edit1.text) < 15 testen

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:

alleinherrscher 17. Mär 2009 17:14

Re: If-Then oder Case-else
 
:-D Wie machen wirs dann? Noch irgendwelche Vorschläge? :gruebel: Am besten direkt auf Assembler ebene :coder: Ne, belassen wir es mal dabei, wa ;-) Irgendwie muss der Code ja auch noch dem Lehrkörper erklärbar sein

worker 17. Mär 2009 19:34

Re: If-Then oder Case-else
 
Zitat:

Zitat von quendolineDD
Nein, da hier nicht wie in C dann der ASCII-Code verglichen wird. Aber du könntest

StrToInt(Edit1.text) < 15 testen

Teste das Beispiel und Du wirst schlau.

Btw: StrToInt(Edit1.text) => ganz gefährlich. Wenn schon dann StrToIntDef

MatthiasxD 29. Mär 2009 19:49

Re: If-Then oder Case-else
 
Danke für die hilfe! :-D ich habs mit dem beispiel von frankfurtoder probiert und es funktioniert! ich muss aber noch ein struktogramm erstellen. ich hab jetz was ausgemalt was mir nich ganz richtig erscheint. kann bitte einer ein struktugramm zu der procedur von frankfurtoder erstellen damit ich es mit meinem vergleichen kann?

Klaus01 29. Mär 2009 19:59

Re: If-Then oder Case-else
 
.. könntest Du bitte Dein Struktogramm hier einstellen,
wir können dann darauf schauen ob es denn korrekt ist.

Grüße
Klaus

fkerber 29. Mär 2009 19:59

Re: If-Then oder Case-else
 
Hi!

Lade doch deines hier hoch und man wird dir sicher sagen, ob es richtig ist, oder wo noch ein Fehler steckt...


Ciao, Frederic

DP-Maintenance 29. Mär 2009 20:01

DP-Maintenance
 
Dieses Thema wurde von "mkinzler" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Ist eine Frage zu Delphi/Pascal

MatthiasxD 30. Mär 2009 14:46

Re: If-Then oder Case-else
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hier is es:

Cyf 30. Mär 2009 15:08

Re: If-Then oder Case-else
 
":=" ist eine Zuweisung, "=" oder "==" eine Überprüfung auf Gleichheit.
Außerdem wäre es schön, wenn du Bilder künftig als .jpg oder .gif hochlädst. :wink:

[Edit]Und der Vergleich eines Strings mit einer Zahl macht irgendwie keinen Sinn, sollte die Umwandlung nicht eher anders herum sein?

Klaus01 30. Mär 2009 15:12

Re: If-Then oder Case-else
 
Hallo,

wenn Du diesen Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, ii: Integer;
begin
  i:=0;
  for ii := 1 to 3 do
  begin
    if strtoint(TEdit(FindComponent('Edit'+ IntToStr(ii))).text) < 15 then
    i:=i+1 
  end;
  if i=1 then Label1.Caption := 'Stufe 1'
  else if i>1 then Label1.Caption := 'Stufe 2';
end;
in Deinem Struktogramm beshrieben hast, dann fehlt Dir zumindest
die for Schleife (weil Du das ja für 3 Editfelder/Räume überprüfen willst).

Grüße
Klaus

xZise 30. Mär 2009 15:15

Re: If-Then oder Case-else
 
Hallo MatthiasxD,
bei deinen Struktogrammen wird nur ein Raum überprüft (je nachdem wie groß ii ist). ich bin mir zwar nicht sicher, wie der dazugehören Code lautet, aber ich meine das war das mit den FinComponent? Dann müsstest du zuerst i mit 0 deklarieren und eine Schleife einbauen. In jeder Ausführung der Schleife wird dann der Wert des entsprechenden Raumes getestet. Und dann nur noch einmal überprüfen, ob i = 1 oder > 2 ist und entsprechend reagieren, fertig. Hier findest du entsprechende Grafiken.

@ Cyf: Mit Delphi geht x == a als Vergleich?

MfG
xZise

Cyf 30. Mär 2009 15:40

Re: If-Then oder Case-else
 
Zitat:

Zitat von xZise
@ Cyf: Mit Delphi geht x == a als Vergleich?

Struktogramme sollten normalerweise möglichst sprachneutral gehalten werden, insofern ist's eine Sache was man "sprachneutral" nennt, in anderen Sprachen (C, Basic, Java :P ) ist "=" nurmal die Zuweisung, von daher kann man sich jetzt aussuchen, ob man ":=" und "=" oder "=" und "==" nimmt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr.

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