powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно привести тип в функции конвертации системы исчисления
36 сообщений из 36, показаны все 2 страниц
Как правильно привести тип в функции конвертации системы исчисления
    #38560567
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
#include <iostream>
#include <string.h>
#include <math.h>

using namespace std;

int hexdec (char * hex) {
 int k=strlen(hex);
 int i;
 int res=0;
 for (i=2; i<k;i++) {
  if (hex[i]=='F') res+=15*pow(16,k-i-1);
  else if (hex[i]=='E') res+=14*pow(16,k-i-1);
  else if (hex[i]=='D') res+=13*pow(16,k-i-1);
  else if (hex[i]=='C') res+=12*pow(16,k-i-1);
  else if (hex[i]=='B') res+=11*pow(16,k-i-1);
  else if (hex[i]=='A') res+=10*pow(16,k-i-1);
  else res+=(int*)hex[i]*pow(16,k-i-1);
}
return res;}

int main()
{
 cout << hexdec("0xF1")<< endl;
 return 0;
}



else res+=(int*)hex[i]*pow(16,k-i-1);--что то эта строка не работает.
Или не так привожу типы или else надо как то иначе употребить.
С буквами в шестнадцятиричном виде работает на отлично-например-0хFFFF

Модератор: Используйте тег SRC для оформления исходника
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560568
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В (int*)hex[i]*pow(16,k-i-1);---(int*)--эта часть лишняя просто разные варианты испытывал
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560571
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int hexdec (char * hex) {
int k=strlen(hex);
int i;
int res=0;
for (i=2;i<k;i++) {if (hex[i]=='F') res+=15*pow(16,k-i-1);
else if (hex[i]=='E') res+=14*pow(16,k-i-1);
else if (hex[i]=='D') res+=13*pow(16,k-i-1);
else if (hex[i]=='C') res+=12*pow(16,k-i-1);
else if (hex[i]=='B') res+=11*pow(16,k-i-1);
else if (hex[i]=='A') res+=10*pow(16,k-i-1);
else if (hex[i]>=0 && hex[i]<=9) res+=hex[i]*pow(16,k-i-1);// не читает цыфры числа только буквы-то есть что то с приведением типов
}
return res;}

int main()
{
cout << hexdec("0x1F")<< endl;
return 0;
}
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560575
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int hexdec (char * hex)
{
    int k=strlen(hex);
    int res=0;
    int koeff=1;

    for(int i=k-1; i>1; i--)
    {
        if (hex[i]>'9') res+=(hex[i]-'A'+10)*koeff;
        else res+=(hex[i]-'0')*koeff;

        koeff*=16;
    }
    return res;
}
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560724
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla,

Слева направо намного проще, понятнее и быстрее :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int hexdec (char * hex)
{
    int res=0;
    for (; *hex; hex++)
    {
        res <<= 4;
        if (*hex > '9')
            res += *hex - 'A' + 10;
        else
            res += *hex - '0';
    }
    return res;
}
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560896
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там речь идет о элементах масива чар. Что достаточно будет hех[i]-'0'. Это не одиночный символ. Потом там коэф.=1 и 16. Там кроме того не одна буква А а А..F. Кроме того важена степень с
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560902
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,

Стесняюсь спросить. Русский ваш не родной язык? Сложно понять о чем вы пытаетесь спросить. Может как-то на пальцах?
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560906
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,

Правильно.
Вот это может не сработать:
Код: plaintext
1.
return v;



Для надежности надо писать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
if (v == 1)
  return 1;
else if (v == 2)
  return 2;
else if (v == 3)
  return 3;
else if (v == 4)
  return 4;
else if (v == 5)
  return 5;
else if (v == 6)
  return 6;
else if (v == 7)
  return 7;
...  
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560930
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСлева направо намного проще, понятнее и быстрее :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int hexdec (char * hex)
{
    int res=0;
    for (; *hex; hex++)
    {
        res <<= 4;
        if (*hex > '9')
            res += *hex - 'A' + 10;
        else
            res += *hex - '0';
    }
    return res;
}


Не возьмет 0x
stut
Код: plaintext
1.
cout << hexdec("0xF1")<< endl;



