%EXTERNALROUTINE HOUSING(%STRING (255) S) %EXTERNALROUTINESPEC DEFINE(%STRING (255) S) %EXTERNALROUTINESPEC PROMPT(%STRING (18) S) %STRING (255) T,U %RECORDFORMAT INFOF(%INTEGER FORM, WARD, APTS, MARKET, ACTUAL, TYPE) %RECORD(infof) %ARRAY INFOA(1:4000) %OWNINTEGERARRAY QUARTER(1:10) = 1(10) %OWNBYTEINTEGERARRAY COMM(1:7) = 'W', 'H','A','*','S','R', 'F' %SWITCH SW(1:7) !! %OWNINTEGER NO OF TYPES = 9 %CONSTINTEGERARRAY TYPEX(1:9) = 'B', 'U', 'L', 'M', %C 'D', 'G', 'F', 'S', 'T' %CONSTINTEGERARRAY TINDEX(1:9) = 1(5), 2, 3, 4, 5 %OWNINTEGERARRAY COUNTWARD(0:62) = 0(63) %INTEGERARRAY TYPE(0:6, 1:8); ! no of types and no of quarters %RECORD (infof) %NAME INFO !! %INTEGER I,J,K,X,Z, LIMIT, MAX,TOP QU, QURT, THIS COMM %ROUTINESPEC ROLLING2 !! %ownSTRING (19) %ARRAY WARDN(0:62) = "All", "Queensferry", "Kirkliston", "Balerno", "Baberton", "Cramond", "Parkgrove", "Pilton", "Muirhouse", "Granton", "Trinity", "Newhaven", "Fort", "NW Corstorphine", "NE Corstorphine", "Telford", "Blackhall", "Broughton", "Inverleith", "Lorne", "Harbour", "SW Corstorphine", "SE Corstorphine", "Murrayfield", "Dean", "New Town", "Stockbridge", "Calton", "Lochend", "Links", "Craigentinny", "N. Hailes", "S. Hailes", "Sighthill", "Longstone", "Moat", "Stenhouse", "Dalry", "Shandon", "Haymarket", "Tollcross", "St. Giles", "Holyrood", "Willowbrae", "Mountcastle", "Portobello", "Milton", "Merchiston", "Morningside", "Sciennes", "Marchmont", "Prestonfield", "Mayfield", "Colinton", "Firhill", "Braidburn", "Fairmilehead", "Alnwickhill", "Kaimes", "Inch", "Gilmerton", "Niddrie", "Craigmillar" !! %ON %EVENT 9 %START ->FRED %FINISH %ROUTINE ERROR(%INTEGER TYPE, VAL) %INTEGER I %OWNSTRING (25) %ARRAY FAU(1:6) = %C "FORM NO","WARD NO","NO OF APTS", "MARKET VALUE","ACTUAL PRICE","DESCRIPTION" PRINTSTRING(FAU(TYPE)) PRINTSTRING(" OUT OF RANGE, VAL =") WRITE(VAL, 1) PRINTSTRING(" ON FORM NO:"); WRITE(INFO_FORM, 1) NEWLINE X = X-1; ! NASTY %CYCLE; ! SKIP REST OF LINE READSYMBOL(I) %RETURN %IF I=NL %REPEAT %END %ROUTINE PRINT PRICE(%INTEGER M, A, C) %REAL X, Y X = M/C; Y = A/C PRINTSTRING(" Av. Value ") PRINT(X, 5, 0) PRINTSTRING(", Sale Price") PRINT(Y, 5, 0) PRINTSTRING(", Av Disc.") PRINT(100-(A*100)/M, 2, 0); PRINTSTRING("% = ") PRINT(X-Y, 4, 0) NEWLINE %END !! %ROUTINE DO WARD(%INTEGER WARD, QURT, FLAG) %INTEGER COUNT, MARKET, ACTUAL, X, I, TYPE,LOW, HIGH %INTEGERARRAY TYC, TYM, TYA(1:9) %IF QURT=0 %START LOW = 1; HIGH = LIMIT %FINISHELSESTART LOW = QUARTER(QURT); HIGH=QUARTER(QURT+1)-1 %IF LOW>=HIGH %THEN %RETURN %FINISH COUNT=0; MARKET=0; ACTUAL=0 %CYCLE X = 1, 1, 9; TYC(X) = 0; TYM(X)=0;TYA(X)=0; %REPEAT %CYCLE X = LOW, 1, HIGH INFO==INFOA(X) %IF INFO_WARD=WARD %OR WARD = 0 %START COUNT = COUNT+1; MARKET=MARKET+INFO_MARKET ACTUAL = ACTUAL+INFO_ACTUAL TYPE = INFO_TYPE TYC(INFO_TYPE) = TYC(INFO_TYPE)+1 TYM(INFO_TYPE) = TYM(INFO_TYPE)+INFO_MARKET TYA(INFO_TYPE) = TYA(INFO_TYPE)+INFO_ACTUAL %FINISH %REPEAT %IF COUNT # 0 %AND FLAG>0 %START PRINTSTRING("WARD:") %IF WARD#0 %THEN WRITE(WARD, 1) SPACES(3); PRINTSTRING(WARDN(WARD)) PRINTSTRING(" No of Sales was"); WRITE(COUNT, 1) PRINT PRICE(MARKET, ACTUAL, COUNT) %IF FLAG=1 %THEN NEWLINES(2) %AND %RETURN %CYCLE X = 1, 1, 9 %IF TYC(X) # 0 %START SPACES(15) PRINTSTRING("House '"); PRINTSYMBOL(TYPEX(X)) PRINTSTRING("' No of Sales") WRITE(TYC(X), 3) PRINTSYMBOL('('); PRINT((TYC(X)*100)/COUNT, 2, 0) PRINTSTRING("%)") PRINT PRICE(TYM(X), TYA(X), TYC(X)) %FINISH %REPEAT NEWLINES(2) %FINISH %END %ROUTINE DO APTS(%INTEGER WARD, QURT, FLAG) %INTEGER COUNT, MARKET, ACTUAL, X, I, APTS, LOW, HIGH %INTEGERARRAY TYC, TYM, TYA(0:6) COUNT=0; MARKET=0; ACTUAL=0 %IF QURT = 0 %THEN LOW=1 %AND HIGH=LIMIT %ELSE %START LOW = QUARTER(QURT); HIGH = QUARTER(QURT+1)-1 %IF LOW>=HIGH %THEN %RETURN %FINISH %CYCLE X = 0, 1, 6; TYC(X) = 0; TYM(X)=0;TYA(X)=0; %REPEAT %CYCLE X = LOW, 1, HIGH INFO==INFOA(X) %IF INFO_WARD=WARD %OR WARD = 0 %START COUNT = COUNT+1; MARKET=MARKET+INFO_MARKET ACTUAL = ACTUAL+INFO_ACTUAL APTS = INFO_APTS TYC(APTS) = TYC(APTS)+1 TYM(APTS) = TYM(APTS)+INFO_MARKET TYA(APTS) = TYA(APTS)+INFO_ACTUAL %FINISH %REPEAT %IF COUNT # 0 %START PRINTSTRING("WARD:") %IF WARD#0 %THEN WRITE(WARD, 1) SPACES(3); PRINTSTRING(WARDN(WARD)) PRINTSTRING(" No of Sales was"); WRITE(COUNT, 1) PRINT PRICE(MARKET, ACTUAL, COUNT) %CYCLE X = 0, 1, 6 %IF TYC(X) # 0 %START NEWLINE SPACES(15) PRINTSTRING("No of rooms:"); WRITE(X, 1) PRINTSTRING(" No of Sales") WRITE(TYC(X), 3) PRINTSYMBOL('('); PRINT((TYC(X)*100)/COUNT, 2, 0) PRINTSTRING("%)") PRINT PRICE(TYM(X), TYA(X), TYC(X)) %FINISH %REPEAT NEWLINES(2) %FINISH %END !! %ROUTINE WARDS(%INTEGER QURT) %INTEGER I NEWPAGE DO WARD(0, QURT, 2) %CYCLE I = 1, 1, 62 DO WARD(I, QURT, 2) %REPEAT %END !! %ROUTINE HIST(%INTEGER QURT) %INTEGER I,J,LOW,HIGH,X NEWPAGE %IF QURT=0 %START LOW = 1; HIGH = LIMIT %FINISHELSESTART LOW = QUARTER(QURT); HIGH=QUARTER(QURT+1)-1 %IF LOW>=HIGH %THEN %RETURN %FINISH %CYCLE I = LOW, 1, HIGH INFO == INFOA(I) COUNTWARD(INFO_WARD) = COUNTWARD(INFO_WARD)+1 %REPEAT MAX = 0 %CYCLE I = 1, 1, 62 %IF COUNTWARD(I) > MAX %THEN MAX = COUNTWARD(I) %REPEAT PRINTSTRING("Histogram of Number of Houses Sold in Each Ward ") %CYCLE I = MAX, -1, 1 WRITE(I, 3) %CYCLE X = 1, 1, 62 %IF COUNTWARD(X) >= I %THEN PRINTSYMBOL('*') %ELSE SPACE SPACE; !# %REPEAT NEWLINE %REPEAT %CYCLE I = 1, 1, 132; PRINTSYMBOL('='); %REPEAT NEWLINE SPACES(4) %CYCLE I = 1, 1, 62 X = I//10 %IF X>0 %THEN PRINTSYMBOL(X+'0') %ELSE SPACE SPACE %REPEAT NEWLINE; SPACES(4) %CYCLE I = 1, 1, 62 X = I - (I//10)*10 PRINTSYMBOL(X+'0') SPACE %REPEAT PRINTSTRING(" WARD NUMBER ") NEWPAGE J=1 %CYCLE I = MAX, -1, 0 %CYCLE X = 1, 1, 62 %IF COUNTWARD(X) = I %START WRITE(J, 2); J=J+1 PRINTSTRING(" Ward:"); WRITE(X, 2) SPACES(2); PRINTSTRING(WARDN(X)) SPACES(25-LENGTH(WARDN(X))) PRINTSTRING(" Sales") WRITE(I, 4); NEWLINE %FINISH %REPEAT %REPEAT %END !! %ROUTINE APTS(%INTEGER QURT) NEWPAGE DO APTS(0, QURT, 0) %END !! %ROUTINE HIST2(%INTEGER MAX, SCALE, MAXTY) %INTEGER I, MAX2, QU, TY ! MAX2 = MAX//SCALE %CYCLE I = MAX2, -1, 1 WRITE(I*SCALE, 4); PRINTSYMBOL('!') %CYCLE TY = 1, 1, MAXTY %CYCLE QU = 1, 1, 5 %IF TYPE(TY, QU)//SCALE >= I %THEN PRINTSYMBOL('*') %C %ELSE SPACE %REPEAT SPACES(10) %REPEAT NEWLINE %REPEAT %CYCLE I = 1, 1, 132; PRINTSYMBOL('='); %REPEAT NEWLINE SPACES(6) %CYCLE TY = 1, 1, MAXTY %CYCLE QU = '1', 1, '5' PRINTSYMBOL(QU) %REPEAT SPACES(10) %REPEAT %IF MAXTY=5 %START PRINTSTRING(" House Ground First Second Above ") %FINISHELSESTART NEWLINE SPACES(6) %CYCLE I = 1, 1, 6 WRITE(I, 5); SPACES(6) %REPEAT NEWLINES(2) %FINISH %END %ROUTINE RAW FIGS(%INTEGER TYMAX) %INTEGER TY, QU PRINTSTRING(" Raw figures in each category ") %CYCLE QU = 1, 1, 5 WRITE(QU, 5); PRINTSYMBOL('!') %CYCLE TY = 1, 1, TYMAX WRITE(TYPE(TY, QU), 5); SPACES(8) %REPEAT NEWLINE %REPEAT %END %ROUTINE ROLLING %INTEGER I,X,QU,MAX ! NEWPAGE QU=1; MAX = 0 %CYCLE I = 1, 1, 5; %CYCLE X = 1, 1, 8 TYPE(I, X)= 0 %REPEAT; %REPEAT ! %CYCLE I = 1, 1, LIMIT %IF I > QUARTER(QU+1) %THEN QU = QU+1 INFO == INFOA(I) X = TINDEX(INFO_TYPE) TYPE(X, QU) = TYPE(X, QU)+1 %IF TYPE(X, QU) > MAX %THEN MAX = TYPE(X, QU) %REPEAT !! HIST2(MAX, 5, 5) PRINTSTRING(" Sales per Quarter of ") PRINTSTRING("each type ") RAW FIGS(5) NEWPAGE %CYCLE I = 2, 1, 5 %CYCLE X = 1, 1, 5 TYPE(X, I) = TYPE(X, I)+TYPE(X, I-1); ! ADD PREVIOUS QUARTERS %IF TYPE(X, I) > MAX %THEN MAX = TYPE(X, I) %REPEAT %REPEAT HIST2(MAX, 10, 5) PRINTSTRING(" Sales accumulating per Quarter ") RAW FIGS(5) ROLLING2 %END !! %ROUTINE ROLLING2 %INTEGER I,X,QU,MAX,MAX2 ! NEWPAGE QU=1; MAX = 0 %CYCLE I = 1, 1, 6; %CYCLE X = 1, 1, 5 TYPE(I, X)= 0 %REPEAT; %REPEAT ! %CYCLE I = 1, 1, LIMIT %IF I > QUARTER(QU+1) %THEN QU = QU+1 INFO == INFOA(I) X = INFO_APTS TYPE(X, QU) = TYPE(X, QU)+1 %IF TYPE(X, QU) > MAX %THEN MAX = TYPE(X, QU) %REPEAT !! HIST2(MAX, 5, 6) PRINTSTRING(" Sales per Quarter of ") PRINTSTRING("per number of rooms ") RAW FIGS(6) NEWPAGE %CYCLE I = 2, 1, 5 %CYCLE X = 1, 1, 5 TYPE(X, I) = TYPE(X, I)+TYPE(X, I-1); ! ADD PREVIOUS QUARTERS %IF TYPE(X, I) > MAX %THEN MAX = TYPE(X, I) %REPEAT %REPEAT HIST2(MAX, 10, 6) PRINTSTRING(" Sales accumulating per Quarter ") RAW FIGS(6) %END !! %ROUTINE FLOOR(%INTEGER QURT) %OWNSTRING (10) %ARRAY TYN(1:5) = %C "House ", "Ground ", "First ", "Second ", "Above " %INTEGER TY, FL %INTEGERARRAY COU(1:5, 1:62) %CYCLE FL = 1, 1, 5 %CYCLE I = 1, 1, 62 COU(FL, I) = 0 %REPEAT %REPEAT %CYCLE I = 1, 1, LIMIT INFO == INFOA(I) COU(TINDEX(INFO_TYPE), INFO_WARD) = COU(TINDEX( %C INFO_TYPE), INFO_WARD)+1 %REPEAT %CYCLE TY = 1, 1, 5 NEWLINE PRINTSTRING(TYN(TY)) %CYCLE I = 1, 1, 31 WRITE(COU(TY, I), 2) %REPEAT %REPEAT PRINTSTRING(" WARD: ") %CYCLE I = 1, 1, 31; WRITE(I, 2); %REPEAT NEWLINE ! %CYCLE TY = 1, 1, 5 NEWLINE PRINTSTRING(TYN(TY)) %CYCLE I = 32, 1, 62 WRITE(COU(TY, I), 2) %REPEAT %REPEAT PRINTSTRING(" WARD: ") %CYCLE I = 32, 1, 62; WRITE(I, 2); %REPEAT NEWLINES(3) %END %UNLESS S->T.("/").U %START PRINTSTRING("PARAMETERS? ") %STOP %FINISH DEFINE("1,".T) DEFINE("2,".U) SELECT INPUT(1) SELECT OUTPUT(2) %CYCLE X = 1, 1, 4000 INFO == INFOA(X) READ(INFO_FORM) %IF INFO_FORM<0 %OR INFO_FORM>10000 %START K = -INFO_FORM QUARTER(K) = X X = X-1 %CONTINUE %FINISH %IF INFO_FORM>8000 %START ERROR(1, INFO_FORM) %CONTINUE %FINISH READ(INFO_WARD) %UNLESS 1<=INFO_WARD<=62 %THEN ERROR(2, INFO_WARD) %ANDCONTINUE READ(INFO_APTS) %UNLESS 0<=INFO_APTS<=6 %THEN ERROR(3,INFO_APTS) %ANDCONTINUE READ(INFO_MARKET) %UNLESS 1000<=INFO_MARKET<=24000 %THENC ERROR(4, INFO_MARKET) %AND %CONTINUE READ(INFO_ACTUAL) %UNLESS 1000<=INFO_ACTUAL<=INFO_MARKET %THEN %C ERROR(5, INFO_ACTUAL) %AND %CONTINUE SKIPSYMBOL %WHILE NEXTSYMBOL = ' ' READSYMBOL(INFO_TYPE) %CYCLE I = 1, 1, NO OF TYPES %IF INFO_TYPE = TYPEX(I) %THEN INFO_TYPE=I %AND ->OK %REPEAT ERROR(6, INFO_TYPE) %CONTINUE OK: %REPEAT FRED: !! GOT ALL THE DATA LIMIT = X-1 TOP QU=K+1 QUARTER(TOP QU) = LIMIT+1 %CYCLE I = 1, 1, TOP QU WRITE(I, 3); WRITE(QUARTER(I), 4); NEWLINE %REPEAT SELECT INPUT(0) REP: PROMPT("BREAKDOWN?") skipsymbol %if nextsymbol = nl READSYMBOL(X); SKIPSYMBOL %if nextsymbol=nl %IF 'a' <= X <= 'z' %THEN X=X-'a'+'A' %CYCLE THIS COMM = 1, 1, 7 %IF COMM(THIS COMM) = X %THEN -> GOT %REPEAT PRINTSTRING("? ") ->REP GOT: %IF THIS COMM = 5 %THEN NEWPAGE %AND %RETURN PROMPT("QUARTER(0=ALL)?") READ(QURT); SKIPSYMBOL ->SW(THIS COMM) SW(1): ! 'W' WARDS(QURT) ->REP SW(2): ! 'H' HIST(QURT) -> REP SW(3): ! 'A' APTS APTS(QURT) ->REP SW(4): ! '*' ALL WARDS(QURT) HIST(QURT) APTS(QURT) -> REP SW(5): ! 'S' %RETURN SW(6): ! 'R' - ROLLING SUMMARY ROLLING ->REP SW(7): ! 'F' - FLOOR BY WARD SUMMARY FLOOR(QURT) -> REP %END %ENDOFFILE