2017-03-07 236 views
1

我正在尝试开发一个关于转换的程序。该程序应该将二进制,八进制和十六进制数字转换为十进制数。这个程序包含一些错误,因为十进制数是错误的。任何人都可以帮助我吗? 这里是代码:十六进制,八进制,二进制到十进制(C++)

#include <conio.h> 
#include <iostream> 
#include <windows.h> 
#include <stdlib.h> 
#include <math.h> 

using namespace std; 

int Decimal,Lenght,Pos_bit,x,base,i,n; 
//Pos_bit=Exponent 

char c[9]; 
int main() 
{ 
    Decimale=0; 
    Pos_bit=0; 
    n=0; 
    cout<<"Select a conversion method"<<endl; 
    cout << endl << endl; 
    cout << "1)Binary-Decimal" << endl; 
    cout << "2)Octal-Decimal" << endl; 
    cout << "3)Hexa-Decimal" << endl; 
    cin >> x; 
    switch (x) 
    { 
      case (1): 
      base=2; 
      break; 
      case (2): 
      base=8; 
      break; 
      case (3): 
      base=16; 
      } 
    cout<<"How many digits has the number?"<<endl; 
    cin>>Lenght; 
    Pos_bit=Lenght; 
    for(i=0;i<Lenght;i++,Pos_bit--) 
    { 
    cout<<"Type-bit value"<<endl; 
    cin>>c; 
    if(base==2){ 
     if(c[i]==48){ 
     n=0;} 
    else if(c[i]==49){ 
     n=1;} 
    Decimal=Decimal+n*(pow(2,Pos_bit)); 
    } 
    else if(base==8){ 
    if ((c[i]>=48)&&(c[i]<=55)){  
    n=c[i]-48;} 
    Decimal=Decimal+n*(pow(8,Pos_bit)); 
    } 
    else if(base==16){ 
     if((c[i]>=48 && c[i]<=57)){ 
     n=c[i]-48;} 
    else if((c[i]>=65)&&(c[i]<=70)){ 
     n=c[i]-55;} 
    else if((c[i]>=97)&&(c[i]<=102)){ 
     n=c[i]-87;} 
    Decimal=Decimal+n*pow(16,Pos_bit); 
    } 
    } 

    cout<<"Decimal number is"<<Decimal<<endl; 
    getch(); 
    system("cls"); 
    return 0; 
    } 

感谢您的帮助!

+1

详细说明你的问题。你的测试输入是什么?你的预期产出是多少?实际产出是多少?你能把你所有的代码翻译成英文吗?情境很重要。而任何东西,但输出应该是英文无论如何。也就是说,你到目前为止尝试隔离错误的方法是什么?使用调试器?任何情况下的基本提示,你都应该通过使用函数真正划分你的程序。使调试方式更快。 – Aziuth

+0

除了以前的评论:你应该避免使用“48”或“55”等“魔术”数字,而应该使用“0”和“7”等,这更清晰。 –

+0

这是你应该使用调试器的东西。在'cin >> x'行后面设置一个断点,单步执行代码并在每一步中检查变量的实际值是否符合您的期望值。 – zett42

回答

0

最大的问题是你处理Pos_bit的方式。你有一个错误。

比方说,我想从二进制转换11。 Lungh_num因此Pos_bit在2开始了你的第一个数字计算将是

Decimale=Decimale + 1 * (pow(2, 2)); 

这个问题的答案是4。您的最终答案是6.循环之前,设置

Pos_bit = Lungh_num - 1; 

其实,最好的事情是完全忘掉pow()的东西。取而代之的

Decimale=Decimale+n*pow(16,Pos_bit); 

Decimale = Decimale * base + n; 
0

如果我们不关心输入清理和幻数等编码标准问题,你的主要错误是:

  • 我们指望位数字从0到n-1,所以这一行应该是:Pos_bit = Lungh_num - 1;
  • 在任何你使用的地方c[i]哟你应该用c[0]替换它。如果我没有弄错,你只关心输入中的第一个字符。

你纠正的代码应该是这样的:

#include <conio.h> 
#include <iostream> 
#include <windows.h> 
#include <stdlib.h> 
#include <math.h> 

using namespace std; 

int Decimale, Lungh_num, Pos_bit, x, base, i, n; 
//lungh_num=n lenght; 
//Pos_bit=Exponent 

char c[9]; 
int main() 
{ 
    Decimale = 0; 
    Pos_bit = 0; 
    n = 0; 
    cout << "Scegli un metodo di conversione" << endl; 
    cout << endl << endl; 
    cout << "1)Binario-Decimale" << endl; 
    cout << "2)Ottale-Decimale" << endl; 
    cout << "3)Esadecimale-Decimale" << endl; 
    cin >> x; 
    switch (x) 
    { 
    case (1): 
     base = 2; 
     break; 
    case (2): 
     base = 8; 
     break; 
    case (3): 
     base = 16; 
    } 
    cout << "Quante cifre ha il numero?" << endl; 
    cin >> Lungh_num; 
    Pos_bit = Lungh_num - 1; 
    for (i = 0; i < Lungh_num; i++, Pos_bit--) 
    { 
     cout << "Digita valore bit" << endl; 
     cin >> c; 
     if (base == 2) { 
      if (c[0] == 48) { 
      n = 0; 
     } 
     else if (c[0] == 49) { 
      n = 1; 
     } 
     Decimale = Decimale + n*(pow(2, Pos_bit)); 
     } 
     else if (base == 8) { 
      if ((c[0] >= 48) && (c[0] <= 55)) { 
       n = c[0] - 48; 
      } 
      Decimale = Decimale + n*(pow(8, Pos_bit)); 
     } 
     else if (base == 16) { 
      if ((c[0] >= 48 && c[0] <= 57)) { 
       n = c[0] - 48; 
      } 
      else if ((c[0] >= 65) && (c[0] <= 70)) { 
       n = c[0] - 55; 
      } 
      else if ((c[0] >= 97) && (c[0] <= 102)) { 
       n = c[0] - 87; 
      } 
      Decimale = Decimale + n*pow(16, Pos_bit); 
     } 
    } 

    cout << "Il numero decimale e'" << Decimale << endl; 
    getch(); 
    system("cls"); 
    return 0; 
} 
+0

非常棒!谢谢你! – KingRoy