Переводить число из любой системы счисления в любую другую. - 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.
Объяснение кода листинга программы
- Объявление константы
NUMBERS
содержит символы от '0' до '9'. - Функция
StrToWord
преобразует строку в число типаWord
и устанавливает флагerror
в true, если преобразование невозможно. - Функция
WordToStr
преобразует число типаWord
в строку. - Функция
Power
возвращает результат возведения в степень. - Функция
AnyToDec
преобразует число из произвольной системы счисления в десятичное число с установленным основанием и разделителем. Функция также устанавливает флагerror
в true, если встречаются ошибки при преобразовании. - Функция
DecToAny
преобразует десятичное число в число с произвольной системой счисления с установленным основанием и разделителем. - В основной части программы запрашивается у пользователя разделитель разрядов числа, основание оригинального числа и само число. Затем производятся преобразования числа из десятичной системы счисления в другую указанную основанием и вывод результата.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д