Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Falls Variable(n) vorhanden mache das sonst mache dies (https://www.delphipraxis.net/112765-falls-variable-n-vorhanden-mache-das-sonst-mache-dies.html)

thknub 26. Apr 2008 20:15


Falls Variable(n) vorhanden mache das sonst mache dies
 
Hallo,

Ich möchte Programm zur Berechnung von Dreiecken coden. Dabei bin ich auf ein Problem gestoßen:

Ich möchte 6 Variablen, die man eingeben kann, aber nicht eingeben muss. Wenn ich z.B. nur 3 Variablen eingebe, soll das Programm trotzdem alles, was man damit errechnen kann, ausgeben.

Genau genommen würde das bedeuten:

Eingabe sind Variablen a,b,c,d,e,f

Delphi-Quellcode:
m := sin(d)*b/sin(e)
oder wenn b oder e nicht vorhanden ist
Delphi-Quellcode:
m := sin(d)*c/sin(f)
und wenn keine nötige Variable vorhanen ist mache nichts

Ist das irgendwie zu bewerkstelligen?

mkinzler 26. Apr 2008 20:18

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Überprüfe doch den Inhalt der Variablen

omata 26. Apr 2008 20:23

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Vielleicht hilft dir ja das weiter...

Delphi-Quellcode:
  TDreieck = class
  private
  public
    function Berechnung(a,b,c,d,e,f:integer):real; overload;
    function Berechnung(a,b,c,d,e:integer):real; overload;
    function Berechnung(a,b,c,d:integer):real; overload;
    function Berechnung(a,b,c:integer):real; overload;
    function Berechnung(a,b:integer):real; overload;
    function Berechnung():real; overload;
  end;
Gruss
Thorsten

Stefan92 26. Apr 2008 20:25

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Falls es ohne die Variable zu einem Laufzeitfehler kommt, könntest du folgendes versuchen:

Delphi-Quellcode:
try
  m := sin(d)*b/sin(e);
except
  m := sin(d)*c/sin(f);
end;
Gruß

Stefan

Edit:
Vergiss meinen Vorschlag, es gibt bei deinem Problem zu viele Fälle.
@hoika: Ich glaube, thknub möchte wissen, wie man die Variablen auf leeren Inhalt prüft.

hoika 26. Apr 2008 20:26

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Halloo,

6 Boolean-Variablen,
die anzeigen, ob die Variablen gefüllt worden sind.


Heiko

inherited 26. Apr 2008 20:27

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
oder du initalisierst sie einfach mit einem Wert der nicht eingegeben werden kann und überprüfst sie nachher darauf.

thknub 26. Apr 2008 21:22

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Wenn ich die Variante von omata benutze antwortet er mir [Pascal Fehler] E2065 Ungenügende Forward- oder External-Deklaration: 'TForm5.Berechnung'.

Hier nochmal der Code

Delphi-Quellcode:
unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,Math;

type
  TForm5 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit12: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Button1: TButton;
    Label13: TLabel;
    Label14: TLabel;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Edit17: TEdit;
    Edit18: TEdit;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Edit19: TEdit;
    Edit20: TEdit;
    Edit21: TEdit;
    Edit22: TEdit;
    Label24: TLabel;
    Label25: TLabel;
    Edit23: TEdit;
    Edit24: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public

  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Button1Click(Sender: TObject);




 var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r: REAL;

begin

a := StrToFloat(edit1.Text);
b := StrToFloat(edit2.Text);
c := StrToFloat(edit3.Text);
d := StrToFloat(edit4.Text);
e := StrToFloat(edit5.Text);
f := StrToFloat(edit6.Text);
g := sqrt(sqr(b)+sqr(c)-2*b*c*Cos(d));
h := sqrt(sqr(a)+sqr(c)-2*a*c*Cos(e));
i := sqrt(sqr(a)+sqr(b)-2*a*b*Cos(f));
j := ArcCos((sqr(b)+sqr(c)-sqr(a))/(2*b*c));
k := ArcCos((sqr(a)+sqr(c)-sqr(b))/(2*a*c));
l := ArcCos((sqr(a)+sqr(b)-sqr(c))/(2*a*b));
m := sin(d)*b/sin(e);
n := sin(e)*a/sin(d);
o := sin(f)*a/sin(d);
p := ArcSin((a*Sin(e))/b);
q := ArcSin((b*Sin(d))/a);
r := ArcSin((c*Sin(d))/a);

edit7.Text := FloatToStr(g);
edit8.text := FloatToStr(h);
edit9.Text := FloatToStr(i);
edit10.Text := FloatToStr(j);
edit11.Text := FloatToStr(k);
edit12.Text := FloatToStr(l);
edit13.Text := FloatToStr(m);
edit14.Text := FloatToStr(n);
edit15.text := FloatToStr(o);
edit16.Text := FloatToStr(p);
edit17.Text := FloatToStr(q);
edit18.Text := FloatToStr(r);


end;

end.
Wobei g und m sowie h und n das gleiche sind.(Hatte probiert es über verschiedene Ausgabefelder zu machen, aber es kommt immer folgende Nachricht, wenn ich auf testen klicke und nicht in alle Eingabe Felder etwas schreibe: " ist kein gültiger Gleitkommawert

Ich hätte auch nicht wirklich ein Problem damit 3 Ausgabefelder zu machen, wenn man wenigstens nicht überall was eingeben muss, wobei mir zwei oder auch nur eins besser gefielen...

@inherited
Ich versteh jetzt nicht so ganz, was du meinst

mkinzler 26. Apr 2008 21:33

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Zitat:

Wenn ich die Variante von omata benutze antwortet er mir [Pascal Fehler] E2065 Ungenügende Forward- oder External-Deklaration: 'TForm5.Berechnung'.
Du musst die Methoden natürlich auch implementieren.

thknub 26. Apr 2008 22:13

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Das mache ich wie? Kann mir mal jemand ein Bsp. geben? Sorry, ich bin noch ziemlich neu auf dem Gebiet (hab gestern Abend angefangen ein wenig rumzucoden)

hesubat 27. Apr 2008 00:15

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Was meinst Du zu folgender Loesung:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r: REAL; bo1,bo2,bo3,bo4,bo5,bo6:boolean;
begin

bo1:=false; bo2:=false; bo3:=false; bo4:=false; bo5:=false; bo6:=false;
if edit1.text<>'' then begin a := StrToFloat(edit1.Text); bo1:=true; end;
if edit2.text<>'' then begin b := StrToFloat(edit2.Text); bo2:=true; end;
if edit3.text<>'' then begin c := StrToFloat(edit3.Text); bo3:=true; end;
if edit4.text<>'' then begin d := StrToFloat(edit4.Text); bo4:=true; end;
if edit5.text<>'' then begin e := StrToFloat(edit5.Text); bo5:=true; end;
if edit6.text<>'' then begin f := StrToFloat(edit6.Text); bo6:=true; end;
if bo2 and bo3 and bo4 then g := sqrt(sqr(b)+sqr(c)-2*b*c*Cos(d));
if bo1 and bo3 and bo5 then h := sqrt(sqr(a)+sqr(c)-2*a*c*Cos(e));
if bo1 and bo2 and bo6 then i := sqrt(sqr(a)+sqr(b)-2*a*b*Cos(f));
if bo1 and bo2 and bo3 then j := ArcCos((sqr(b)+sqr(c)-sqr(a))/(2*b*c));
if bo1 and bo2 and bo3 then k := ArcCos((sqr(a)+sqr(c)-sqr(b))/(2*a*c));
if bo1 and bo2 and bo3 then l := ArcCos((sqr(a)+sqr(b)-sqr(c))/(2*a*b));
if bo2 and bo4 and bo5 then m := sin(d)*b/sin(e);
if bo1 and bo4 and bo5 then n := sin(e)*a/sin(d);
if bo1 and bo4 and bo6 then o := sin(f)*a/sin(d);
if bo1 and bo2 and bo5 then p := ArcSin((a*Sin(e))/b);
if bo1 and bo2 and bo4 then q := ArcSin((b*Sin(d))/a);
if bo1 and bo3 and bo4 then r := ArcSin((c*Sin(d))/a);

edit7.Text := FloatToStr(g);
edit8.text := FloatToStr(h);
edit9.Text := FloatToStr(i);
edit10.Text := FloatToStr(j);
edit11.Text := FloatToStr(k);
edit12.Text := FloatToStr(l);
edit13.Text := FloatToStr(m);
edit14.Text := FloatToStr(n);
edit15.text := FloatToStr(o);
edit16.Text := FloatToStr(p);
edit17.Text := FloatToStr(q);
edit18.Text := FloatToStr(r);

end;

Fussball-Robby 27. Apr 2008 00:28

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
@thknub: Ich würde dir eher mal die Einsteiger-Tutorials hier in der DP und vor allem auf www.dsdt.info empfehlen. Bevor du hier waghalsig versuchst, ein Problem auf solch unschöne Weise zu lösen, solltest du dich lieber erst einmal in Delphi einarbeiten.

Mfg

hesubat 27. Apr 2008 09:17

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Hallo Fussball-Robby,

deine Worte:

ich würde dir eher mal die Einsteiger-Tutorials hier in der DP und vor allem auf www.dsdt.info empfehlen. Bevor du hier waghalsig versuchst, ein Problem auf solch unschöne Weise zu lösen, solltest du dich lieber erst einmal in Delphi einarbeiten.

Meine Anwort:

Bevor Du Kritik uebst an der Programmierung anderer, solltest Du Dir mal ueberlegen, in welcher Situation der Fragende steckt. Er braucht Hilfe, und zwar schnell, denn er moechte ein mathematisches Problem per Programm loesen. Ich habe nach seinen Angaben das Programm eingegeben, die Komponenten installiert und den Code ergaenzt. Der Code mag in Deinen Augen unschoen sein, aber er funktioniert.
Desweiteren sollte Deine Kritik positiv sein, d.h. dass der Link, den Du sendest nicht im Nirwana landet mit irre vielen Moeglichkeiten. Er sollte direkt zur Programmloesung fuehren.

Gruss

DeddyH 27. Apr 2008 09:23

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Zitat:

Zitat von thknub
Das mache ich wie? Kann mir mal jemand ein Bsp. geben? Sorry, ich bin noch ziemlich neu auf dem Gebiet (hab gestern Abend angefangen ein wenig rumzucoden)

Was ist dann falsch daran, auf die Tutorials zu verweisen? Es ist zwar einzusehen, dass man gleich am Anfang die "eierlegende Wollmilchsau" coden möchte, aber ohne Grundlagen kann das nichts werden, das haben wir alle wohl einmal einsehen müssen.

grenzgaenger 27. Apr 2008 10:03

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Zitat:

Zitat von thknub
Delphi-Quellcode:
...
  var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r: REAL;

begin

a := StrToFloat(edit1.Text);
b := StrToFloat(edit2.Text);
c := StrToFloat(edit3.Text);
d := StrToFloat(edit4.Text);
e := StrToFloat(edit5.Text);
f := StrToFloat(edit6.Text);
g := sqrt(sqr(b)+sqr(c)-2*b*c*Cos(d));
h := sqrt(sqr(a)+sqr(c)-2*a*c*Cos(e));
i := sqrt(sqr(a)+sqr(b)-2*a*b*Cos(f));
j := ArcCos((sqr(b)+sqr(c)-sqr(a))/(2*b*c));
k := ArcCos((sqr(a)+sqr(c)-sqr(b))/(2*a*c));
l := ArcCos((sqr(a)+sqr(b)-sqr(c))/(2*a*b));
m := sin(d)*b/sin(e);
n := sin(e)*a/sin(d);
o := sin(f)*a/sin(d);
p := ArcSin((a*Sin(e))/b);
q := ArcSin((b*Sin(d))/a);
r := ArcSin((c*Sin(d))/a);
...

wauuuuuuu, nur was soll es bedeuten???? hier mal ein paar tipps...
  • geb deinen variablen mal einen vernünftigen namen
  • trenne die eingabe, die ausgabe und die berechnung

was mir nicht ganz klar wird, was soll dein programm eigentlich machen? kansnt du das mal ein wenig besser erklären und ggf. deine form (als .JPG) anhängen, damit wir uns hier einen visuellen eindruck machen können. was mir nicht ganz klar ist, weshalb verwendet du so viele variablen, welche du dann doch nicht verwendest und der user diese auch nicht einzugeben braucht?

schöne grüsse
GG

thknub 27. Apr 2008 18:49

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Ich kann mit Ein-Buchstaben-Variablen besser umgehen als mit Wort-Variablen.

Wie gesagt, das Programm soll der Berechnung von Dreiecken dienen.
Variablen a,b,c stehen für die Seiten des Dreiecks und d,e,f für die Winkel. Diese sollten eingegeben werden, aber nicht alle, denn man kann aus einigen Variablen ja dann auch die anderen errechnen. Ich möchte, dass aus den eingegebenen Variablen, alle mit diesen Variablen errechenbaren ausgerechnet werden. Da es pro Variable aber mind. 3 Varianten gibt (die alle unterschiedliche Voraussetzungen haben), um diese auszurechnen habe ich schon zwei Ausgabefelder je Variable.

Eingabe

Seite a

Seite b

Seite c

Winkel d

Winkel e

Winkel f



Ausgabe (2x)

Seite a

Seite b

Seite c

Winkel d

Winkel e

Winkel f

So weit so gut. Aber wenn ich jetzt bei Eingabe nicht alle Felder fülle meint er Keine gültige Gleitkommaoperation...

Also Anliegen: Ausgabe trotz mehrerer Lösungformeln auf 1 Feld je Variable zu begrenzen und Nicht alle Variablen eingeben zu müssen und trotzdem alle errechenbaren Ergebnisse zu erhalten.

thknub 27. Apr 2008 19:02

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
http://img228.imageshack.us/img228/7...vncbxvxmb1.jpg


Nicht die Version von oben, aber so sollte es in etwa aussehen

grenzgaenger 27. Apr 2008 19:16

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
ups, du willst wirklich den anwender erlauben, alles mögliche einzugeben und auszulassen? da wünsch ich dir jetzt schon viel spass. denke, um die ganzen varianten in den griff zu bekommen, solltest dir die antwort #3 von omata ansehen. für die umwandlung, bekommst du das in den griff mit StrToFloatDef . würde dir dennoch raten, die buchstaben in worte zu wandeln, damit du auch noch in ein paar wochen mit deinem code zurecht kommst.

wie gesagt, würd ich die berechnung auf alle fälle von der darstellung/eingabe trennen. damit kannst du dann später auch viel einfacher deine lösungen in andere programme, funktionen, etc. einbinden. <HTH> GG

sx2008 28. Apr 2008 04:14

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Ich würd's so angehen:
In einem Record wird ein Wert und die Info, ob der Wert überhaupt gesetzt wurde gespeichert:
Delphi-Quellcode:
TOptionalNumber = record
  value : Extended; // der Wert
  valid : Boolean; // zeigt an, ob der Wert gültig ist
end;
Es gibt 6 Eingabewerte:
Delphi-Quellcode:
var
  seite1, seite2, seite3, alpha, beta, gamme : TOptionalNumber;
  // man könnte auch ein array[1..6] of TOptionalNumber;
  // verwenden, aber mit Einzelvariablen bleibt es übersichtlicher
jetzt kommt der Trick, wir verwenden eine Unterfunktion, um die 6 Variablen zu befüllen:
Delphi-Quellcode:
function GetOptionalNumber(edit:TEdit):TOptionalNumber;
var
  s : string;
begin
  s := Trim(edit.text); // Leerzeichen weg, die stören
  result.valid := s <> '';
  if result.valid then
    result.Value := StrToFloat(s); // Verbesserungmöglichkeit: Val()-Funktion verwenden
end;
Das Befüllen der 6 Variablen geht damit kurz und knackig:
Delphi-Quellcode:
  seite1 := GetOPtionalNumber(EditSeite1);
  ... // usw
Wenn du jetzt wissen willst, ob Winkel beta eingegeben wurde:
Delphi-Quellcode:
if beta.valid then ...
Und jetzt kommt etwas Mathe ins Spiel. Es gibt folgende Fälle:
a.) 3 Seiten
b.) 2 Seiten & 1 Winkel
c.) 1 Seite & 2 Winkel
d.) 3 Winkel
Fall a.) und d.) sind ganz einfach, bei b.) würde ich verlangen, dass der Winkel zwischen den Seiten ist, bei c.) sind die Winkel an den Ecken der Seite
Für die Fälle a.) bis d.) schreibst du je eine Unterfunktion.

