Autor Beitrag
Beginner87
Hält's aus hier
Beiträge: 4

Windows 7 und Ubuntu 10.04
Delphi
BeitragVerfasst: 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):

================================================================

ausblenden volle Höhe 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              //fuer Variation
    begin
         if RadioGroup2.ItemIndex = 0 then                  //ohne Wiederholung
                result:= ((fak(n))/(fak(n-k)));
                lbl_result.Caption:= floattostr(result);
         if RadioGroup2.ItemIndex = 1 then                  //mit Wiederholung
                result:= (exp(k*ln(n)));
                lbl_result.Caption:= floattostr(result);
     end;
 if RadioGroup1.ItemIndex = 1 then              //fuer Kombination
    begin
         if RadioGroup2.ItemIndex = 0 then                  //ohne Wiederholung
                result:= ((fak(n))/((fak(n-k)*fak(k))));
                lbl_result.Caption:= floattostr(result);
          if RadioGroup2.ItemIndex = 1 then                 //mit Wiederholung
                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 user profile iconKha: Delphi-Tags hinzugefügt
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if length(trim(edt_n.text)) < 1 then
begin
 //FEhlermeldung, dass N leer ist
 exit;
end;

if length(trim(edt_k.text)) < 1 then
begin
 //FEhlermeldung, dass K leer ist
 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 Threadstarter
Hält's aus hier
Beiträge: 4

Windows 7 und Ubuntu 10.04
Delphi
BeitragVerfasst: 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:

ausblenden 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!'//FEhlermeldung, dass N leer ist
 exit;
end;

if length(trim(edt_k.text)) < 1 then
begin
 lbl_result.Caption:=' Bitte eine Zahl fuer k eingeben!'//FEhlermeldung, dass K leer ist
 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 user profile iconKha: Code- durch Delphi-Tags ersetzt
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4

Windows 7 und Ubuntu 10.04
Delphi
BeitragVerfasst: So 20.06.10 20:12 
Hm schade,

gibt es vielleicht noch eine andere Möglichkeit außer case?
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 20.06.10 21:58 
user profile iconBeginner87 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:
ausblenden 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!'//FEhlermeldung, dass N leer ist
    Exit;
  end;

  if not TryStrToFloat(edt_k.Text, k) then
  begin
    lbl_result.Caption := ' Bitte eine Zahl fuer k eingeben!'//FEhlermeldung, dass K leer ist
    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

Für diesen Beitrag haben gedankt: Beginner87
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4

Windows 7 und Ubuntu 10.04
Delphi
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Mo 21.06.10 10:24 
Moderiert von user profile iconNarses: 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.