Entwickler-Ecke

Sonstiges (Delphi) - Probleme beim erstellen eines Dreiecksrechner


pump - Sa 25.09.04 01:54
Titel: Probleme beim erstellen eines Dreiecksrechner
Also der rechner soll am ende winkel, umfang, fläeche, hoehen der seiten und den radius des inkreises sowie umkreises berechnen, wenn nur die seiten a b und c gegeben sind.

hier der programmtext bis jetzt:


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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
unit Unit1;

interface

uses
  Math, // UNit in der der ArcCos Bezeichner Steht
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    LabelSeitea: TLabel;
    LabelSeiteb: TLabel;
    LabelSeitec: TLabel;
    LabelWinkela: TLabel;
    LabelWinkelb: TLabel;
    LabelWinkelc: TLabel;
    LabelFlaeche: TLabel;
    LabelUmfang: TLabel;
    EditSeitea: TEdit;
    EditSeiteb: TEdit;
    EditSeitec: TEdit;
    EditWinkela: TEdit;
    EditWinkelb: TEdit;
    EditFlaeche: TEdit;
    EditUmfang: TEdit;
    berechnen: TButton;
    Beenden: TButton;
    EditWinkelc: TEdit;
    clear: TPanel;
    EditHoehec: TEdit;
    EditHoeheb: TEdit;
    EditHoehea: TEdit;
    EditInkreis: TEdit;
    EditUmkreis: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure berechnenClick(Sender: TObject);
    procedure BeendenClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.berechnenClick(Sender: TObject);
var seitea,seiteb,seitec,winkela,winkelb,winkelc,flaeche,umfang,hoehea,hoeheb,hoehec: Integer;
begin
  seitea:=StrToInt(EditSeitea.text); // Gibt an, dass die Seitea im Edit-Fenster EditSeitea eingegeben ist.
  seiteb:=StrToInt(EditSeiteb.text); // Gibt an, dass die Seiteb im Edit-Fenster EditSeiteb eingegeben ist.
  seitec:=StrToInt(EditSeitec.text); // Gibt an, dass die Seitec im Edit-Fenster EditSeitec eingegeben ist.
  winkela:=round(arccos((Seitea*Seitea-Seiteb*Seiteb-Seitec*Seitec)/(-2*Seiteb*Seitec))); // Rechnet den Winkel alpha aus.
  winkelb:=round(arccos((Seiteb*Seiteb-Seitec*Seitec-Seitea*Seitea)/(-2*Seitec*Seitea))); // Rechnet den Winkel beta aus.
  winkelc:=round(arccos((Seitec*Seitec-Seitea*Seitea-Seiteb*Seiteb)/(-2*Seitea*Seiteb))); // Rechnet den Winkel gamma aus.
  hoehea:=round(seiteb*sin(arccos((Seitec*Seitec-Seitea*Seitea-Seiteb*Seiteb)/(-2*Seitea*Seiteb))));
  hoeheb:=round(seitec*sin(arccos((Seitea*Seitea-Seiteb*Seiteb-Seitec*Seitec)/(-2*Seiteb*Seitec))));
  hoehec:=round(seitea*sin(arccos((Seiteb*Seiteb-Seitec*Seitec-Seitea*Seitea)/(-2*Seitec*Seitea))));
  umfang:=seitea+seiteb+seitec; // Rechnet den Umfang aus.
  flaeche:=round(0.5*seitea*seiteb*sin(3.1415/180*(round(arccos((Seitec*Seitec-Seitea*Seitea-Seiteb*Seiteb)/(-2*Seitea*Seiteb)))))); // Rechnet die Fläeche aus.
  EditFlaeche.text:=IntToStr(Flaeche); // Besagt, dass die Fläche im Edit-Fenster EditFlaeche eingefügt wird.
  EditUmfang.text:=IntToStr(Umfang); // Besagt, dass der Umfang im Edit-Fenster EditUmfang eingefügt wird.
  EditWinkela.Text:=IntToStr(Winkela); // Besagt, dass der Winkel alpha im Edit-Fenster EditWinkela eingefügt wird.
  EditWinkelb.Text:=IntToStr(Winkelb); // Besagt, dass der Winkel beta im Edit-Fenster EditWinkelb eingefügt wird.
  EditWinkelc.Text:=IntToStr(Winkelc); // Besagt, dass der Winkel gamma im Edit-Fenster EditWinkelc eingefügt wird.
  EditHoehea.Text:=IntToStr(hoeheb);
  EditHoeheb.Text:=IntToStr(hoehea);
  EditHoehec.Text:=IntToStr(hoehec);
end;

procedure TForm1.BeendenClick(Sender: TObject);
begin
    close; // Schließt das Programm.
