|
|
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: 13824 (0x3600)
Types: TextFile
Names: »LL3.PAS«
└─⟦cd307176b⟧ Bits:30002666 Programmer fra Forlaget FAG ApS
└─⟦this⟧ »LL3.PAS«
program LLIGNING; (* Martin Rasmussen, 3xF , januar 1985 *)
const (* COMPAS PASCAL version 3.07, Piccoline *)
maxm=10; maxn=10;
maxmn=20; (* maxmn = maxm+maxn *)
type
fil1type = record
a:array(.1..maxn,1..maxmn.) of real;
rn,rm:integer;
end;
printype = (cons,prin,spog,clos);
var
r:fil1type;
n,m,i,j:integer;
detfac:real;
svar:char;
fil:string(.12.);
fil1:file of fil1type;
prt:boolean;
outf:text;
procedure menu; forward;
procedure nulstil; forward;
procedure stop; forward;
procedure printer(mode:printype); forward;
procedure forklaring; forward;
procedure erklaringer; forward;
procedure inddata; forward;
procedure indlas1; forward;
procedure indlas2; forward;
procedure rettelser; forward;
procedure retdata; forward;
procedure hentdata; forward;
procedure gemdata; forward;
procedure gauss; forward;
procedure uddata; forward;
procedure losning; forward;
procedure menu;
begin
repeat
write(clrhom);writeln;
writeln(' L I N E Æ R E L I G N I N G E R');
writeln;
writeln;
writeln(' Der kan vælges mellem følgende muligheder:');
writeln;
writeln(' 1. Løsning af ny opgave.');
writeln;
writeln(' 2. Løsning af gammel opgave.');
writeln;
writeln(' 3. Gentag udskrivning af løsningen.');
writeln;
writeln(' 4. Forklaring.');
writeln;
writeln(' 5. Stop kørslen.');
writeln;
write(' Anfør det ønskede nummer > ');
readln(svar); writeln;
if svar in (.'1'..'4'.) then write(clrhom);
case svar of
'1':begin
erklaringer;
inddata;
rettelser;
gemdata;
printer(spog);
if prt then uddata;
gauss;
losning;
printer(clos);
end;
'2':begin
hentdata;
rettelser;
gemdata;
printer(spog);
if prt then uddata;
gauss;
losning;
printer(clos);
end;
'3':begin
printer(spog);
losning;
printer(clos);
end;
'4':forklaring;
end;
until svar='5';
end; (* menu *)
procedure nulstil;
begin
fill(r,size(r),0);
n:=0; m:=0; i:=0; j:=0; detfac:=0;
prt:=false;
end; (* nulstil *)
procedure stop;
begin
writeln; writeln; writeln;
writeln(' ** Fejlmeldingen er uden betydning. **');
if 1/0=0 then;
end; (* stop *)
procedure printer;
begin
if mode=spog then
begin
write(' Ønskes udskrift på skærm/printer? (s/p) ');
readln(svar); writeln;
if svar in (.'p','P'.) then mode:=prin else mode:=cons;
end;
case mode of
cons :begin
assign(outf,'con:');
rewrite(outf); prt:=false;
end;
prin :begin
assign(outf,'lst:');
rewrite(outf); prt:=true;
end;
clos : begin
close(outf);
prt:=false;
end;
end;
end; (* printer *)
procedure forklaring;
begin
write(clrhom);writeln;
writeln(' F O R K L A R I N G.');
writeln;
writeln(' *******************************************************');
writeln(' * DETTE PROGRAM LØSER LINEÆRE LIGNINGER PÅ *');
writeln(' * PÅ FØLGENDE FORM. *');
writeln(' * *');
writeln(' * *');
writeln(' * A11*X1 + A12*X2 + ... + A1N*XN = B1 ... B1M *');
writeln(' * . . . . . *');
writeln(' * . . . . . *');
writeln(' * AM1*X1 + AM2*X2 + ... + AMN*XN = BM ... BNM *');
writeln(' * *');
writeln(' * HVOR *');
writeln(' * N = ANTAL UBEKENDTE (OG ANTAL LIGNINGER) *');
writeln(' * M = ANTAL HØJRESIDER *');
writeln(' * *');
writeln(' * *');
writeln(' * (c) Martin Rasmussen. Tommy Borch *');
writeln(' * Forlaget FAG Januar 1984. *');
writeln(' *******************************************************');
writeln;
write(' Tast return > '); readln(svar);
write(clrhom);writeln;
writeln(' ********************************************************');
writeln(' * ALLE ELEMENTER ANBRINGES I EN MATRIX A(N,N+M) *');
writeln(' * HVOR A(1:N,1:N) INDEHOLDER KOEFFICIENTERNE MENS *');
writeln(' * A(1:N,N+1:N+M) INDEHOLDER HØJRESIDERNE. *');
writeln(' * *');
writeln(' * LØSNINGERNE GEMMES SOM SØJLEVEKTORER I *');
writeln(' * A(1:N,N+1:N+M). *');
writeln(' * LIGNINGSSYSTEMETS DETERMINANT BEREGNES OG UDSKRIVES *');
writeln(' * *');
writeln(' * HVIS DETERMINANTEN ER 0 (ELLER MEGET NÆR 0) STOPPER *');
writeln(' * PROGRAMMET MED EN MEDDELELSE OM, AT MATRICEN ER *');
writeln(' * SINGULÆR, OG AT LIGNINGSSYSTEMET IKKE HAR NOGEN *');
writeln(' * ENTYDIG LØSNING. HEREFTER FØLGER EN FEJLMEDDELELSE, *');
writeln(' * SOM ER UDEN BETYDNING, OG KØRSLEN STOPPER. *');
writeln(' * *');
writeln(' * DEN INVERSE MATRIX TIL EN MATRIX A KAN BEREGNES VED *');
writeln(' * AT INDTASTE N X N ENHEDSMATRICEN SOM HØJRESIDERNE. *');
writeln(' * *');
writeln(' * IØVRIGT HENVISES TIL KAPITEL 2 I BOGEN *');
writeln(' * "LINEÆR PROGRAMMERING" AF MORTEN BLOMHØJ, *');
writeln(' * KLAVS FRISDAHL OG FRANK MØLGAARD OLSEN (FAG) *');
writeln(' *******************************************************');
write(' Tast return > ');readln(svar);
end; (* forklaring *)
procedure erklaringer;
var m1:integer;
begin
nulstil;
write(clrhom);writeln;
repeat
write(' Antal ubekendte (max ',maxn,') ? ');
readln(n); writeln;
write(' Antal højresider (max ',maxm,') ? ');
readln(m1); writeln;
until (n>0) and (m1>0) and (n<=maxn) and (m1<=maxm);
m:=m1+n;
end; (* erklaringer *)
procedure inddata;
begin
if (n<=9) and (m<=9) then indlas1 else indlas2;
end; (* inddata *)
procedure indlas1;
var
i,j,pos,pos1,pos2,fejl:integer;
svar:string(.20.);
begin
write(clrhom);writeln(' LIGNINGER: ');
for i:=1 to n do
begin
for j:=1 to n do
begin
pos:=10*(j-1);
pos1:=pos mod 70+4;
pos2:=i*2+pos div 70;
gotoxy(pos1,pos2); writeln('0 X',j,'+');
end;
gotoxy(pos1+8,pos2); writeln('= ');
for j:=n+1 to m do
begin
pos:=10*(j-1);
pos1:=pos mod 70+4;
pos2:=i*2+pos div 70;
gotoxy(pos1,pos2); writeln('0');
end;
end;
for i:=1 to n do
begin
for j:=1 to m do
begin
pos:=10*(j-1);
pos1:=pos mod 70+4;
pos2:=i*2+pos div 70;
repeat
gotoxy(pos1,pos2); readln(svar);
val(svar,r.a(.i,j.),fejl);
until fejl=0;
end;
end;
end; (* indlas1 *)
procedure indlas2;
var
i,j:integer;
begin
write(clrhom);
write(' LINÆRE LIGNINGER MED ',n,' UBEKENDTE OG ');
writeln(m-n,' HØJRESIDER.');
writeln('Kun koefficienter forskellig fra 0 skal indtastes.');
writeln('Tast først nummeret på søjlen og så koefficientens talværdi.');
writeln('Søjlenummer 0 afslutter en række i koefficient-matricen .');
writeln;
writeln('Række Søjle koefficient');
for i:=1 to n do
begin
j:=0;
repeat
j:=j+1;
write(i:3,'':12); read(j);
if (j>0) and (j<=n) then
begin
write('':20,'A(',i,',',j,') = ');
readln(r.a(.i,j.));
end else
begin
writeln;
end;
until (j=0) or (j=n);
writeln;
writeln('':3,'HØJRESIDE:',i);
j:=0;
repeat
j:=j+1;
write(i:3,'':12); read(j);
if (j>0) and (j<=m-n) then
begin
write('':20,'A(',i,',',n+j,') = ');
readln(r.a(.i,n+j.));
end else
begin
writeln;
end;
until (j=0) or (j=m-n);
writeln;
end;
end; (* indlas2 *)
procedure rettelser;
begin
repeat
printer(cons);
uddata;
printer(clos);
write(' Er dette korrekt? (j/n) ');
readln(svar); writeln;
if not(svar in (.'j','J'.)) then retdata;
until svar in (.'j','J'.);
end; (* rettelser *)
procedure retdata;
var svar:char;
begin
repeat
writeln;
write(' Rettelser i : (a) A-matricen. ');
writeln('(venstresiderne)');
write(' (b) B-matricen. ');
writeln('(højresiderne)');
writeln(' (p) Matrixen på printer.');
writeln(' (s) Stop rettelser');
repeat
write(' Vælg bogstav > ');
read(svar);
if ord(svar)>96 then svar:=chr(ord(svar)-32);
until svar in (.'A','B','C','P','S'.);
writeln;
case svar of
'A':begin
repeat
write(' Anfør rækkenummer: '); read(i);
write('. søjlenummer: '); readln(j);
until (i in (.1..n.)) and (j in (.1..n.));
write(' A(',i,',',j,') = ');
write(r.a(.i,j.):0:4,' = ');
readln(r.a(.i,j.));
end;
'B':begin
repeat
write(' Anfør rækkenummer: '); read(i);
write('. Højreside nummer: '); readln(j);
until (i in (.1..n.)) and (j in (.1..m-n.));
write(' A(',i,',',n+j,') = ');
write(r.a(.i,n+j.):0:4,' = ');
readln(r.a(.i,n+j.));
end;
'P':begin
printer(prin);
uddata;
printer(clos);
end;
end;
until svar='S';
end; (* retdata *)
procedure hentdata;
begin
nulstil;
repeat
write(' Hvad er filens navn? (højst 8 bogstaver) ');
buflen:=8; readln(fil); writeln;
until len(fil)<>0;
fil:=fil+'.LLD';
assign(fil1,fil); reset(fil1);
read(fil1,r); close(fil1);
n:=r.rn; m:=r.rm;
end; (* hentdata *)
procedure gemdata;
begin
write(' Skal disse data gemmes på en fil? (j/n) ');
svar:='j'; readln(svar); writeln;
if svar in (.'j','J'.) then
begin
repeat
write(' Hvad er filens navn? (højst 8 bogstaver) ');
buflen:=8; readln(fil); writeln;
until len(fil)<>0;
fil:=fil+'.LLD';
r.rn:=n; r.rm:=m;
assign(fil1,fil); rewrite(fil1);
write(fil1,r); close(fil1);
end;
end; (* gemdata *)
procedure gauss;
var
permute:array(.1..maxn.) of integer;
i,j,k,i0,j0:integer;
max,factor,twofac:real;
begin
writeln;
writeln(' ANTAL GENNEMLØB:');
detfac:=1;
for i:=1 to n do
begin
max:=0;
for j:=1 to n do max:=max+sqr(r.a(.i,j.));
if (max>1) or (max<0.25) then
begin
twofac:=exp(ln(2)*(-int(ln(max)/1.3893+1)));
for j:=1 to m do r.a(.i,j.):=r.a(.i,j.)*twofac;
detfac:=detfac/twofac;
end;
end;
for k:=1 to n do
begin
write(k:4);
max:=0;
for i:=k to n do
begin
for j:=k to n do
begin
factor:=abs(r.a(.i,j.));
if max<factor then
begin
max:=factor; i0:=i; j0:=j;
end;
end;
end;
if max<0.000001 then
begin
write(clrhom);writeln; writeln;
write(' SINGULÆRT SYSTEM. ');
writeln('OPGAVEN HAR IKKE EN ENTYDIG LØSNING.');
writeln;
stop;
end;
max:=r.a(.i0,j0.);
detfac:=detfac*max;
if i0<>k then
begin
detfac:=-detfac;
for j:=k to m do
begin
factor:=r.a(.k,j.);
r.a(.k,j.):=r.a(.i0,j.);
r.a(.i0,j.):=factor;
end;
end;
permute(.k.):=k;
if j0<>k then
begin
detfac:=-detfac;
permute(.k.):=j0;
for i:=1 to n do
begin
factor:=r.a(.i,k.);
r.a(.i,k.):=r.a(.i,j0.);
r.a(.i,j0.):=factor;
end;
end;
for i:=k+1 to n do
begin
factor:=r.a(.i,k.)/max;
for j:=k+1 to m do r.a(.i,j.):=r.a(.i,j.)-
r.a(.k,j.)*factor;
end;
end;
writeln;
(* Løsning *)
for k:=n+1 to m do
begin
for i:=n downto 1 do
begin
factor:=r.a(.i,k.);
for j:=i+1 to n do factor:=factor-
r.a(.i,j.)*r.a(.j,k.);
r.a(.i,k.):=factor/r.a(.i,i.);
end;
end;
for i:=n-1 downto 1 do
begin
i0:=permute(.i.);
if i0<>i then
begin
for k:=n+1 to m do
begin
factor:=r.a(.i,k.);
r.a(.i,k.):=r.a(.i0,k.);
r.a(.i0,k.):=factor;
end;
end;
end;
end; (* gauss *)
procedure uddata;
begin
if not prt then write(clrhom);
writeln(outf); writeln(outf);
for j:=1 to 79 do write(outf,'-'); writeln(outf);
for i:=1 to n do
begin
for j:=1 to n do
begin
if j mod 7=0 then writeln(outf);
write(outf,r.a(.i,j.):12:4);
end;
write(outf,' : ');
for j:=n+1 to m do
begin
if (j-n) mod 7=0 then writeln(outf);
write(outf,r.a(.i,j.):12:4);
end;
writeln(outf);
end;
for i:=1 to 79 do write(outf,'-'); writeln(outf);
end; (* uddata *)
procedure losning;
begin
write(clrhom);
if prt then write(outf,@12);
for i:=1 to 23 do write(outf,'-');
write(outf,' Løsning til ligningerne ');
for i:=1 to 31 do write(outf,'-'); writeln(outf);
writeln(outf); writeln(outf);
for i:=1 to n do
begin
write(outf,'':25,'X(',i,') = ');
for j:=1 to m-n do write(outf,r.a(.i,n+j.):12:4);
writeln(outf);
end;
writeln(outf);
write(outf,' LIGNINGS-SYSTEMETS DETERMINANT ER ');
if detfac >= 1E8 then writeln(outf,detfac)
else writeln(outf,detfac:0:4);
if abs(detfac)<0.00005 then
writeln(outf,' ADVARSEL! LØSNINGERNE KAN VÆRE MEGET UNØJAGTIGE.');
writeln(outf); writeln(outf); writeln(outf);
write('Tast return >'); readln(svar);
end; (* losning *)
begin
menu;
writeln; writeln;
end.
«eof»