cruiser 28. Apr 2008 04:51

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Die Befüllung von .Valid würde ich davon abhängig machen ob .Value zu setzen geht... und gabs da nicht auch noch NaN (Not a number) für Float-Werte?

Fall D ist nicht lösbar:
3 Winkel sagen nichts über das Größenverhältnis aus. Statt dessen gibt es mehrere Varianten bei 1 und 2 gegebenen Winkeln

thknub 28. Apr 2008 18:50

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
So das sieht jetzt vllt. etwas unschön und kompliziert aus, aber es funzt, zumindes zur Hälfte. Wenn ich nur Seiten eingebe kommt trotzdem: Ungültige Gleitkommaoperation Weiß jemand warum?

Delphi-Quellcode:
var a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a2, b2, c2, d2, e2, f2, g2, h2, i2, j2, k2, l2, m2, n2, o2, p2, q2, r2, s2, t2, u2, v2, w2, x2, y2, z2, a3, b3, c3, d3, e3, f3, h3, i3, j3, k3, l3, m3, n3, o3, p3, q3, r3, s3, t3, u3, v3, w3, x3, y3, z3 : REAL;
    bo1, bo2, bo3, bo4, bo5, bo6, bo7, bo8, bo9, bo10, bo11, bo12, bo13, bo14, bo15, bo16, bo17, bo18, bo19, bo20 :boolean;

