【问题标题】:Convert decimal to any base (using switch statement for base>=10)将十进制转换为任何基数(对基数>=10 使用 switch 语句)
【发布时间】:2021-12-30 15:18:57
【问题描述】:

我正在尝试使用 switch 语句来转换十进制数 放入一个基数(大于 9)并将余数保存到一个数组中, 但是,我没有得到想要的结果,因为看起来我弄乱了 switch 语句。 示例:200(10) = 678(16)

#include <iostream>

using namespace std;

int main(){

    int x,y,yCopy,q,r,cnt=0;
        cout << "Select a base for your number from 2 to 16 : ";
        cin >> x;
        cout << "Enter a decimal number in order to transform it to the selected base : " << endl;
        cin >> y;
            yCopy=y;

    do{
        yCopy=yCopy/x;
        cnt++;
    }while(yCopy!=0);
        yCopy=y;

        int result[cnt];

    if(x>1 && x<10){
        for(int i=cnt-1; i>=0;--i){
            r=yCopy%x;
            result[i]=r;
            yCopy=yCopy/x;
        }

        cout << y << "(10) = ";
        for(int i=0;i<cnt;++i){
            cout << result[i];
        }
        cout << "(" << x <<  ")" << endl;
    }

    if(x>9 && x<17){
        for(int i=cnt-1; i>=0;--i){
            r=yCopy%x;
            switch(r){
            case 10 : r='A'; break;
            case 11 : r='B'; break;
            case 12 : r='C'; break;
            case 13 : r='D'; break;
            case 14 : r='E'; break;
            case 15 : r='F';
            }
            result[i]=r;
            yCopy=yCopy/x;
        }

        cout << y << "(10) = ";
        for(int i=0;i<cnt;++i){
            cout << result[i];
        }
        cout << "(" << x << ")" << endl;
    }

return 0;
}

【问题讨论】:

  • 不相关:x 对于表示基数的变量来说是一个非常糟糕的名称。为什么不称它为base 并减少代码读者所需的认知负担? y 也有类似的问题。
  • q 也是一个非常糟糕的变量名。如果该变量从未被使用过,您甚至都不会注意到。
  • 也不相关,我认为每个案例都需要一个break语句,包括“case:15”。还同意您应该大大改进您的命名约定,尝试使用驼峰或下划线,然后使用 1-3 个单词来描述该变量
  • 提示:字符C的ASCII码是67。
  • int 表示"integer"。您的程序只打印整数变量。你不应该期望任何整数是C

标签: c++ hex decimal converters


【解决方案1】:

谢谢大家的澄清! 正如你们中的一些人提到的,我在这里错误地使用了数据类型。 我已将数组更改为 char(对于 bases>=10), 为 nums 0-9 添加了几个案例,并且有效。 非常感谢!

if(base>9 && base<17){
        char remainder;
        char arr[cnt];
        for(int i=cnt-1; i>=0;--i){
            remainder=yCopy%base;
            switch(remainder){
            case 0 : remainder='0'; break;
            case 1 : remainder='1'; break;
            case 2 : remainder='2'; break;
            case 3 : remainder='3'; break;
            case 4 : remainder='4'; break;
            case 5 : remainder='5'; break;
            case 6 : remainder='6'; break;
            case 7 : remainder='7'; break;
            case 8 : remainder='8'; break;
            case 9 : remainder='9'; break;
            case 10 : remainder='A'; break;
            case 11 : remainder='B'; break;
            case 12 : remainder='C'; break;
            case 13 : remainder='D'; break;
            case 14 : remainder='E'; break;
            case 15 : remainder='F';
            }
            arr[i]=remainder;
            yCopy=yCopy/base;
        }

        cout << y << "(10) = ";
        for(int i=0;i<cnt;++i){
            cout << arr[i];
        }
        cout << "(" << base <<  ")" << endl;
    }

【讨论】:

  • 危险:char arr[cnt]; 可变长度数组是非标准 C++ 扩展。
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
相关资源
最近更新 更多