![]() |
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"? |
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?
|
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; |
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. |
Re: If-Then oder Case-else
ja ich sagte ja, so wird er es wenigstens verstehen, hoffe ich zumindestens...
|
Re: If-Then oder Case-else
Delphi-Quellcode:
Ungetestet, aber sollte gehen.
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; |
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. |
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:
Sorry, aber mir war grade danach :bouncing4: Und ohne eine If-Abfrage zu benutzen!!! :thumb: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; //edit: code etwas besser kommentiert. |
Re: If-Then oder Case-else
Mich hats nur kurz in den Fingern gejuckt.
Zu b00gies Lösung: funktioniert dise überhaupt?
Delphi-Quellcode:
Immerhin ist das eine mathematische Operation mit strings.
Edit1.Text<'15'
|
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 |
Re: If-Then oder Case-else
Zitat:
|
Re: If-Then oder Case-else
Dazu braucht er aber wieder eine If-Abfrage :lol:
|
Re: If-Then oder Case-else
Zitat:
|
Re: If-Then oder Case-else
Zitat:
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* |
Re: If-Then oder Case-else
Zitat:
Delphi-Quellcode:
try
[...] except [...] end;
Delphi-Quellcode:
assert([...] = 0);
|
Re: If-Then oder Case-else
Zitat:
|
Re: If-Then oder Case-else
Delphi-Quellcode:
1. temp_raum1=13 => round((13-15)/(abs(13-15)+0.1))=round(-2/2.1) = -1
diff_raum1:=round((temp_raum1-referenz_temp)/(abs(temp_raum1-referenz_temp)+0.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 |
Re: If-Then oder Case-else
Zitat:
Delphi-Quellcode:
diff_raum1 := Sign(temp_raum1-referenz_temp);
|
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: |
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: |
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
|
Re: If-Then oder Case-else
Zitat:
Btw: StrToInt(Edit1.text) => ganz gefährlich. Wenn schon dann StrToIntDef |
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?
|
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 |
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
Dieses Thema wurde von "mkinzler" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Ist eine Frage zu Delphi/Pascal |
Re: If-Then oder Case-else
Liste der Anhänge anzeigen (Anzahl: 2)
Hier is es:
|
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? |
Re: If-Then oder Case-else
Hallo,
wenn Du diesen Code:
Delphi-Quellcode:
in Deinem Struktogramm beshrieben hast, dann fehlt Dir zumindest
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; die for Schleife (weil Du das ja für 3 Editfelder/Räume überprüfen willst). Grüße Klaus |
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. ![]() @ Cyf: Mit Delphi geht x == a als Vergleich? MfG xZise |
Re: If-Then oder Case-else
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz