0

選択肢番号3(10進数から2進数)具体的にはCode:Blocksで機能し、Visual C ++では試していませんが、私たちの学校ではDev-C ++を使用しているため、問題の原因を特定できません。私はそれが論理的かつ構文的に正しいことを意味します。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define MAXDIGITS 100

void printmenu(void);
void getchoice(void);
void decitobinary(int str);



int main(void)
{
    char choice;

    printmenu();
    getchoice();
    system("cls");
    while(1)
    {
        printf("\nAgain? y/n: ");
        scanf("\n%c",&choice);
        if(choice == 'y' || choice == 'Y')
        {
            system("cls");
            main();
        }
        else if(choice == 'n' || choice == 'N')
            exit(EXIT_SUCCESS);
        else
        {
            printf("\a\nInvalid input.\n");
            continue;
        }
    }
}

void printmenu(void)
{
    printf("\n3 - Decimal -> Binary");
    printf("\n19 - Exit Program\n");
}

void getchoice(void)
{
    int choice;
    char number[MAXDIGITS];
    int digits;

    printf("\nEnter choice: ");
    scanf("\n%d",&choice);
    switch(choice)
    {

        case 3:
        {
            system("cls");
            printf("Enter number: ");
            scanf("\n%d",&digits);
            decitobinary(digits);
            break;
        }

        case 19:
            exit(EXIT_SUCCESS);
    }
}


void decitobinary(int str)
{
    int arraycntr = 0;
    int number[arraycntr];
    printf("\n%d in binary is: ",str);
    while(str > 0)
    {
        number[arraycntr] = str % 2;
        str /= 2;
        ++arraycntr;
    }
    for(arraycntr -= 1;arraycntr >= 0;arraycntr--)
    {
        printf("%d",number[arraycntr]);
    }
    printf("\n");
    system("pause");
}
4

3 に答える 3

1
void decitobinary(int str)
{
    int arraycntr = 0;
    int number[arraycntr];
    printf("\n%d in binary is: ",str);
    while(str > 0)
    {
        number[arraycntr] = str % 2;
        str /= 2;
        ++arraycntr;
    }
    for(arraycntr -= 1;arraycntr >= 0;arraycntr--)
    {
        printf("%d",number[arraycntr]);
    }
    printf("\n");
    system("pause");
}

数値配列の初期化に問題があります。次のようになります。

int number[33];

すべての 2 進数を格納するには、33 桁あれば十分です。

于 2012-07-06T05:28:32.617 に答える
0

これは答えではありません。考慮すべきことだけです。同じ関数に対して約 10 個の同一の実装があります。decitobase と basetodeci のすべてのバリエーションを 1 組の関数に統合することを検討しましたか?

void decitobase(int str, int base)
{
    int arraycntr = 33;
    int number[arraycntr] = {};
    printf("\n%d in base %d is: ",str, base);
    while(str > 0)
    {
        number[arraycntr] = str % base;
        str /= base;
        ++arraycntr;
    }
    for(arraycntr -= 1;arraycntr >= 0;arraycntr--)
    {
        printf("%d",number[arraycntr]);
    }
    printf("\n");
    system("pause");
}

void basetodeci(char str[], int base)
{
    int arraycntr,digitcntr,power;
    int value[MAXDIGITS];
    int number;
    arraycntr = 0;
    digitcntr = 0;
    number = 0;
    power = 1;
    while(str[arraycntr] != '\0')
    {
        value[arraycntr] = str[arraycntr] - '0'
        ++arraycntr;
    }
    digitcntr = arraycntr - 1;
    for(digitcntr; digitcntr >= 0; digitcntr--)
    {
        number += value[digitcntr] * power;
        power *= base;
    }
    printf("\n%s base %d in decimal is: %ld\n",str,base,number);
    system("pause");
 }

上記のコードがあなたが提出したものよりも正しいかどうかはわかりませんが、私が何を目指しているのか見ていただければ幸いです. また、必要な基数内で文字列を整数に変換する C 関数があることも忘れないでください: strtolとその仲間。

于 2012-07-06T05:37:34.953 に答える
0

使用しているアルゴリズムは非常に遅いです。代わりに、2 進数を扱っているため、ビット単位の演算子を使用します。

#include <stdio.h>
#include <stdlib.h>

#define BITS_N  (sizeof(unsigned int) * 8)
#define MSB     (1 << (BITS_N - 1))


void print_binary (unsigned int val)
{
  for(size_t i=0; i<BITS_N; i++)
  {
    printf("%c", (val & MSB) ? '1' : '0' );
    val <<= 1;

    if( ((i+1)%8) == 0) // print a space every 8th digit
    {
      printf(" ");
    }

  }
}


int main()
{
  unsigned int some_val = 0xBAADBEEF;

  print_binary (some_val);
}
于 2012-07-06T08:28:19.580 に答える