begin

{Eingabe}

{Seiten}
a := StrToFloat(edit1.text);
b := StrToFloat(edit2.Text);
c := StrToFloat(edit3.Text);
{Winkel}
d := StrToFloat(edit4.Text);
e := StrToFloat(edit5.Text);
f := StrToFloat(edit6.Text);

{-----------------------------------------------------------------------------}

{Berechnung}

{Variablendefinierung Gradmaß<->Bogenmaß}
g := 2*Pi/360;   {Gradmaß -> Bogenmaß}
h := 360/(2*Pi); {Bogenmaß -> Gradmaß}

{Boolean Variablen}
if a>0 then bo1 := True else bo1 := False;
if b>0 then bo2 := True else bo2 := False;
if c>0 then bo3 := True else bo3 := False;
if d>0 then bo4 := True else bo4 := False;
if e>0 then bo5 := True else bo5 := False;
if f>0 then bo6 := True else bo6 := False;

 {Berechnung Seite a}
if bo2 and bo4 and bo5 = True then i := (b*sin(d*g))/sin(e*g) else i := 0;
if bo3 and bo4 and bo6 = True then j := (c*sin(d*g))/sin(f*g) else j := 0;
if bo2 and bo3 and bo4 = True then k := sqrt(sqr(b)+sqr(c)-(2*b*c*cos(d*g))) else k := 0;

