Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Trigonometrischer Rechner... (https://www.delphipraxis.net/34500-trigonometrischer-rechner.html)

At0mGuRk3 23. Nov 2004 21:38


Trigonometrischer Rechner...
 
Hallo Leute,
ich habe ein großes Problem.
Auch ich muss in Informatik ein Proggy schreiben,
womit man Berechnungen am allgemeinen Dreieck durchführt und
welches insgesamt 6 Editfelder besitzt, wobei in 3 die Seitenlängen geschrieben und in den anderen 3 die Winkelgrößen geschrieben werden. Alle 6 sind Variablen (a,b,c,wa,wb,wc) zugewiesen, die vom Typ REAL sind. Die Grundfunktionen SSS,SSW,WSW,WWS hab ich alle in einer UNIT gespeichert.
Das Programm greift auf diese zu.
Mein Problem sind die Abfragen,
um die Einzelnen Prozeduren aufzurufen.
Funktionieren tut bisher nur SSS,
also ob in allen 3 Editfeldern was drin steht.
Und wenn nicht, dann soll er meckern.

Da ich aber echt verzweifelt bin, weil das Proggy nicht funzt OBWOHL es funzt!?!?!
Denn der spuckt nach dem klicken auf Berechnen ne Fehlermeldung "Blablabla Gleitkommazahlen Bla..." aus. Und direkt im Anschluß das richtige Ergebnis.
Was hab ich falsch gemacht??? :wall: :wall: :wall:


So.
Hier kommt mein CODE:

Zuerst die UNIT mit den Prozeduren
Delphi-Quellcode:
unit cpu;

interface
uses math;

PROCEDURE cosw(x,y,z:REAL;VAR w:REAL);
PROCEDURE hundertachtzig(winkel1,winkel2:REAL; VAR winkel3:REAL);
PROCEDURE WSW(x,w:REAL;VAR y:REAL);
PROCEDURE SSW(x,w:REAL;VAR y:REAL);
PROCEDURE SWS(y,z,w:REAL;VAR x:REAL);

implementation

PROCEDURE cosw(x,y,z:REAL;VAR w:REAL);
BEGIN
w:=RADTODEG(ARCCOS(((y*y)+(z*z)-(x*x))/(2*y*z)));
END;

PROCEDURE hundertachtzig(winkel1,winkel2:REAL; VAR winkel3:REAL);
BEGIN
winkel3:=180-(winkel1+winkel2);
END;

PROCEDURE WSW(x,w:REAL;VAR y:REAL);
BEGIN
y:=x*(RADTODEG(COS(w)));
END;

PROCEDURE SSW(x,w:REAL;VAR y:REAL);
BEGIN
y:=(RADTODEG(tan(w)))*x;
END;

PROCEDURE SWS(y,z,w:REAL;VAR x:REAL);
BEGIN
x:=SQRT(((y*y)+(z*z)-((2*y*z)*(RADTODEG(cos(w))))));
END;
end.

Und jetzt das eigentliche Programm zum Rechnen:

Delphi-Quellcode:
unit berechnung.sss;

interface

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

type
  TSSS = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Image1: TImage;
    closebutton: TButton;
    Seitea: TEdit;
    Seiteb: TEdit;
    Seitec: TEdit;
    Winkelalpha: TEdit;
    Winkelbeta: TEdit;
    Winkelgamma: TEdit;
    MainMenu1: TMainMenu;
    Gehezu1: TMenuItem;
    Hilfe1: TMenuItem;
    Info1: TMenuItem;
    Programmbeenden1: TMenuItem;
    Button1: TButton;
    loeschen: TButton;

    procedure closebuttonClick(Sender: TObject);
    procedure Info1Click(Sender: TObject);

    procedure Hauptmen1Click(Sender: TObject);
    procedure Programmbeenden1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Gehezu1Click(Sender: TObject);
    procedure loeschenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  SSS: TSSS;

implementation

uses info, rechner;

{$R *.dfm}






procedure TSSS.closebuttonClick(Sender: TObject);
begin
close;
end;

procedure TSSS.Info1Click(Sender: TObject);
begin
Information.Show;
SSS.Hide;
end;



procedure TSSS.Hauptmen1Click(Sender: TObject);
begin
index.show;
SSS.Hide;
end;

procedure TSSS.Programmbeenden1Click(Sender: TObject);
begin
close;
end;

procedure TSSS.Button1Click(Sender: TObject);
VAR alpha,beta,gamma,a,b,c:REAL;


begin

//Abfrage, ob keine Seite gegeben ist
IF (Seitea.Text='') AND (Seiteb.Text='') AND (Seitec.Text='')
THEN showmessage('Bitte geben Sie mindestens 1 Seite ein!');

//Abfrage, ob 3 Seiten gegeben sind
IF (Seitea.Text<>'') AND (Seiteb.Text<>'') AND (Seitec.Text<>'')
THEN
  BEGIN
  //Einlesen der 3 Seiten
  a:=STRTOFLOAT(Seitea.Text);
  b:=STRTOFLOAT(Seiteb.Text);
  c:=STRTOFLOAT(Seitec.Text);
  //Berechnung der 3 Winkel
  cosw(a,b,c,alpha);
  cosw(b,c,a,beta);
  cosw(c,a,b,gamma);
  //Ausgabe der 3 Winkel
  Winkelalpha.Text:=FLOATTOSTR(alpha);
  Winkelbeta.Text:=FLOATTOSTR(beta);
  Winkelgamma.Text:=FLOATTOSTR(gamma);
  END;

//Abfrage, ob Seite a, Seite b und der dazwischen liegende Winkel Gamma gegeben sind
IF (Seitea.Text<>'') AND (Seiteb.Text<>'') AND (Winkelgamma.Text<>'')
THEN
  BEGIN
  a:=STRTOINT(Seitea.Text);
  b:=STRTOINT(Seiteb.Text);
  gamma:=STRTOFLOAT(Winkelgamma.Text);
  //Aufruf der Prozedur SWS
  sws(a,b,gamma,c);
  //Berechnung der Winkel Alpha und Beta
  cosw(a,b,c,alpha);
  cosw(b,c,a,beta);
  //Ausgabe der berechneten Seite und der restlichen 2 Winkel
  Seitec.Text:=FLOATTOSTR(c);
  Winkelalpha.Text:=FLOATTOSTR(alpha);
  Winkelbeta.Text:=FLOATTOSTR(beta);
  END;

  //Abfrage, ob Seite a, Seite c und der dazwischen liegende Winkel Beta gegeben sind
IF (Seitea.Text<>'') AND (Seitec.Text<>'') AND (Winkelbeta.Text<>'')
THEN
  BEGIN
  a:=STRTOFLOAT(Seitea.Text);
  c:=STRTOFLOAT(Seitec.Text);
  beta:=STRTOFLOAT(Winkelbeta.Text);
  //Aufruf der Prozedur SWS
  sws(a,c,beta,b);
  //Berechnung der Winkel Alpha und Gamma
  cosw(a,b,c,alpha);
  cosw(c,a,b,gamma);
  //Ausgabe der berechneten Seite und der restlichen 2 Winkel
  Seiteb.Text:=FLOATTOSTR(b);
  Winkelalpha.Text:=FLOATTOSTR(alpha);
  Winkelbeta.Text:=FLOATTOSTR(gamma);
  END;

//Abfrage, ob 2 Winkel = 0° und einer = 180° sind --> Dreieck nicht möglich
IF (Winkelalpha.Text='0') AND (Winkelbeta.Text='0') AND (Winkelgamma.Text='180')
OR (Winkelalpha.Text='180') AND (Winkelbeta.Text='0') AND (Winkelgamma.Text='0')
OR (Winkelalpha.Text='0') AND (Winkelbeta.Text='180') AND (Winkelgamma.Text='0')
THEN showmessage('2 Seiten zusammen dürfen nicht kleiner als die dritte sein! Bitte versichern Sie sich, dass Sie alles korrekt eingegeben haben!');


end;

procedure TSSS.Gehezu1Click(Sender: TObject);
begin
index.show;
SSS.Hide;
end;

procedure TSSS.loeschenClick(Sender: TObject);
begin
Seitea.Text:='';
Seiteb.Text:='';
Seitec.Text:='';
Winkelalpha.Text:='';
Winkelbeta.Text:='';
Winkelgamma.Text:='';
end;

end.
Hier ist ein Screenshot vom Programm


MfG
die Gurke

Ps:
Ich hoffe ihr könnt mir helfen!

Ich kann hier auch das Proggy posten wenn ihr wollt!

Nikolas 23. Nov 2004 21:41

Re: Trigonometrischer Rechner...
 
Wo kommt der Fehler? Bei welchen Eingaben? Wie lautet die genaue Fehlermeldung?

At0mGuRk3 23. Nov 2004 21:58

Re: Trigonometrischer Rechner...
 
Direkt nach dem Klicken auf "Berechnen" sagt der ungültige Gleitkommaoperation.
Ich hab schon alle möglichen Ursachen gecheckt (INTEGER mit REAL vertauscht, usw...) ich finds nicht.. :gruebel:

Nikolas 23. Nov 2004 22:07

Re: Trigonometrischer Rechner...
 
Ich meine in welcher Zeile? Hast du in den Edits auch mal eine 0 stehen, durch die du teilen könntest?

At0mGuRk3 24. Nov 2004 08:49

Re: Trigonometrischer Rechner...
 
Nein hab ich nicht...
Da steht nix drin.
Egal für welche Werte ich auf Berechnen klicke,
er gibt immer die gleich Meldung aus. :coder2:

Beispiel:

Seitea.Text -> 5
Seiteb.Text -> 4
Seitec.Text -> 3

Eigentlich ist Alpha laut Kosinussatz 90 ° groß.

Also muss er das auch ausgeben.
Klicke ich jetzt auf Berechnen, dann kommt die Fehlermeldung bezüglich der Gleitkommaoperation.
Klickt man dann auf OK, stehen die Ergebnisse trotzdem korrekt da.

Woran könnte das liegen?
Sind vielleicht meine Abfragen falsch programmiert?
Ich bräuchte dafür auch noch Hilfe.
Der Feler ist übrigens erst nach dem Proggen der Abfragen aufgetreten...

Mist,
es ist zum :wall: :wall: :wall:

At0mGuRk3 24. Nov 2004 15:18

Re: Trigonometrischer Rechner...
 
Ich hatte mir auch überlegt,
ob das nicht mit den Abfragen zusammenhängen könnte.
Dass er vielleicht wegen irgendeiner Abfrage einen leeren String in eine REAL - Variable schreiben will, dass er deshalb meckert. Das macht das Proggy aber nicht...

Ich find das zum :kotz:

At0mGuRk3 25. Nov 2004 21:50

Re: Trigonometrischer Rechner...
 
Leute??
Ich brauhce eure Hilfe!!
So schreibt mir doch!

supermuckl 25. Nov 2004 22:13

Re: Trigonometrischer Rechner...
 
hi und herzlich willkommen bei der :dp:

ich würde an deiner stelle mal von anfang bis ende mit hilfe der einzeleilen ausführung durch den code gehen und dann siehste wo der fehler genau kommt

also einzelschritt debugging
das neben der grünen "play" taste

das tut aber auch nur wenn du das programm angehalten hast ->
also einen breakpoint irgendwo am anfang setzen und ab da dann einzelschritt mäßig vorgehen

At0mGuRk3 26. Nov 2004 05:28

Re: Trigonometrischer Rechner...
 
Danke...
Ich werds heute mal ausprobiern...
Vielleicht find ich den gottverdammten Bug ja... :coder:

At0mGuRk3 28. Nov 2004 21:27

Fehler gefunden!
 
:corky: :corky: :corky: :corky: :corky: :corky: :corky: :corky: :corky:

:roteyes:


Hallo Leute!
Ich hab den Fehler gefunden!

Es lag daran,
dass die Winkel in Form des DEG-Systems an die cosinusfunktion und Co übergeben wurden.
Man musste die vorher ins Rad-Maß konvertieren.
also DEGTORAD(w)

Jop
ich schreib morgen hier mal nen link zur alpha rein

cya :dancer2: :dancer: :bounce2: :bounce1: :bouncing4:


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