Programm mit Pascal

Neue Frage »

Rivago Auf diesen Beitrag antworten »
Programm mit Pascal
Wink

Aufgabe siehe Bild..

http://fs2.directupload.net/images/150601/6sxud3zn.png


Mal ganz abgesehen davon dass mein Programm noch nicht läuft, habe ich wohl noch einen riesigen Denkfehler.. oder aber die Aufgabe bzw. die Ergebnisse in der Listbox in der Spalte t sind falsch.

Es soll ja die Anzahl der Wertepaare (= Variable n) in das Edit-Feld eingegeben werden.
Außerdem sollen die Funktionsschare für t = 0 bis t = 20n berechnet werden.

In meiner Auffassung sind die Wertepaare doch Ganzzahlig, also vom Typ Integer. Denn es gibt ja nur ganzzahlige Wertepaare (ein Wertepaar, 2 Wertepaare, 3 ...), aber doch nicht "Kommazahlige" (einskommafünfte Wertepaar, .., verwirrt )

Jetzt angenommen, der Benutzer gibt für n = 12 ein. Dann muss doch das Programm von t = 0 bis t = 20 * 12 = 240 laufen, oder nicht?

Also bis

Und bis

Wie kann es also sein, dass für t in der Tabelle Kommazahlen rauskommen können? t = 20 * n(Integer) kann doch nie eine Kommazahl werden.


Wo ist also mein Denkfehler? Oder hab ich keinen und der Screenshot von der Ausgabe ist so falsch?
Steffen Bühler Auf diesen Beitrag antworten »
RE: Programm mit Pascal
Zitat:
Original von Rivago
Jetzt angenommen, der Benutzer gibt für n = 12 ein. Dann muss doch das Programm von t = 0 bis t = 20 * 12 = 240 laufen, oder nicht?


Nein, das ist ein Missverständnis. Die Zeit t soll immer von 0 bis 20 laufen, unabhängig von n. Wenn der Benutzer n=12 eingibt, erhält er also 12 Wertepaare, das erste für t=0, das letzte für t=20, die anderen äquidistant dazwischen.

Viele Grüße
Steffen
 
 
IfindU Auf diesen Beitrag antworten »
RE: Programm mit Pascal
Dort steht . Dort steht soweit ich sehe nichts über Schrittweiten, d.h. über die Anzahl der t, sondern nur wie groß es werden darf.

Edit: Steffens Version ergibt deutlich mehr Sinn Hammer
Rivago Auf diesen Beitrag antworten »
RE: Programm mit Pascal
Zitat:
Original von Steffen Bühler
Nein, das ist ein Missverständnis. Die Zeit t soll immer von 0 bis 20 laufen, unabhängig von n.


Aber warum steht dann da t = 0 bis 20n? Oder ist das n da einfach nur reingerutscht?

Zitat:
Original von Steffen BühlerWenn der Benutzer n=12 eingibt, erhält er also 12 Wertepaare, das erste für t=0, das letzte für t=20, die anderen äquidistant dazwischen.


Okay, soweit kann ich dir folgen.

Aber mir ist immernoch nicht klar, wie es dann zum Beispiel zu 1,05 oder zu 6,32 für t kommen kann unglücklich
Steffen Bühler Auf diesen Beitrag antworten »
RE: Programm mit Pascal
Zitat:
Original von Rivago
Aber warum steht dann da t = 0 bis 20n? Oder ist das n da einfach nur reingerutscht?


Nein, das n gehört da hin. Es ist nur nicht mit der 20 malzunehmen, sondern steht alleine. Der Satz ist ohnehin unglücklich formuliert. Es sollen einfach n Wertepaare für t=0 bis 20 berechnet werden.

Zitat:
Original von Rivago
Aber mir ist immernoch nicht klar, wie es dann zum Beispiel zu 1,05 oder zu 6,32 für t kommen kann unglücklich


Nehmen wir mal nur n=3 Paare. Das erste bei t=0, das dritte bei t=20. Für welchen t-Wert musst Du das zweite berechnen?

Kannst Du nun eine allgemeine Formel für die zeitliche Schrittweite in Abhängigkeit von n angeben?
Rivago Auf diesen Beitrag antworten »

Jetzt hats Klick gemacht Big Laugh Gott

