【问题标题】:Hexa,octal,binary to Decimal(C++)十六进制、八进制、二进制转十进制(C++)
【发布时间】:2017-03-08 01:16:48
【问题描述】:

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

#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;
    }

感谢您的帮助!

【问题讨论】:

  • 详细说明您的问题。你的测试输入是什么?你的预期输出是什么?实际输出是多少?你能把你所有的代码翻译成英文吗?上下文很重要。无论如何,除了输出之外的任何东西都应该是英文的。也就是说,到目前为止,您尝试过什么来隔离错误?使用调试器?无论如何,一个基本的提示,你应该用函数来划分你的程序。使调试更快。
  • 除了前面的注释:你应该避免使用4855等“神奇”数字,而是使用'0''7'等,这样更清楚。
  • 这是你应该使用调试器的东西。在cin &gt;&gt; x 行之后设置断点,单步执行代码并在每一步检查变量的实际值是否符合您的期望。

标签: c++ decimal


【解决方案1】:

最大的问题是您处理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;

【讨论】:

    【解决方案2】:

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

    • 我们计算从 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;
    }
    

    【讨论】:

    • 太好了!!谢谢老兄!
    猜你喜欢
    • 2015-12-12
    • 2014-10-30
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多