Переводить число из любой системы счисления в любую другую. - 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
преобразует десятичное число в число с произвольной системой счисления с установленным основанием и разделителем. - В основной части программы запрашивается у пользователя разделитель разрядов числа, основание оригинального числа и само число. Затем производятся преобразования числа из десятичной системы счисления в другую указанную основанием и вывод результата.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д