Numeral.Mod 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. MODULE Numeral;
  2. IMPORT In, Out;
  3. PROCEDURE Digit(c: CHAR; P: INTEGER): INTEGER;
  4. VAR d: INTEGER;
  5. BEGIN
  6. IF ('0' <= c) & (c <= '9') THEN d := ORD(c) - ORD('0')
  7. ELSIF ('a' <= c) & (c <= 'z') THEN d := ORD(c) - ORD('a') + 10
  8. ELSIF ('A' <= c) & (c <= 'Z') THEN d := ORD(c) - ORD('A') + 10
  9. ELSE d := -1
  10. END;
  11. IF d >= P THEN d := -1 END
  12. RETURN d END Digit;
  13. PROCEDURE Convert(s: ARRAY OF CHAR; P: INTEGER; VAR err: INTEGER): INTEGER;
  14. VAR d, x, i: INTEGER;
  15. BEGIN
  16. err := -1;
  17. x := 0;
  18. i := 0;
  19. WHILE (err = -1) & (s[i] # 0X) DO
  20. d := Digit(s[i], P);
  21. IF d = -1 THEN err := i ELSE x := x * P + d END;
  22. INC(i)
  23. END
  24. RETURN x END Convert;
  25. PROCEDURE Do;
  26. VAR P, n, err: INTEGER;
  27. s: ARRAY 50 OF CHAR;
  28. BEGIN
  29. Out.String('Введите P: '); In.Int(P);
  30. Out.String('Введите число в '); Out.Int(P, 0);
  31. Out.String('-ичной системе счисления: '); In.Line(s);
  32. n := Convert(s, P, err);
  33. IF err = -1 THEN
  34. Out.String('Число в десятичной системе: '); Out.Int(n, 0)
  35. ELSE
  36. Out.String('Введённое число имет неверный знак в ');
  37. Out.Int(err + 1, 0); Out.String('-м слева разряде.')
  38. END;
  39. Out.Ln
  40. END Do;
  41. BEGIN
  42. Do
  43. END Numeral.