Десятичное в двоичное, используя только основы


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

Это мой первый проект на C++ и мне потребовалось некоторое время, чтобы сделать это. Позвольте мне знать, что вы думаете.

#include <iostream>
#include <string>

using namespace std;

string ConvertInt(int value); 
string ConvertDec(double value);
void printBinary1(string str1);
void printBinary2(string str2);

int main()
{   
    double number, decValue;
    int remainder, intValue;
    string binary1, binary2;

    cout << "Enter a deciaml value to be converted to binary. Then press ENTER: ";
    cin >> number;

    intValue = (int)number;         
    decValue = number - intValue;       

    binary1 = ConvertInt(intValue);         

    binary2 = ConvertDec(decValue);             

    printBinary1(binary1);                          

    cout << ".";

    printBinary2(binary2);                                  

    int pause;
    cin >> pause;

    return 0;
}   

string ConvertInt(int value)
{   
    int remainder;
    string binary;

    while(value != 0)
    {
        remainder = value % 2;              
        binary += remainder;                        
        value /= 2;
    }

    return binary;

}   

string ConvertDec(double value)
{   
    string binary;
    int integer;
    double decimal;

    for(int i = 1; i <= 5; i++)
    {
        integer = (int)value;
        binary += integer;
        decimal = value - integer;
        value = decimal * 2;
    }

    return binary;
}

void printBinary1(string str1)
{
    string binary1 = str1;

    for(int i = (binary1.length() - 1); i <= (binary1.length() - 1); i--)
    {
        cout <<  (int)binary1[i];
    }
}

void printBinary2(string str2)
{
    string binary2 = str2;

    for(int index = 1; index < binary2.length(); index++)
    {
        cout << (int)binary2[index];
    }
}


5742
5
задан 23 октября 2011 в 05:10 Источник Поделиться
Комментарии
2 ответа

Это считается плохой практикой (большинство людей), чтобы объявить несколько переменных в строке.

double number, decValue;
int remainder, intValue;
string binary1, binary2;

Хотя это не проблема в некоторых случаях угол, где декларация становится запутанным.

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

Я знаю, что все книги говорят, чтобы использовать:

using namespace std;

Но в долгосрочной перспективе его не очень хорошая идея. Вам, используемый для обозначения вещей, пространство имен СТД::строка, или импорта конкретных битов вы хотите , используя std::строка (даже тогда охвата как можно плотнее (вы не поверите, сколько раз строка была заново)).

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

for(int i = 1; i <= 5; i++)

Думаю около 10 лет эксплуатации на этот код. Код сейчас занимает 5 страниц. Попробуйте найти и обновить все обычаи я. Это будет панель, как я появится в почти любой другой идентификатор во всех комментариях во многих местах и т. д. Так что попробуйте и использовать переменные, которые могут быть легко искали.

В ConvertXXX() функции. Вы экономите целых значений в строку. Это нормально. Но вы после извлечения тех char значения и преобразования в int для печати. Почему бы не преобразовать значения прямо на символы, которые вы хотите напечатать.

string ConvertDec(double value)
{
// STUFF
binary += '0' + integer; // each digit will be the character 0 or 1
// MORE STUFF
}

При печати:

cout <<  (int)binary1[i];

// Can change this too:

cout << binary1[i];

Что еще более важно, вы можете заменить петли:

for(int index = 1; index < binary2.length(); index++)
{
cout << (int)binary2[index];
}

// Can be changed too:

cout << binary2

Глядя на ваши петли:

for(int i = (binary1.length() - 1); i <= (binary1.length() - 1); i--)

Это даже работает?
Кажется, что меня становится все меньше и меньше, потом уходит в минус.

Проще в петлю и убавить в диапазоне:

for(int loop = 0; loop < bianry1.length(); ++lop)
{
std::cout << bianry1[binary1.length() - 1 - loop];
}

Но СТД контейнеры (включая строки) обеспечить итераторы (и что более важно обратные итераторы)

for(std::string::const_reverse_iterator loop = bianry1.rbegin(); loop != binary1.rend(); ++loop)
{
std::cout << *loop;
}

Второй цикл:

for(int index = 1; index < binary2.length(); index++)

Проблема здесь заключается в том, что вы начинаете с 1. массивы/контейнеры почти все пронумерованы от 0 и вы можете получить доступ к элементам 0 -> (Размер() - 1). Так вот вы начинаете в неположенном месте и идти мимо конца строки.

Но как уже упоминалось выше, вы даже не нужно это, как вы можете заменить шлейф.

4
ответ дан 23 октября 2011 в 09:10 Источник Поделиться

Есть некоторые проблемы с кодом:


  • Вы (МИС)с помощью струны, а целыми массивами.

  • Функции в коде созависимых. В ConvertInt функции возвращает строку, которая является непригодным для использования, если вы используете printBinary1 , чтобы отобразить его. То же самое для ConvertDec и printBinary2.

  • В ConvertDec функция выдает результат с неиспользуемым значением (с индексом 0), которая затем следует избегать в printBinary2 функции.

  • Есть баг в printBinary1 , где условие в цикле должно быть я >= 0 , а не я <= (binary1.длина() - 1).

Вы должны либо использовать другой формат для хранения промежуточных данных, или сделать ConvertInt и ConvertDec функции возвращают реальные строки, вы можете просто дисплей без необходимости отдельной функции для этого.

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

4
ответ дан 24 октября 2011 в 07:10 Источник Поделиться