![]() |
Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Hallo Leute,
ich habe mal wieder eine Frage ... wir haben eine neue Projektaufgabe bekommen, in der es um die Programmierung einer mathematischen Berechnung von Sinus und Cosinus Werten geht. Dabei soll zu Programmstart eine Tabelle geschrieben und in dem Programmordner abgelegt werden. In dieser Tabelle sollen alle Cos und Sin Werte von 0° bis 90° in 1/10° Schritten aufgeführt sein. Auf dem Formular sollen dann nur ein Editfeld, ein Button und zwei Labels liegen. In dem Editfeld wird eine Gradzahl eingegeben. Bei Klick auf dem Button, soll laut Aufgabenstellung folgendes geschehen: 1. das Maskeditfeld den Winkel in Grad übernehmen 2. der Winkel wird in Rad umgewandelt 3. der Quadrant aus den Grenzwinkeln soll bestimmt werden 4. für den Quadranten soll der Index und das Vorzeichen (integer) für sin und cos in einer case Anweisung festgelegt werden 5. per Zugriff auf das Array soll der Funktionswert ermittelt werden 6. die Werte sollen in einem Labelfeld ausgegeben werden. So, und da komme ich etwas ins straucheln :-/ Zunächst, gibt es einen Befehl, der den Winkel in Rad umwandelt? Oder muss das mit Hilfe einer Formel gelöst werden. Ist ja nicht so schwierig, aber wenn ich mir das Tippen der Formel mit einem einfachen Befehl ersparen kann, ist das ja schonmal was ... Zu dem Index und den Vorzeichen stand hier auch noch etwas, dass dazu Tabellen geschrieben werden sollen, um das ganze nicht zu Zeitaufwändig zu machen :shock: Aber wie schreibe ich denn, dass sich gleich bei Programm start diese Tabelle erstellt? Und wie, dass das Programm darauf zugreift und die Werte abgreift??? Ich bin da irgendwie ein wenig überfordert :-( Kann mir da jemand helfen??? Gruß Hamptoncourt |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
![]() ![]() oder selber machen: alpha(Grad)/alpha(Bogen) = 360/2 PI = 180/PI |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Hey, danke erstmal für den Tipp ....
Aber wie geht denn das jetzt eigentlich mit der Tabelle??? Bin da echt ein wenig verzweifelt ... Unser Prof erklärt mal wieder nix und will, dass wir das alles aus dem Kopf können. Kann mir da jemand nen Tipp geben oder nen Lösungsvorschlag??? Dass er ne Tabelle erstellt, die Zeilen und Spalten füllt, und dass er dann später wieder darauf zugreift um den Wert abzulesen ... |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
0 bis 90 Grad in 0,1 Grad Schritten - das sind dann wohl 901 Einzelwerte, oder?
Delphi-Quellcode:
type
TSinCosTabelle = array[0..900] of double; var SinusTabelle : TSinCosTabelle; CosinusTabelle : TSinCosTabelle; for i := 0 to 900 do begin SinusTabelle[i] := Sin( ???); CosinusTabelle[i] := Cos( ??? ); end; |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
hey cool, danke ... allerdings hab ich noch ein Problem mit bem Speichern des Array ... Muss ich da nicht einfach SaveArray setzen??? Ich hab das so versucht, wie es bei "Delphi Treff" stand. Aber der sagt mir, das Identifier not foun "SaveArray" .... hä??? Im FAQ stand da aber nix, das ich das vorher festlegen muss. Oder ist das ein Unterschied zwischen Delphi und Lazarus??? In der Uni muss ich mit Delphi programmieren, zuhause mach ich das aber mit Lazarus ...
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Müsste wohl heissen (ungeprüft):
Delphi-Quellcode:
for i := 0 to 900 do
begin SinusTabelle[i] := DegToRad(Sin( 0.1*i)); CosinusTabelle[i] := DegToRad(Cos( 0.1*i )); end; |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Ja, soweit hab ich das mit der Berechnung auch ... aber er soll es ja als externe Datei speichern ... z.B. als test.dat .... Wenn ich aber SafeArray benutze, sagt er mir, dass er die nicht kennt. Muss ich dann erst als Variable "SafeArray : TSafeArray" Festlegen??? Aber als was leg ich dann den Typ TSafeArray fest??? Oder mache ich das grad total falsch ... ??? Ich bin verwirrt *lol*
type TSinCosTabelle = array[0..900] of double; TArrayData = array of string[20]; var ArrayData: TArrayData; SinusTabelle : TSinCosTabelle; CosinusTabelle : TSinCosTabelle; i : Integer; for i := 0 to 900 do begin SinusTabelle[i] := DegToRad(Sin( 0.1 * i)); CosinusTabelle[i] := DegToRad(Cos( 0.1 * i )); end; SaveArray(ExtractFilePath(Application.ExeName) + 'test.dat', ArrayData); end; |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Du könntest das Array z.B. in einer typisierten Datei speichern (file of Datentyp). BTW:
![]() |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
typisierte Datei??? Verstehe grad nicht, wie das funktioniert??? Kann mir vielleicht jemand nen Quellcode dazu schicken, wie das bei mir aussehen müsste???
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Du solltest dir auf DT auch das Tutorial zu Funktionen durchlesen. In dem von dir angesprochenen Tipp steht ziemlich klar, dass SaveArray eine Procedure ist, die du zuerst definieren musst. Wenn du das so machst, ist fast schon die ganze Arbeit getan, du musst nur noch deinen Array-Typ angeben.
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Hey ... stimmt. Habe ich auch im Tutorium jetzt gesehen, dass es eine Prozedur ist ...
Aber nochmal zu dem Tipp mit dem typisierten Dateiformat ... Das scheint ja so ganz übersichtlich zu haben. Das Tutorial ist echt gut verständlich ... Aber eine Frage hab ich doch noch ... Wenn ich das mache z.B. mit for i := 0 to 900 do write ..... wie schreibe ich das denn dann, wenn zwei Daten gesetzt werden sollen??? Schreibe ich beide Daten hintereinander in der einen Klammer, oder gebe ich zwei Anweisungen "for ... do write" in dem Quelltext ein??? |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Das bleibt Dir überlassen. Aus Vereinfachungsgründen könntest Du die Daten als Paare in einem Record (Sinus- und Cosinuswert) ablegen und diesen dann speichern bzw. auslesen. Wichtig ist lediglich, dass Du selbst den Überblick behältst.
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
hehe glaube du studierst maschinenbau in bielefeld oder?
Nungut , da meines Wissens nach die Tabelle als Textdatei erstellt und dann erst in ein Array geladen werden soll zeig ich dir einfach mal meine Lösung. Aber die Aufgabe umfasste nur den Teil der Werte Ausgabe und Berechnung, deswegen lass den Zeichnen Teil lieber weg. Am besten nutzt Du das nur als Hilfe und machst es selber. Die Prüfung wird sich sonst an Dir rechen. hier meine Lösung :
Code:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, Buttons, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; BitBtn1: TBitBtn; MaskEdit1: TMaskEdit; Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; function SinCos(x:double):double; function IndexVorzeichen(x:double):double; var Form1: TForm1; Werte:array[0..900] of double; Q :integer; f:textfile; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var s:string; x : integer; begin // Sinuswerte als txt datei speichern assignfile(f, 'Werte.txt'); rewrite(f); for x := 0 to 900 do begin s:=floattostr(sin((x/10)*(Pi/180))); writeln(f,s); end; closefile(f); end; procedure TForm1.Button1Click(Sender: TObject); var s : string; x,v, Ym, ySin, yCos, xSin , xCos : integer; winkel, Rad, SinWert, CosWert : double; begin // Txtfile auslesen und in Array speichern assignfile(f, 'werte.txt'); reset(f); for x := 0 to 900 do begin readln(f, s); werte[x]:=strtofloat(s); end; closefile(f); // Eingelesen // Einlesen des Edit in Variable winkel := strtofloat(maskedit1.Text); if winkel > 360 then ShowMessage('falsche Eingabe'); // Umrechnen des Winkels in Rad Rad := winkel*Pi/180; // Quadrant aus Winkeln bestimmen case (round(10*winkel)) of 0..900 : begin Q := 1; v := 1; end; 901..1800 : begin Q := 2; v := -1; end; 1801..2700 : begin Q := 3; v := -1; end; 2701..3600 : begin Q := 4; v := 1; end; end; SinWert := IndexVorzeichen(10*winkel); // ????????????????? CosWert := v*sqrt(1-(SinWert*SinWert)); label1.Caption:='SinWert : '+floattostr(SinWert); label2.Caption:='CosWert : '+floattostr(CosWert); label3.Caption:='Rad : '+floattostr(Rad)+' rad'; label4.Caption:='Quadrant : '+floattostr(Q); // #################### Funktionen zeichnen ###################### Ym:=Image1.Height div 2; Image1.Canvas.FillRect(rect(0,0,image1.Width,image1.Height)); // Koordinatenkreuz Image1.Canvas.MoveTo(0,Ym); image1.Canvas.LineTo(image1.Width,Ym); for Q := 1 to 4 do // zahler für Ober/Unterhalb der x-Achse(Case anweisungen) begin for x:=0 to 900 do // zahler für Array-Pointer begin //x-Koords xSin := (Q-1)*90+round(x/10); xCos := xSin-90; if xCos < 0 then //x-Pixel < 0 ans Ende hängen xCos := xCos+360; //y-Koords ySin := round(Ym-SinCos(x)); yCos := round(Ym-SinCos(x)); //Zeichnen von Auswahl image1.Canvas.MoveTo(round(winkel),0); image1.Canvas.LineTo(round(winkel),200); //Zeichnen der Funktionen image1.Canvas.Pixels[xSin,ySin]:=clred; image1.Canvas.Pixels[xCos,yCos]:=clHighlight; end; end; end; //################################ Index+Vorzeichen function IndexVorzeichen(x:double):double; var a : integer; begin a:=round(x); case Q of 1: begin result := werte[a]; end; 2: begin result := werte[1800-a]; end; 3: begin result := -werte[a-1800]; end; 4: begin result := -werte[3600-a]; end; end; end; //################################ Sinus-Fkt function SinCos(x:double):double; var a : integer; begin a:=round(x); case Q of 1: begin result := 90*werte[a]; end; 2: begin result := 90*werte[900-a]; end; 3: begin result := -90*werte[a]; end; 4: begin result := -90*werte[900-a]; end; end; end; end. |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
*lol* woher weist du das??? Nehme an, du bist auch in BI???
Das ist ja cool ... Interessanter Lösungsweg ... Werde ich mal mit rum spielen ... Aber sag mal, in unserer Aufgabenstellung steht noch was von wegen "Erstellen sie Tabellen vor Index und Vorzeichen" Damit die Aufgabe nicht zu Zeitaufwändig wird ... aber wie habe ich denn das zu verstehen??? Hätte das mit den Vorzeichen so ungefähr wie du gemacht ... Wozu brauche ich denn da noch zusätzliche Tabellen??? greetz |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Es geht eigentlich darum das ein leistungsschwacher Prozessor ( sagen wir für ne Maschine ) damit arbeiten kann und nicht zwingend ein Pentium4 für ne Bohrmaschine genutzt wird. falls du verstehst was ich meine :-D
Nun zur Frage selbst : Das mit der Tabelle (Index Vorzeichen) ist auch gut möglich aber irrelevant. Denke du kannst das ruhigen gewissens auch so machen wie ich. Er hat mir das auch abgezeichnet. nur versuch es villeicht nicht mit
Code:
zu lösen, sondern versuch wie den Sinuswert auch den Cosinuswert aus der Tabelle zu lesen und zu berechnen.
CosWert := v*sqrt(1-(SinWert*SinWert));
Ähnlich wie ich es für das zeichnen gemacht habe
Code:
ySin := round(Ym-SinCos(x));
yCos := round(Ym-SinCos(x)); |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
*lach* ja gut, ich verstehe was du meinst ;-) sehr anschauliches Beispiel ;-)
Ja, ich merk schon, ich bin halt doch mehr für Arbeiten in der Konstruktion geeignet (Berechnungen, Konstruieren etc.) als für den Bereich der Informatik ... Aber ist halt Pflicht :-/ Ja, habe das auch schon anders für mich umgesetzt. Hatte mir deinen Lösungsansatz durchgeguckt und es dann etwas abgeändert ... jetzt funzt es auch endlich mit der Tabelle ... jippiiiiii :-D Mit der Tabelle dachte ich auch eher, weil es explizit nochmal in der Aufgabenstellung erwähnt wurde :-S Werde es aber auch mal so versuchen ;-) |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Schön das ich dir etwas helfen konnte.
Aber wie gesagt für die Prüfung ist es NOTWENDIG das selber zu machen und zu verstehen was passiert und warum etwas passiert. Bei Fragen zu den Paktikas meld Dich einfach bei Kai im A-Zug. Hab die Praktikumsaufgaben meist 2 Tage nach erscheinen schon fertig. Gruß Kai P.S. die nächste Aufgabe hab ich auch schon fertig :-D // @Admins -> Sry wegen dieser Unterhaltung im Forum |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Manno ... jetzt läuft es doch wieder nicht :-( Ich mache das glaub ich komplett falsch ... also er erstrellt die Datei, alles Super ... aber sobald ich in die Box nen Wert eingebe und auf den Button klicke, dass er das berechnen soll, kackt der ab ...
@ Kenny: Ich verstehe das auch nicht ganz, wie du das gemacht hast mit den Vorzeichen und so ... ne case Anweisung ist klar ... der guckt in welchem Quadranten und berechnet dann ob - oder + und so ... Aber der weiß doch in dieser Anweisung gar nicht, was x ist, oder??? Auf jeden Fall: Sobald ich den Button zum berechnen klicke, will er die Daten aus der TXT Datei auslesen. dann kommt aber gleich ein EConvertError: " " is an invalid float hmmm ... vielleicht habe ich es jetzt auch komplett falsch aufgebaut. Hier mal der Quelltext zum Auslesen der Daten ...
Delphi-Quellcode:
Hoffe, mir kann da noch jemand helfen ...
var
s, c : String; x, v, i : Integer; rad, ErgSin, ErgCos : double; begin assignfile(f,'Werte.txt'); reset(f); for x:=0 to 900 do begin readln(f, s, c); sinWert[x] := strtofloat(s); cosWert[x] := strtofloat(c); end; closefile(f); |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Update:
Wenn ich statt nur einer Tabelle 2 schreibe (eine mit nem Sinuswert, die anderen mit nem Cosinuswert) dann funktioniert alles ohne Probleme. Er schmeißt sogar die richtigen Werte raus ... voll cool ... aber warum funktioniert das nicht, wenn er daraus eine einzige Tabelle schreiben soll??? |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Mit "readln" werden vermutlich alle Zeichen bis zum Zeilenende in die erste String-Variable gelesen. Da bleibt für die zweite Variable nichts übrig.
Zwei Variablen in einer "readln"-Anweisung zu lesen funktioniert nur mit Variablen fester Länge. Wie wird den die Datei erstellt? |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Axo, ok ... ja, die Datei hatte ich auch mit writeln geschrieben ...
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Und wie? Beide Werte in eine Zeile oder untereinander? Ich hätte mir die Stringumwandlung übrigens gespart und stattdessen dann doch lieber einen Record deklariert und diesen dann in einer typisierten Datei abgelegt, aber das muss ja jeder selber wissen.
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Also sieht mein Quellcode aus, wie ich ihn jetzt für zwei Datein habe ...
Delphi-Quellcode:
Und so hatte ich es versucht, das in eines zu packen ...
procedure TForm1.FormCreate(Sender: TObject);
var s, c : String; x : Integer; begin assignfile(f,'SinWerte.txt'); // Erste Tabelle erstellen rewrite(f); for x:=0 to 900 do begin s:=floattostr(sin((x/10)*(pi/180))); write(f, s); end; closefile(f); assignfile(f,'SinWerte.txt'); // Zweite Tabelle erstellen rewrite(f); for x:=0 to 900 do begin c:=floattostr(cos((x/10)*(Pi/180))); write(f, c); end; closefile(f); end;
Delphi-Quellcode:
Aber hast recht, der schreibt dann ja in eine Zeile z.B.
procedure TForm1.FormCreate(Sender: TObject);
var s, c : String; x : Integer; begin assignfile(f,'Werte.txt'); rewrite(f); for x:=0 to 900 do begin s:=floattostr(sin((x/10)*(pi/180))); c:=floattostr(cos((x/10)*(Pi/180))); write(f, s, c); end; closefile(f); end; 0,001745328365890,99999847691328 Wenn er die komplette Zeile einmal so liest, dann kommt nur blödsinn raus ... |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Siehste, das ist der Unterschied zwischen write und writeln ;)
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Ah, aber jetzt schein ich es fast zu haben ... du hattest mich da auf ne Idee gebracht, mit dem "untereinander"-schreiben ;-)
Habe das jetzt so geschrieben, dass er die Werte untereinander schreibt, abwechselnd Sinus und Cosinus ... das hat auch gut geklappt. Nur eine Datei und er schmeißt die richtigen Werte raus ... aber nun scheint das Programm nurnoch einmal zu laufen :-( wenn ich eine neue Zahl eingebe und wieder auf den Button klicke, dann kommt nen Error und das Programm schließt sich :-( ... mist *lol* |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Und welcher Error? :glaskugel:
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
"Project project1.exe raised exception class 'RunError(5)'"
Dann wechselt er in die Zeile "for x:=0 to 900 do begin", dem Beginn der Schleife zum Auslesen der Daten ...
Delphi-Quellcode:
assignfile(f,'Werte.txt');
reset(f); for x:=0 to 900 do begin readln(f, s); sinWert[x] := strtofloat(s); readln(f, c); cosWert[x] := strtofloat(c); end; |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Und wenn Du einmal einen absoluten Pfad angibst?
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
RunError(5)
Vermutlich Zugriff verweigert weil "closefile(f)" an einer Stelle vergessen. |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Das kann es auch sein, oder eben das aktuelle Arbeitsverzeichnis ist falsch.
|
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
och gott war das einfach *lach* Ich bin ja auch nen trottel ...
danke Blup ... da fehlte tatsächlich das closefile(f) zum schluss ... argh ... na gut, also alles in Ordnung jetzt ;-) Programm läuft so wie es laufen soll ... Ich danke euch allen vielmals für die Hilfe ... |
AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten
Aus diesem Grund sollte man hierbei auch immer mit try..finally arbeiten.
Delphi-Quellcode:
Wenn man sich das angewöhnt, vergisst man das Schließen oder Free auch nicht mehr.
AssignFile( f, FileName );
Rewrite( f ); try // irgendwas mit f machen finally CloseFile( f ); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz