Program Bestpension (input,output,rpifile) ; type realarray = array[0..300] of real ; intarray = array[0..300] of integer ; var rpifile : text ; persno : alfa8 ; month : intarray ; year : intarray ; p : array[1..40] of integer ; periodno,q : 0..40 ; i,m,n : 0..300 ; r : 0..300 ; endbestyear : 1..25 ; endbest3 : 1..121 ; mlastrpi : 1..12 ; ylastrpi : 75..90 ; mrpi : 0..12 ; yrpi : 0..90 ; nonewrpi : -80..20 ; retmon : 1..12 ; retyr : 75..90 ; try : 0..12 ; mainswitch1 : 0..5 ; mainswitch2 : 0..1 ; switch : 1..5 ; loserpi : 0..40 ; bestyear, bestav3 : real ; actsal : realarray ; yearsal : realarray ; msal : realarray ; corrsal : realarray ; av3 : realarray ; rpi : realarray ; rpiused : realarray ; procedure rpiread ; begin read (rpifile,mlastrpi) ; readln (rpifile,ylastrpi) ; r := 0 ; repeat r := r + 1 ; readln (rpifile,rpi[r]) ; until rpi[r] = 0 ; end; procedure adjrpi ; begin nonewrpi := (retmon -1 -mlastrpi) + 12*(retyr - ylastrpi) ; if nonewrpi>0 then begin for m := 1 to nonewrpi+1 do rpiused[m] := rpi[1] ; for m := nonewrpi+2 to 156 do rpiused[m] := rpi[m - nonewrpi ] ; end else if nonewrpi <0 then for m:= 1 to 156 do rpiused[m] := rpi[m-nonewrpi] else rpiused[m] := rpi[m] ; if mrpi = 0 then loserpi := 0 ; if mrpi > 0 then if nonewrpi > 0 then begin loserpi := (mlastrpi-mrpi) + 12*(ylastrpi -yrpi) ; for m:= 1 to nonewrpi + loserpi + 1 do rpiused[m] := rpiused[nonewrpi+loserpi+1] ; end else if nonewrpi <= 0 then begin loserpi := (retmon -1 - mrpi) + 12*(retyr - yrpi) ; for m := 1 to loserpi do rpiused[m] := rpiused[1+loserpi] ; end; end; procedure best ; begin bestyear := corrsal[1] ; endbestyear := 1 ; for m := 2 to 25 do begin if corrsal[m] > bestyear then begin bestyear := corrsal[m] ; endbestyear := m ; end; end; m:=1 ; endbest3 := 1 ; bestav3 := av3[m] ; for m := 2 to 121 do if av3[m] > bestav3 then begin bestav3 := av3[m] ; endbest3 := m ; end; end; Procedure writedate (A : integer) ; var mon : -11..12 ; yr : 60..90 ; begin mon := retmon - A mod 12 ; yr := retyr - A div 12 ; if mon <1 then begin mon := mon + 12 ; yr := yr - 1 ; end; write(mon:3,'/',yr:2,' ') ; end; procedure list ; begin for n := 1 to 5 do writeln; writeln ('Personnel number: ',persno,' Name: '); writeln ('First month of retirement: ',retmon:2,'/',retyr:2) ; writeln ('Salary details:') ; writeln ; writeln ('month year salary') ; for n := 1 to periodno do writeln (month[n]:4, year[n]:5, actsal[n]:8:0) ; writeln; writeln; write('Date of final rpi to be used in calculation: ') ; writedate(2) ; writeln ; write('Value of rpi used in present estimate: ',rpiused[2]:6:1,' for ') ; if nonewrpi <= 0 then begin if loserpi < 2 then writedate(2) else writedate(1+loserpi) end else if nonewrpi > 0 then writedate(1 + nonewrpi + loserpi) ; writeln; writeln ; write ('Best year salary in last 3 years: ',bestyear:6:0,' ending ') ; writedate(endbestyear) ; writeln; writeln; write ('Best average salary of 3 years in last 13: ',bestav3:6:0,' ending '); writedate(endbest3); for n := 1 to 3 do writeln ; end; procedure longlist ; begin writeln(' month msal yrsal rpi corrsal av3') ; for n := 1 to 156 do begin writedate(n); write(msal[n]:7:1,yearsal[n]:6:0,rpiused[n]:6:1,corrsal[n]:6:0 ); writeln(av3[n]:7:0, n:5) ; end; end; BEGIN reset(rpifile) ; read(rpifile,mainswitch1) ; readln(rpifile,mainswitch2) ; rpiread ; REPEAT page; for n:= 1 to 40 do begin p[n] := 0 ; actsal[n] := 0 ; end; for n:= 1 to 156 do begin msal[n] := 0 ;yearsal[n]:=0 ;corrsal[n] := 0 ; av3[n] := 0 ; rpiused[n] := 0 ; end; for n := 1 to 6 do read(persno[n]) ; readln; read(switch) ; read(mrpi) ; readln(yrpi) ; if mainswitch1 > 0 then switch := mainswitch1 ; if mainswitch2 = 1 then begin mrpi := 0 ; yrpi := 0 ; end; read (month[0]) ; readln (year[0]) ; retmon := month[0] ; retyr := year[0] ; adjrpi ; n := 0 ; repeat n := n + 1 ; read (month[n]) ; read (year[n]) ; readln (actsal[n]); try := month[n] ; until try = 0 ; periodno := n-1 ; {the following routine removes any salaries and their dates if these are after the retiral date} ; while retmon - month[1] + 12*(retyr - year[1]) <= 0 do begin for q := 1 to periodno - 1 do begin month[q] := month[q+1] ; year[q] := year[q+1] ; actsal[q] := actsal[q+1] ; end; periodno := periodno - 1 ; end; n := 0; i := 0 ; repeat n := n + 1 ; p[n] := month[n-1] - month[n] + 12*(year[n-1] - year[n]) ; for m := i + 1 to i + p[n] do msal[m] := actsal[n]/12 ; i := i + p[n] ; until n = periodno ; n := 1 ; yearsal[n] := 0 ; for m := 1 to 12 do yearsal[1] := msal[m] + yearsal[n] ; corrsal[1] := yearsal[1] - 100 ; m := 12 ; repeat n := n + 1 ; m := m + 1 ; yearsal[n] := yearsal[n-1] -msal[m-12] + msal[m] ; until n = 145 ; for n := 2 to 145 do if yearsal[n] -100 > 0 then corrsal[n] := (yearsal[n] - 100)*rpiused[2]/rpiused[n+1] ; for n := 1 to 121 do av3[n] := (corrsal[n] + corrsal[n+12] + corrsal[n+24])/3 ; best ; case switch of 1 : list; 2 : begin list; page; list; end; 3 : begin list; longlist; end; 4 : begin list; page; list; longlist ; end; 5 : begin list; longlist; page; list; longlist; end; end; page; UNTIL EOF; END.