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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| program modell;
uses graph,crt;
const BGI_Pfad = 'c:\tp7\bgi'; {Pfad far BGI-Dateien z.B. c:\bp\bgi}
x0 :integer =0; {Koordinaten-Ursprung}
y0 :integer =0; {Voreinstellung fur }
x_text:string = 't/s'; {x, y-Achsen-Beschriftung}
y_text:string = 's/m';
type string10 = string [10];
var Grafiktreiber,Grafikmodus,Fehlercode:integer;
xp0_abs,yp0_abs,xp_max,yp_max,x_max,y_max:integer;
x_LE,y_LE:real;
procedure Eingabe_Achsen (var x_text,y_text:string10;var x_LE,y_LE:real);
{Beschriftung und Langeneinheiten der Koordinatenachsen}
begin
ClrScr;writeln('Beschriftung der');
write('x-Achse (z.B. t/ 4s) = ');gotoxy(25,2);readln(x_text);
write('y-Achse (z.B. s/ 8m) = ');gotoxy(25,3);readln(y_text);
writeln('Langeneinheiten der');
write('x-Achse (z.B. 4) = ');gotoxy(25,5);readln(x_LE);
write('y-Achse (z.B. 8) = ');gotoxy(25,6);readln(y_LE);
end;
function x_xp(x:real):integer;
{Anwenderkoordinaten werden in Pixelwerte umgerechnet. Der absolute Nullpunkt des
Anwenders liegt bei (xO_abs=40,yO_abs=GetMaxY-40). Damit liegt der Ursprung (0,0) links
unten auf dem Bildschirm}
var x_pos:real;
begin x_pos:=x+x0;x_xp:=round(x_pos/x_max*xp_max+xp0_abs); end;
function y_yp(y:real):integer; {Anwenderkoordinaten in Pixelwerte vgl. x_xp}
var y_pos:real;
begin y_pos:=y+y0;y_yp:=round(yp0_abs-y_pos/y_max*yp_max); end;
procedure Gerade(xp_0,yp_0,xp_1,yp_1:integer);
{ zeichnet eine Gerade von (xp_0,yp_0) nach (xp_1,yp_l) }
begin MoveTo(xp_0,yp_0);LineTo(xp_1,yp_1); end;
procedure Koordinaten_Achsen(x_text,y_text:string10; x0,y0:integer);
{zeichnet ein Koordinatensystem, die Achsen werden mit x_text bzw. y_text beschriftet.
Der Koordinatenursprung liegt bei xO,yO}
var i:integer;
x_txt,y_txt:string[5];
begin
Gerade(x_xp(-x0),y_yp(0),x_xp(x_max-x0),y_yp(0));
Gerade(x_xp(x_max-x0)-5,y_yp(0)-2,x_xp(x_max-x0),y_yp(0));
Gerade(x_xp(x_max-x0)-5,y_yp(0)+2,x_xp(x_max-x0),y_yp(0));
Gerade(x_xp(0),y_yp(-y0),x_xp(0),y_yp(y_max-y0));
Gerade(x_xp(0)+2,y_yp(y_max-y0)+5,x_xp(0),y_yp(y_max-y0));
Gerade(x_xp(0)-2,y_yp(y_max-y0)+5,x_xp(0),y_yp(y_max-y0));
outtextxy(x_xp(0)+5,y_yp(y_max-y0),y_text); {Textausgabe im Grafik-Schirm}
outtextxy(x_xp(x_max-x0)-
textwidth(x_text),y_yp(0)+textheight('0123456789'),x_text);
for i:=1-x0 to x_max-1-x0 do {x_Achse skalieren}
begin
str(i,x_txt);gerade(x_xp(i),y_yp(0)+5,x_xp(i),y_yp(0));
outtextxy(x_xp(i)-textwidth(x_txt),y_yp(0)+textheight('0123456789'),x_txt);
end;
for i:=1-y0 to y_max-1-y0 do {y_Achse ska1ieren}
begin
str(i,y_txt);gerade(x_xp(0)-5,y_yp(i),x_xp(0),y_yp(i));
outtextxy(x_xp(0)-5-textwidth(y_txt),y_yp(i),y_txt);
end;
end;
procedure Tabelle; {mit t,s-Variablen "Der Aufzug", S. 10}
var t,dt,s,v,x,y: real;
weiter:boolean;
i:integer;
begin
dt:=0.01; {Schrittweite}
t:=0; s:=0; v:=5; {Startwerte}
weiter:=true; {Tabelle ausgeben, solange welter = true ist}
while weiter do
begin
ClrScr;gotoXY(10,1);write(x_text);gotoXY(30,1);write(y_text);
for i:=3 to 20 do
begin
t:=t+dt; {Zeit in Sekunden}
if t>10 then v:=0; {nach 10 s Geschwindigkeit y = O m/s}
if t>15 then v:=-2.5; {nach 15 s Geschwindigkeit y = —2,5 m/s}
s:=s+v*dt; {zuruckgelegter Weg s in Meter}
if s<0 then s:=0;
gotoXY(5,i);write(t);gotoXY(25,i);write(s); {Tabellenwerte ausgeben}
end;
gotoXY(10,24);write('Fortsetzung (j/n)');weiter:=(UpCase(ReadKey)='J');
end;
end;
procedure GrafikEinstellungen;
begin
Grafiktreiber:=Detect;InitGraph(Grafiktreiber,Grafikmodus,BGI_Pfad);
Fehlercode:=GraphResult;
if FehlerCode <> grOK
then begin writeln('Grafik-Fehler: ',GraphErrorMsg(FehlerCode));
readln;halt;end;{Startwerte fur die Koordinaten xp.. yp..= Pixelkoordinaten}
x_max:=15; y_max:=Round(x_max/GetMaxX*GetMaxy);
xp0_abs:=40; yp0_abs:=GetMaxY-40; {absoluter Ursprung}
xp_max:=GetMaxX-xp0_abs-20; yp_max:=yp0_abs-20; {max. x-y-Achse}
Koordinaten_Achsen(x_text,y_text,x0,y0);
end;
procedure Schaubild; { mit t,s-Variablen "Der Aufzug", S. 10}
var t,dt,s,v,x,y: real;
begin
Eingabe_Achsen(x_text,y_text,x_LE,y_LE); <<<=== C'est ici que cela bloque !
GrafikEinstellungen;
dt:=0. 01; {Schrittweite}
t:=0; s:=0; v:=5; {Startwerte }
X:=t/x_LE;
while (x<x_max) and (s>=0) do
begin
x:=t/x_LE; y:=s/y_LE; {Langeneinheiten berechnen }
PutPixel(x_xp(x),y_yp(y),15); {Punkt zeichnen}
t:=t+dt; {Zeit in Sekunden}
if t>10 then v:=0; {nach 10 s Geschwindigkelt v = O m/s}
if t>15 then v:=-2.5; {nach 15 s Geschwindigkeit v = -2,5 m/s}
s:=s+v*dt; {zuruckgelegter Weg s in Meter}
end;
readln; {warten auf RETURN}
CloseGraph;
end;
begin {Hauptprogramm}
ClrScr; {Bildschirm loschen}
gotoXY(10,15);write('T=Wertetabelle S=Schaubild');
if UpCase(ReadKey)='T' then Tabelle else Schaubild;
end. |
Partager