Hm.. Ich hätte jetzt gesagt, dass die Schrittweite t/n ist? verwirrt
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Rivago
Ich hätte jetzt gesagt, dass die Schrittweite t/n ist?


Hm. Schaun wir mal mein Beispiel an:

Ich hätte den zweiten Wert bei t=10 erwartet, Du nicht auch?
Rivago Auf diesen Beitrag antworten »

Doch, das hatte ich mir danach auch gedacht Big Laugh

Ich steh mal wieder aufm Schlauch. Keine Ahnung wie da die allgemeine Formel dafür lauten soll unglücklich

Die Schrittweite ist doch t?
Steffen Bühler Auf diesen Beitrag antworten »

Das ist das alte Problem mit Telegrafenkabel und Telegrafenmasten. Du hast 20 Meter Kabel und drei Masten.

Hint: Programmierer verzählen sich maximal um Eins. smile
Rivago Auf diesen Beitrag antworten »



?
Steffen Bühler Auf diesen Beitrag antworten »

Genau! Allerdings solltest Du die Schrittweite nicht t nennen, das ist schon die Gesamtzeit t=20. Nimm lieber sowas wie .

Und jetzt sind die krummen Zeitabstände auch verständlich, oder?
Rivago Auf diesen Beitrag antworten »

Jep, jetzt hab ichs glaub verstanden smile
Find die Aufgabe allerdings wirklich etwas umständlich formuliert..

Naja, sei es drum.

Mein Programm sieht nun bis hier hin so aus: (wichtig dabei wohl eher nur der Teil "Berechnung" in der Prozedur BU_EVAClick)

implementation

{$R *.lfm}

{ TForm1 }

var
y1 : Array [0..99] of Double;
y2 : Array [0..99] of Double;


procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption := 'Test der gui_unit_xyChart';
BU_EVA.Caption := 'Berechnung';

//Testdaten
ED_Anzahl.Text := '20';

//Listbox leeren
Form1.LB_Erg.Clear;

//StringGrid leeren
Form1.SG_Erg.Clear;


end; //Ende Prozedur FormCreate

procedure TForm1.BU_EVAClick(Sender: TObject);
//Variablen deklarieren
var
Anz, //Anz = Anzahl der Wertepaare (mind. 10, max. 100)
i: Integer; // i ist Zählvariable für for-Schleife
sw : Double; //sw = Schrittweite

begin
//Eingabe von Anz in ED_Anzahl
Anz := StrToInt(ED_Anzahl.Text);

//Plausibilitätsprüfung, ob Anz ausreichend ist
if (Anz < 10) or (Anz > 100)
Then ShowMessage ('Wert muss >=10 und <=100 sein!');

//Edit-Feld ED_Anzahl zur erneuten Eingabe vorbereiten, falls Fehler bei
//Plausibilitätsprüfung entstanden ist
Ed_Anzahl.Clear; //Edit-Feld ED_Anzahl leeren
Ed_Anzahl.SetFocus; //Cursor in Edit-Feld ED_Anzahl setzen

//Berechnung
i := 0;
sw := 20/(Anz - 1);
for i := 0 to Anz do
begin
y1[i] := sin(sw);
y2[i] := exp(0.1*(sw)) * sin(sw);
end; //Ende for-Schleife
end; //Ende Prozedur BU_EVAClick

end.




Passt das soweit?

Ich hab immer noch Probleme mit den Arrays. Ist das richtig, dass ich es von 0 bis 99 deklarier? Wäre nicht 1 bis 100 besser? Oder sogar 10 bis 100, denn in dem Bereich soll es ja liegen?

Außerdem weiß ich dann immer nie, von wo an ich in der for-Schleife zählen soll. Von 0 oder 1?
Magst du es mir mal versuchen zu erklären? Der Dozent ist bis jetzt daran gescheitert Big Laugh
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Rivago
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
  i := 0;
  sw := 20/(Anz - 1);
  for i := 0 to Anz do
  begin
    y1[i] := sin(sw);
    y2[i] := exp(0.1*(sw)) * sin(sw);
  end; //Ende for-Schleife

Hier schreibst Du immer denselben Wert hinein. Siehst Du, warum? Was musst Du hier noch tun?

Zitat:
Original von Rivago
Ich hab immer noch Probleme mit den Arrays. Ist das richtig, dass ich es von 0 bis 99 deklarier?


