PROGRAM FRACTIONS; {$A-} {J. BEAHM 1/23/86} {PROGRAM TO ADD OR SUBTRACT FRACTIONS WITH UNLIKE DENOMINATORS} {SIMPLIFIES ANSWER} {IF YOU HAVE LONG_INTEGER ON PASCAL VERSION, USE IT INSTEAD OF INTEGER} VAR NUM, {NUMERATOR AFTER + OR -} DEN, {COMMON DENOMINATOR} FACTOR, {GREATEST COMMON FACTOR} N1, {FIRST NUMERATOR ENTERED} N2, {SECOND NUMERATOR} D1, {FIRST DENOMINATOR} D2, {SECOND DENOMINATOR} N3, {NUMERATOR FROM N1 FOR EQUIV. FRACTION} N4:INTEGER; {NUMERATOR FROM N2 " " "} ANS, {ANSWER (Y/N)} OP:CHAR; {OPERATION (+ OR -)} B1, B2:STRING[3]; {********************************************} FUNCTION GCF(K1,K2:INTEGER):INTEGER; {RECURSIVE FUNCTION TO FIND G.C.F.} BEGIN IF K1 MOD K2 = 0 THEN GCF:=K2 ELSE GCF:=GCF(K2,K1 MOD K2); END; {*****************************************} PROCEDURE ENTRY; {PROCEDURE TO ENTER NUMBERS AND OPERATION} BEGIN CLRSCR; GOTOXY(1,1); WRITELN('ENTER THE NUMERATORS, DENOMINATORS, AND OPERATION AS INDICATED'); GOTOXY(5,6); WRITE('-----'); GOTOXY(5,12); WRITE('-----'); GOTOXY(6,5); READLN(N1); GOTOXY(6,7); READLN(D1); REPEAT GOTOXY(3,12); READLN(OP); UNTIL (OP='+') OR (OP='-'); GOTOXY(6,11); READLN(N2); GOTOXY(6,13); READLN(D2); GOTOXY(12,6); WRITE('='); GOTOXY(12,12); WRITE('='); GOTOXY(1,16); WRITE('-------------------------'); END; {***********************************} PROCEDURE EQUIV_FRACT; {PROCEDURE TO FIND EQUIVALENT FRACTIONS WITH LEAST COMMON DENOMINATOR} BEGIN DEN:=D1 DIV FACTOR*D2; {FIND OUT IF WE GO OVER MAXINT} IF D1<>DEN DIV D2*FACTOR THEN WRITE('DENOMINATOR > MAXIMUM INTEGER, RESULTS NOT VALID'); N3:=N1*(DEN DIV D1); N4:=N2*(DEN DIV D2); GOTOXY(15,5); WRITE(N3); GOTOXY(14,6); WRITE('-----'); GOTOXY(15,7); WRITE(DEN); GOTOXY(15,11); WRITE(N4); GOTOXY(14,12); WRITE('-----'); GOTOXY(15,13); WRITE(DEN); END; {************************************} PROCEDURE WORK; {ADD OR SUBTRACT EQUIVALENT FRACTIONS} BEGIN IF OP='+' THEN NUM:=N3+N4 ELSE NUM:=N3-N4; GOTOXY(15,20); WRITE(NUM); GOTOXY(14,21); WRITE('-----'); GOTOXY(15,22); WRITE(DEN); END; {****************************************} PROCEDURE REDUCE; {REDUCE IF POSSIBLE} BEGIN FACTOR:=GCF(NUM,DEN); IF GCF(NUM,DEN)>1 THEN BEGIN NUM:=NUM DIV FACTOR; DEN:=DEN DIV FACTOR; GOTOXY(20,21); WRITE('='); GOTOXY(23,20); WRITE(NUM); GOTOXY(22,21); WRITE('-----'); GOTOXY(23,22); WRITE(DEN); END; END; {**************************************} PROCEDURE SIMPLIFY; {SIMPLIFY IF IMPROPER FRACTION} VAR WN:INTEGER; {WHOLE NUMBER FROM IMPROPER FRACTION} BEGIN IF NUM>DEN THEN BEGIN WN:=NUM DIV DEN; NUM:=NUM MOD DEN; GOTOXY(28,21); WRITE('= ',WN,' -----'); GOTOXY(33,20); WRITE(NUM); GOTOXY(33,22); WRITE(DEN); END; END; {*******************************************} BEGIN {MAIN PROGRAM} REPEAT ENTRY; FACTOR:=GCF(D1,D2); EQUIV_FRACT; WORK; REDUCE; SIMPLIFY; GOTOXY(1,24); WRITE('ANOTHER? (Y/N)'); READLN(ANS); UNTIL (ANS='N') OR (ANS='n'); END.