Переводить число из любой системы счисления в любую другую. - Pascal

Узнай цену своей работы

Формулировка задачи:

Ребят, помогите, уже неделю бьюсь головой об ноут... Нам дали задачу написать прогу, которая будет переводить число из любой системы счисления в любую другую. НО подвох в том, что препод дает несуществующие системы счисления! К примеру переведите число "9_65_76" из 80 системы счисления в 51-ую систему счисления. ("_" это тип пробел) В инете нету нигде, а я не настолько шикарно пишу проги что бы написать ЭТО Прошу помогите, мне не важно даже на каком языке (С++, С, Паскаль любой) лишь бы было.

Решение задачи: «Переводить число из любой системы счисления в любую другую.»

textual
Листинг программы
  1. const
  2.     NUMBERS: Set Of Char = ['0'..'9'];
  3. function StrToWord(const s: String; var error: Boolean): Word;
  4. var
  5.     Result, code: Word;
  6. begin
  7.     Val(s, Result, code);
  8.     error := (code <> 0);
  9.     if (error)
  10.     then
  11.         Result := 0;
  12.     StrToWord := Result;
  13. end;
  14. function WordToStr(const x: Word): String;
  15. var
  16.     Result: String;
  17. begin
  18.     Str(x, Result);
  19.     WordToStr := Result;
  20. end;
  21. function Power(const a: Byte; const b: Byte): LongWord;
  22. var
  23.     Result: LongWord;
  24.     i: Byte;
  25. begin
  26.     Result := 1;
  27.     if (b > 0)
  28.     then
  29.         for i := 1 to b do
  30.             Result := Result * a;
  31.     Power := Result;
  32. end;
  33. function AnyToDec(s: String; const sep: Char; const q: Byte; var error: Boolean): LongWord;
  34. var
  35.     Result: LongWord;
  36.     sCurrNumb: String;
  37.     xCurrNumb: Word;
  38.     currDigit: Byte;
  39. begin
  40.     currDigit := 0; Result := 0;
  41.     s := sep + s; error := False;
  42.     while ((Length(s) > 0) And (Not error)) do
  43.     begin
  44.         sCurrNumb := '';
  45.         while (s[Length(s)] <> sep) do
  46.         begin
  47.             sCurrNumb := s[Length(s)] + sCurrNumb;
  48.             Delete(s, Length(s), 1);
  49.         end;
  50.         Delete(s, Length(s), 1);
  51.         xCurrNumb := StrToWord(sCurrNumb, error);
  52.         error := (error Or (xCurrNumb >= q));
  53.         if (Not error)
  54.         then
  55.             Inc(Result, Power(q, currDigit) * xCurrNumb);
  56.         Inc(currDigit);
  57.     end;
  58.     AnyToDec := Result;
  59. end;
  60. function DecToAny(x: LongWord; const sep: Char; const q: Byte): String;
  61. var
  62.     Result: String;
  63. begin
  64.     Result := '';
  65.     while (x > 0) do
  66.     begin
  67.         Result := sep + WordToStr(x mod q) + Result;
  68.         x := x div q;
  69.     end;
  70.     Delete(Result, 1, 1);
  71.     DecToAny := Result;
  72. end;
  73. var
  74.     x: String;
  75.     q1, q2: Byte; //целочисленное основание (2..255)
  76.     separator: Char; //разделитель
  77.     ans: LongWord;
  78.     error: Boolean;
  79. begin
  80.     repeat
  81.         Write('Введите разделитель разрядов числа: ');
  82.         ReadLn(separator);
  83.     until Not(separator in NUMBERS);
  84.     repeat
  85.         Write('Введите основание оригинального числа: ');
  86.         ReadLn(q1);
  87.     until (q1 > 1);
  88.     Write('Введите число: '); ReadLn(x);
  89.     ans := AnyToDec(x, separator, q1, error);
  90.     if (Not error)
  91.     then
  92.     begin
  93.         WriteLn(x, '_', q1, '=', ans, '_10');
  94.         repeat
  95.             Write('Введите основание второго числа: ');
  96.             ReadLn(q2);
  97.         until (q2 > 1);
  98.         WriteLn(x, '_', q1, '=', DecToAny(ans, separator, q2), '_', q2);
  99.     end;
  100. end.

Объяснение кода листинга программы

  1. Объявление константы NUMBERS содержит символы от '0' до '9'.
  2. Функция StrToWord преобразует строку в число типа Word и устанавливает флаг error в true, если преобразование невозможно.
  3. Функция WordToStr преобразует число типа Word в строку.
  4. Функция Power возвращает результат возведения в степень.
  5. Функция AnyToDec преобразует число из произвольной системы счисления в десятичное число с установленным основанием и разделителем. Функция также устанавливает флаг error в true, если встречаются ошибки при преобразовании.
  6. Функция DecToAny преобразует десятичное число в число с произвольной системой счисления с установленным основанием и разделителем.
  7. В основной части программы запрашивается у пользователя разделитель разрядов числа, основание оригинального числа и само число. Затем производятся преобразования числа из десятичной системы счисления в другую указанную основанием и вывод результата.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.417 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы