Написать рекурсивную процедуру, переводящую целое число из шестнадцатеричной системы счисления в десятичную- Pascal(Паскаль)

program Project1;
 
(*Рекурсивный перевод шестнадцатеричной записи в число.*)
function Hex2Num(const aSHex : String; const aWeight, aI : Integer) : Integer;
var
  Num : Integer;
begin
  Num := 0;
  case aSHex[aI] of
    '0'      : Num := 0 * aWeight;
    '1'      : Num := 1 * aWeight;
    '2'      : Num := 2 * aWeight;
    '3'      : Num := 3 * aWeight;
    '4'      : Num := 4 * aWeight;
    '5'      : Num := 5 * aWeight;
    '6'      : Num := 6 * aWeight;
    '8'      : Num := 8 * aWeight;
    '9'      : Num := 9 * aWeight;
    'A', 'a' : Num := 10 * aWeight;
    'B', 'b' : Num := 11 * aWeight;
    'C', 'c' : Num := 12 * aWeight;
    'D', 'd' : Num := 13 * aWeight;
    'E', 'e' : Num := 14 * aWeight;
    'F', 'f' : Num := 15 * aWeight;
  end;
  if aI > 1 then begin
    Num := Num + Hex2Num(aSHex, aWeight * 16, aI - 1);
  end;
  Hex2Num := Num;
end;
 
(*Рекурсивный перевод числа в десятичную запись.*)
function Num2Dec(const aNum : Integer) : String;
var
  StrDec : String;
  Num : Integer;
begin
  case aNum mod 10 of
    0 : StrDec := '0';
    1 : StrDec := '1';
    2 : StrDec := '2';
    3 : StrDec := '3';
    4 : StrDec := '4';
    5 : StrDec := '5';
    6 : StrDec := '6';
    7 : StrDec := '7';
    8 : StrDec := '8';
    9 : StrDec := '9';
  end;
  Num := aNum div 10;
  if Num > 0 then StrDec := Num2Dec(Num) + StrDec;
  Num2Dec := StrDec;
end;
 
var
  SHex, SDec, S : String;
  Num : Integer;
begin
  repeat
    Writeln('Задайте целое неотрицательное число в шестнадцатеричной системе счисления:');
    Readln(SHex);
 
    (*Переводим шестнадцатеричную запись в число.*)
    Num := Hex2Num(SHex, 1, Length(SHex));
    (*Переводим число в десятичную запись.*)
    SDec := Num2Dec(Num);
 
    Writeln('Это же число в десятичной системе счисления:');
    Writeln(SDec);
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.

Следующий вариант

program Project1;
 
(*Рекурсивный перевод шестнадцатеричной записи в число.*)
function Hex2Num(const aSHex : String; const aWeight, aI : Integer) : Integer;
var
  Num : Integer;
begin
  Num := 0;
  case aSHex[aI] of
    '0'      : Num := 0 * aWeight;
    '1'      : Num := 1 * aWeight;
    '2'      : Num := 2 * aWeight;
    '3'      : Num := 3 * aWeight;
    '4'      : Num := 4 * aWeight;
    '5'      : Num := 5 * aWeight;
    '6'      : Num := 6 * aWeight;
    '8'      : Num := 8 * aWeight;
    '9'      : Num := 9 * aWeight;
    'A', 'a' : Num := 10 * aWeight;
    'B', 'b' : Num := 11 * aWeight;
    'C', 'c' : Num := 12 * aWeight;
    'D', 'd' : Num := 13 * aWeight;
    'E', 'e' : Num := 14 * aWeight;
    'F', 'f' : Num := 15 * aWeight;
  end;
  if aI > 1 then begin
    Num := Num + Hex2Num(aSHex, aWeight * 16, aI - 1);
  end;
  Hex2Num := Num;
end;
 
var
  SHex, S : String;
  Num : Integer;
begin
  repeat
    Writeln('Задайте целое неотрицательное число в шестнадцатеричной системе счисления:');
    Readln(SHex);
 
    (*Переводим восьмеричную запись в число.*)
    Num := Hex2Num(SHex, 1, Length(SHex));
 
    Writeln('Это же число в десятичной системе счисления:');
    Writeln(Num);
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.

Например, имеем шестнадцатеричную запись числа: «DA5». Эта запись обозначает следующее число:
D * 16^2 + A * 16^1 + 5 * 16^0
= D * 256 + A * 16 + 5 * 1
= 13 * 256 + 10 * 16 + 5
= 3328 + 160 + 5
= 3493
В представленном коде происходит преобразование:
‘D’ -> 13
‘A’ -> 10
‘5’ -> 5
А через aWeight учитывается вес разряда:
D * 256 + A * 16 + 5 * 1
Здесь для старшего разряда имеем вес: aWeight = 256, для второго разряда вес равен: aWeight = 16 и младший разряд имеет вес равный: aWeight = 1.

Leave a Comment

− 5 = 5