Перевод чисел из одной системы счисления в другую- QBasic(Бейсик)

DECLARE FUNCTION fromDec$ (number$, lenght%)
DECLARE FUNCTION checkData! (number$, lenght%)
DECLARE FUNCTION isFract! (number$, lenght%)
DECLARE FUNCTION toDec (number$, lenght%, fract%)
 
CLS
 
DIM SHARED number$, q%, p%, valmas$(0 TO 15), res&(0 TO 10000)
 
valmas$(0) = "0"
valmas$(1) = "1"
valmas$(2) = "2"
valmas$(3) = "3"
valmas$(4) = "4"
valmas$(5) = "5"
valmas$(6) = "6"
valmas$(7) = "7"
valmas$(8) = "8"
valmas$(9) = "9"
valmas$(10) = "A"
valmas$(11) = "B"
valmas$(12) = "C"
valmas$(13) = "D"
valmas$(14) = "E"
valmas$(15) = "F"
 
start:
 
q% = 0
p% = 0
 
DIM SHARED wholenum$
DIM SHARED fract$
 
INPUT "Enter number: "; number$
number$ = UCASE$(number$)
 
 
IF checkData(number$, LEN(number$)) <> 1 THEN
  PRINT
  PRINT "Incorrect data format. Try one more time! ;-)"
  PRINT
  GOTO start
END IF
 
 
osn:
 
INPUT "Enter original system's notation: ", q%
 
IF q% >= 2 AND q% <= 16 THEN
ELSE
  GOTO osn
END IF
 
tsn:
 
INPUT "Enter target system's notation: ", p%
 
IF p% >= 2 AND p% <= 16 THEN
ELSE
  GOTO tsn
END IF
 
 
count:
 
lenght% = LEN(number$)
fractional = 0
 
IF isFract(number$, lenght%) = 1 THEN
  fractional = 1
END IF
 
 
IF q% = p% THEN
  GOTO answer
 
ELSEIF q% = 10 THEN
 
  IF fractional = 1 THEN
    number$ = fromDec(wholenum$, LEN(wholenum$)) + "," + fromDec(fract$, LEN(fract$))
  ELSE
    number$ = fromDec(number$, lenght%)
  END IF
 
ELSEIF q% <> 10 THEN
 
  IF fractional = 1 THEN
    number$ = STR$(toDec(wholenum$, LEN(wholenum$), 1) + toDec(fract$, LEN(fract$), -1))
  ELSE
    number$ = STR$(toDec(number$, lenght%, 1))
  END IF
 
  q% = 10
  
  GOTO count
 
END IF
 
 
 
answer:
 
PRINT
PRINT "OTBET: "; number$
PRINT
 
 
continue:
 
DO
  INPUT "Would U like to continue? (y/n)"; answ$
LOOP UNTIL LCASE$(answ$) = "y" OR LCASE$(answ$) = "n"
 
IF LCASE$(answ$) = "y" THEN
  PRINT
  GOTO start
ELSE
  PRINT
  PRINT "Exit programm..."
  END
END IF
 
FUNCTION checkData (number$, lenght%)
  FOR i = 1 TO lenght%
    inarray% = 0
    num$ = MID$(number$, i, 1)
    FOR j = 0 TO 15
      IF valmas$(j) = num$ OR num$ = "," OR num$ = "." THEN
        inarray% = 1
        EXIT FOR
      END IF
    NEXT j
    IF inarray% <> 1 THEN
      EXIT FUNCTION
    END IF
  NEXT i
  checkData = inarray%
END FUNCTION
 
FUNCTION fromDec$ (number$, lenght%)
 
  DIM lres!(0 TO 1000)
  a$ = ""
  i = 0
  number! = VAL(number$)
 
  WHILE number! > 0
    lres!(i) = number! MOD p%
    number! = FIX(number! / p%)
    i = i + 1
  WEND
 
  FOR j = i TO 0 STEP -1
    IF lres!(j) > 9 THEN
      a$ = a$ + valmas$(lres!(j))
    ELSE
      a$ = a$ + STR$(lres!(j))
    END IF
  NEXT j
 
  a$ = RIGHT$(a$, LEN(a$) - 2)
 
  fromDec = a$
 
END FUNCTION
 
FUNCTION isFract (number$, lenght%)
  isFract = 0
  FOR i = 1 TO lenght%
    num$ = MID$(number$, i, 1)
    IF num$ = "," OR num$ = "." THEN
      wholenum$ = LEFT$(number$, i - 1)
      fract$ = RIGHT$(number$, lenght% - i)
      isFract = 1
    END IF
  NEXT i
END FUNCTION
 
FUNCTION toDec (number$, lenght%, fract%)
 
  res! = 0
 
  FOR i = 1 TO lenght%
    num$ = MID$(number$, i, 1)
    IF NOT num$ = "0" AND VAL(num$) = 0 THEN
      FOR k = 0 TO 15 STEP 1
        IF num$ = valmas$(k) THEN
          num$ = STR$(k)
        END IF
      NEXT k
    END IF
    IF fract% = 1 THEN
      res! = res! + VAL(num$) * q% ^ (lenght% - i)
    ELSE
      res! = res! + VAL(num$) * q% ^ -i
    END IF
  NEXT i
 
  toDec = res! 'STR$(res!)
 
END FUNCTION

Leave a Comment