C(转换器)

时间:2016-11-15 18:00:58

标签: c

           conta = 16;
           oper3 = 0;
           oper = 10;  
           oper2 = 15;
           for(i=0;i<16;i++)
           { 
             esadecimale[i] = 0;
           }
           for(i=0;i<16;i++)
           {
             binario[i] = 0;
           }
           esadecimale[10] = 'A';
           esadecimale[11] = 'B';
           esadecimale[12] = 'C';
           esadecimale[13] = 'D';
           esadecimale[14] = 'E';
           esadecimale[15] = 'F';

           printf("Inserisci il numero esadecimale da convertire (4 inserimenti): ");
           for(i=4;i>0;i--)
           {
             scanf("%s",&esadecimale[i]);
           }

           while(oper3 < 4)
            {
             if(esadecimale[oper3] < 10)
             {
                oper = esadecimale[oper3];
                while(oper > 0)
                 {
                    conta--;
                    oper2 = oper % 2;
                    binario[conta] = oper2;
                    oper = oper / 2;
                }
             }
             else
             {
                while(!(esadecimale[oper3]==esadecimale[oper]))
                {
                   oper++;
                } 
                while(oper > 0)
                {
                    conta--;
                    oper2 = oper % 2;
                    binario[conta] = oper2;
                    oper = oper / 2;
                }

             }
              oper = 10;
              oper3++;
           }
        printf("Il numero esadecimale convertito in binario e': ");
        for(i=0;i<16;i++)
        {
            printf("%i",binario[i]);
        }

此代码应该将十六进制数转换为二进制数。 我尝试使用-for循环而不是&#34;而(oper3&lt; 4)&#34;但它并没有解决问题。

如果我输入F F F F,我得到的输出就像0000 0000 0000 1111 0000 0000 0000 1011如果输入A B C D

我猜它只会转换第二个十六进制字符并且位置错误。

如果可能的话,我想要的解决方案并不需要超出您在此代码中看到的知识,因为练习明确指出只能使用数组,谢谢。< /强>

1 个答案:

答案 0 :(得分:0)

你的代码太复杂而且在某些地方没有任何意义(例如,你有很多代码行来初始化esadecimale然后用scanf()覆盖其中一些代码。你没有做出区分在ASCII数字和整数之间,因此while循环运行时间过长:

oper = esadecimale[oper3]; // contains '1' = 49 = 110001 binary
while(oper > 0) // loops seven times instead of once!

你的&gt; = 10的情况不应该与你的&lt; 10个案例。这是一个解决这些问题的重写:

void esadecimale_a_binario() {

    char esadecimale[4];

    printf("Inserisci il numero esadecimale da convertire (4 inserimenti): ");

    for (int i = 3; i >= 0; i--)
    {
        scanf("%c", &esadecimale[i]);
    }

    int binario[16] = { 0 };
    int conta = 15;
    int oper3 = 0;

    while (oper3 < 4)
    {
        int oper;

        if (esadecimale[oper3] < 10)
        {
            oper = esadecimale[oper3] - '0';
        }
        else
        {
            oper = esadecimale[oper3] - 'A' + 10;
        }

        while (oper > 0)
        {
            int oper2 = oper % 2;
            binario[conta--] = oper2;
            oper /= 2;
        }

        oper3++;
    }

    printf("Il numero esadecimale convertito in binario e': ");

    for (int i = 0; i < 16; i++)
    {
        printf("%i", binario[i]);
    }

    printf("\n");
}

但是,如果您要使用scanf(),请通过它%x输入选项让它为您服务。然后,进行一些奇偶校验测试很简单:

#define CONTA 16

void esadecimale_a_binario() {

    printf("Inserisci il numero esadecimale da convertire (4 inserimenti): ");

    unsigned esadecimale;

    (void) scanf("%4x", &esadecimale);

    printf("Il numero esadecimale convertito in binario e': ");

    int binario[CONTA] = { 0 };

    for (int i = 0; i < CONTA; i++)
    {
        int j = CONTA - i - 1;

        binario[j] = esadecimale % 2;

        esadecimale /= 2;
    }

    for (int i = 0; i < CONTA; i++)
        {
            printf("%i", binario[i]);
        }

    printf("\n");
}

以这种方式使用scanf()也会使十六进制数字不区分大小写。这个子程序可以更简单(没有数组,更少的循环等),但我已经将它限制在您原始代码中已经使用过的功能。

<强> TEST

% ./a.out
Inserisci il numero esadecimale da convertire (4 inserimenti): ABCD
Il numero esadecimale convertito in binario e': 1010101111001101
%