myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Pascal Sinus/Cosinus (https://mygully.com/showthread.php?t=3179566)

MrGreEn1231 25.01.14 18:51

Pascal Sinus/Cosinus
 
Liebe Community,

Ich lerne seit einigen Wochen Pascal. Momentan codiere ich einen Algorithmus zur Errechnung der fehlenden Seiten eines allgemeinen Dreiecks. Ich arbeite mit Lazarus v1.0.1.4 und verwende Grafische LCL-Oberflächen. Nun habe ich folgendes Problem: Ich möchte den Cosinus eines Winkels berechnen, ohne den Winkel im Bogenmaß angeben zu müssen. Sprich, der Benutzer dieser Anwendung soll einen Winkel in Grad angeben können und von diesem soll der Cosinus berechnet werden.

Ich weiß leider nicht, wie man den Cosinus eines Winkels mit Pascal berechnet. Alle vermeintlichen Lösungen, die ich im Internet fand, halfen nicht :cry:.

Es wäre nett, wenn mir jemand erklären könnte, wie man den Sinus, bzw. Cosinus eines Winkels mit Pascal berechnen kann.

Gruß MrGreEn

NetWebs 25.01.14 21:39

Den Cosinus eines Winkels errechnet man immer gleich.
Warum sollte man diesen in Pascal auch anders errechnen?

Was hast du denn bereits versucht?

cortez442 25.01.14 22:05

Du willst ernsthaft behaupten, dass du nicht in der Lage bist, 2 Begriffe bei google zu benutzen und den ersten Treffer anzuklicken?

Dann überleg dir mal ganz schnell, wie man den sinus und cosinus in mathematischen Formeln schreibt und wie rad in Grad umgerechnet wird. Wenn du auch nicht rausfinden kannst, frage ich mich, warum du das Atmen nicht vergisst...

MrGreEn1231 26.01.14 13:58

Zitat:

Zitat von cortez442 (Beitrag 25251475)
Du willst ernsthaft behaupten, dass du nicht in der Lage bist, 2 Begriffe bei google zu benutzen und den ersten Treffer anzuklicken?

Ich habe mich schon belesen, jedoch helfen mir diese "Lösungen" nicht weiter.


Wenn ich nun den inn Deg eingelesenen Winkel in Rad umrechne und diesen entstandenen Wert dann wieder in Deg umwandle, kommt jedoch Stuss raus.

Ich versuche lediglich den Kosinussatz anzuwenden, jedoch
bquadrat:=a*a+c*c -2*a*b* Cos (Winkel);

Umrechnung DegToRad: winkelRad:=((2*pi)/360)*(WinkelDeg);
Umrechnung RadToDeg: wert_deg:=(360/(2*pi))*wert_rad;
gehen wir von 60 Grad aus. 60°inRad=2*pi/360*WinkelDeg=1,04719...
Kann ich den COsinus von 1,04719 Pi berechnen und diesen dann wieder in Deg umwandeln?

Pascal kann nur den Cosinus bzw Sinus, Tangens eines Winkels in Rad errechnen!!!!
Außerdem handelt es sich um ein Allgemeines Dreieck, da kann ich die Herleitung des Sinus,Cosinus (GK/Hyp=Sin)
Außerdem erhalte ich, wenn ich den COsinus eines Rad Winkels errechne immer 0,999... , egal welcher Rad Winkel es ist...

MrGreEn1231 26.01.14 16:10

Zitat:

Zitat von HababaX (Beitrag 25253783)
Und C# kann nur Addieren, aber nicht Subtrahieren!!!
Java kennt nur die Zahlen 0,1,2,3 und 7. Mit 4,5,6,8 und 9 kann man nicht arbeiten!!!

Ziemlicher Stuss ist das, was Du von Dir gibst :(

Wenn ich Pascal den COsinus von 60° errechnen lasse, kommt -0,95... raus... das KANN nicht richtig sein, da der Cosinus von 60° 0,5 ergibt..

Ich rede keinen STuss, Pascal kann nur den Cosinus eines Winkels in Rad errechnen.:(

MrGreEn1231 26.01.14 16:17

Du kannst es gerne ausprobieren...

Quelltext von Probe Cosinus eines Winkels in Degree:

program project1;

{$mode objfpc}{$H+}
{$APPTYPE CONSOLE}

uses
sysutils, windows, Console,math;
VAR gamma,cosa:double;






BEGIN
ReadLn (gamma);
Cosa:=Cos (gamma);
WriteLn (cosa:2:1);
ReadLn ();
End.

Es kommt bei Cos 60° -1 raus, obwohl es 0,5 sein sollte.
Bei 45° kommt 0,5 raus, obwohl es 0,707 sein sollte...

NetWebs 26.01.14 16:28

Du willst ernsthaft behaupten, dass Du einen einfachen mathematischen Fehler in einer Programmiersprache entdeckt hast, die zuvor bereits millionenfach von anderen eingesetzt wurde?

Die Frage ist doch, was ist wahrscheinlicher?
Dass Pascal eine Grundrechenfunktion nicht beherrscht oder dass Deine kognitiven Fähigkeiten stark begrenzt sind?

MrGreEn1231 26.01.14 16:36

Die Programmiersprache ist aus dem Jahr 1972. Möglicherweise rechnete man in der Zeit noch nicht mit dem WInkel in deg, sondern mit dem Bogenmaß.

MrGreEn1231 26.01.14 16:43

@NetWebs: Falls du es ausprobieren möchtest, hier der Downloadlink für Lazarus:[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Mein Quellcode:
program project1;

{$mode objfpc}{$H+}
{$APPTYPE CONSOLE}

uses
sysutils, windows, Console,math;
VAR gamma,cosa:double;






BEGIN
ReadLn (gamma);
Cosa:=Cos (gamma);
WriteLn (cosa:2:1);
ReadLn ();
End.

Dauert vll. 2 Minuten.

Und hier nocheinmal das Pascal-Wiki. Es beschreibt, dass der Cos nur bei Bogenmaßen eingesetz werden kann:"cos cosine of a RADIAN measure ".

ProgMaster 26.01.14 16:53

Zitat:

Zitat von MrGreEn1231 (Beitrag 25253856)
Die Programmiersprache ist aus dem Jahr 1972. Möglicherweise rechnete man in der Zeit noch nicht mit dem WInkel in deg, sondern mit dem Bogenmaß.

Ja..und den EUR gibt es erst seit wenigen Jahren. Daher können die heutigen Rechner nicht EUR rechnen, da diese auf einer Prozessorarchitektur basieren die 1980 entworfen wurde.

Ist dir klar was für einen Schwachsinn du redest?
Ist Cosinus eine Rechenfunktion die in die CPU eingebrannt ist?

MrGreEn1231 26.01.14 18:28

Das was ich eigentlich sage ist, dass der Cosinus in Pascal nicht auf Degree Zahlen (Ganz normale Winkel) angewendet werden kann.

Der Cosinus kann daher nicht angewendet werden, da die Funktion nicht auf die normalen Winkel erweitert wurde.

Wie dem auch sei. Fakt ist, dass bei mehreren Testversuchen die falschen Werte berechnet wurden.

Siehe Quelltext. WIe kann das sein, wenn doch der Cosinus auf normale Gradzahlen angewendet werden kann? Cos von 60 ist normalerweise 0,5. Jedoch gibt mein Algorithmus -1,0 aus?!?!

spartan-b292 26.01.14 19:05

Dann rechne die Winkel doch einfach um.

cortez442 26.01.14 19:11

Manche Menschen sind echt zu dumm zum Scheißen. DU MUSST DEN WINKEL VON GRAD IN BOGENMß UMRECHNEN!!! Sorry, aber das muss sein. Es wurde etliche Male erwähnt, dass du umrechnen musst.

Code:

function Deg2Rad(x : real) : real;
begin
  Deg2Rad := x * (pi / 180);
end;

function Rad2Deg(x : real) : real;
begin
  Rad2Deg := x * (180 / pi);
end;

Code:

b = sqrt(sqr(a) + sqr(c) - 2*a*c*cos(Deg2Rad(Winkel)));

MrGreEn1231 26.01.14 20:13

Ich hab's endlich geschafft. Ich habe schon die ganze Zeit umgerechnet. Der Fehler war eine falsch gesetzte Klammer, die einen Error zur Folge hatte.

@cortez:

Sobald ich function einsetze, wird "illegal expression" ausgegeben. Habe es nun wie folgt gelöst:
Code:

Winkel1:=WinkelDeg * (Pi / 180);
b := sqrt(sqr(a) + sqr(c) - 2*a*c*cos(Winkel1));
Edit4.text:=FloatToStr(b);

meine primitivere Formel sieht folgendermaßen aus:
Code:

b:=((a * a) + (c * c)) -2*a*c*cos(Winkel1);
Dort fehlte zwar, die Wurzel, aber es war richtig.

Ich danke euch für eure Geduld. ;)

Gruß MrGreEn

cortez442 26.01.14 20:56

lass mich raten,du hast in deiner Main Funktion versucht, eine neue Funktion zu deklarieren. Dann ist der Fehler auch kein Wunder. Die Dekleration muss vor der Implementation erfolgen.

Code:

function Deg2Rad(x : real) : real;
begin
  Deg2Rad := x * (pi / 180);
end;

function Rad2Deg(x : real) : real;
begin
  Rad2Deg := x * (180 / pi);
end;
...
procedure main();
var a, b, c, winkel: real;
begin
//einlesen
...
//verarbeiten
b = sqrt(sqr(a) + sqr(c) - 2*a*c*cos(Deg2Rad(Winkel)));
...
//Ausgeben
end.

BTW: Globale Variablen sind in dem Zusammenhang ein No-Go. Lerne es gleich richtig und erstelle für den ganzen Kleinscheiß lokale Variablen (dekleration erfolgt in der jeweiligen Prozedur/Funktion). Be Globalen Vars kommst du nur durcheinander und sie können leichter kompromittiert werden, besonders, wenn du die Werte an anderen Stellen verwendest.

fryx 27.01.14 06:29

Free Pascal, auf dem Lazarus aufsetzt, kennt in der 'math' unit Funktionen, um Winkel umzurechnen [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]
Dort gibts auch die forward Deklaration [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

MrGreEn1231 31.01.14 20:32

Moin nochmal,

es ist ein neues Problem aufgetreten, welches ich bis jetzt nicht lösen konnte.

Wähle ich einen meiner 3 RadioButtons an, bevor ich meine Werte in die TEdit's eingebe, so poppt ein Error auf. Nun möchte ich einen der 3 RadioButtons auswählen können, bevor ich die Werte eingebe.
Ich habe es schon mit
Code:

If RadioButton2.checked=true And (Edit1.text:='') Then ShowMessage ('....');
Ich hoffe, ihr könnt mir weiterhelfen.

cortez442 31.01.14 21:01

Warum machst du die Zuweisung Edit1.text:=''? Du willst einfach wissen, ob der Inhalt einem leeren String entspricht, was du mit Edit1.text='' erreichst.

Außerdem warum hast du eine redundante Abfrage drinnen? Dein RadioButton2.checked liefert bereits einen boolschen Wert zurück, je nachdem ob er gecheckt ist oder nicht. Mit dem RadioButton2.checked=true fragst du nochmal, ob der wert true entspricht. Das Ganze hat genau 0 Einfluss auf das Ergebnis, verschwendet aber Ressourcen und macht den Code unübersichtlich.

MrGreEn1231 31.01.14 21:24

Ich habe es auch schon so probiert:

If Edit1.text:= '' Then Showmessage ('Bitte zuerst Werte angeben.');

Dort erscheint folgende Fehlermeldung in der Nachrichtenbox:"unit3.pas(72,11) Error: Boolean expression expected, but got "untyped" ".

(72,11) ist Edit1(hier).text


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.