{Berechnung Seite b}
if bo1 and bo4 and bo5 = True then l := (a*sin(e*g))/sin(d*g) else l := 0;
if bo3 and bo5 and bo6 = True then m := (c*sin(e*g))/sin(f*g) else m := 0;
if bo1 and bo3 and bo5 = True then n := sqrt(sqr(a)+sqr(c)-(2*a*c*cos(e*g))) else n := 0;

{Berechnung Seite c}
if bo1 and bo4 and bo6 = True then o := (a*sin(f*g))/sin(d*g) else o := 0;
if bo2 and bo5 and bo6 = True then p := (b*sin(f*g))/sin(e*g) else p := 0;
if bo1 and bo2 and bo6 = True then q := sqrt(sqr(a)+sqr(b)-(2*a*b*cos(f*g))) else q := 0;

{Berechnung Winkel Alpha}
if bo1 and bo2 and bo5 = True then r := h*arcsin((a*sin(e*g))/b) else r := 0;
if bo1 and bo3 and bo6 = True then s := h*arcsin((a*sin(f*g))/c) else s := 0;
if bo1 and bo2 and bo3 = True then t := h*arccos(sqr(a)/(sqr(b)+sqr(c)-2*b*c)) else t := 0;
if bo5 and bo6 = True then u := 180-e-f else u := 0;

