Раздел: Задачи / Простейшие /

Преобразование десятичного числа в шестнадцатеричное

Основы программирования 2.0 Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее...

Условие задачи 2.26

Задача 2.26
Дано натуральное число X в десятичной системе счисления. Перевести его в шестнадцатеричную систему счисления. Результат вывести на экран.

Программистам приходится довольно часто это делать. Поэтому почти во всех языках программирования имеются стандартные подпрограммы для преобразования различных форматов записи чисел. В Паскале для этого есть множество функций (одну из них вы увидите ниже), а в С++ можно использовать манипуляторы и флаги форматирования (подробнее об этом в моей книге Основы С++).

Однако использование стандартных средств - это было бы слишком просто. Поэтому мы создадим собственную функцию для перевода десятичного числа в шестнадцатеричное.

Кстати, если вы подзабыли, что такое натуральное число, то читайте здесь.

Запись шестнадцатеричных чисел в Паскале и С++

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

$NNNN

то есть перед цифрами числа ставится знак доллара, а затем записывается число в шестнадцатеричной системе.

В Си и С++ это делается так:

0хNNNN

то есть перед числом ставится 0х, а затем записываются цифры числа.

Разумеется, цифр в числе может быть не обязательно четыре, как в примерах.

Функция преобразования числа в шестнадцатеричное

В Паскале есть стандартная функция для преобразования десятичных чисел в шестнадцатеричные: IntToHex. Эта функция объявлена в модуле SysUtils, и её мы будем использовать для проверки работы нашей собственной функции, которую я назову MyIntToHex, и которая будет работать примерно также, как и стандартная функция IntToHex.

Кроме того, чтобы упростить код основной функции, я использую вспомогательную функцию DigitToHex, которая будет переводить одну десятичную цифру в шестнадцатеричную.

Решение будет, быть может, не самым простым. Но зато мы постараемся использовать как можно меньше стандартных функций. Коды функций отдельно приводить не буду - см. их в примерах программ.

Также не забываем, что по условию задачи нам требуется выполнить преобразование только для натуральных чисел. Отрицательные числа не являются натуральными, поэтому наша функция с ними не работает (хотя если убрать в теле функции проверку числа, то будет работать также как и стандартная функция IntToHex).

Решение задачи 2.26 на Паскале
 
program mytask;

uses SysUtils;    //Подключить этот модуль !!!

//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const
  NUM = $0ABC;    //Число 2748

//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************

//****************************************************************
// Преобразует десятичную цифру в шестнадцатеричную (символ)
// ВХОД  : N - цифра
// ВЫХОД : шестнадцатеричная цифра (символ)
//****************************************************************
function DigitToHex(N : Integer) : char;
begin
  Result := '?';
  case N of
  0   : Result := '0';
  1   : Result := '1';
  2   : Result := '2';
  3   : Result := '3';
  4   : Result := '4';
  5   : Result := '5';
  6   : Result := '6';
  7   : Result := '7';
  8   : Result := '8';
  9   : Result := '9';
  10  : Result := 'A';
  11  : Result := 'B';
  12  : Result := 'C';
  13  : Result := 'D';
  14  : Result := 'E';
  15  : Result := 'F';
  end;
end;

//****************************************************************
// Преобразует десятичное число в шестнадцатеричное (строку)
// ВХОД  : Num - число, Count - количество цифр в шестнадцатеричном числе
// ВЫХОД : шестнадцатеричное число (строка)
//****************************************************************
function MyIntToHex(Num, Count : Integer) : string;
var N, X  : Integer;
    i, j  : Integer;
    Res   : string;
begin
  if Num < 0 then Exit;
  Res := '';
  Result := '?';
  N := Num;
  i := 1;
  while N > 0 do
    begin
      Inc(i);
      X := N mod 16;
      N := N div 16;
      if X < 16 then Res := DigitToHex(X) + Res;
    end;
  for j := i to Count do Res := '0' + Res;
  Result := Res;
end;

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
begin

  WriteLn('DEC = ', NUM, '; HEX = ', IntToHex(NUM, 4));
  WriteLn('DEC = ', NUM, '; HEX = ', MyIntToHex(NUM, 4));

  WriteLn('The end. Press ENTER...');
  ReadLn;
end.
Решение задачи 2.26 на С++
#include <cstdlib>
#include <iostream>

using namespace std;

//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const int NUM = 0xABC;    //Число 2748 

//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************

//****************************************************************
// Преобразует десятичную цифру в шестнадцатеричную (символ)
// ВХОД  : N - цифра
// ВЫХОД : шестнадцатеричная цифра (символ)
//****************************************************************
char DigitToHex(int N)
{
  switch (N)
  {
    case 0  : return('0'); break;
    case 1  : return('1'); break;
    case 2  : return('2'); break;
    case 3  : return('3'); break;
    case 4  : return('4'); break;
    case 5  : return('5'); break;
    case 6  : return('6'); break;
    case 7  : return('7'); break;
    case 8  : return('8'); break;
    case 9  : return('9'); break;
    case 10 : return('A'); break;
    case 11 : return('B'); break;
    case 12 : return('C'); break;
    case 13 : return('D'); break;
    case 14 : return('E'); break;
    case 15 : return('F'); break;
    default : return('?');
  }
}

//****************************************************************
// Преобразует десятичное число в шестнадцатеричное (строку)
// ВХОД  : Num - число, Count - количество цифр в шестнадцатеричном числе
// ВЫХОД : шестнадцатеричное число (строка)
//****************************************************************
string MyIntToHex(int Num, int Count)
{
  string Res = "?";
  if (Num < 0) return(Res);
  Res = "";
  int N = Num;
  int i = 1;
  int X;
  while (N > 0)
  {
    i++;
    X = N % 16;
    N = N / 16;
    if (X < 16) Res = DigitToHex(X) + Res;
  }
  for (int j = i; j <= Count; j++) Res = '0' + Res;
  return(Res);
}        

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
int main(int argc, char *argv[])
{
  cout << "DEC = " << NUM << "; HEX = " << hex << uppercase << NUM << dec << endl;
  cout << "DEC = " << NUM << "; HEX = " << MyIntToHex(NUM, 4) << endl;
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Преобразование десятичного числа в шестнадцатеричное


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика