私は今経験しているような問題を何時間も探していますが、何も見つけられず、また何も見つかりません。ここや他のウェブサイトにはありません。申し訳ありませんC++ Do - 条件が満たされても無限ループ中(理由を理解できない)
#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で、私は小数部分を削除することをやっている)プログラム店。
- それ記憶「ParteDecimale」内側「ヌメロ-ParteIntera」(ヌメロ私は初めに入力された入力である)、この時点で「ParteDecimale」は0.2に等しいです。
- "ParteDecimale"の値は "Controllo2"の内部に格納されます。
- これは基本的に "ParteDecimale * 2"を実行するDo-Whileループを開始するので、 "0.4"です。
- ParteDecimaleが1より大きいか小さいかをチェックし、これに基づいてif文内でistructionsを実行します。
- ifステートメントから取得された "ParteDecimale"の値は、 "Controllo"(この場合は0.4)に格納されます。
- この場合、 "Controllo"と "Controllo2"はまだ異なるので、ループが開始されます。
特定の時点でParteDecimaleは0.6になるため、ParteDecimaleが起動するとParteDecimaleは1.2(0.6 * 2)になります。 1より大きいため、else文が実行され、ParteDecimaleは0.2(1.2-1)になります。この時点で、 "Controllo"と "Controllo2"は両方とも0.2であるため、do-while内の条件はもはや満たされず、ループは終了するはずです。
BUT
なぜ、終わらないのかわかりません。コードを実行すると、すぐにループ内のどこかをクリックしてループを一時停止する必要があります)、すべてのステップが正しいと思われます。おそらく、愚かな間違いや見えないものですが、もはや私の頭を叩く場所を知りません。
この非常に長い記事をお読みいただきありがとうございました。ご協力いただきありがとうございました。私の悪い英語を申し訳ありません。
このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –
'==' 2つの浮動小数点値を決して比較しないでください。それらのn番目の小数はおそらく異なるでしょう。そのようなことにイプシロンデルタを使うようにしてください。 – Ceros