Преобразование десятичной системы счисления в двоичную с использованием только основ

#c

#c

Вопрос:

Мне нужно написать программу, которая преобразует десятичное число между (1.0 — 99.99) в двоичное. Мой учитель сказал, что мы можем использовать ТОЛЬКО то, что мы изучили на уроке, включая циклы, файлы ввода / вывода, строки, if / else, cmath и определяемые пользователем функции. Я начал программировать, как сначала преобразовать целое число в двоичное, прежде чем переходить к десятичной системе счисления. Я могу вычислить двоичное значение, но я выплевываю свой двоичный файл в обратном порядке. Итак, мой учитель сказал отправить остатки (например, битовые значения) в файл и прочитать их как строку. Где я сейчас. Все та же проблема. Как мне распечатать эти значения из строки в обратном порядке? Моя попытка до сих пор:

 #include <iostream>
#include <fstream>
#include <string>

using namespace std;



int main()
{
int number;
int remainder;
string bitValues;
ofstream outFile;
ifstream inFile;

//inFile.open("C:\Users\David\Desktop\BinaryIn.txt"); // pay no mind to this.
outFile.open("C:\Users\David\Desktop\BinaryOut.txt");

cout << "Enter a integer to be converted to binary: ";
cin >> number;

while(number != 0)
{
    remainder = number % 2; 
    outFile << remainder << " "; // I send it to the outFile
    number /= 2;
}
outFile.close(); // I close because I need to read from it now.

inFile.open("C:\Users\David\Desktop\BinaryOut.txt"); //I did this so I can read      from the same outFile

getline(inFile, bitValues); //had to look up getline(), was not covered in class
// I just came up with this idea, is this Valid??????????

    int posisiton = 10;
while(posisiton >= 0)
{
    cout << bitValues[posisiton]; // I ever done something like this but It worked!
    posisiton--;
}


int pause;
cin >> pause;

return 0;
}
 

Комментарии:

1. Вы можете использовать stack? Или просто вектор для эмуляции стека? Использование файла для временного хранения кажется излишним.

2. Я не знаю, что такое стек, что означает «нет». Вектор определенно нет. Он сказал использовать только эти концепции, потому что это то, что мы узнали до сих пор. Я не думаю, что это справедливо на данном этапе нашего обучения. Кажется, для этого требуется гораздо больше, чем то, что мы рассмотрели. И я делаю только целочисленную часть, лол.

3. Ну, есть два способа. Способ № 1: вы можете прочитать файл с конца! Можете ли вы запросить его длину и прочитать последний символ, затем предпоследний символ и т.д.?

4. Способ № 2: вы можете получить свои цифры не от крайнего правого к крайнему левому, а наоборот, в естественном порядке, чтобы вы могли выводить их немедленно. Чтобы сделать это, вы должны ответить на 2 вопроса: (1) как проверить, является ли i-я двоичная цифра в числе 1 или 0? (2) какое максимально возможное количество двоичных цифр в числе? Если вы знаете двоичные операции, такие как amp; или << (для целых чисел, а не для cout ), ответ будет простым.

Ответ №1:

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

Ответ №2:

1) Забудьте файл (я не знаю, как это могло помочь. Возможно, вы неправильно поняли учителя). Просто напишите простую функцию для обратного преобразования строки.

 for(int i=0; i<bitValues.length()/2;   i) {
    char t = bitValues[i];
    bitValues[i] = bitValues[bitValues.length()-1-i];
    bitValues[str.length()-1-i] = t;
}
 

2) Или вместо использования по модулю, используйте флаг, чтобы получить биты по порядку в первый раз. Это не код, потому что он более непосредственно связан с вашей домашней работой, чем простое обращение строки.

 resize the string to be big enough to hold all the bits
set a mask to have a 1 in the 31st position
for each position in the string
    use `amp;` with the mask to find if it's a one or zero
    set the character depending on the bit
    shift the mask right one.
 

Комментарии:

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

2. Да, я удалил код из второй половины сразу после публикации. Первая половина — это постоянно используемый общий / общий бит, который напрямую не связан с его назначением. Я могу удалить код там тоже, если люди думают, что это слишком много.

3. Только что сохраненное обозначение нижнего индекса для строки заставило меня произвести правильный вывод.

4. Неважно, он дал мне это только для числа 43. Не для других.

5. int posisiton = 10; должно быть int position = bitValues.size()-1;