' DEC_FRAC.BAS - Fraction/Decimal conversion functions
'               and sample program

' by Antonio and Alfonso De Pasquale

DECLARE FUNCTION DecToFrac$ (decimal)
DECLARE FUNCTION FracToDec (fraction$)

MAIN:
    CLS : LOCATE 1, 25: PRINT "Fraction/Decimal Converter"
    LOCATE 2, 21: PRINT "by Antonio and Alfonso De Pasquale"
    LOCATE 3, 1: FOR x = 1 TO 79: PRINT "="; : NEXT x
    LOCATE 5, 1: PRINT "Please select one of the following choices:"
    LOCATE 7, 10: PRINT "[D]ecimal to Fraction"
    LOCATE 8, 10: PRINT "[F]raction to Decimal"
    LOCATE 9, 10: PRINT "[Q]uit Program"

    DO
        LOCATE 11, 1: PRINT SPACE$(79)
        LOCATE 11, 1: INPUT "Please enter your choice (D/F/Q): ", choice$
        choice$ = UCASE$(LEFT$(choice$, 1))
    LOOP UNTIL choice$ = "D" OR choice$ = "F" OR choice$ = "Q"

convert:
    SELECT CASE choice$
        CASE "Q"
             SCREEN 2: PRINT "Please Wait...": SYSTEM

        CASE "D"
            LOCATE 13, 1: PRINT SPACE$(79)
            LOCATE 13, 1: INPUT "Please enter a decimal value: ", decimal$
            decimal = VAL(decimal$)
            IF decimal = 0 OR INT(decimal) = decimal THEN GOTO convert
            fraction$ = DecToFrac$(decimal)
            LOCATE 16, 1: PRINT "The Decimal  "; decimal; "  is equal to the fraction  "; fraction$

        CASE "F"
            LOCATE 13, 1: PRINT SPACE$(79)
            LOCATE 13, 1: INPUT "Please enter a fractional value: ", fraction$
            fl$ = fraction$: fl$ = fl$ + " ": fl = INSTR(1, fl$, "/")
            IF VAL(fraction$) = 0 OR fl = 0 THEN GOTO convert
            IF (MID$(fl$, fl - 1, 1) = " ") OR (MID$(fl$, fl + 1, 1) = " ") THEN GOTO convert
            decimal = FracToDec(fraction$)
            LOCATE 16, 1: PRINT "The fraction  "; fraction$; "  is equal to the decimal  "; decimal

        END SELECT

        LOCATE 19, 1: PRINT "Press Enter to continue";
        DO: LOOP UNTIL INKEY$ = CHR$(13)
        GOTO MAIN
        END
'********************************************************************
'               ACTUAL CONVERSION FUNCTIONS BEGIN HERE
'********************************************************************

FUNCTION DecToFrac$ (decimal)

    decimal$ = STR$(decimal)
    index = INSTR(decimal$, ".")

    IF index = 1 THEN
        decimal$ = "0" + decimal$
        index = index + 1
    END IF

    whole$ = LEFT$(decimal$, index - 1)
    dec$ = MID$(decimal$, index, 10)

    IF VAL(whole$) = 0 THEN
        whole$ = ""
    END IF

    dec = VAL(dec$)
    dec = INT(dec * 1000 + .5)

    num = dec
    den = 1000

    FOR pass = 0 TO 3
        FOR index = 10 TO 1 STEP -1
            IF (num / index = INT(num / index)) AND (den / index) = INT(den / index) THEN
              num = (num / index)
              den = (den / index)
            END IF
        NEXT index
    NEXT pass

    fraction$ = whole$ + STR$(num) + "/" + MID$(STR$(den), 2)
    DecToFrac$ = fraction$


END FUNCTION

FUNCTION FracToDec (fraction$)

    decimal = 0
    dp = 0

    index = INSTR(fraction$, CHR$(32))

    IF index = 0 THEN
        f$ = fraction$
    ELSE
        whole$ = LEFT$(fraction$, index)
        f$ = MID$(fraction$, index + 1, 10)
    END IF

    index = INSTR(f$, "/")
    num = VAL(LEFT$(f$, index - 1))
    den = VAL(MID$(f$, index + 1))

    dp = num / den
    decimal = ABS(VAL(whole$)) + dp
    IF LEFT$(fraction$, 1) = "-" THEN decimal = (-decimal)
    IF LEFT$(fraction$, 1) = "-" AND decimal > 0 THEN decimal = (-decimal)
    FractToDec = decimal
   
END FUNCTION