Ich hätte es dynamisch gemacht, je nach Eingabe nur so viel Speicher, wie gebraucht wird. Aber so geht's auch, die Anzahl darf ja nicht über 100 sein.

Zitat:
Original von Rivago
Wäre nicht 1 bis 100 besser?


Das ist Geschmackssache. Ich bin es nicht gewohnt, und manche Programmiersprachen erlauben sowas gar nicht. Daher empfehle ich die andere Variante.

Zitat:
Original von Rivago
Oder sogar 10 bis 100, denn in dem Bereich soll es ja liegen?


Dann deklarierst Du aber ein Array mit 91 Elementen, das wäre falsch.

Zitat:
Original von Rivago
Außerdem weiß ich dann immer nie, von wo an ich in der for-Schleife zählen soll. Von 0 oder 1?


Von Null, denn der erste Wert ist bei t=0. Und der kommt eben auch ins Arrayelement mit Index Null.
Rivago Auf diesen Beitrag antworten »

Zitat:
Original von Steffen Bühler
Ich hätte es dynamisch gemacht, je nach Eingabe nur so viel Speicher, wie gebraucht wird. Aber so geht's auch, die Anzahl darf ja nicht über 100 sein.


Das funktioniert wie?



Ich hab es jetzt überarbeitet, schau mal smile

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
//Berechnung
i := 0;
sw := 20/(Anz - 1);
t := 0;
for i := 0 to Anz do
begin
  y1[i] := sin(t);
  y2[i] := exp(0.1*(t)) * sin(t);
  i := i + 1;   //Zählvariable erhöhen
  t := t + sw;  //t um die Schrittweite erhöhenend;
end;//Ende for-Schleife


Allerdings kommt bei der Zeile " i := i+1; " ein Fehler. Und zwar "Error: illegal assignment to for-loop variable 'i' "

Was bedeutet das?

i muss ich doch um 1 erhöhen?!
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Rivago
Zitat:
Original von Steffen Bühler
Ich hätte es dynamisch gemacht


Das funktioniert wie?


Keine Ahnung, ob das bei Pascal überhaupt geht. Frag das besser die Informatiker nebenan.

Zitat:
Original von Rivago
"Error: illegal assignment to for-loop variable 'i' "

Was bedeutet das?

i muss ich doch um 1 erhöhen?!


Das macht die For-Schleife schon für Dich. Deshalb darfst Du die Loop-Variable i ja auch nicht anfassen.
Rivago Auf diesen Beitrag antworten »

Okay, bei C++ musste man das immer selbst machen..

Oder ich verwechsel es grad mit was anderem..


Passt der Code bis zu der Stelle jetzt, wenn ich die Zeile i := i+1 wieder raus lösch?

Dann kann ich ja die Ausgabe machen smile
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Rivago
Passt der Code bis zu der Stelle jetzt, wenn ich die Zeile i := i+1 wieder raus lösch?


Ja, soweit ich das überblicke.
Rivago Auf diesen Beitrag antworten »

smile

Dann wollte ich jetzt die Ausgabe machen, aber da kommt ein Fehler:

code:
1:
2:
3:
4:
5:
6:
7:
8:
//Ausgabe
//Ausgabe für Listbox LB_Erg
 LB_Erg.Items.Add(Format('%5.2s %5.2s %5.2s', ['t', 'y1', 'y2'])); //Tabellenkopf   
for i:=0 to Anz - 1 do
     begin
       LB_Erg.Items.Add(Format('%5.2n %5.2n %5.2n', [[U]t[i][/U], y1[i], y2[i]]));
end; //Ende for-Schleife


An der unterstrichenen Stelle bleibt er beim kompilieren hängen, "Error: Illegal qualifier" und "Fatal: There were 1 errors compiling module, stopping"

verwirrt
Steffen Bühler Auf diesen Beitrag antworten »

Du willst t[i] ausgeben, aber t ist kein Array, sondern einfach eine Zahl.
Rivago Auf diesen Beitrag antworten »

Stimmt..

Hmm, wie kann ich das dann ausgeben? Muss ich t also auch als Array deklarieren, damit ich jeweils t = t + sw ausgeben kann?
Steffen Bühler Auf diesen Beitrag antworten »

Nein, Du gibst einfach t aus, das enthält ja immer den aktuellen Wert.
Rivago Auf diesen Beitrag antworten »

Hab es jetzt. Danke für deine Hilfe smile Wink Freude
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »