Я искал часы, похожие на ту, что я сейчас испытываю, но я ничего не могу найти, ни здесь и на других сайтах.C++ Do-While бесконечный цикл, даже если условие выполнено (не могу понять, почему)
#include <iostream>
using namespace std;
int main()
{
double Numero=0, ParteDecimale=0, Controllo=0, Controllo2=0;
int ParteIntera=0;
string Var1="1", Var0="0", NumeroFinale;
cout<<"\n\n\tBenvenuto, questo programma ti consente di convertire la parte\n"
"\tdecimale di un numero in sistema binario. Per iniziare, inserisci un numero: ";
cin>>Numero;
cout<<Numero<<" Numero\n\n"<<endl; //
ParteIntera=Numero; //casting implicito, in modo da poter isolare esclusivamente la parte decimale del numero inserito.
cout<<ParteIntera<<" ParteIntera\n\n"<<endl; //
ParteDecimale=Numero-ParteIntera; //Isolamento della parte decimale
cout<<ParteDecimale<<" ParteDecimale\n\n"<<endl; //
Controllo2=ParteDecimale;
do{
ParteDecimale=ParteDecimale*2; //Moltiplicazione della parte decimale per due
cout<<"\n\nParteDecimaleCiclo "<<ParteDecimale<<endl; //
if(ParteDecimale<1){
NumeroFinale=NumeroFinale+Var0;
cout<<"\n\nNumeroFinaleMin1 "<<NumeroFinale<<endl; //
}
else{
NumeroFinale=NumeroFinale+Var1;
cout<<NumeroFinale<<" NumeroFinaleMagg1\n\n"<<endl; //
ParteDecimale-=1;
cout<<ParteDecimale<<" ParteDecimaleMagg1\n\n"<<endl;
}
Controllo=ParteDecimale;
cout<< "\n\nCONTROLLO " <<Controllo; //
cout<<"\n\nNUMERO "<<Numero; //
}
while(Controllo!=Controllo2);
cout<<NumeroFinale<<endl;
}
К сожалению, если код грязный, но когда я увидел, что он не работает, как ожидалось, я решил вывести каждое значение, чтобы следовать наряду с процессом, и это странно .. код действует точно так же, как ожидается, и результаты все в порядке, он просто отказывается выйти из цикла do-while, даже если условие выполнено.
Например:
-I вход «12,2», магазин программа номер в переменной «ParteIntera» (который является INT, я делаю, что для удаления дробной части);
-Он хранит «Numero-ParteIntera» внутри «ParteDecimale» (Numero - это ввод, введенный мной в начале), и в этот момент «ParteDecimale» равен 0,2;
-Значение «ParteDecimale» хранится внутри «Controllo2»;
-Начинается цикл Do-While, который в основном выполняет «ParteDecimale * 2», поэтому это «0,4»;
-It проверяет, является ли ParteDecimale больше или меньше 1, и на основании этого он выполняет инструкции внутри операторов if;
-Значение «ParteDecimale», которое получается из оператора if, затем сохраняется внутри «Controllo» (в этом случае оно равно 0,4);
Состояние проверено, в этом случае «Controllo» и «Controllo2» все еще отличаются, поэтому цикл начинается;
В определенный момент ParteDecimale будет равен 0,6, поэтому при запуске цикла ParteDecimale станет 1.2 (0.6 * 2). Поскольку он больше 1, выполняется инструкция else, а ParteDecimale - 0.2 (1.2-1). На данный момент «Controllo» и «Controllo2» равны 0,2, поэтому условие внутри do-while больше не выполняется, и цикл должен заканчиваться.
НО
Я не могу понять, почему это не заканчивается. Если вы запустите код, который вы увидите (вы должны быстро нажать где-нибудь внутри CMD, чтобы временно остановить цикл), что все шаги правильные, возможно, это глупая ошибка или что-то, что я не вижу, но сейчас я не знаю, Я знаю, где больше ударить головой.
Спасибо за прочтение этого очень длинного сообщения, любая помощь приветствуется, и извините за мой плохой английский!
Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –
Никогда не сравнивайте '==' два значения с плавающей запятой. Их n-й десятичный знак, вероятно, будет отличаться. Попытайтесь использовать дельта эпсилона для такой вещи. – Ceros