Перевод числа из 16 в 10 систему счисления.

Здравствуйте.
Реализовать программу перевода числа из шестнадцатеричной системы счисления в десятичную. Обязательно должна быть проверка символов на соответствие допустимым.Сам не долго программирую , поэтому только набросал отрывки кода, зарание блогадарен.

#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;


int DEC (char* str)
{
    int step = 1;
    int itog = 0;
    char* str2 = str;

    while (*str++ != '\0');
        str--;
    while (str-- != str2)
        if (*str>='0' && *str<='9') {
            itog += (*str-'0') * step;
            step *= 16;
        } else {
            itog+=(*str-'a')*step;
            step *= 16;
        }
    return itog;
}

void main()
{
    const int MAX=80;
    char s[MAX];
    cin.getline(s, MAX, '\n');
    cout << DEC(s) << " (10)";
}

Комментировал код по возможности. Держите.

#include <iostream>
#include <string>

// Возведения целого числа в степень с целым положительным показателем
int pow_(int num, int exp)
{
    // Если показатель степени является нулем
    if (exp == 0) {
        // Любое число в нулевой степени является единицей
        return 1;
    }
    // Если показатель степени положителен
    if (exp > 0) {
        int result = 1;
        // Умножаем число само на себя exp раз
        for (int i = 0; i < exp; ++i) {
            result *= num;
        }
        // Возвращаем результат
        return result;
    }
    // Нам не нужно считать отрицательные степени
    return -1;
}

// Преобразование шестнадцатеричного символа в десятичное число
unsigned int char2int_(char chr)
{
    if (chr >= '0' && chr <= '9')
        return chr - '0';
    else if (chr >= 'A' && chr <= 'F')
        return chr - 'A' + 10;
    else if (chr >= 'a' && chr <= 'f')
        return chr - 'a' + 10; 
    return -1;
}

// Приведение строкового значения шестнадцатеричного
// числа к десятичному виду
int hex2dec_(const char *hex, int size)
{
    // Изначальное десятичное значение
    int dec = 0;
    // Непосредственно преобразование шестнадцатеричного числа
    // в десятичное. Пруфлинк: http://vestikinc.narod.ru/AB/hex_dec_tr.htm
    for (int j = 0, i = size - 1; j < size; ++j, --i) {
        dec += char2int_(hex[j]) * pow_(16, i);
    }
    // Возвращаем десятичное число
    return dec;
}

// Проверка строки на соответствию формата десятичного числа
int is_valid_hex(const char *hex, unsigned int size)
{
    for (int i = 0; i < size; ++i)
        if (!((hex[i] >= '0' && hex[i] <= '9')
               || (hex[i] >= 'a' && hex[i] <= 'z')
               || (hex[i] >= 'A' && hex[i] <= 'z'))
                )
            return 0;
    return 1;
}

int main(int argc, char *argv[])
{
    // Шестнадцатеричное число в виде строки
    std::string hex;

    if (argc == 2) {
        // Программу можно запускать через аргументы командной строки
        // Пруфлинк: http://code-live.ru/post/cpp-command-line-arguments/
        hex = argv[1];
    } else {
        // Если нужные аргументы не были переданы,
        // забираем число из stdin.
        std::cin >> hex;
    }

    // Проверяем число на соответствие шестнадцатеричному формату
    if (!is_valid_hex(hex.c_str(), hex.length())) {
        std::cerr << argv[0] << ": hex number is not valid: " << hex << std::endl;
        return 1;
    }

    // Вызываем функцию преобразования hex2dec.
    // Передаем ей строку типа const char*, а также длину данной строки

    // Дело в том, что sizeof(char) в разных системах и компиляторах
    // может отличаться от единицы. Метод std::string::length() корректно
    // считает длину строки.

    // Проверить корректность вычислений можно на http://numsys.ru/
    int dec = hex2dec_(hex.c_str(), hex.length());

    // Выводим результат в stdout
    std::cout << dec << std::endl;

    // Говорим системе об успешном завершении процесса.
    // Код успешного завершения всегда нуль
    return 0;
}

Угу, спасибо теперь ясно. Просто сложности были сообразить эту часть программы.

// Преобразование шестнадцатеричного символа в   десятичное число
   unsigned int char2int_(char chr)
  {
if (chr >= '0' && chr <= '9')
    return chr - '0';
else if (chr >= 'A' && chr <= 'F')
    return chr - 'A' + 10;
else if (chr >= 'a' && chr <= 'f')
    return chr - 'a' + 10; 
return -1;
 }

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.