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, 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 public 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); seiteb:=StrToInt(EditSeiteb.text); seitec:=StrToInt(EditSeitec.text); winkela:=round(arccos((Seitea*Seitea-Seiteb*Seiteb-Seitec*Seitec)/(-2*Seiteb*Seitec))); winkelb:=round(arccos((Seiteb*Seiteb-Seitec*Seitec-Seitea*Seitea)/(-2*Seitec*Seitea))); winkelc:=round(arccos((Seitec*Seitec-Seitea*Seitea-Seiteb*Seiteb)/(-2*Seitea*Seiteb))); 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; flaeche:=round(0.5*seitea*seiteb*sin(3.1415/180*(round(arccos((Seitec*Seitec-Seitea*Seitea-Seiteb*Seiteb)/(-2*Seitea*Seiteb)))))); EditFlaeche.text:=IntToStr(Flaeche); EditUmfang.text:=IntToStr(Umfang); EditWinkela.Text:=IntToStr(Winkela); EditWinkelb.Text:=IntToStr(Winkelb); EditWinkelc.Text:=IntToStr(Winkelc); EditHoehea.Text:=IntToStr(hoeheb); EditHoeheb.Text:=IntToStr(hoehea); EditHoehec.Text:=IntToStr(hoehec); end;
procedure TForm1.BeendenClick(Sender: TObject); begin close; 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
Christian 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); seiteb:=StrToInt(EditSeiteb.text); seitec:=StrToInt(EditSeitec.text); winkela:=arccos((Seitea*Seitea-Seiteb*Seiteb-Seitec*Seitec)/(-2*Seiteb*Seitec)); winkelb:=arccos((Seiteb*Seiteb-Seitec*Seitec-Seitea*Seitea)/(-2*Seitec*Seitea)); winkelc:=arccos((Seitec*Seitec-Seitea*Seitea-Seiteb*Seiteb)/(-2*Seitea*Seiteb)); hoehea:=seiteb*sin(winkelc); hoeheb:=seitec*sin(winkela); hoehec:=seitea*sin(winkelb); umfang:=seitea+seiteb+seitec; flaeche:=hoehea*seitea/2; umkreis:=seitea/(2*sin(winkela)); inkreis:=seitec * sin(winkela / 2) * sin(winkelb / 2) / sin((winkela + winkelb) / 2); EditFlaeche.text:=FloatToStr(Flaeche); EditUmfang.text:=FloatToStr(Umfang); EditWinkela.Text:=FloatToStr(Winkela); EditWinkelb.Text:=FloatToStr(Winkelb); EditWinkelc.Text:=FloatToStr(Winkelc); EditHoehea.Text:=FloatToStr(hoeheb); EditHoeheb.Text:=FloatToStr(hoehea); EditHoehec.Text:=FloatToStr(hoehec); EditUmkreis.Text:=FloatToStr(umkreis); EditInkreis.Text:=FloatToStr(inkreis); 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
tommie-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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!