0
#include<stdio.h>

int main()
{
int input = 0;
int binaryNumber = 0;
int decimalNumber = 0;
int remainder = 0;
int i = 1;
int wholeNumber = 0;\
int number = 0;
char hexLetters[] = "ABCDEF";


printf("Press 1 to convert Binary to Hex\n");
printf("Press 2 to convert Hex to Binary\n");
printf("Press 3 to convert Decimal to 2's to Compliment Binary\n");
scanf("%d",&input);
printf("\n");

switch (input)
{
    case 1:
    {

    printf("Enter a Binary number\n");
    scanf("%d",&binaryNumber);

    char binaryToHex[2];
    while(binaryNumber != 0)
    {
        remainder = binaryNumber%10;
        decimalNumber = decimalNumber + (remainder*i);
        i = i*2;
        binaryNumber = binaryNumber/10;
    }
    while(decimalNumber != 0)
    {
    remainder = decimalNumber%16;
    wholeNumber = (decimalNumber%16)-(remainder/16);

    decimalNumber = 0;
    }

    int j = 1;
    for(j=1;j<16;j++){
        if(remainder ==j){
            binaryToHex[1] = hexLetters[j-10];
        }
        else{
            binaryToHex[1] = remainder;
        }
    }

    int k = 1;
    for(k=1;k<16;k++){
        if(wholeNumber == k){
            binaryToHex[0] = hexLetters[k-10];
        }
        else{
            binaryToHex[0] = wholeNumber;
        }
    }

    printf("%c%c\n", binaryToHex[0], binaryToHex[1]);

何も表示されないように助けてください。少しいじった後、Fだけが表示されますが、これは
間違っています。余りとwholeNumberが機能していて、正しい番号を取得していることを確認しましたが、binaryToHexに文字を保存しようとすると、常にFであるか、まったく何もありません。助けてください

4

2 に答える 2

0

最大の問題は、おそらく次の行にあります。

binaryToHex[1] = remainder;

そして、binaryToHex[0]ステートメントについても同様です。これはキャラクターである必要があります(AFの場合です)。代わりに、ここでは番号を割り当てています。これにより、その数値に対応する ASCII 文字が出力されます。これは、0 ~ 9 の場合、出力できない値の範囲 (NUL-TAB) にあります。

ASCII 整数は、'0' の 48 から始まります。したがって、1 つの修正方法は、最終的な出力を作成するときに変数remainderと変数に48 を追加する (またはすべての「マジック ナンバー」「0」を削除する) ことです。wholeNumber

binaryToHex[1] = remainder + '0';

もう 1 つの問題 (私が気付いたばかりです) は、ループです。

for(k=1;k<16;k++){
    if(wholeNumber == k){
        binaryToHex[0] = hexLetters[k-10];
    }
    else{
        binaryToHex[0] = wholeNumber;
    }
}

だから、これについて簡単に考えてください。1 ~ 16 の場合、数字が一致する場合は 16 進文字を割り当て、一致しない場合は数字を割り当てます。これは論理的に間違っています。5 の値があるとします。5kまで増加すると、最初の節が成功します。これは に割り当てhexLetters[5-10]られますがbinaryToHex[0]、実際にはアクセス違反が発生する可能性があります。その後、k16 まで増加し続けます。これにより、else句が実行され続け、取得した値が上書きされます。

修正するにbreakは、正しい数を見つけたら、ロジックを少しシャッフルします。次に例を示します。

for(k=1;k<16;k++){
    if(wholeNumber == k){
        if(k < 10)
            binaryToHex[0] = k + '0';
        else
            binaryToHex[0] = hexLetters[k-10];

        break;
    }
}
于 2013-02-16T01:11:48.073 に答える
0

あなたの論理は正しいですか?10の入力でそれをフォローしようとしましたが、役に立ちませんでした。このコードには多くの問題があると思います。

とにかくあなたの質問に

このステートメント: binaryToHex[1] = 残り;

またはこのステートメント: binaryToHex[0] = wholeNumber;

int を binaryToHex[0] に割り当てます。

したがって、printf("%c", binaryToHex[1]); を使用して印刷すると、

printf を printf("%i", binaryToHex[1]) に変更すると、数値が出力されます。ただし、コードで見たものに基づいて、 binaryToHex[1] と [0] は数値または文字のいずれかを割り当てることができるため、文字を割り当てたが %i を使用すると、同じ問題が発生します. 代わりに、バイナリToHex [1] =剰余+ '0'のように追加することにより、整数0のasci番号をステートメントに追加できます。したがって、binaryToHex[1] の値が 7 の場合、印刷できない ASCII 文字を印刷することになりますが、それに「0」または 48 を追加することで、希望どおりに 55 の ASCII 表現である 7 を印刷することになります。しかし、これらのハッキングを避けるために、代わりにコードを書き直すことを考えるべきだと思います.

とにかく、コードロジックに欠陥があると思うので、コードロジックから始めるべきだと思いますが、テストするコンパイラがないため、間違っている可能性があります。

于 2013-02-16T02:03:07.543 に答える