stut, предлагаю самому понять как работает алгоритм Anatoly Moskovsky
Немного подскажу:
1. Считается так 3B97 = (((3 * 16 + 11) * 16 + 9) *16 + 7
2. res <<= 4; это умножить на 16
3. сам допили чтоб 0x не обрабатывалось
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560933
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyДля надежности надо писать так:


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

Код: plaintext
1.
2.
3.
do {
   x = a;
} while ( x != a);
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560982
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе возьмет 0x
По большому счету должен быть еще один уровень вызова, который по префиксу определяет что вызвать: hexdec, octdec, decdec.... и выдавать ошибку если префикс неверный.
Иначе что слева что справа парсить строку - все равно будет всякий мусор неверно интерпретировать.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38561106
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Все фигня,
Код: plaintext
1.
2.
3.
int hexdec (char * hex) {
  return strtol(hex,NULL,16);
}
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38561135
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
stutelse if (hex[i]>=0 && hex[i]<=9) res+=hex[i]*pow(16,k-i-1);// не читает цыфры числа только буквы-то есть что то с
Ты чё, так нельзя... '0' на самом деле равен сорока восьми, а '9' - пятидесяти семи... :)
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38561142
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
?Ты чё, так нельзя... '0' на самом деле равен сорока восьми, а '9' - пятидесяти семи... :)Причем самое смешное, что это вовсе не шутка...
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38561222
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Символ ноль '0' имеет шестнадцатиричный код 0x30 в кодировке ASCII или 48 в десятичной системе.
Этим можно пользоваться. Но для символов старше 0x7f это опасно т.к. мы уходим в национальные
кодировки которые могут на экране выглядеть одниаково но иметь разные коды (прим: 1251,koi-8,cp866).
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562408
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да проблема уже давно решилась. res+=hex[i]*pow..надо заменить на hex[i]-'0' и все работает. Что то даже очень просто.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562426
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее хекс-итэ надо заменить, а перед пов поставить 16. А я то думал почему там такие большие числа получаются а '2' считалось 50, например. Очень хорошая прога получилась. Может надо тему переименовать: как перевести число из 16 в 10-чную систему исчисления.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562516
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutМожет надо тему переименовать: как перевести число из 16 в 10-чную систему исчисления.
Лучше назвать "как не надо переводить" :)
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562832
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, в смысле, а что не работает? Или это принцип такой. Я бы здесь не публиковал и не старался сделать свою если бы в нете была готовая. И работающая.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562865
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutв смысле, а что не работает?
вызов pow() в конверторе счисления - это пример того как не надо делать.
Даже если "работает" :)
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562960
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,

тебе же уже указали на strtok - она делает ровно то, что ты хотел. почему этот вариант не использовал?
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562993
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широковstrtok
strtol
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38563241
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strlok-не использовал эту команду никогда. И при чем она здесь. Я вот что хотел узнать что значит цикл. Первые два параметра: for (;*ptr;++ptr)-то есть пока есть указатель на строку. Ну а начальный параметр, где цикл начинается?
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38563304
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut где цикл начинается?
где-то выше по коду
Код: plaintext
1.
ptr = ...


