Код
uses CRT;
const
h15 = '0123456789ABCDEF';
var
hold_in, dec_str, hex_str: string;
hex_digits: array [0..15] of Char;
ch: Char;
k: Integer;
procedure initialize;
var
j: Word;
temp: string [Length(h15)];
begin
temp := h15;
for j := 0 to 15 do hex_digits[j] := temp[j + 1];
end;
procedure get_decimal(var dec_str: string );
var
k: Word;
begin
repeat
WriteLn('Введите строку десятичных цифр:');
ReadLn(dec_str);
if dec_str = '' then
Halt;
{Удалить недесятичные символы}
for k := Length(dec_str) downto 1 do
if not (dec_str[k] in ['0'..'9']) then
Delete(dec_str, k, 1);
{Удалить нули в старших разрядах}
while (Length(dec_str) > 1) and (dec_str[1] = '0') do
Delete(dec_str, 1, 1);
if Length(dec_str) > 0 then
Exit;
WriteLn('Ошибка при вводе, повторите');
WriteLn;
until false;
end;
procedure convert(var dec_str, hex_str: string );
var
remainder: Integer;
procedure divide_by_16;
{Строка dec_str, состоящая из десятичных цифр, делится на 16.
Остаток далее будет преобразован в следующую шестнадцатеричную цифру.
Частное преобразуется в строку dec_str}
var
j, k,
dividend: Word;
error: Integer;
begin
remainder := 0; {0 <= remainder <= 15}
for j := 1 to Length(dec_str) do
begin
if KeyPressed then
Halt;
Val(dec_str[j], k, error);
dividend:= 10*remainder + k;
{0 <= dividend<= 159}
remainder := dividend mod 16;
{0 <= remainder <= 15}
dec_str[j] := hex_digits[dividend div 16];
end;
Delete(dec_str, 1, 1);
end;{divide_by_16}
begin
hex_str := '';
while Length(dec_str) > 0 do
begin
if KeyPressed then Halt;
divide_by_16;
hex_str := hex_digits[remainder] + hex_str;
end;
end;{convert}
begin
initialize;
repeat
get_decimal(dec_str);
hold_in := dec_str;
convert(dec_str, hex_str);
k := Length(hold_in) - 2;
while k > 1 do
begin
Insert(',', hold_in, k);
Dec(k, 3);
end;
Write(hold_in, ' = $');
while Length(hex_str) mod 4 <> 0 do
hex_str := '0' + hex_str;
k := Length(hex_str) - 3;
while k > 1 do
begin
Insert(' ', hex_str, k);
Dec(k, 4);
end;
WriteLn(hex_str); WriteLn;
WriteLn('Для продолжения работы нажмите <Enter>, а для окончания <Esc>');
ch := ReadKey;
if ch = #27 then Break;
WriteLn;
until false;
end.
Это перевод из 10-тичной в 16-ричную
Другие делаются аналогично.