| Autor |
Beitrag |
Beginner87
Hält's aus hier
Beiträge: 4
Windows 7 und Ubuntu 10.04
Delphi
|
Verfasst: So 20.06.10 19:10
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):
================================================================
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
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: 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
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Für diesen Beitrag haben gedankt: Beginner87
|
|
Beginner87 
Hält's aus hier
Beiträge: 4
Windows 7 und Ubuntu 10.04
Delphi
|
Verfasst: 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
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: 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
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Für diesen Beitrag haben gedankt: Beginner87
|
|
Beginner87 
Hält's aus hier
Beiträge: 4
Windows 7 und Ubuntu 10.04
Delphi
|
Verfasst: So 20.06.10 20:12
Hm schade,
gibt es vielleicht noch eine andere Möglichkeit außer case?
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: 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
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 20.06.10 21:58
Für diesen Beitrag haben gedankt: Beginner87
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: 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 
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
Beginner87 
Hält's aus hier
Beiträge: 4
Windows 7 und Ubuntu 10.04
Delphi
|
Verfasst: 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
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: 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 
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
|