{Berechnung Winkel Beta}
if bo1 and bo2 and bo4 = True then v := h*arcsin((b*sin(d*g))/a) else v := 0;
if bo2 and bo3 and bo6 = True then w := h*arcsin((b*sin(f*g))/c) else w := 0;
if bo1 and bo2 and bo3 = True then x := h*arccos(sqr(b)/(sqr(a)+sqr(c)-2*a*c)) else x := 0;
if bo4 and bo6 = True then y := 180-d-f else y := 0;

{Berechnung Winkel Gamma}
if bo1 and bo3 and bo4 = True then z := h*arcsin((c*sin(d*g))/a) else z := 0;
if bo2 and bo3 and bo5 = True then a2 := h*arcsin((c*sin(e*g))/b) else a2 := 0;
if bo1 and bo2 and bo3 = True then b2 := h*arccos(sqr(c)/(sqr(a)+sqr(b)-2*a*b)) else b2 := 0;
if bo4 and bo5 = True then c2 := 180-a-b else c2 := 0;

{Berechnung Flächeninhalt A}
if a>b then bo7 := True else bo7 := False;
if a>c then bo8 := True else bo8 := False;
if b>c then bo9 := True else bo9 := False;
if b>a then bo10 := True else bo10 := False;
if c>a then bo11 := True else bo11 := False;
if c>b then bo12 := True else bo12 := False;