В примере передается в параметрах
Anatoly Moskovsky
Код: plaintext
1.
2.
3.
4.
5.
int hexdec (char * hex)
{
    int res=0;
    for (; *hex; hex++)
...
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38563310
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut for (;*ptr;++ptr)-то есть пока есть указатель на строку.
т.е. пока *ptr != 0
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38563402
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,

ты решил написать свою функцию, поскольку не знал о существовании СТАНДАРТНОЙ функции strtol. это понятно. теперь тебе говорят, что есть стандартная функция

http://www.cplusplus.com/reference/cstdlib/strtol/

и ты спрашиваешь при чем здесь она?

конечно же не причем, но все же на будущее надо использовать стандартные средства и уже после использоваться "колхоз", если только ты не ставишь своей целью обучение.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38565409
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот вопрос в тему: как написать функцию atoi перевода строчного числа в int? Если отнимать '0' то понятно. А если без этого. В нете есть один пример таких функции только там реверс идет? Для чего?
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38565412
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutвот вопрос в тему: как написать функцию atoi перевода строчного числа в int? Если отнимать '0' то понятно. А если без этого. В нете есть один пример таких функции только там реверс идет? Для чего?
Любая функция в итоге сведется к тому что надо отнимать '0'.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38568025
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://stackoverflow.com/questions/5710091/how-does-atoi-function-in-c-work--здесь вот другой пример. Но я так понимаю что надо найти первую цыфру или знак (минус). Потом если минус-то занести в переменную сайн. Потом заносить цыфры в масив целых чисел. Если после конца встречается пробел то закончить формирование масива. А потом масив цыфр определя его длину уже превратить в десятичное число. Это мое понимание создание собственной итои-функции без использование указателей? Не знаю насколько это эфективно-ибо наверное надо выделять динамическую память?
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38568038
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutнаверное надо выделять динамическую память?
тут надо дополнительный поток создать, выполнять в нем это преобразование и через мьютекс проверять окончание расчета. Шутка.

Там тоже самый алгоритм что и выше перевод из 16ричной, только вначале дополнительно добавлена проверка знака + или -
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38568058
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutвот вопрос в тему: как написать функцию atoi перевода строчного числа в int? Если отнимать '0' то понятно. А если без этого. В нете есть один пример таких функции только там реверс идет? Для чего?
Вот мы в школе на уроках информатики первой темой изучали
преобразования систем счисления. Алгоритм стандартый.
Без вариантов.

Что ты хочешь получить от atoi - непонятно.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38568159
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да было у меня такое задание для написание собственной атои-функции--только это не задание на школьном уроке, и даже на универс. занятие. Конечно ничего сложного. Но если использовать стандартную функцию что переводит масив символов в целое долгое то вообще будет просто. Но когда всречаешся впервую с этим не знаеш к чему это.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38568234
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut http://stackoverflow.com/questions/5710091/how-does-atoi-function-in-c-work--здесь вот другой пример. Но я так понимаю что надо найти первую цыфру или знак (минус). Потом если минус-то занести в переменную сайн. Потом заносить цыфры в масив целых чисел. Если после конца встречается пробел то закончить формирование масива. А потом масив цыфр определя его длину уже превратить в десятичное число. Это мое понимание создание собственной итои-функции без использование указателей? Не знаю насколько это эфективно-ибо наверное надо выделять динамическую память?
Где ты там увидел выделение динамической памяти? Тебе на вход пришёл указатель на строку.
Память уже до тебя выделена. Ты должен вернуть атомарный тип. short, int, long e.t.c.
Это всё - работа со стеком. Никаких операций malloc, new не требуется.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38568270
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutНо когда всречаешся впервую с этим не знаеш к чему это.
Надо учиться отлаживать код. Непонимаешь как работает - навтыкай вывод на экран и смотри пошагово что происходит.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int hexdec (char * hex)
{
    int res=0;
    printf("res=%d\n", res);
    for (; *hex; hex++)
    {
       printf("hex = %s *hex=%d\n", hex, *hex);
        res <<= 4;
       printf("res=%d\n", res);
        if (*hex > '9')
            res += *hex - 'A' + 10;
        else
            res += *hex - '0';
       printf("res=%d\n", res);
    }
    printf("hex = %s *hex=%d\n", hex, *hex);
    printf("res=%d\n", res);
    return res;
}


Сначала так, потом пользоваться отладчиком научишься.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38568290
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСначала так, потом пользоваться отладчиком научишься.Я бы сказал наоборот.
Сначала то можно и с отладчиком баловаться, а на серьезных проектах отладочный вывод - единственно возможная вещь. Так что если научиться вести логи с младенчества - много потом себе нервов сохранишь и времени выиграешь.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38568656
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня чаще были ситуации когда не было возможности вообще использовать отладчик.
Нужно было разбираться в коде, которые писал не я и не было исходников. Имеешь
чёрный ящик. И думаешь. Медитируешь как оно внутри. Иногда (Oracle/PLSQL) тебе
не дают привелегий (grant debug) на сервере. Тоже приходися изворачиваться.
STDOUT там тоже нет. Выводишь в таблицы. Потом анализ. Иногда задача еще сложнее.
Перформанс. Тоже нет возможности профилятор включать. Нет привилегий. Создаю
систему кумулятивных счётчиков-переменных которые просто считают входы-выходы
в code-blocks. Потом анализ. Иногда это вообще единственный способ детектировать
факт оверхеда (функция в предложении WHERE....). И бох ее знает сколько раз
она должна дёрнуться. По логике - десяток раз. По факту (так оптимизатор решил)
- миллионы раз.

Вобщем дебаггер, ребята - это самые комфортные и тепличные условия. Пользуйтесь
дебаггером пока есть возможность. Пока не наступила война....
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно привести тип в функции конвертации системы исчисления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]