Entwickler-Ecke
Sonstiges (Delphi) - Der Case-Fall für ein Kombinatorik-Programm
Beginner87 - So 20.06.10 19:10
Titel: Der Case-Fall für ein Kombinatorik-Programm
Hallo Leute,
hab mich hier nun mal registriert, um vielleicht Hilfe zu erhalten ;)
Ich habe ein Programm für die Kombinatorik geschrieben und möchte es nun noch etwas verbessern.
Bei der Kombinatorik werden die die "Operatoren" n und k genutzt.
Hier ein Teil des Codes (ohne Funktion der Fakultät):
================================================================
Delphi-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: 40:
| procedure TForm1.btn_solveClick(Sender: TObject); var n,k,result : extended; begin n:= strtofloat(edt_n.Text); k:= strtofloat(edt_k.Text);
case n of k>n result:=' k muss kleiner oder gleich n sein!' ; k<1 result:=' k darf nicht kleiner als 1 sein!' ; end;
if n<1 then lbl_result.Caption:=' n darf nicht kleiner 1 sein,' + #13 + 'oder ziehen Sie aus einer nicht vorhandenen Menge ?' else if k>n then lbl_result.Caption:=' k muss kleiner oder gleich n sein!' else if k<1 then lbl_result.Caption:=' k darf nicht kleiner als 1 sein!' else
begin if RadioGroup1.ItemIndex = 0 then begin if RadioGroup2.ItemIndex = 0 then result:= ((fak(n))/(fak(n-k))); lbl_result.Caption:= floattostr(result); if RadioGroup2.ItemIndex = 1 then result:= (exp(k*ln(n))); lbl_result.Caption:= floattostr(result); end; if RadioGroup1.ItemIndex = 1 then begin if RadioGroup2.ItemIndex = 0 then result:= ((fak(n))/((fak(n-k)*fak(k)))); lbl_result.Caption:= floattostr(result); if RadioGroup2.ItemIndex = 1 then result:= ((fak(n+k-1))/(fak(n-k)*fak(k))); lbl_result.Caption:= floattostr(result); end; end; end; |
================================================================
Die Berechnungen stimmen, nur gibt mir Delphi halt Fehlermeldungen aus, sobald man für n oder k nichts eingibt und man den Button "solve" drückt.
Wie ihr sehen könnt, habe ich mit "case" versucht die 3 If-Anweisungen irgendwie zu bündeln. Jedoch klappt das nicht.
Hat einer von euch eine Idee wie ich die Fälle, die nicht auftreten dürfen, in einer Anweisung bündeln kann? :)
Grüße,
Martin.
Moderiert von
Kha: Delphi-Tags hinzugefügt
ZeitGeist87 - So 20.06.10 19:20
Hallo!
Sobald du nichts eingibst, schmeißt er dir einen Fehler beim Umwandeln des Strings in den Float.
Dir fehlt folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| if length(trim(edt_n.text)) < 1 then begin exit; end;
if length(trim(edt_k.text)) < 1 then begin exit; end; |
length() gibt die Anzahl ans Chars im String zurück -> als Integer
trim() schneidet am Anfang und am Ende eines Strings Leerzeichen ab
Das machen wir hier aus dem Grund: Wenn einer bei N und K ein Leerzeichen eingibt ist die
length(eingabe) größer 0 und somit gültig.
Aber aus nichts Float machen ist schwierig ;-)
LG
Stefan
Beginner87 - So 20.06.10 19:42
Danke @ ZeitGeist87:
Nach mehrmaligen Versuchen habe ich gemerkt, dass dieses Befehlskette ganz an Anfang stehen muss. Das klappt nun danke :)
Jedoch suche ich immer noch eine Möglichkeit alle "verbotenen" Fälle die derzeit noch mit if aufgeführt sind, mit einer Verzweigung wie "case" ? zu vereinen:
Delphi-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:
| procedure TForm1.btn_solveClick(Sender: TObject); var n,k,result : extended; begin
if length(trim(edt_n.text)) < 1 then begin lbl_result.Caption:=' Bitte eine Zahl fuer n eingeben!'; exit; end;
if length(trim(edt_k.text)) < 1 then begin lbl_result.Caption:=' Bitte eine Zahl fuer k eingeben!'; exit; end;
n:= strtofloat(edt_n.Text); k:= strtofloat(edt_k.Text);
if n<1 then lbl_result.Caption:=' n darf nicht kleiner 1 sein!' else if k>n then lbl_result.Caption:=' k muss kleiner oder gleich n sein!' else if k<1 then lbl_result.Caption:=' k darf nicht kleiner als 1 sein!' else |
Moderiert von
Kha: Code- durch Delphi-Tags ersetzt
ZeitGeist87 - So 20.06.10 19:47
Leider hast du verschiende Prüfungen. Einmal auf Eingabe (String) und einmal auf Wertigkeit (Float).
Das lässt sich nicht ohne weiteres in einen einzigen Case fassen.
Somit kannst du nur den Weg über zwei Case-Blöcke gehen.
LG
Stefan
Beginner87 - So 20.06.10 20:12
Hm schade,
gibt es vielleicht noch eine andere Möglichkeit außer case?
ZeitGeist87 - So 20.06.10 20:18
Definitiv nein.
Warum?
Case erwartet einen Wert auf den geprüft werden kann.
Du hast aber mindestens zwei: n und k.
Somit schonmal zwei Case für jede Prüfung einzeln.
Da ist das If die beste Lösung für dich im Moment.
Leider keine erfreuliche Nachricht.
LG
Stefan
jaenicke - So 20.06.10 21:58
Beginner87 hat folgendes geschrieben : |
Delphi-Quelltext 1:
| if length(trim(edt_n.text)) < 1 then | |
Und was machst du, wenn jemand 2a23 eingibt?
Diese Art der Prüfung ist Blödsinn.
Warum nicht so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm1.btn_solveClick(Sender: TObject); var n, k, result: extended; begin if not TryStrToFloat(edt_n.Text, n) then begin lbl_result.Caption := ' Bitte eine Zahl fuer n eingeben!'; Exit; end;
if not TryStrToFloat(edt_k.Text, k) then begin lbl_result.Caption := ' Bitte eine Zahl fuer k eingeben!'; Exit; end;
if n < 1 then lbl_result.Caption := ' n darf nicht kleiner 1 sein!' else if k > n then lbl_result.Caption := ' k muss kleiner oder gleich n sein!' else if k < 1 then lbl_result.Caption := ' k darf nicht kleiner als 1 sein!' else |
ZeitGeist87 - So 20.06.10 22:00
Gut in dem Falle hatte ich TryStrToFloat den Vorzug geben sollen. Ich hab beim Tippen nicht dran gedacht, dass er nur Zahlen eingeben möchte.
Zu sagen es ist Blödsinn ist etwas sehr kurzsichtig meiner Meinung nach.
Im Nachfolgenden wandelt er um, somit hätte er TryStrToFloat auch dort machen können.
Bitte nicht mit "aber das sind 5 Zeilen mehr, Prüfung ist unnnötig" argumentieren.
Hat sogar einen Vorteil: Man kann den Fehler genauer spezifizieren und sagen: Das Feld ist leer (aus welchen Gründen auch immer).
PS Aber warum den Leuten immer alles hinschmeißen - lieber probieren lassen und sobald es nicht geht -> Hilfe suchen/finden ;-)
Beginner87 - Mo 21.06.10 08:11
Guten Morgen,
jop nun reagiert er auch auf Buchstaben anstatt das ein Programmerror erscheint @ jaenicke :)
Aber die Lösung von Zeitgeist87 war auch neu für mich und hab somit wieder etwas dazu gelernt ;).
Gut, wenn es keine Lösung gibt markiere ich den Beitrag mit Frage beantwortet.
Danke an euch beide :)
ZeitGeist87 - Mo 21.06.10 10:24
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Meine Lösung funktioniert aber nur, wenn du wie beschreiben das
TryStrToFloat gleich danach verwendest ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!