{Seite a = Längste Seite}
if bo1 and bo2 and bo3 and bo7 and bo8 = True then d2 := (1/2)*b*c*sin(g*d) else d2 := 0;
{Seite b = Längste Seite}
if bo1 and bo2 and bo3 and bo9 and bo10 = True then e2 := (1/2)*a*c*sin(g*e) else e2 := 0;
{Seite c = Längste Seite}
if bo1 and bo2 and bo3 and bo11 and bo12 = True then f2 := (1/2)*a*b*sin(g*f) else f2 := 0;

{Berechnung Umfang u}
if bo1 and bo2 and bo3 then g2 := a+b+c else g2 := 0;

{----------------------------------------------------------------------------}

{Definierung der Ausgabevariablen}

{Seite a}
if i>0 then h2 := i else h2 := i2;
if j>0 then i2 := j else i2 := j2;
if k>0 then j2 := k else j2 := 0;

{Seite b}
if l>0 then k2 := l else k2 := l2;
if m>0 then l2 := m else l2 := m2;
if n>0 then m2 := n else m2 := 0;

{Seite c}
if o>0 then n2 := o else n2 := o2;
if p>0 then o2 := p else o2 := p2;
if q>0 then p2 := q else p2 := 0;

{Winkel Alpha}
if r>0 then q2 := r else q2 := r2;
if s>0 then r2 := s else r2 := s2;
if t>0 then s2 := t else s2 := t2;
if u>0 then t2 := u else t2 := 0;

{Winkel Beta}
if v>0 then u2 := v else u2 := v2;
if w>0 then v2 := w else v2 := w2;
if x>0 then w2 := x else w2 := x2;
if y>0 then x2 := y else x2 := 0;

{Winkel Gamma}
if z>0 then y2 := z else y2 := z2;
if a2>0 then z2 := a2 else z2 := a3;
if b2>0 then a3 := b2 else a3 := b3;
if c2>0 then b3 := c2 else b3 := 0;

{Flächeninhalt A}
if d2>0 then c3 := d2 else c3 := d3;
if e2>0 then d3 := e2 else d3 := e3;
if f2>0 then e3 := f2 else e3 := 0;

{Umfang u}
if g2>0 then f3 := g2 else f3 := 0;


{Ausgabe}
edit7.Text := FloatToStr(h2);
edit8.Text := FloatToStr(k2);
edit9.Text := FloatToStr(n2);
edit10.Text:= FloatToStr(q2);
edit11.Text:= FloatToStr(u2);
edit12.Text:= FloatToStr(y2);
edit13.Text:= FloatToStr(c3);
edit14.Text:= FloatToStr(f3);





end;

edit:\\ Wenn ich drei Seiten angebe funzt es nicht. Egal ob ich noch zusätzliche Variablen angebe.

p80286 29. Apr 2008 11:23

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Hallo Thknub,

hast Du es mal mit dem Debugger versucht? mit [F7] und [F8] geht einem manchmal ein ganzer Kronleuchter auf.

Bei mir erhalte ich bei folgendem Sourcecode:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a : real;
begin
  form1.Edit3.Text:='xxx';
  a:=strtofloat(form1.Edit3.text);
