2017-01-21 13 views
0

私はC++の割り当てを友人に手伝っています。いくつかの不可解な理由私は3と5桁の小数を入力して、私は適切な番号を取得していますベース10を選んだ-1たびのためにベースコンバータ機能の問題

#include <iostream> 
#include <cmath> 
using namespace std; 

int strToInt(string num, unsigned base){ 
    int result = 0; 
    for (int i=0; i<num.length(); i++) { 
     if (num[i]>='0' && num[i]<='9') 
      result += (num[i]-'0')*pow(base,num.length()-i-1); 
     else if (num[i]>='A' && num[i]<='F') 
      result += (num[i]-'A'+10)*pow(base,num.length()-i-1); 
     else if (num[i]>='a' && num[i]<='f') 
      result += (num[i]-'a'+10)*pow(base,num.length()-i-1); 
    } 
    return result; 
} 

int main() 
{ 
    string number; 
    int base; 
    while(number.compare("exit")!=0){ 
     cin>>number; 
     cin>>base; 
     cout<<strToInt(number,base)<<"\n\n"; 
    } 
    return 0; 
} 

:folowingベースコンバータ機能との問題があります。

など。

100 
10 
99 

10000 
10 
9999 

私は、最後の5~6時間、この機能の上に行くとデバッグコードのすべての種類を追加することが、私の利益のために私は地獄が間違っているかを把握することはできませんしてきました。

コードスタイルの備考も非常に高く評価されています。

乾杯

+0

@livedeveloperの良い点です。はるかに読みやすい。 しかし、私は==とcompare()の間に違いは見当たりません。 戻り値をテストすることはどういう意味ですか?検証?これはタスクの要件ではありません。 フィードバックいただきありがとうございます。 –

+0

デバッガでコードをステップ実行しようとしましたか?デバッガは、**コードが正しく動作しないときに使用する**ツールです。 –

+1

私は再現できません。あなたの入力と私は100-10-100と10000-10-10000を得る –

答えて

2

std::pow浮動小数点演算を行います。おそらくどこかで丸め誤差が発生しています。値を累積する通常の方法は、毎回掛け算してループに追加することです。

result *= base; 
result += ch - '0'; 
+0

はい、はるかにエレガントなソリューション、ありがとう! –