DataMuseum.dk

Presents historical artifacts from the history of:

RegneCentralen RC759 "Piccoline"

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RegneCentralen RC759 "Piccoline"

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦87fa62149⟧ TextFile

    Length: 13824 (0x3600)
    Types: TextFile
    Names: »LL3.PAS«

Derivation

└─⟦cd307176b⟧ Bits:30002666 Programmer fra Forlaget FAG ApS
    └─ ⟦this⟧ »LL3.PAS« 

TextFile

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»