C++ 十六进制、八进制、二进制到十进制(C+;+;)

C++ 十六进制、八进制、二进制到十进制(C+;+;),c++,decimal,C++,Decimal,我正在开发一个关于转换的程序。该程序应将二进制、八进制和十六进制数字转换为十进制。这个程序包含一些错误,因为十进制数是错误的。有人能帮我吗? 代码如下: #include <conio.h> #include <iostream> #include <windows.h> #include <stdlib.h> #include <math.h> using namespace std; int Decimal,Lenght,Pos

我正在开发一个关于转换的程序。该程序应将二进制、八进制和十六进制数字转换为十进制。这个程序包含一些错误,因为十进制数是错误的。有人能帮我吗? 代码如下:

#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;
    }
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
整数十进制,长度,位置位,x,基数,i,n;
//位=指数
charc[9];
int main()
{
分母=0;
位=0;
n=0;

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

假设我想把11从二进制转换成二进制。
Lungh\u num
,因此
Pos\u 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;

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

假设我想把11从二进制转换成二进制。
Lungh\u num
,因此
Pos\u 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到n-1计算位数,因此此行应该是:
    Pos\u bit=Lungh\u 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;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
整数分母,长度,位置位,x,基,i,n;
//lungh_num=n长度;
//位=指数
charc[9];
int main()
{
分母=0;
位=0;
n=0;

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

  • 我们从0到n-1计算位数,因此此行应该是:
    Pos\u bit=Lungh\u 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;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
整数分母,长度,位置位,x,基,i,n;
//lungh_num=n长度;
//位=指数
charc[9];
int main()
{
分母=0;
位=0;
n=0;

不能详细说明你的问题。你的测试输入是什么?你期望的输出是什么?实际的输出是什么?你能把你所有的代码翻译成英语吗?上下文很重要。除了输出之外,任何东西都应该是英语的。也就是说,到目前为止,你有什么尝试来隔离错误?使用了调试器?一个基本的提示在任何情况下,你都应该你真的可以用函数来划分你的程序。这样可以加快调试速度。除了前面的评论:你应该避免“魔法”诸如
48
55
之类的数字,而是使用
'0'
'7'
等,这更清楚。这是您应该使用调试器来完成的事情。在
cin>>x
行后设置断点,单步执行代码,并在每一步检查变量的实际值是否符合您的要求CTactions。详细说明你的问题。你的测试输入是什么?你期望的输出是什么?实际的输出是什么?你能把你所有的代码翻译成英语吗?上下文很重要。除了输出之外,任何东西都应该是英语的。也就是说,到目前为止,你是如何尝试隔离错误的?使用了调试器?在任何情况下都是一个基本的提示,哟你真的应该用函数来划分你的程序。这样可以加快调试速度。除了前面的评论:你应该避免“魔术”诸如
48
55
之类的数字,而是使用
'0'
'7'
等,这更清楚。这是您应该使用调试器来完成的事情。在
cin>>x
行后设置断点,单步执行代码,并在每一步检查变量的实际值是否符合您的要求动作。太好了!!谢谢老兄!太好了!!谢谢老兄!