end;
"xxx ist kein gültiger Gleitkommawert"

Da hat er recht! Du solltest deine Eingabetextfelder zumindestens mit "0.0" vorbelegen!

Buchstaben und andere Fehleingaben mußt Du dann auch noch herausklauben.

Viel Spaß

K-H

mkinzler 29. Apr 2008 11:26

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Ich würde eher TryStrToFloat(), TMaskEdit oder Falscheingaben verhindern

glkgereon 29. Apr 2008 11:50

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Ein paar Tipps zu deinem Code:

Delphi-Quellcode:
if a>0 then bo1 := True else bo1 := False;
ist äquivalent zu
Delphi-Quellcode:
bol := a>0;
Ausserdem lässt sich
Delphi-Quellcode:
if bo2 and bo4 and bo5 = True then
ersetzen durch
Delphi-Quellcode:
if bo2 and bo4 and bo5 then
ansonsten ist es dank der "intuitiven Benennung" deiner Variablen praktisch unmöglich dir zu sagen, was da falsch ist :?

[Edit]
Achso, es wäre sehr praktisch zu wissen, wo genau der Fehler auftritt...
Allgemein:
StrToFloat wenn "Edit1" da steht funktioniert nicht
und durch null teilen wird auch eher ungern gesehen :wink:

thknub 29. Apr 2008 14:50

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
@ p80286

Sie sind mi 0 vorbelegt.

@ glkgereon

Zitat:

Allgemein:
StrToFloat wenn "Edit1" da steht funktioniert nicht
und durch null teilen wird auch eher ungern gesehen
Meinst du im Feld edit1 steht edit1? Ich hab überall 0 drin stehen...
Wo teile ich durch null?

tomsel 29. Apr 2008 16:08

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
ich glaub, du solltest die Formeln zur Winkelberechnung noch mal prüfen. Übrigens: Der Debugger würde dir m.E. sehr gut weiterhelfen, die Fehlerstelle zu finden.

thknub 29. Apr 2008 16:30

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Wenn ich F7 drück kommt das:

http://img514.imageshack.us/img514/346/dfgla6.png

Bei F8 ist die nächste Zeile bordeauxrot markiert, also
Delphi-Quellcode:
Application.Initialize;

Fussball-Robby 29. Apr 2008 16:32

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Dann drück solange F7, bis dass du an der richtigen Stelle bist :wink:

p80286 29. Apr 2008 16:52

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Hallo thknub,

ich hab mir die Freiheit genommen und Deinen Source mal ausprobiert, da ich es nicht so mit der Mathematik habe und darum nicht so ganz verstanden habe was das Programm genau machen soll.

Code:
{Berechnung Winkel Gamma}
if bo1 and bo2 and bo3 = True then b2 := h*arccos(sqr(c)/(sqr(a)+sqr(b)-2*a*b)) else b2 := 0;
Da wird arccos wohl mit den falschen Werten gefüttert.
wenn a=11 und b=22 und c=33 dann ist der Inhalt der Klammer =9 und das mag arccos nicht.
Schau mal in die Hilfe.

viel Spaß noch

K-H

thknub 29. Apr 2008 17:43

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Das Programm ist dazu gedacht mathematische Aufgaben zu lösen und da wird es garantiert keine ernstgemeinte Aufgabe geben, die diese Werte vorgibt, da die Werte kein Dreieck ergeben, sondern einen Strich...

thknub 29. Apr 2008 17:46

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Die mathematische Grundlage dieser Formel ist der Cosinussatz: c²=a²+b²-2*a*b*cos(Gamma). Ich denke doch, dass ich richtig umgestellt habe...

edit: Ich hab falsch umgestellt. Es müsste sein:


c²=a²+b²-2*a*b*Cos(Gamma) | /(2ab)
c²/(2ab)=(a²+b²)/(2ab)+Cos(Gamma) | -(a²+b²)/(2ab)
(c²-a²-b²)/(2ab)=Cos(Gamma) | arccos
Gamma = arccos((c²-a²-b²)/(2ab))

So richtig?

tomsel 30. Apr 2008 07:34

Re: Falls Variable(n) vorhanden mache das sonst mache dies
 
Ääh... ... nein! Aber DAS ist nun DEIN Problem. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 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