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.