end;

end.


das problem ist folgendes:

1. ich will die ergebnisse mit nachkommastellen
2. bei den winkeln kommen völlig falsche ergebnisse raus
3. es soll noch ein "clear" button rein, der alle edit felder wieder zurücksetzt

arbeite erst seit 4 schulstd. mit delphi also nicht lachen ^^

ps: die inkreis umkreis formleln muessen noch rein und lauten:
umkreis: a / (2 * sin(alpha))
inkreis: c * sin(alpha / 2) * sin(beta / 2) / sin((alpha + beta) / 2)

schoen wär noch wenn einer mir das machen koennte, dass man einfach 3 verschiedene eingaben machen muss

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


.Chef - Sa 25.09.04 09:45

Zu 1.: Du musst Real-Typen (Stichwort Floatingpoint) zum Rechnen nehmen.
Zu 2.: Trigonometrische Umkehrfunktionen liefern Ergebnisse zwischen -pi/2 und +pi/2. Da du aber im Dreieck nur mit postiven Winkeln rechnest, musst du das anpassen.
Zu 3.: Hier versteh ich nicht, wo das Problem liegt.

Noch als Tipp: Du kannst in Delphi "pi" direkt so hinschreiben, der Compiler kennt das. ;-)

Gruß,
Jörg


ttauch - Sa 25.09.04 11:17

löschen kannst du ein editfeld indem du nix reinschreiben lässt
edit1.text:=''

oder es so löschst:
edit1.clear


Tobias1 - Sa 25.09.04 12:18

Zitat:

ps: die inkreis umkreis formleln muessen noch rein und lauten:
umkreis: a / (2 * sin(alpha))
inkreis: c * sin(alpha / 2) * sin(beta / 2) / sin((alpha + beta) / 2)

schoen wär noch wenn einer mir das machen koennte, dass man einfach 3 verschiedene eingaben machen muss


Wo ist das Problem, rechne hier einfach mit winkela,winkelb weiter.
Also:


Delphi-Quelltext
1:
2:
3:
var umkreis,inkreis:real;
umkreis:=seitea/(2*sin(winkela));
inkreis:=seitec * sin(winkela / 2) * sin(winkelb / 2) / sin((winkela + winkel) / 2);


Delete - Sa 25.09.04 14:22

Die Winkelfunktionen erwarten die Werte in RAD und nicht in DEG. Entsprechende Umrechnungsfunktionen sind in der Unit Math drinne.


pump - Sa 25.09.04 17:39

hey ich hab erst 4 std inner schule delphi gehabt bombardiert mich nicht mit so vielen fachausdrücken ^^

1. was sind real typen und wie mach ich die?
2. wie muss ich die anpassen
3. is mir nu klar

also nochma zu 2 wenn ich die seiten z.b. alle 2 einheiten lang hab dann kommt da als ergebnis bei den winkeln 1 raus obwohl da 60 rauskommen muesste

was zum teufel ist rad bzw deg???

