Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод числа в десятичную систему 
V
    Опции темы
JAYBE
Дата 10.1.2013, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Добрый день!
Есть задача: "Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное двоичное число в десятичное".

Помогите, пожалуйста, решить.

Мой тупиковый вариант:
Код

#include <iostream>

int main() {
    using namespace std;
    string number ="";
    int n;
    cout << "Vvedite chislo:";
    char buffer[8];
    cin.read(buffer, 3);
    cout << buffer;
    /*
    cin >> number;
    cout << number.length();
    if (number.length()>8) {
        cout << "Neverno\n";
    }
    */
    return 0;
}

Правилен ли подход или нет? Сам очень novice в С++...
PM   Вверх
bsa
Дата 10.1.2013, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



JAYBE, используй std::string и std::getline для чтения числа в строку.
Затем сделай проверки (например, что число не содержит ничего, кроме 0 и 1, и имеет длину не более 8 разрядов). Затем начиная с начала выполняй левый сдвиг целочисленной переменной (изначально она должна быть нулевой) и, если в текущей позиции в строке находится 1, делай установку нулевого бита:
Код
unsigned a = 0;
for(std::string::iterator i = str.begin(), e = str.end(); i != e; ++i) {
   a <<= 1;
   if (*i == '1')
      a |= 1;
}

PM   Вверх
borisbn
Дата 10.1.2013, 10:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(JAYBE @  10.1.2013,  10:10 Найти цитируемый пост)
Правилен ли подход или нет?

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

#include <iostream>

using namespace std;

int main() {
    string s;
    cout << "Enter 8 binary digits: ";
    cin >> s;
    if ( s.length() != 8 ) {
       cout << "I told you EIGHT digits" << endl;
       return 1;
    }
    int num = 0;
    for ( int i = 0; i < 8; i++ ) {
        if ( s[ i ] != '0' && s[ i ] != '1' ) {
            cout << "I told you eight BINARY digits" << endl;
            return 2;
        }
        num |= ( s[ i ] - '0' ) << ( 7 - i );
    }
    cout << endl << "Result is: " << num << endl;
    return 0;
}

http://liveworkspace.org/code/3c6xjC$0


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
JAYBE
Дата 10.1.2013, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



borisbn, спасибо. Воспользовался.

Все предельно ясно кроме этой строчки:
Код

num |= ( s[ i ] - '0' ) << ( 7 - i );


Что здесь происходит?
PM   Вверх
borisbn
Дата 10.1.2013, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(JAYBE @  10.1.2013,  13:33 Найти цитируемый пост)
Что здесь происходит? 

Цитата
s[ i ] - '0'

если от символа '0' отнять '0', получится число 0. если от символа '1' отнять '0', получится число 1.
Цитата
( s[ i ] - '0' ) << ( 7 - i )

полученное число (0 или 1) сдвигаем влево на 7 - i бит.
Цитата
num |= ...

делаем побитовое ИЛИ num и результата сдвига 0-ля или 1-цы.
возьмём строку из моего примера
Цитата
00101010

и посмотрим на каждом шаге цикла, что будет происходить со всеми переменными.

а для вывода лучше использовать двоичный вид:
Код

char* itoa( int val, int base ) {
    static char buf[ 32 ] = { 0 };
    int i = 8;
    for(; val && i ; --i, val /= base)
    
        buf[i] = "0123456789abcdef"[val % base];
    return & buf[i + 1];
}

std::string i_to_bin( int val ) {
    std::string res = itoa( val, 2 );
    while ( res.length() < 8 ) {
        res = "0" + res;
    }
    return res;
}


использование:
Код
cout << i_to_bin( что-то );


Это сообщение отредактировал(а) borisbn - 10.1.2013, 16:54


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 10.1.2013, 13:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



borisbn, вот зачем ты дал полностью готовый ответ?
PM   Вверх
borisbn
Дата 10.1.2013, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



bsa, согласен. подправил


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
JAYBE
Дата 11.1.2013, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Все понятно, спасибо за разъяснения. Вопрос решён.  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.