Language: Turbo Pascal.
Objective: This program performs the linear regression between a set of (X,Y) points, including the following transformations:
The program has graphical capability, so you can plot dispersion graphics to verify grafically the fit between data and the proposed function.
Notes: The compilation of this program must be done under the Turbo Pascal compiler, version 5.0 or superior. It requires the Turbo Pascal Graphics Toolbox. After the compiling, the following files must be included in the same directory of the executable file:
***** Begin of Program Listing *****
Program Zardoz; {--------------------------------------------------------------------------} {- -} {- Z A R D O Z -} {- -} {- -} {- Linear Regression Program with Several Transformations -} {- and Graphical Capability -} {- -} {- -} {- Used Units: -} {- GDriver.TPU, GKernel.TPU, GWindow.TPU, GShell.TPU -} {- -} {- Used Files: -} {- 4x6.fon, 8x8.fon (IBM color graphics), -} {- 4x9.fon (Hercules mono graphics) and Error.msg. -} {- -} {- -} {- Antonio Augusto Gorni --- March 6, 1990 -} {- -} {- Lattest Revision: June 6, 1992 -} {- -} {--------------------------------------------------------------------------} uses Dos, Crt, Printer, GDriver, GKernel, GWindow, GShell; type Boolean7 = array [1..7] of boolean; Real7 = array [1..7] of real; ColorArray = array[1..4] of byte; GorniArray = array[1..600] of real; const IOerr : boolean = false; { Detecta Erro de E/S } LinSup : integer = 2; { EGA = 2; CGA = 3 } LinInf : integer = 25; { EGA = 25; CGA = 24 } PrinterMode = 6; { EGA = 6; CGA = 1 } NroFuncoes = 7; WindowColor : ColorArray = (Green, Magenta, LightCyan, White); BackColor : ColorArray = (Black, Black, Black, Black); var XData, YData : GorniArray; Func, i : integer; NumPoints : integer; a, b : Real7; Narq : string; SalvaDados : boolean; Estado : Boolean7; GraphArray : PlotArray; procedure IOCheck; {---------------------------------------------------} {- Check for I/O error; print message if needed. -} {---------------------------------------------------} type String80 = string[80]; var IOcode : integer; procedure Error(Msg : String80); begin Writeln; Write(^G); { Beep! } Writeln(Msg); Writeln; end; { procedure Error } begin { procedure IOCheck } IOcode := IOresult; IOerr := IOcode <> 0; if IOerr then case IOcode of 2 : Error('File not found.'); 3 : Error('Path not found.'); 4 : Error('Too many open files.'); 5 : Error('File access denied.'); 6 : Error('Invalid file handle.'); 12 : Error('Invalid file access code.'); 15 : Error('Invalid drive number.'); 16 : Error('Cannot remove current directory.'); 17 : Error('Cannot rename across drives.'); 100 : Error('Disk read error.'); 101 : Error('Disk write error.'); 102 : Error('File not assigned.'); 103 : Error('File not open.'); 104 : Error('File not open for input.'); 105 : Error('File not open for output.'); 106 : Error('Invalid numeric format.'); else begin Writeln; Writeln(^G); Writeln('Unidentified error message = ', IOcode, '. See manual.'); Writeln; end; end; { case } end; { procedure IOCheck } function FileExists(Fname : String) : boolean; var CheckFile : file; begin Assign(CheckFile, Fname); {$I-} Reset(CheckFile); {$I+} if IOresult = 0 then begin FileExists := true; Close(CheckFile) end else FileExists := false; end; { function FileExists } procedure GetGraphData(var X, Y : GorniArray; var GraphArray : PlotArray; NumPoints : Integer); var Index : Integer; begin for Index := 1 to NumPoints do begin GraphArray[Index, 1] := X[Index]; GraphArray[Index, 2] := Y[Index]; end; end; { procedure GetGraphData } procedure SetColors(Fore, Back : Integer); begin if MaxForeGround = 15 then begin SetForeGroundColor(Fore); SetBackGroundColor(Back); end; end; { Procedure SetColors } procedure Tela1; begin TextMode(0); GoToXY(1,6); write('****************************************'); write('* *'); write('* Z A R D O Z *'); write('* *'); write('* *'); write('* Developed by: *'); write('* *'); write('* Antonio Augusto Gorni - EGT/T *'); write('* *'); write('* Lattest Revision: 11/06/1992 *'); write('* *'); write('****************************************'); delay(5000); TextMode(2) end; { procedure Tela1 } procedure Flash; begin TextBackground(0); TextColor(31); end; procedure Normal; begin TextBackground(0); TextColor(7); end; procedure Inverse; begin TextBackground(7); TextColor(0); end; procedure Centraliza(var Buffer : string); begin GotoXY(round((80-Length(Buffer))/2+1),1); Inverse; Writeln(Buffer); Normal; end; {procedure Centraliza} procedure Tabula(var Buffer, BufImpr : string; Posicao : integer); var i, Compr : integer; begin for i := 1 to Posicao - Length(BufImpr) do Buffer := ' ' + Buffer; BufImpr:=BufImpr+Buffer; end; {Tabula} procedure CabImpr(var BufImpr, Buffer : string; var NroPag : integer); var Ano, Mes, Dia, DiaSemana, Hora, Minuto, Segundo, CentSegundo : word; begin Writeln(Lst,BufImpr); Writeln(Lst,Buffer); GetDate(Ano, Mes, Dia, DiaSemana); GetTime(Hora, Minuto, Segundo, CentSegundo); Write(Lst,'Page no. ',NroPag,' ***** '); Write(Lst,Dia,'/',Mes,'/',Ano,', ',Hora,':'); If Minuto<10 then Write(Lst,'0'); Writeln(Lst,Minuto); Writeln(Lst); Writeln(Lst); Writeln(Lst); end; {CabImpr} Procedure Eject; begin Writeln(Lst,#$C); end; {Eject} procedure Dir(var Caminho : string; Espec : string); var Contador, i, j, NroLin : integer; Flag : boolean; Buffer : string; Tipo : word; ArqDados : SearchRec; ArqRes : Array [1..255] of string[12]; begin Contador := 0; Tipo := 0; FindFirst(Caminho + Espec, Tipo, ArqDados); If DosError = 0 then begin ArqRes[Contador+1] := ArqDados.Name; Contador := Contador + 1; Flag := true; While Flag do begin FindNext(ArqDados); If DosError = 0 then begin ArqRes[Contador+1] := ArqDados.Name; Contador := Contador + 1; end else Flag := false; end; end; ClrScr; Write('DIRETORIO: '); Inverse; Writeln(Caminho); Normal; Writeln; if Contador = 0 then begin GotoXY(1,7); Flash; Writeln('No File was Found in this Directory!'); Normal; GotoXY(1,14); Write('Pressto Continue... '); Readln(Buffer); end else begin For i:=1 to Trunc(Contador/5)+1 do begin if i mod 20 = 0 then begin Writeln; Writeln; Write('Press to Continue... '); Readln(Buffer); ClrScr; GotoXY(1,4); Write('DIRECTORY: '); Inverse; Writeln(Caminho); Normal; Writeln; end; for j := 1 to 5 do begin if 5*(i-1)+j <= Contador then begin GotoXY((j-1)*15+1,WhereY); write(ArqRes[5*(i-1)+j]); end; end; Writeln; end; Writeln; Writeln; Write('Press to Continue... '); Readln(Buffer); end; end; {Dir} procedure IdentificaFuncao(var Funcao : integer; var Saida : string); begin if Saida = 'Con' then case Funcao of 1 : Writeln('<1> Y = A + B * X '); 2 : Writeln('<2> Y = A * EXP(B * X) '); 3 : Writeln('<3> Y = A * X ^ B '); 4 : Writeln('<4> Y = A + B / X '); 5 : Writeln('<5> Y = 1 / (A + B * X) '); 6 : Writeln('<6> Y = X / (A + B * X) '); 7 : Writeln('<7> Y = A + B * LN(X) '); end {case} else if Saida = 'String' then case Funcao of 1 : Saida:='<1> Y = A + B * X'; 2 : Saida:='<2> Y = A * EXP(B * X)'; 3 : Saida:='<3> Y = A * X ^ B'; 4 : Saida:='<4> Y = A + B / X'; 5 : Saida:='<5> Y = 1 / (A + B * X)'; 6 : Saida:='<6> Y = X / (A + B * X)'; 7 : Saida:='<7> Y = A + B * LN(X)'; end {case} else case Funcao of 1 : Writeln(Lst,'<1> Y = A + B * X '); 2 : Writeln(Lst,'<2> Y = A * EXP(B * X) '); 3 : Writeln(Lst,'<3> Y = A * X ^ B '); 4 : Writeln(Lst,'<4> Y = A + B / X '); 5 : Writeln(Lst,'<5> Y = 1 / (A + B * X) '); 6 : Writeln(Lst,'<6> Y = X / (A + B * X) '); 7 : Writeln(Lst,'<7> Y = A + B * LN(X) '); end {case} end; {Identifica Funcao} function Potencia(x, y : real) : real; begin Potencia:=exp(Ln(x)*y); end; {Potencia} function CalculaFuncao(var i : integer; var x : real; var a, b : real; var Bandeira : boolean) : real; begin Bandeira:=true; case i of 1 : CalculaFuncao:=a+b*x; 2 : CalculaFuncao:=a*Exp(b*x); 3 : If x <= 0 then begin CalculaFuncao:=0.0; Bandeira:=false; end else CalculaFuncao:=a*Potencia(x,b); 4 : If x = 0 then begin CalculaFuncao:=0.0; Bandeira:=false; end else CalculaFuncao:=a+b/x; 5 : CalculaFuncao:=1/(a+b*x); 6 : CalculaFuncao:=x/(a+b*x); 7 : If x <= 0 then begin CalculaFuncao:=0.0; Bandeira:=false; end else CalculaFuncao:=a+b*Ln(x); end; {case} end; {CalculaFuncao} procedure MenuPrincipal(var Funcao : integer); var Buffer : string; begin Window(1,1,80,25); ClrScr; Buffer := 'LINEAR REGRESSION WITH SEVERAL TRANSFORMATIONS'; Centraliza(Buffer); GotoXY(29,6); Writeln('<1> Data Input'); GotoXY(29,8); Writeln('<2> Data Correction'); GotoXY(29,10); Writeln('<3> Data Suppression'); GotoXY(29,12); Writeln('<4> Data Output'); GotoXY(29,14); Writeln('<5> Curve Fitting'); GotoXY(29,16); Writeln('<6> Graphics'); GotoXY(29,18); Writeln('<7> End'); Funcao:=100; While (Funcao < 1) or (Funcao > NroFuncoes) do Begin GotoXY(29,22); Write('Your Choice? '); Readln(Funcao); End; end; {procedure MenuPrincipal} procedure EntradaDados(var XData, YData : GorniArray; var NumPoints : integer; var Narq : string; var SalvaDados : boolean); var Buffer, Xtr, Ytr, Espec, Caminho : string; Funcao, Cod, Nr, i : integer; InFile : text; begin ClrScr; Buffer := 'ENTRADA DE DADOS'; Centraliza(Buffer); Window(1,4,80,25); if SalvaDados then begin ClrScr; write(^G); GotoXY(1,9); Flash; Writeln('Data Not Saved Yet!'); Normal; Buffer := ''; While ((Buffer <> 'Y') and (Buffer <> 'N')) do begin GotoXY(1,13); Write('Do You Want to Continue (Y/N)? '); Readln(Buffer); end; ClrScr; end; if (Buffer = 'Y') or (not SalvaDados) then begin GotoXY(32,6); Writeln('<1> New Data'); GotoXY(32,10); Writeln('<2> More Data'); Funcao := 100; While ((Funcao < 1) or (Funcao > 2)) do begin GotoXY(32,18); Write('Your Choice? '); Readln(Funcao); end; If Funcao = 1 then begin SalvaDados := False; NumPoints := 0; Narq:=''; end; Buffer := 'INPUT OPTION'; Window(1,1,80,25); ClrScr; Centraliza(Buffer); GotoXY(35,9); Writeln('<1> Keyboard'); GotoXY(35,13); Writeln('<2> Disk'); Funcao := 100; While ((Funcao < 1) or (Funcao > 2)) do begin GotoXY(35,22); Write('Your Choice? '); Readln(Funcao); end; If Funcao = 1 then begin Buffer := 'INPUT VIA KEYBOARD'; Window(1,1,80,25); ClrScr; Centraliza(Buffer); Window(1,4,80,25); Writeln('Now Enter the Raw Data.'); Writeln('Write to Finish.'); Writeln; Xtr := ''; Ytr := ''; While ((Xtr <> 'END') and (Ytr <> 'END')) do begin NumPoints := NumPoints + 1; Writeln; Writeln('Conjunto #', NumPoints); Write('X? '); Readln(Xtr); If Xtr <> 'END' then begin Write('Y? '); Readln(Ytr); Val(Xtr,XData[NumPoints],Cod); Val(Ytr,YData[NumPoints],Cod); end; end; NumPoints := NumPoints - 1; if NumPoints <> 0 then SalvaDados := true; end else begin Buffer := 'DISK INPUT'; Window(1,1,80,25); ClrScr; Centraliza(Buffer); Window(1,4,80,25); Narq := '?'; While Narq = '?' do begin GotoXY(1,6); Write('File Name (? to List Directory)? '); Readln(Narq); If Narq = '?' then begin Writeln; Write('Drive or Path? '); Readln(Caminho); Dir(Caminho,'*.ZDZ'); ClrScr; end; end; Narq := Narq + '.ZDZ'; If not FileExists(Narq) then begin ClrScr; GotoXY(1,9); Write(^G); Flash; Writeln('File ',Narq,' Not Found!'); Normal; Writeln; GotoXY(1,13); Write('Press to Continue... '); Readln(Buffer); end else begin If NumPoints <> 0 then SalvaDados := true; GotoXY(1,16); Write('Reading '); Flash; Writeln(Narq); Assign(InFile,Narq); Reset(InFile); {I-} Readln(InFile, Nr); {I+} IOCheck; for i := 1 to Nr do begin {I-} Readln(InFile, XData[NumPoints+i], YData[NumPoints+i]); {I+} IOCheck; end; Close(InFile); NumPoints := NumPoints + Nr end; end; end; end; {EntradaDados} Procedure CorrigeDados(var XData, YData : GorniArray; var NumPoints : integer; var SalvaDados : boolean); var Buffer, Buffer1 : string; Cod, Nponto : integer; begin ClrScr; Buffer := 'DATA CORRECTION'; Centraliza(Buffer); Window(1,4,80,25); While Buffer <> 'END' do begin ClrScr; GotoXY(1,7); Writeln('Point Index ( to Finish)? '); Readln(Buffer); If Buffer <> 'END' then begin Val(Buffer, Nponto, Cod); If ((Nponto >= 1) and (Nponto <= NumPoints)) then begin writeln; write('X = ',XData[Nponto],'. New Value? '); Readln(Buffer1); If Buffer1 <> '' then Val(Buffer1, XData[Nponto], Cod); write('Y = ',YData[Nponto],'. New Value? '); Readln(Buffer1); If Buffer1 <> '' then Val(Buffer1, YData[Nponto], Cod); SalvaDados := True; end; end; end; end; {Corrige Dados} Procedure SuprimeDados(var XData, YData : GorniArray; var NumPoints : integer; var SalvaDados : Boolean); var Cod, Nponto, NroSupr, i, j, Troca : integer; Vsupr : array [1..30] of integer; Buffer, Buffer1 : string; begin NroSupr := 0; ClrScr; Buffer := 'DATA SUPPRESSION'; Centraliza(Buffer); Window(1,4,80,25); While Buffer <> 'END' do begin ClrScr; GotoXY(1,7); Writeln('Point Index ( para Terminar)? '); Readln(Buffer); If Buffer <> 'END' then begin Val(Buffer, Nponto, Cod); If ((Nponto >= 1) and (Nponto <= NumPoints)) then begin writeln; write('X = ',XData[Nponto],' ***** ',YData[Nponto]); Buffer1 := ''; While ((Buffer1 <> 'Y') and (Buffer1 <> 'N')) do begin GotoXY(1,12); Write(^G); Write('Confirm (Y/N)! '); Readln(Buffer1); end; If Buffer1 = 'Y' then begin NroSupr := NroSupr + 1; Vsupr[NroSupr] := Nponto; end else ClrScr; end; end; end; If NroSupr > 0 then begin GotoXY(1,14); Write(^G); Flash; Writeln('Making Suppressions...'); Normal; for i := 1 to NroSupr - 1 do for j := i + 1 to NroSupr do If Vsupr[j] > Vsupr[i] then begin Troca := Vsupr[j]; Vsupr[j] := Vsupr[i]; Vsupr[i] := Troca; end; for j := 1 to NroSupr do begin For i := Vsupr[j] to NumPoints - 1 do begin XData[i] := XData[i+1]; YData[i] := YData[i+1]; end; NumPoints := NumPoints - 1; end; end; SalvaDados := True; end; {SuprimeDados} Procedure SaidaDados(var XData, YData : GorniArray; var NumPoints : integer; var Narq : string; var SalvaDados : Boolean); var Opcao, Contador, i, NroPag : integer; Buffer, BufImpr, Mensagem, Caminho : string; OutFile : text; begin ClrScr; Buffer := 'DATA OUTPUT'; Centraliza(Buffer); Window(1,4,80,25); GotoXY(35,4); Writeln('<1> Screen'); GotoXY(35,8); Writeln('<2> Printer'); GotoXY(35,12); Writeln('<3> File'); Opcao := 100; While ((Opcao < 1) or (Opcao > 3)) do begin GotoXY(35,18); Write('Your Choice? '); Readln(Opcao); end; Case Opcao of 1 : begin Window(1,1,80,25); ClrScr; Buffer := 'DATA OUTPUT'; Centraliza(Buffer); Window(1,4,80,25); Contador := 0; For i := 1 to NumPoints do begin Writeln('Point # ',i); Write('X = ',XData[i]); GotoXY(30,WhereY); Writeln('Y = ',YData[i]); Writeln; Contador := Contador + 3; If ((Contador >= 17) and (i < Numpoints)) then begin GotoXY(1,21); Flash; Write('Press to Continue...'); Normal; Contador := 0; Readln(Buffer); ClrScr; GotoXY(1,1); end; end; GotoXY(1,21); Flash; Write('Press to Continue.'); Normal; Readln(Buffer); ClrScr; end; 2 : begin Window(1,1,80,25); ClrScr; Buffer := 'DATA PRINTER OUTPUT'; Centraliza(Buffer); Window(1,4,80,25); GotoXY(1,8); Writeln('Enter Data Identification Message.'); Readln(Mensagem); Writeln; Writeln; Writeln; Write('Prepare Printer, Mark Start of Report.'); Writeln; Writeln; Write('Press to Continue...'); NroPag := 1; Readln(Buffer); BufImpr := 'Data for Curve Fitting'; CabImpr(BufImpr,Mensagem,NroPag); Contador := 0; For i:=1 to NumPoints do begin Str(i,Buffer); BufImpr := '#' + Buffer; Str(XData[i],Buffer); Tabula(Buffer,BufImpr,10); Str(YData[i],Buffer); Tabula(Buffer,BufImpr,35); Writeln(Lst,BufImpr); Contador := Contador + 1; If ((Contador >= 55) and (i < NumPoints)) then begin NroPag := NroPag + 1; Eject; BufImpr := 'Data for Curve Fitting'; CabImpr(BufImpr,Mensagem,NroPag); Contador := 0; end; end; Eject; ClrScr; end; 3 : begin Window(1,1,80,25); ClrScr; Buffer := 'DATA SAVING IN DISK'; Centraliza(Buffer); Window(1,4,80,25); GotoXY(1,6); If Narq<>'' then begin Buffer:=''; While ((Buffer<>'Y') and (Buffer<>'N')) do begin GotoXY(1,8); Write('Do Your Want to Save in '); Flash; Write(Narq); Normal; Write(' (Y/N)? '); Readln(Buffer); ClrScr; end; end; If ((Narq='') or (Buffer='N')) then begin Narq := '?'; While Narq = '?' do begin GotoXY(1,6); Write('File Name (? para listar Diretorio)? '); Readln(Narq); If Narq = '?' then begin Writeln; Write('Drive or Path? '); Readln(Caminho); Dir(Caminho,'*.ZDZ'); ClrScr; end else Narq:=Narq+'.ZDZ'; end; end; GotoXY(1,16); Write('Writing '); Flash; Writeln(Narq); Assign(OutFile,Narq); Rewrite(OutFile); {I-} Writeln(OutFile, NumPoints); {I+} IOCheck; for i := 1 to NumPoints do begin {I-} Writeln(OutFile, XData[i], ' ', YData[i]); {I+} IOCheck; end; Close(OutFile); SalvaDados := false; end; end; {Case} end; {SaidaDados} Procedure AjustaCurvas(var XData, YData : GorniArray; var NumPoints : integer; var SalvaDados : Boolean; var a, b : Real7; var Estado : Boolean7); var i, j, Contador : integer; Console, Impressora, Buffer, BufImpr, BufAux : string; a1, b1, s1, s2, y, st, d, p1, d2, be, xe, z, ff, d1, ae, fe, ye, SomXY, SomX, SomY, SomX2, z1, st1, st2, MediaY : real; Ano, Mes, Dia, DiaSemana, Hora, Minuto, Segundo, CentSegundo : word; Bandeira : boolean; c, ep, p : real7; Impressao : array[1..7,1..2] of string[80]; XTransf, YTransf : GorniArray; Solution : array[1..2] of real; begin Console:='Con'; Impressora:='Lst'; ClrScr; Buffer := 'CURVE FITTING'; Centraliza(Buffer); Window(1,4,80,25); Contador := 0; For i:=1 to NroFuncoes do begin IdentificaFuncao(i,Console); Estado[i]:=true; for j:=1 to NumPoints do begin if Estado[i] then case i of 1 : begin XTransf[j]:=XData[j]; YTransf[j]:=YData[j]; end; 2 : if YData[j] <= 0 then Estado[i]:=false else begin XTransf[j]:=XData[j]; YTransf[j]:=Ln(YData[j]); end; 3 : if YData[j] <= 0 then Estado[i]:=false else if XData[j] <= 0 then Estado[i]:=false else begin XTransf[j]:=Ln(XData[j]); YTransf[j]:=Ln(YData[j]); end; 4 : begin YTransf[j]:=YData[j]; if XData[j]=0 then Estado[i]:=false else XTransf[j]:=1/XData[j]; end; 5 : begin XTransf[j]:=XData[j]; if YData[j]=0 then Estado[i]:=false else YTransf[j]:=1/YData[j]; end; 6 : if YData[j]=0 then Estado[i]:=false else begin YTransf[j]:=1/YData[j]; if XData[j]=0 then Estado[i]:=false else XTransf[j]:=1/XData[j]; end; 7 : if XData[j] <= 0 then Estado[i]:=false else begin XTransf[j]:=Ln(XData[j]); YTransf[j]:=YData[j]; end end; {case} end; If not Estado[i] then begin GotoXY(5,WhereY+1); Inverse; Writeln('IMPOSSIBLE!'); Normal; Contador:=Contador+1; Writeln; Writeln; end else begin SomX:=0.; SomY:=0.; SomXY:=0.; SomX2:=0.; for j:=1 to NumPoints do begin SomX:=SomX+XTransf[j]; SomY:=SomY+YTransf[j]; SomX2:=SomX2+Sqr(XTransf[j]); SomXY:=SomXY+XTransf[j]*YTransf[j]; end; Solution[2]:=(SomXY-SomX*SomY/NumPoints)/(SomX2-Sqr(SomX)/NumPoints); Solution[1]:=(SomY-Solution[2]*SomX)/NumPoints; case i of 1 : begin a[i]:=Solution[1]; b[i]:=Solution[2]; end; 2 : begin a[i]:=Exp(Solution[1]); b[i]:=Solution[2]; end; 3 : begin a[i]:=Exp(Solution[1]); b[i]:=Solution[2]; end; 4 : begin a[i]:=Solution[1]; b[i]:=Solution[2]; end; 5 : begin a[i]:=Solution[1]; b[i]:=Solution[2]; end; 6 : begin a[i]:=Solution[2]; b[i]:=Solution[1]; end; 7 : begin a[i]:=Solution[1]; b[i]:=Solution[2]; end; end; {case} st:=0.; st1:=0.; for j:=1 to NumPoints do st1:=st1+YData[j]; MediaY:=st1/NumPoints; st1:=0.; for j:= 1 to NumPoints do begin y:=CalculaFuncao(i,XData[j],a[i],b[i],Bandeira); d:=YData[j]-y; st:=st+d*d; d:=YData[j]-MediaY; st1:=st1+d*d; end; c[i]:=abs(1-(st/(NumPoints-2))/(st1/(NumPoints-1))); if c[i]>1 then c[i]:=0.001; ep[i]:=sqrt(st/NumPoints); ff:=c[i]*(NumPoints-2)/(1-c[i]); p1:=1; d1:=1; d2:=NumPoints-2; if ((d1=0) or (d2=0) or (ff=0)) then p[i]:=p1 else begin if ff < 1 then begin ae:=d2; be:=d1; fe:=1/ff end else begin ae:=d1; be:=d2; fe:=ff end; a1:=2/(9*ae); b1:=2/(9*be); xe:=(1-b1)*Potencia(fe,0.3333333)-1+a1; ye:=sqrt(b1*Potencia(fe,0.66666667)+a1); z:=abs(xe/ye); if be < 4 then z:=z*(1+0.08*Potencia(z,4)/Potencia(be,3)); z1:=0.115194+z*(0.000344+z*0.019527); p1:=0.5/Potencia(1+z*(0.196854+z*z1),4); if ff<0 then p[i]:=p1*100 else p[i]:=(1-p1)*100; end; if p[i]=100 then p[i]:=99.999999; for j:=1 to 2 do Impressao[i,j]:=''; BufImpr:=''; Str(a[i],BufAux); BufImpr:='A = '+BufAux; Str(b[i],BufAux); Buffer:='B = '+BufAux; Tabula(Buffer,BufImpr,27); Str(c[i],BufAux); Buffer:='r2 = '+BufAux; Tabula(Buffer,BufImpr,54); Writeln(BufImpr); Impressao[i,1]:=BufImpr; Buffer:=''; Str(ep[i],BufAux); BufImpr:='E = '+BufAux; Str(p[i],BufAux); Buffer:='% Conf = '+BufAux; Tabula(Buffer,BufImpr,27); Writeln(BufImpr); Writeln; Writeln; Contador:=Contador+1; Impressao[i,2]:=BufImpr; if Contador >= 4 then begin Writeln(^G); Flash; Write('Press to Continue...'); Normal; Readln(Buffer); Contador:=0; ClrScr; GotoXY(1,1); end; end; end; Writeln(^G); Flash; Write('Press to Continue...'); Normal; Readln(Buffer); Buffer:=''; While ((Buffer<>'Y') and (Buffer<>'N')) do begin ClrScr; GotoXY(1,9); Write('Do You Want to Print Results (Y/N)? '); Readln(Buffer); end; if Buffer = 'Y' then begin ClrScr; GotoXY(1,8); Writeln('Enter Results Identification Message.'); Readln(BufImpr); GotoXY(1,12); Writeln('Prepare Printer and Press !'); Readln(Buffer); Writeln(Lst,'LINEAR REGRESSION WITH SEVERAL TRANSFORMATIONS'); If Narq<>'' then begin Write(Lst,'Data from'); If SalvaDados then Write(Lst,' (partially)'); Write(Lst,' from the File ',Narq,' *** ') end else Write(Lst,'Data Entered via Keyboard *** '); GetDate(Ano, Mes, Dia, DiaSemana); GetTime(Hora, Minuto, Segundo, CentSegundo); Write(Lst,Dia,'/',Mes,'/',Ano,', ',Hora,':'); If Minuto<10 then Write(Lst,'0'); Writeln(Lst,Minuto); Writeln(Lst,''); Writeln(Lst,BufImpr); Writeln(Lst,''); Writeln(Lst,''); for i:=1 to NroFuncoes do begin IdentificaFuncao(i,Impressora); if Estado[i] then begin Writeln(Lst,Impressao[i,1]); Writeln(Lst,Impressao[i,2]); Writeln(Lst,''); end else begin Writeln(Lst,' IMPOSSIBLE!'); Writeln(Lst,''); Writeln(Lst,''); end; end; end; end; {AjustaCurvas} Procedure PlotaCurvas(var XData,YData : GorniArray; NumPoints : integer; a, b : Real7; Estado : Boolean7); var i, j, k, Opcao, Funcao, Cod, NX, NY, CharCode : integer; X0, X1, Y0, Y1, XCalc, Incr : real; Buffer, Console, LabelX, LabelY : string; Bandeira, Loop : boolean; begin Loop:=true; Opcao:=0; Funcao:=0; Console:='Con'; X0:=XData[1]; X1:=X0; Y0:=YData[1]; Y1:=Y0; for i:=1 to NumPoints-1 do for j:=i+1 to NumPoints do begin if XData[j] X1 then X1:=XData[j]; if YData[j] Y1 then Y1:=YData[j] end; NX:=5; NY:=5; LabelX:=''; LabelY:=''; CharCode:=8; While Loop do begin Window(1,1,80,25); ClrScr; Buffer := 'GRAPHIC PLOTTING'; Centraliza(Buffer); GotoXY(29,7); Writeln('<1> Function Definition'); GotoXY(29,9); Writeln('<2> Axis Definition'); GotoXY(29,11); Writeln('<3> Plot Graphic'); GotoXY(29,13); Writeln('<4> Show Graphic'); GotoXY(29,15); Writeln('<5> Print Graphic'); GotoXY(29,17); Writeln('<6> Main Menu'); Opcao:=0; While (Opcao < 1) or (Opcao > NroFuncoes) do begin GotoXY(29,23); Write('Your Choice? '); Readln(Opcao); end; case Opcao of 1 : begin ClrScr; Buffer:='FUNCTION TO BE PLOTTED'; Centraliza(Buffer); GotoXY(29,6); for i:=1 to NroFuncoes do begin GotoXY(29,WhereY); IdentificaFuncao(i,Console); Writeln; end; Funcao:=0; While (Funcao < 1) or (Funcao > NroFuncoes) do begin GotoXY(29,22); Write('Your Choice? '); Readln(Funcao); If (Funcao >= 1) and (Funcao <= NroFuncoes) then If not Estado[Funcao] then Funcao:=0; end; end; 2 : If (Funcao<>0) and (Estado[Funcao]) then begin ClrScr; Buffer:='AXIS DEFINITION'; Centraliza(Buffer); Window(1,4,80,25); GotoXY(1,3); Write('Current Minimum X: ',X0,' - New: '); Readln(Buffer); If Buffer<>'' then Val(Buffer,X0,Cod); Write('Current Maximum X: ',X1,' - New: '); Readln(Buffer); If Buffer<>'' then Val(Buffer,X1,Cod); Writeln; Writeln; Write('Current Minimum Y: ',Y0,' - New: '); Readln(Buffer); If Buffer<>'' then Val(Buffer,Y0,Cod); Write('Current Maximum Y: ',Y1,' - New: '); Readln(Buffer); If Buffer<>'' then Val(Buffer,Y1,Cod); Writeln; Writeln; Write('Current Tick Density in the X-Axis: ',NX, ' - New (-9 a +9): '); Readln(Buffer); If Buffer<>'' then Val(Buffer,NX,Cod); Write('Current Tick Density in the Y-Axis: ',NY, ' - New (-9 a +9): '); Readln(Buffer); If Buffer<>'' then Val(Buffer,NY,Cod); If (Abs(NX)>9) or (Abs(NY)>9) then begin Writeln(^G); Inverse; Writeln('Illegal Tick Density!'); Normal end; Writeln; Writeln; Write('Current X-Axis Label: ',LabelX,' - New: '); Readln(Buffer); If Buffer<>'' then LabelX:=Buffer; Write('Current Y-Axis Label: ',LabelY,' - New: '); Readln(Buffer); If Buffer<>'' then LabelY:=Buffer; Writeln; Writeln; Write('Current Point Type: ',CharCode,' - New: '); Readln(Buffer); If Buffer<>'' then Val(Buffer,Charcode,Cod); end; 3 : If (Funcao <> 0) and (Estado[Funcao]) then begin RAMScreenGlb := true; Incr:=(X1-X0)/MaxPlotGlb; XCalc:=X0; for k:=1 to MaxPlotGlb do begin GraphArray[k,1]:=XCalc; GraphArray[k,2]:=CalculaFuncao(Funcao, XCalc, a[Funcao], b[Funcao], Bandeira); XCalc:=XCalc+Incr; If (GraphArray[k,1] X1) or (GraphArray[k,2] Y1) or not Bandeira then begin GraphArray[k,1]:=X0; GraphArray[k,2]:=Y0; end; end; EnterGraphic; DefineWindow(1, 0, 0, XMaxGlb, YMaxGlb); DefineWorld(1,X0,Y0,X1,Y1); SelectWorld(1); SelectWindow(1); SetBackground(0); ClearScreen; Buffer:='String'; IdentificaFuncao(Funcao,Buffer); Buffer:='Fitted Function ' + Buffer; DefineHeader(1,Buffer); GotoXY(1,LinSup); Writeln(LabelY); GotoXY(80-Length(LabelX),LinInf); Writeln(LabelX); SetHeaderOn; DrawBorder; DrawAxis(NX, NY, 0, 15, 0, 15, -1, -1, true); DrawPolygon(GraphArray, 1, MaxPlotGlb, -9, 1, 0); ResetAxis; GetGraphData(XData, YData, GraphArray, NumPoints); DrawPolygon(GraphArray, 1, NumPoints, -CharCode, 2, 0); Readln(Buffer); SwapScreen; LeaveGraphic; end; 4 : begin EnterGraphic; SwapScreen; Readln(Buffer); SwapScreen; LeaveGraphic; end; 5 : begin Window(1,1,80,25); ClrScr; Buffer:='PRINTING GRAPHIC'; Centraliza(Buffer); GotoXY(1,12); Writeln('Prepare Printer and Press to Continue!'); Readln(Buffer); EnterGraphic; SwapScreen; HardCopy(false,PrinterMode); SwapScreen; LeaveGraphic; Writeln(Lst,Chr(27),'@'); end; 6 : Loop:=false; end {case} end end; {PlotaCurvas} procedure Fim(var SalvaDados : Boolean); var Buffer : string; begin If SalvaDados then begin ClrScr; Buffer := 'END OF PROGRAM RUN'; Centraliza(Buffer); Window(1,4,80,25); GotoXY(1,9); Flash; Writeln(^G'Data Not Saved Yet!'); Normal; Buffer := ''; While ((Buffer<>'Y') and (Buffer<>'N')) do begin GotoXY(1,12); Write('Do Your Really Want to Quit (Y/N)? '); Readln(Buffer); end; if Buffer = 'Y' then begin ClrScr; Halt; end; end else begin ClrScr; Halt end; end; {Fim} begin { program Zardoz } InitGraphic; SetColors(WindowColor[1], BackColor[1]); LeaveGraphic; Tela1; SalvaDados := false; for i:=1 to NroFuncoes do Estado[i]:=false; While true do begin MenuPrincipal(Func); case Func of 1 : EntradaDados(XData,YData,NumPoints,Narq,SalvaDados); 2 : CorrigeDados(XData,YData,NumPoints,SalvaDados); 3 : SuprimeDados(XData,YData,NumPoints,SalvaDados); 4 : SaidaDados(XData,YData,NumPoints,Narq,SalvaDados); 5 : AjustaCurvas(XData,YData,NumPoints,SalvaDados,a,b,Estado); 6 : PlotaCurvas(XData,YData,NumPoints,a,b,Estado); 7 : Fim(SalvaDados); end; {case} end; end. { program Zardoz }
***** End of Program Listing ******
Return to the Software Menu.
Last Update: 27 June 1996 | ||
© Antonio Augusto Gorni |