|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 16000 (0x3e80)
Types: TextFile
Names: »REGRES.PAS«
└─⟦f8aa97e0f⟧ Bits:30003286 MINICALC eksempler - Piccolo
└─⟦this⟧ »REGRES.PAS«
program REGRES; æ Copyright (c), Carl Hemmingsen, FAG 7/4 - 1984 å
æ Dette program er medtaget som et eksempel paa yderligere beregninger
paa en opgave fra minicalc. Constantdelen og typedelen lige herunder
indeholder alle oplysninger om opgaven. For at kunne regne paa opgaven
er det nødvendigt, at lave maaltallene om fra strenge til reelle tal.
Man kan altid diskutere, hvad et program skal kunne og hvad eleverne
selv maa lave. Mange vil maaske mene at lineær regression ikke hører
hjemme i en 1g (jeg selv inkluderet). Man kan saa blot fjerne dette
program fra disketten. å
const maxrakke = 17; maxsojle = 9;
max = 85; (* til TURTLE *)
type str10 = stringÆ10Å; str14 = STRINGÆ14Å;
str50 = stringÆ50Å;
BTYPE = ARRAYÆ1..maxsojle,1..maxrakkeÅ OF STR14;
ATYPE = ARRAYÆ1..maxsojle,1..maxrakkeÅ OF STR10;
NTYPE = ARRAYÆ1..maxsojleÅ OF STR10;
FTYPE = ARRAYÆ1..maxsojleÅ OF STR50;
OPGAVE= RECORD
ASOJLE,RAKKE,BSOJLE: BYTE; æ antal sojler og rækker å
A: ATYPE; æ maaleskemaet å
B: BTYPE; æ beregningsskemaet å
Anavn,Bnavn: ntype; æ overskrifter å
F: FTYPE æ forskrifter å
END;
var FOPG: FILE OF OPGAVE; æ en fil af en opgave å
OPG: OPGAVE; æ en opgave å
FILNAVN: STR14;
x, y: arrayÆ1..maxrakkeÅ of real;
a, b, koeff, haeldning: real;
i, j, nrA, nrB, p: integer;
ch: char;
udf: text;
printer: boolean;
(* ================================================================== *)
(*$A+*)(*$S+*)
TYPE sgntype = -1..1;
boolsktype = 0..1;
farve = (white,none,black);
xtype = 0..255;
ytype = 0..264;
CONST ttabel : ARRAY(.1..6.) OF 0..64 = (1,2,4,8,16,64);
VAR screen : ARRAY(.1..2000.) OF CHAR AT $F800;
ta : ARRAY(.1..max,1..132.) OF CHAR;
toldfarve,tfarve : farve;
tph : 0..85;
tsh : xtype;
tsb : ytype;
tb,tch : CHAR;
txmin,txmax,tymin,tymax,txscale,tyscale,tretning : REAL;
toldx,toldxa,tix,toldy,toldya,tiy : REAL;
FUNCTION sgn(t : REAL) : sgntype;
BEGIN
IF t=0 THEN sgn:=0 ELSE sgn:=TRUNC(t/ABS(t));
END;
FUNCTION tround(t : REAL) : INTEGER;
BEGIN
tround:=TRUNC(t+0.5);
END;
FUNCTION boolsk(a : BOOLEAN) : boolsktype;
BEGIN
IF a THEN boolsk:=1 ELSE boolsk:=0;
END;
PROCEDURE tplot;
VAR txa,tox : INTEGER;
tya : 1..2000;
toy : ytype;
tu,tv : BYTE;
BEGIN
tox:=TRUNC(toldx) ; toy:=TRUNC(toldy);
toldx:=toldx+tix ; toldy:=toldy+tiy;
txa:=tox DIV 2 ; tya:=toy DIV 3;
tv:=ttabel(.5+tox MOD 2-toy MOD 3*2.);
IF tph<>0 THEN
BEGIN
tu:=ORD(ta(.tya,txa.));
ta(.tya,txa.):=CHR(tu+(boolsk((tu MOD (tv+tv))<tv)-boolsk(tfarve<none))*tv); END
ELSE
BEGIN
tya:=(25-tya)*80+1+txa;
tu:=ORD(screen(.tya.));
screen(.tya.):=CHR(tu+(boolsk((tu MOD (tv+tv))<tv)-boolsk(tfarve<none))*tv); END;
END;
PROCEDURE draw(tx,ty : REAL);
VAR step : sgntype;
txn,tyn : REAL;
BEGIN
toldxa:=tx ; toldya:=ty;
tix:=0 ; tiy:=0;
txn:=(tx-txmin)*txscale+2.5 ; tyn:=(ty-tymin)*tyscale+3.5;
IF (txn>=2) AND (txn<tsb+2) AND (tyn>=3) AND (tyn<tsh+3) THEN
BEGIN
IF tfarve<>none THEN
BEGIN
CASE sgn(ABS(tyn-toldy)-ABS(txn-toldx)) OF
-1 : BEGIN
tiy:=(tyn-toldy)/ABS(txn-toldx) ; step:=sgn(txn-toldx);
REPEAT
tplot ; toldx:=toldx+step;
UNTIL step*(toldx-txn)>0;
END;
0 : BEGIN
IF tyn-toldy<>0 THEN
BEGIN
tix:=(txn-toldx)/ABS(tyn-toldy) ; step:=sgn(tyn-toldy);
REPEAT
tplot ; toldy:=toldy+step;
UNTIL step*(toldy-tyn)>0;
END
ELSE
tplot;
END;
1 : BEGIN
tix:=(txn-toldx)/ABS(tyn-toldy) ; step:=sgn(tyn-toldy);
REPEAT
tplot ; toldy:=toldy+step;
UNTIL step*(toldy-tyn)>0;
END
END; (* OF CASE *)
END;
tfarve:=black;
END
ELSE
BEGIN
tfarve:=none ; toldfarve:=none;
END;
toldx:=txn ; toldy:=tyn;
END;
PROCEDURE plot(tx,ty : REAL);
BEGIN
tfarve:=none;
toldx:=(tx-txmin)*txscale+2.5 ; toldy:=(ty-tymin)*tyscale+3.5;
IF (toldx>=2) AND (toldx<tsb+2) AND (toldy>=3) AND (toldy<tsh+3) THEN
BEGIN
tfarve:=black;
tplot;
END;
toldxa:=tx ; toldya:=ty;
END;
PROCEDURE moveto(tx,ty : REAL);
BEGIN
toldfarve:=tfarve;
draw(tx,ty);
tfarve:=toldfarve;
END;
PROCEDURE move(tl : REAL);
BEGIN
moveto(toldxa+tl*COS(tretning/180*PI),toldya+tl*SIN(tretning/180*PI));
END;
PROCEDURE scale(txmini,txmaxi,tymini,tymaxi : REAL);
BEGIN
txmin:=txmini ; txmax:=txmaxi;
tymin:=tymini ; tymax:=tymaxi;
txscale:=(tsb-1)/(txmax-txmin);
tyscale:=(tsh-1)/(tymax-tymin);
tfarve:=none;
moveto((txmax+txmin)/2,(tymax+tymin)/2);
END;
PROCEDURE pencolor(tcolor : farve);
BEGIN
tfarve:=tcolor;
moveto(toldxa,toldya);
END;
PROCEDURE plotaxes(txorg,tyorg,txunit,tyunit : REAL);
VAR tj,ti,tst,tkor : REAL;
BEGIN
plot(txmin,tyorg) ; draw(txmax,tyorg) ; plot(txmax,tyorg);
plot(txorg,tymin) ; draw(txorg,tymax) ; plot(txorg,tymax);
IF tyunit>0 THEN
BEGIN
tst:=tyorg ; tkor:=1/txscale;
WHILE tst>=(tymin+tyunit) DO tst:=tst-tyunit;
tj:=txorg ; ti:=(tj-txmin)*txscale ; ti:=ti-INT(ti)-0.5;
IF (ABS(ti)<0.001) AND (ti>=0) THEN tj:=tj+0.1/txscale;
IF (ABS(ti)<0.001) AND (ti<0) THEN tj:=tj-0.1/txscale;
WHILE tst<=tymax DO
BEGIN
plot(tj-tkor,tst) ; plot(tj+tkor,tst) ; tst:=tst+tyunit;
END;
END;
IF txunit>0 THEN
BEGIN
tst:=txorg ; tkor:=1/tyscale;
WHILE tst>=(txmin+txunit) DO tst:=tst-txunit;
tj:=tyorg ; ti:=(tj-tymin)*tyscale ; ti:=ti-INT(ti)-0.5;
IF (ABS(ti)<0.001) AND (ti>=0) THEN tj:=tj+0.1/tyscale;
IF (ABS(ti)<0.001) AND (ti<0) THEN tj:=tj-0.1/tyscale;
WHILE tst<=txmax DO
BEGIN
plot(tst,tj-tkor) ; plot(tst,tj+tkor) ; tst:=tst+txunit;
END;
END;
tfarve:=none;
moveto(0,0);
END;
PROCEDURE turn(tvinkel : REAL);
BEGIN
tretning:=tretning+tvinkel;
WHILE tretning>=360 DO tretning:=tretning-360;
WHILE tretning<0 DO tretning:=tretning+360;
END;
PROCEDURE turnto(tvinkel : REAL);
BEGIN
tretning:=tvinkel ; turn(0);
END;
PROCEDURE whereami(VAR tx,ty,tvinkel : REAL);
BEGIN
tx:=toldxa ; ty:=toldya ; tvinkel:=tretning;
END;
PROCEDURE initturtle;
BEGIN
tph:=1 ; tch:='j';
IF max>1 THEN
BEGIN
WRITE(@12,'Skal tegningen på skærmen (j/n) ?');
READ(KBD,tch);
END;
IF tch IN (.'j','J'.) THEN
BEGIN
tph:=0 ; tsh:=75 ; tsb:=158;
WRITE(@12) ; screen(.1.):=@132;
END
ELSE
BEGIN
WRITELN;
WHILE (tph<=1) OR (tph>85) DO
BEGIN
WRITE('Antal linier (indtil 85) ? ') ; READLN(tph);
END;
tsb:=264 ; tsh:=3*tph;
END;
toldfarve:=none ; tfarve:=none ; tretning:=0;
FILL(ta,max*132,' ');
scale(-tsb/2,(tsb/2)-1,-(tsh DIV 2),(tsh-1) DIV 2);
moveto(0,0);
END;
PROCEDURE endturtle;
VAR ti : 0..85;
tj,tu : 0..132;
alarm,vent : INTEGER;
BEGIN
IF tph<>0 THEN
BEGIN
FOR alarm:=1 TO 6 DO
BEGIN
WRITE(@7);
FOR vent:=1 TO 8000 DO;
END;
WRITE('Pres en tast når printeren er tændt');
REPEAT UNTIL KEYPRESS;
WRITE(LST,@27,'F68',@27,'8',@27,'5',@14,@29);
FOR ti:=tph DOWNTO 1 DO
BEGIN
tj:=tsb DIV 2-9;
WHILE (tj>10) AND (COPY(ta(.ti.),tj,10)=' ') DO tj:=tj-10;
FOR tu:=1 TO tj+9 DO WRITE(LST,CHR((ORD(ta(.ti,tu.))+32) MOD 96));
WRITELN(LST);
END;
WRITE(LST,@12,@27,'F51',@27,'6',@27,'5',@15,@30);
END
ELSE
BEGIN
WRITE(@7);
REPEAT UNTIL KEYPRESS ; WRITE(@12);
END;
WRITELN(@144,'*** BYE FROM TURTLE ***',@128);
END;
(*$A-*)
PROCEDURE kryds(px,py : REAL);
VAR sign : -1..1;
ti,tj,tkor : REAL;
BEGIN
FOR sign:=-1 TO 1 DO
BEGIN
tkor:=1/tyscale; tj:=py ; ti:=(tj-tymin)*tyscale ; ti:=ti-INT(ti)-0.5;
IF (ABS(ti)<0.001) AND (ti>=0) THEN tj:=tj+0.1/tyscale;
IF (ABS(ti)<0.001) AND (ti<0) THEN tj:=tj-0.1/tyscale;
plot(px,tj+sign*tkor);
tkor:=1/txscale; tj:=px ; ti:=(tj-txmin)*txscale ; ti:=ti-INT(ti)-0.5;
IF (ABS(ti)<0.001) AND (ti>=0) THEN tj:=tj+0.1/txscale;
IF (ABS(ti)<0.001) AND (ti<0) THEN tj:=tj-0.1/txscale;
plot(tj+sign*tkor,py);
END;
END;
TYPE chrtype = 0..127;
lintype = 0..10;
tegntype = ARRAY(.lintype.) of chrtype;
tegnsaet = ARRAY(.chrtype.) of tegntype;
navntype = STRING(.15.);
VAR tegn :tegntype;
saet :tegnsaet;
tabel :ARRAY(.0..10,0..6.) of 0..1;
fundet :BOOLEAN;
tegnfil :TEXT;
PROCEDURE loadtegn(tegnnr:chrtype ; tegn:tegntype);
VAR lin :0..10;
BEGIN
PORT(.209.):=tegnnr;
FOR lin:=0 TO 10 DO
BEGIN
PORT(.210.):=lin;
PORT(.211.):=tegn(.lin.);
END;
END; (* loadtegn *)
PROCEDURE ldtegnsaet(saet:tegnsaet);
VAR tegnnr :chrtype;
BEGIN
PORT(.1.):=64;
FOR tegnnr:=0 TO 127 DO loadtegn(tegnnr,saet(.tegnnr.));
PORT(.1.):=32;
END; (* loadtegnsaet *)
FUNCTION findes(VAR filnavn:navntype):BOOLEAN;
VAR tegnfil : TEXT;
ok :BOOLEAN;
BEGIN
(*$I-*)
ASSIGN(tegnfil,filnavn);
RESET(tegnfil);
ok:=(iores=0);
IF ok THEN CLOSE(tegnfil);
findes :=ok;
IF filnavn='.CHP' THEN findes:=false;
(*$I+*)
END; (* findes *)
PROCEDURE filread(VAR saet:tegnsaet);
VAR s:STRING(.11.);
i,j :INTEGER;
BEGIN
FOR i:=0 TO 127 DO
BEGIN
READLN(tegnfil,s);
FOR j:=0 TO 10 DO saet(.i,j.):=ORD(s(.j+1.));
END;
END; (*filread *)
PROCEDURE chrhent(filnavn : navntype);
BEGIN
filnavn:=filnavn+'.CHP';
fundet:=findes(filnavn);
IF (NOT fundet) THEN WRITELN('Filen findes ikke !! ');
IF fundet THEN
BEGIN
ASSIGN(tegnfil,filnavn);
RESET(tegnfil);
filread(saet);
CLOSE(tegnfil);
ldtegnsaet(saet);
END;
END; (* opret*)
procedure HENTOPGAVE;
var fundet: boolean;
begin
gotoxy(0,7);
repeat
filnavn:='';
WRITE('Hvad hedder opgaven ? (skriv kun fornavn) : ');
READLN(FILNAVN); FILNAVN:=FILNAVN + '.MID';
assign(FOPG,filnavn);
æ$I-å reset(fopg); æ$I+å
fundet:= iores = 0;
if fundet then read(fopg,opg)
else writeln('Opgaven findes ikke')
until fundet;
close(FOPG)
end; æ gemhent å
PROCEDURE LaesSojler;
begin
writeln('Målte størrelser :');
writeln;
for i:= 1 to opg.asojle do
write(i:2,') ',opg.anavnÆiÅ,'':12-len(opg.anavnÆiÅ));
writeln; writeln;
writeln('Beregnede størrelser :');
writeln;
for i:= 1 to opg.bsojle do
write(i+opg.asojle:2,') ',opg.bnavnÆiÅ,'':12-len(opg.bnavnÆiÅ));
writeln; writeln;
write('Angiv nummer på uafhængig variabel : '); readln(nrA);
if nrA <= opg.asojle then
for i:=1 to opg.rakke do val(opg.aÆnrA,iÅ,XÆiÅ,p)
else
for i:=1 to opg.rakke do val(opg.bÆnrA-opg.asojle,iÅ,XÆiÅ,p);
write('Angiv nummer på afhængig variabel : '); readln(nrB);
if nrB <= opg.asojle then
for i:=1 to opg.rakke do val(opg.aÆnrB,iÅ,YÆiÅ,p)
else
for i:=1 to opg.rakke do val(opg.bÆnrB-opg.asojle,iÅ,YÆiÅ,p);
end; æ LaesSojler å
PROCEDURE SkrivSojler;
begin
writeln(lst,filnavn);
writeln(lst);
writeln(lst,'Målte størrelser :');
writeln(lst);
for i:= 1 to opg.asojle do
write(lst,i:2,') ',opg.anavnÆiÅ,'':12-len(opg.anavnÆiÅ));
writeln(lst); writeln(lst);
writeln(lst,'Beregnede størrelser :');
writeln(lst);
for i:= 1 to opg.bsojle do
write(lst,i+opg.asojle:2,') ',opg.bnavnÆiÅ,'':12-len(opg.bnavnÆiÅ));
writeln(lst); writeln(lst);
writeln(lst,'nummer på uafhængig variabel : ',nrA);
writeln(lst,'nummer på afhængig variabel : ',nrB);
writeln(lst)
end; æ SkrivSojler å
procedure regres;
var sumx, sumx2, sumy, sumy2, sumxy, SXX, SXY, SYY: real;
begin
sumx:=0; sumx2:=0; sumy:=0; sumy2:=0; sumxy:=0;
for i:= 1 to opg.rakke do begin
sumx:= sumx + xÆiÅ;
sumy:= sumy + yÆiÅ;
sumx2:=sumx2 + xÆiÅ*xÆiÅ;
sumy2:=sumy2 + yÆiÅ*yÆiÅ;
sumxy:=sumxy + xÆiÅ*yÆiÅ;
end;
SXX:= sumx2 - sumx*sumx/opg.rakke;
SXY:= sumxy - sumx*sumy/opg.rakke;
SYY:= sumy2 - sumy*sumy/opg.rakke;
b:= SXY/SXX; a:= sumy/opg.rakke - b*sumx/opg.rakke;
koeff:= SXY/SQRT(SXX*SYY);
haeldning:= sumxy/sumx2;
end;
procedure skaermprinter;
begin
writeln;
write('Ønskes udskrift på skærm eller printer ? (S/P) ');
read(kbd,ch); writeln(ch);
printer:= ch in Æ'P','p'Å;
if printer then assign(udf,'lst:') else assign(udf,'con:');
rewrite(udf);
gotoxy(0,0); clreos
end;
procedure udskriv;
begin
writeln(udf);
writeln(udf,'Den bedste rette linie: y = Bx + A er bestemt ved:');
writeln(udf);
writeln(udf,'A = ',A:9,' B = ':8,B:9);
writeln(udf);
writeln(udf,'korrelationskoefficient : ',koeff:8:4);
writeln(udf)
end;
procedure proportionalitet;
begin
write('Ønskes Proportionalitet undersøgt ? (Y/N) ');
read(kbd,ch); writeln(ch);
if ch in Æ'Y','y'Å then begin
writeln(udf);
writeln(udf,'Forudsættes proportionalitet fås:');
writeln(udf);
writeln(udf,'Hældning B = ',haeldning:9);
writeln(udf)
end
end;
function f(x : real) : real;
begin
f:=B*x+A;
end;
function g(x : real) : real;
begin
g:=haeldning*x;
end;
procedure grafisk;
var z,q,x1,x2,y1,y2,x0,y0,xenhed,yenhed : real;
ch : char;
i : integer;
begin
write('Ønskes en tegning ? (Y/N) ');
repeat
read(kbd,ch);
until ch in Æ'Y','y','N','n'Å;
if ch in Æ'Y','y'Å then chrhent('ASCII');
x1:=-10 ; x2:=10 ; y1:=-10 ; y2:=10; x0:=0 ; y0:=0;
xenhed:=1; yenhed:=1;
repeat
if ch in Æ'Y','y'Å then begin
write(@12);
write('Når tegningen er færdig og maskinen har sagt BIB, så tryk på');
writeln(' en tast.');
writeln('Hvordan skal koordinat systemet ligge ?');
repeat
gotoxy(0,3); write('Angiv xmin :',x1:6:2,' '); readln(x1);
gotoxy(0,4); write('Angiv xmax :',x2:6:2,' '); readln(x2);
gotoxy(0,5); write('Angiv ymin :',y1:6:2,' '); readln(y1);
gotoxy(0,6); write('Angiv ymax :',y2:6:2,' '); readln(y2);
until (x1<x2) and (y1<y2);
gotoxy(0,8);
write('Hvor skal x og y-aksen skære hinanden ? (x,y) ');
write(x0:6:2,',',y0:6:2,' ');
readln(x0,y0);
gotoxy(0,10);
write('Enheder på x og y-akserne ?(x,y) ');
write(xenhed:6:2,' ',yenhed:6:2,' ');
readln(xenhed,yenhed); writeln;
write('Skal linien gå gennem 0,0 (Y,N) ');
repeat
read(kbd,ch);
until ch in Æ'Y','y','N','n'Å;
initturtle ; scale(x1,x2,y1,y2) ; plotaxes(x0,y0,xenhed,yenhed);
for i:=1 to opg.rakke do kryds(xÆiÅ,yÆiÅ);
z:=x1; q:=x2;
if ch in Æ'N','n'Å then begin
while ((y1>=f(z)) or (y2<=f(z))) and (z<x2) do z:=z+1/txscale;
while not((f(q)<y2) and (f(q)>y1)) and (q>x1) do q:=q-1/txscale; plot(z,f(z)); draw(q,f(q)); end
else begin
while ((y1>=g(z)) or (y2<=g(z))) and (z<x2) do z:=z+1/txscale;
while not((g(q)<y2) and (g(q)>y1)) and (q>x1) do q:=q-1/txscale; plot(z,g(z));draw(q,g(q)); end;
endturtle;
write(@12,'Ønskes en ny tegning ? (Y,N) ');
repeat
read(kbd,ch);
until ch in Æ'Y','y','N','n'Å;
end;
until ch in Æ'N','n'Å;
end; æ grafik å
(* ================= H O V E D P R O G R A M =========================*)
begin
gotoxy(0,0); clreos;
writeln('':10,'Regres: et hjælpeprogram til minicalc.');
writeln('':10,'Programmet beregner den bedste rette linie v.h.a.');
writeln('':10,'mindste kvadraters metode til måltal, som');
writeln('':10,'er beregnet v.h.a minicalc.');
writeln('':10,'Statistisk interesserede henvises til:');
writeln('':10,'Statistik + diskette af Tommy Borch, FAG.');
hentopgave; æ opgaven laeses paa disketten å
skaermprinter;
LaesSojler; æ søjlerne findes å
if printer then SkrivSojler;
regres; æ udregningerne foretages å
udskriv; æ resultaterne skrives å
proportionalitet;
grafisk;
end.
«eof»