Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/120: Рейтинг темы: голосов - 120, средняя оценка - 4.74
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
1

Перевод числа из десятичной системы счисления в шестнадцатеричную

01.09.2014, 14:39. Показов 22453. Ответов 40
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Выскажите вашу точку зрения по этому коду

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

Мой код на C++Builder 6 (не ругать):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
 
string DecHex(int);
 
int main(int argc, char* argv[])
{
    int i = 1000;
    int a;
    cin >> a;
    cout<<DecHex(a);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
 
string DecHex(int ch)
{
     using namespace std;
     string s, b;
     int c, d;
     do
        if ((ch != 0) && (fmod(ch,16) != 0))
        {
            c = ch/16; //?????
            d = ch%16; //???????
            switch(d)
            {
               case 0:  b = "0"; break;
               case 1:  b = "1"; break;
               case 2:  b = "2"; break;
               case 3:  b = "3"; break;
               case 4:  b = "4"; break;
               case 5:  b = "5"; break;
               case 6:  b = "6"; break;
               case 7:  b = "7"; break;
               case 8:  b = "8"; break;
               case 9:  b = "9"; break;
               case 10: b = "A"; break;
               case 11: b = "B"; break;
               case 12: b = "C"; break;
               case 13: b = "D"; break;
               case 14: b = "E"; break;
               case 15: b = "F"; break;
            }
            ch = c;
            s = b+s;
        }
        else
        {
          return(s);
        }
     while (true);
}
Вроде всё работает, но стали возникать вопросы:

Правильно ли он написан? Как можно его улучшить? Хорошо ли придумано с "case"?
Выскажите вашу точку зрения по этому коду.

Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2014, 14:39
Ответы с готовыми решениями:

Перевод из десятичной системы счисления в шестнадцатеричную
Здраствуйте дорогое сообщество КиберФорума, на просторах вашего форума нашёл не один вариант...

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

Перевод числа из десятичной в шестнадцатеричную систему счисления
Здраавствуйте, помогите найти ошибку в этом коде. Непонимаю почему при переводе таких чисел как...

Перевод числа из восьмеричной системы счисления в шестнадцатеричную систему счисления
Вот пример числа: 754 = 1EC 1000 = 200

40
Native x86
Эксперт Hardware
5679 / 3414 / 964
Регистрация: 13.02.2013
Сообщений: 10,832
01.09.2014, 14:44 2
Цитата Сообщение от AndHacker Посмотреть сообщение
Выскажите вашу точку зрения по этому коду.
Как минимум вместо вот этой байды:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            switch(d)
            {
               case 0:  b = "0"; break;
               case 1:  b = "1"; break;
               case 2:  b = "2"; break;
               case 3:  b = "3"; break;
               case 4:  b = "4"; break;
               case 5:  b = "5"; break;
               case 6:  b = "6"; break;
               case 7:  b = "7"; break;
               case 8:  b = "8"; break;
               case 9:  b = "9"; break;
               case 10: b = "A"; break;
               case 11: b = "B"; break;
               case 12: b = "C"; break;
               case 13: b = "D"; break;
               case 14: b = "E"; break;
               case 15: b = "F"; break;
            }
принято использовать индексный выбор значения из массива или строки вида "0123456789ABCDEF".
1
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
01.09.2014, 14:47 3
Со стрингами дел почти не имел, но думаю что и чар к ним должен хорошо приконкатенироваться, так что b можно чаром сделать. Переменная с лишняя, сразу с копией ch работайте, вы же ее потом изменяете все равно. С кейс придумано хорошо, но гораздо лучше использовать таблицу символов - '0' + d даст символ от 0 до 9, от A до F надо прибавить другое число. Вайл тру конечно стильно, но можно упростить до вайл что-то-осталось-от-числа.
1
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
01.09.2014, 15:22  [ТС] 4
Реализовал как написано выше,спасибо.
А есть ещё идеи по модернизации кода?
Спасибо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
 
string DecHex(int);
 
int main(int argc, char* argv[])
{
    int i = 1000;
    int a;
    cin >> a;
    cout<<DecHex(a);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
 
string DecHex(int ch)
{
     using namespace std;
     string s;
     int d;
     char m[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
     while ((ch != 0) && (fmod(ch,16) != 0))
     {
       d = ch%16;
       ch/=16;
       s = m[d]+s;
     }
     return(s);
}
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
01.09.2014, 15:30 5
Насчет модернизации - выбирайте сами, что вам ближе - работать с массивом чаров как советовал quwy, или с самими чарами по таблице символов, как рекомендовал я. Еще у меня подозрение что в вайле хватит и
C++
1
while (ch)
.
1
Native x86
Эксперт Hardware
5679 / 3414 / 964
Регистрация: 13.02.2013
Сообщений: 10,832
01.09.2014, 15:33 6
Цитата Сообщение от AndHacker Посмотреть сообщение
А есть ещё идеи по модернизации кода?
Ну, не знаю. Короче будет только IntToHex() вызвать
1
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
01.09.2014, 15:37  [ТС] 7
quwy, Можно, но так будет не интересно
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
01.09.2014, 15:37 8
AndHacker, инициализацию массива можно и попроще
C++
1
char m[17] { "0123456789ABCDEF"};
и попробуйте ввести число 16 (32, 48 тоже пойдут)
1
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
01.09.2014, 15:43  [ТС] 9
и попробуйте ввести число 16 (32, 48 тоже пойдут)
Поясните, ввести куда? В массив m[32] ?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
01.09.2014, 15:44 10
AndHacker, так и знал, что двояко написал. Имел ввиду в а, при вводе значения.
1
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
01.09.2014, 15:46  [ТС] 11
AndHacker, так и знал, что двояко написал. Имел ввиду в а, при вводе значения.
Проверил, с числами 16, 32 и 48 программа работает нужным образом.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
01.09.2014, 15:51 12
Цитата Сообщение от AndHacker Посмотреть сообщение
работает нужным образом
странно, в студии вывода просто нет. Посмотрю поподробнее.

Добавлено через 3 минуты
Цитата Сообщение от AndHacker Посмотреть сообщение
while ((ch != 0) && (fmod(ch,16) != 0))
тут надо or вместо and ведь, может не ту версию кода выложили?

Но в обоих случаях отсутствует вывод при вводе 0, и было бы неплохо добавить 0х в начало строки, а то выглядит как десятичное число.
1
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
01.09.2014, 15:52  [ТС] 13
Всем спасибо за замечания.
В результате танцев с бубнами получился следующий код, который выглядит в два раза короче чем изначальный
Ещё предложения и замечания будут?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
 
string DecHex(int);
 
int main(int argc, char* argv[])
{
    int a;
    cin >> a;
    cout<<DecHex(a);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
 
string DecHex(int ch)
{
     using namespace std;
     string s;
     int d;
     char m[16] = {"0123456789ABCDEF"};
     while (ch)
     {
       d = ch%16;
       ch/=16;
       s = m[d]+s;
     }
     return(s);
}
0
2338 / 1826 / 753
Регистрация: 27.07.2012
Сообщений: 5,407
01.09.2014, 15:53 14
Замечания в комментариях:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//---------------------------------------------------------------------------
 
#include <vcl.h> // зачем тут?
#include <iostream.h> // правильно так: <iostream>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
 
string DecHex(int);
 
int main(int argc, char* argv[])
{
    int i = 1000; // зачем?
    int a;
    cin >> a;
    cout<<DecHex(a);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
 
string DecHex(int ch)
{
     using namespace std; // зачем это здесь? Если уж использовать это, то в начале файла.
     string s;
     int d; // можно обойтись без неё.
     char m[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
     while ((ch != 0) && (fmod(ch,16) != 0)) // зачем второе условие?
     {
       d = ch%16; // s = m[ch % 16] + s; и переменная d не нужна.
       ch/=16;
       s = m[d]+s; // см.выше.
     }
     return(s);
}
1
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
01.09.2014, 15:55 15
Цитата Сообщение от AndHacker Посмотреть сообщение
Реализовал как написано выше,спасибо.
Просто причесал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//---------------------------------------------------------------------------
 
#include <iostream>
 
//---------------------------------------------------------------------------
 
std::string DecHex( int );
 
int main(int argc, char* argv[])
{
    int a;
    std::cin >> a;
    std::cout << DecHex(a);
    std::cin.ignore(2);
    return 0;
}
//---------------------------------------------------------------------------
 
std::string DecHex( int ch )
{
     std::string s;
     int d;
     const unsigned size = 16;
     char m[size + 1] = { "0123456789ABCDEF\0"};
     while( ch )
         {
         d   = ch % size;
         ch /= size;
         s   = m[d] + s;
         }
     return( s );
}
1
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
01.09.2014, 15:56 16
Если оставаться в стрингах, то больше вряд ли что-то удастся ужать, кроме моей рекомендации про таблицу символов (третий раз пишу).
А если идти дальше, то я бы написал не функцию, возвращающую стринг, а функцию, заполняющую нужными символами строку (не стринг) с переданного указателя. И тогда не нужна перегруженная конкатенация, которая за одним значком '+' скрывает громоздкие методы внутри.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
01.09.2014, 16:11 17
C++
1
s += "0123456789ABCDEF"[d];
2
135 / 134 / 53
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
01.09.2014, 16:13 18
А ещё, осмсленные имена переменным нужно давать.
1
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
01.09.2014, 19:13  [ТС] 19
Цитата Сообщение от John Prick Посмотреть сообщение
Замечания в комментариях:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//---------------------------------------------------------------------------
 
#include <vcl.h> // зачем тут?
#include <iostream.h> // правильно так: <iostream>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
 
string DecHex(int);
 
int main(int argc, char* argv[])
{
    int i = 1000; // зачем?
    int a;
    cin >> a;
    cout<<DecHex(a);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
 
string DecHex(int ch)
{
     using namespace std; // зачем это здесь? Если уж использовать это, то в начале файла.
     string s;
     int d; // можно обойтись без неё.
     char m[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
     while ((ch != 0) && (fmod(ch,16) != 0)) // зачем второе условие?
     {
       d = ch%16; // s = m[ch % 16] + s; и переменная d не нужна.
       ch/=16;
       s = m[d]+s; // см.выше.
     }
     return(s);
}
#include <vcl.h> // зачем тут?
Если убрать эту строку компилятор выдаст 2 ошибки:
Delphi
1
2
[Linker Error] Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES (X86)\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl
[Linker Error] Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES (X86)\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl
Это - Builder, без этой библиотеке в консоли никак.

#include <iostream.h> // правильно так: <iostream>
Если написать просто <iostream> (без .h), то компилятор выдаст ошибку на строке string DecHex(int).
Это - Builder 2002 года.

int i = 1000; // зачем?
Ниже была другая версия.

using namespace std; // зачем это здесь? Если уж использовать это, то в начале файла
Да, согласен он не нужен.(Забыл убрать)

while ((ch != 0) && (fmod(ch,16) != 0)) // зачем второе условие?
Ниже была другая версия. while (ch)
---
d = ch%16; // s = m[ch % 16] + s; и переменная d не нужна.
Полностью согласен, очень хорошее решение.

Добавлено через 2 минуты
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
s += "0123456789ABCDEF"[d];
Отличная мысль и не надо объявлять массив. Внедрю в код.

Добавлено через 22 минуты
Всем спасибо за замечания и предложения.
В итоге получился следующий код:
Ещё предложения и замечания будут?
+проверка на ноль
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
string DecHex(int);
int main(int argc, char* argv[])
{
    int a;
    cin >> a;
    cout<<DecHex(a);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
 
string DecHex(int ch)
{
     if (ch == 0) return("0");
     string s;
     while (ch) //!= 0
     {
       s = "0123456789ABCDEF"[ch%16]+s;
       ch/=16;
     }
     return(s);
}
0
Native x86
Эксперт Hardware
5679 / 3414 / 964
Регистрация: 13.02.2013
Сообщений: 10,832
01.09.2014, 19:28 20
Цитата Сообщение от AndHacker Посмотреть сообщение
Ещё предложения и замечания будут?
C++
1
s = "0123456789ABCDEF"[ch%16]+s;
А в Билдере строки не с 1 индексируются, разве? Этот код работает правильно?
1
01.09.2014, 19:28
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.09.2014, 19:28
Помогаю со студенческими работами здесь

Перевод натурального числа из десятичной системы счисления в систему счисления по основанию
Здравствуйте. Я хотела бы попросить у вас помощи. Я понимаю, что это не очень красиво, но вдруг...

Рекурсия: перевод целого числа из десятичной системы счисления в 9 систему счисления
Написать рекурсивную функцию перевода целого числа из десятичной системы счисления в 9-чную...

Перевод числа из десятичной системы счисления
Помогите пожалуйста решить поставленную задачу с помощью функции пользователя и рекурсивной:Для...

Перевод числа из десятичной системы счисления
Напишите рекурсивную программу перевода числа из десятичной системы счисления в n (n&lt;10).


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетных компьютеров началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
Как определить, содержит ли строка подстроку в JavaScript
InfoMaster 19.01.2025
При разработке веб-приложений часто возникает необходимость выполнять различные операции со строками, среди которых особое место занимает поиск подстрок. JavaScript предоставляет несколько встроенных. . .
Что такое метаклассы в Python
InfoMaster 19.01.2025
Метаклассы в Python представляют собой один из самых мощных и одновременно сложных механизмов языка, позволяющий программистам контролировать процесс создания классов. По своей сути, метакласс. . .
Как удалить свойство из объекта JavaScript
InfoMaster 19.01.2025
В современной веб-разработке объекты JavaScript играют фундаментальную роль в организации и структурировании данных. Они представляют собой контейнеры, которые хранят связанные данные и. . .
Какая разница между String и string в C#
InfoMaster 19.01.2025
В языке программирования C# существует интересная особенность: для работы со строками можно использовать как String, так и string. Эта двойственность часто вызывает вопросы у разработчиков, особенно. . .
Как в Git откатить репозиторий к предыдущему коммиту
InfoMaster 19.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса, предоставляя разработчикам мощные инструменты для управления изменениями в. . .
Как работают замыкания (closure) в JavaScript
InfoMaster 19.01.2025
В мире современной веб-разработки замыкания (closures) представляют собой один из фундаментальных концептов языка JavaScript, который часто вызывает затруднения у начинающих разработчиков, но при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru