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

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

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

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

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

textual
Листинг программы
const
    NUMBERS: Set Of Char = ['0'..'9'];
function StrToWord(const s: String; var error: Boolean): Word;
var
    Result, code: Word;
begin
    Val(s, Result, code);
    error := (code <> 0);
    if (error)
    then
        Result := 0;
    StrToWord := Result;
end;
function WordToStr(const x: Word): String;
var
    Result: String;
begin
    Str(x, Result);
    WordToStr := Result;
end;
function Power(const a: Byte; const b: Byte): LongWord;
var
    Result: LongWord;
    i: Byte;
begin
    Result := 1;
    if (b > 0)
    then
        for i := 1 to b do
            Result := Result * a;
    Power := Result;
end;
function AnyToDec(s: String; const sep: Char; const q: Byte; var error: Boolean): LongWord;
var
    Result: LongWord;
    sCurrNumb: String;
    xCurrNumb: Word;
    currDigit: Byte;
begin
    currDigit := 0; Result := 0;
    s := sep + s; error := False;
    while ((Length(s) > 0) And (Not error)) do
    begin
        sCurrNumb := ''; 
        while (s[Length(s)] <> sep) do
        begin
            sCurrNumb := s[Length(s)] + sCurrNumb;
            Delete(s, Length(s), 1);
        end;
        Delete(s, Length(s), 1);
        xCurrNumb := StrToWord(sCurrNumb, error);
        error := (error Or (xCurrNumb >= q));
        if (Not error)
        then
            Inc(Result, Power(q, currDigit) * xCurrNumb);
        Inc(currDigit);
    end;
    AnyToDec := Result;
end;
function DecToAny(x: LongWord; const sep: Char; const q: Byte): String;
var
    Result: String;
begin
    Result := '';
    while (x > 0) do
    begin
        Result := sep + WordToStr(x mod q) + Result;
        x := x div q;
    end;
    Delete(Result, 1, 1);
    DecToAny := Result;
end;
var
    x: String;
    q1, q2: Byte; //целочисленное основание (2..255)
    separator: Char; //разделитель
    ans: LongWord;
    error: Boolean;
begin
    repeat
        Write('Введите разделитель разрядов числа: ');
        ReadLn(separator);
    until Not(separator in NUMBERS);
    repeat
        Write('Введите основание оригинального числа: ');
        ReadLn(q1);
    until (q1 > 1);
    Write('Введите число: '); ReadLn(x);
    ans := AnyToDec(x, separator, q1, error);
    if (Not error)
    then
    begin
        WriteLn(x, '_', q1, '=', ans, '_10');
        repeat
            Write('Введите основание второго числа: ');
            ReadLn(q2);
        until (q2 > 1);
        WriteLn(x, '_', q1, '=', DecToAny(ans, separator, q2), '_', q2);
    end;
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
Похожие ответы