so das mit dem real hab ich nu glaub ich kapiert. hier der neue quelltext:


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:
procedure TForm1.berechnenClick(Sender: TObject);
var seitea,seiteb,seitec,winkela,winkelb,winkelc,flaeche,umfang,hoehea,hoeheb,hoehec,inkreis,umkreis: real;
begin
  seitea:=StrToInt(EditSeitea.text); // Gibt an, dass die Seitea im Edit-Fenster EditSeitea eingegeben ist.
  seiteb:=StrToInt(EditSeiteb.text); // Gibt an, dass die Seiteb im Edit-Fenster EditSeiteb eingegeben ist.
  seitec:=StrToInt(EditSeitec.text); // Gibt an, dass die Seitec im Edit-Fenster EditSeitec eingegeben ist.
  winkela:=arccos((Seitea*Seitea-Seiteb*Seiteb-Seitec*Seitec)/(-2*Seiteb*Seitec)); // Rechnet den Winkel alpha aus.
  winkelb:=arccos((Seiteb*Seiteb-Seitec*Seitec-Seitea*Seitea)/(-2*Seitec*Seitea)); // Rechnet den Winkel beta aus.
  winkelc:=arccos((Seitec*Seitec-Seitea*Seitea-Seiteb*Seiteb)/(-2*Seitea*Seiteb)); // Rechnet den Winkel gamma aus.
  hoehea:=seiteb*sin(winkelc); // Rechnet die Hoehe a aus.
  hoeheb:=seitec*sin(winkela); // Rechnet die Hoehe b aus.
  hoehec:=seitea*sin(winkelb); // Rechnet die Hoehe c aus.
  umfang:=seitea+seiteb+seitec; // Rechnet den Umfang aus.
  flaeche:=hoehea*seitea/2// Rechnet die Fläeche aus.
  umkreis:=seitea/(2*sin(winkela)); // Rechnet den Umkreis um das Dreieck aus.
  inkreis:=seitec * sin(winkela / 2) * sin(winkelb / 2) / sin((winkela + winkelb) / 2); // Rechnet den Inkreis in dem Dreieck aus.
  EditFlaeche.text:=FloatToStr(Flaeche); // Fügt die Fläche in das Edit-Feld EditFlaeche ein.
  EditUmfang.text:=FloatToStr(Umfang); // Fügt den Imfang in das Edit-Feld EditUmfang ein.
  EditWinkela.Text:=FloatToStr(Winkela); // Fügt den Wert des Winkel alpha in das Edit-Feld EditWinkela ein.
  EditWinkelb.Text:=FloatToStr(Winkelb); // Fügt den Wert des Winkel beta in das Edit-Feld EditWinkelb ein.
  EditWinkelc.Text:=FloatToStr(Winkelc); // Fügt den Wert des Winkel gamma in das Edit-Feld EditWinkelc ein.
  EditHoehea.Text:=FloatToStr(hoeheb); // Fügt den Wert der Hoehe a in das Edit-Feld EditHoehea ein.
  EditHoeheb.Text:=FloatToStr(hoehea); // Fügt den Wert der Hoehe b in das Edit-Feld EditHoeheb ein.
  EditHoehec.Text:=FloatToStr(hoehec); // Fügt den Wert der Hoehe c in das Edit-Feld EditHoehec ein.
  EditUmkreis.Text:=FloatToStr(umkreis); // Fügt den Radius des Umkreises in das Edit-Feld EditUmkreis ein.
  EditInkreis.Text:=FloatToStr(inkreis); // Fügt den Radius des Inkreises in das Edit-Feld EditInkreis ein.
end;


so nu macht der mucken mit dem inttostr befehlen fehlermeldung:

Es gibt keine überladene Version von Inttostr, die man mit diesen argumenten aufrufen kann.


Moderiert von user profile icontommie-lie: Code- durch Delphi-Tags ersetzt.


.Chef - Sa 25.09.04 18:01

Logischerweise geht InttoStr nun nicht mehr. Benutze FloattoStr oder FloattoStrF.


pump - Sa 25.09.04 18:15

jep bin ich auch grad drauf gekommen^^ so nu is aber komisch, dass die winkel immer noch falsch ausgerechent werden aber umkreis bzw inkreis sind richtig obwohl die winkel dafür ja benoetigt werden... daraus schließe ich, dass irgendwas mit den arccos befehlen falsch ist... da ich ohen das arccos den normalen cos wert raus bekomme (d.h. bei alle seiten = 2 ist cos=0,5, arccos muesste 60 sein ist aber dann 1,0471975511966)


.Chef - Sa 25.09.04 20:24

Luckie hat folgendes geschrieben:
Die Winkelfunktionen erwarten die Werte in RAD und nicht in DEG. Entsprechende Umrechnungsfunktionen sind in der Unit Math drinne.

Lies das nochmal genau durch. :roll:


pump - Sa 25.09.04 20:29

ja was isn deg bzw. rad??? kannst mir nich einfach sagen was ich umschreiben muss???


.Chef - Sa 25.09.04 21:38

deg = Grad, rad = Radiant

Der Radiantkreis hat 2*pi (rad, Einheit wird aber üblicherweise nicht genannt), der normale Kreis bekanntermaßen 360 Grad. Also ergibt sich:

1 (rad) = 180/pi Grad

1 Grad = pi/180 (rad)


pump - Sa 25.09.04 21:53

nu bin ich total verwirrt,

wozu is denn dann der arccos befehl da? was muesste ich denn hier dran jetzt verändern?

winkela:=arccos((Seitea*Seitea-Seiteb*Seiteb-Seitec*Seitec)/(-2*Seiteb*Seitec));


tommie-lie - Sa 25.09.04 22:11

pump hat folgendes geschrieben:
wozu is denn dann der arccos befehl da?
Um den Arkuskosinus auszurechnen?


Delphi-Quelltext
1:
winkela:=radtodeg(arccos((Seitea*Seitea-Seiteb*Seiteb-Seitec*Seitec)/(-2*Seiteb*Seitec)));                    


pump - Sa 25.09.04 22:17

juhuu danke den radtodeg befehl kannte ich nicht.. den hab ich gebracuh nu funzt alles einwandfrei...

achja und wen das interressiert hier das fertige programm:

http://home.arcor.de/egalmoth/projekt1.exe