• 締切済み

2進→10進数

2進数から10進数に変換するプログラムを作りたいんですが #include<stdio.h> main() { int a[8],i=0,ans=0,end; start: printf("2進数を10進数に変換するプログラム\n開始する場合は1を入力終了する場合は0を入力してください。\n"); scanf("%d",&end); if(end==1) { goto s1; } else if(end==0) { goto end; } { s1: for(i=0;i<8;i++) { scanf("%d",&a[i]); } for(i=0;i<8;i++) { a[i]=2^i; } for(i=0;i<8;i++) { ans=ans+a[i]; } printf("二進数"); for(i=8;i<=4;i--) { printf("%d",a[i]); } printf(" "); for(i=4;i<=0;i--) { printf("%d",a[i]); } printf("は%dです。\n",ans); goto start; } end: printf("終了します\n"); } 期待した結果が得られないのですがどこが違っているのか教えていただきたいです、お願いします。

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>どこが違っているのか教えていただきたいです、 for(i=0;i<8;i++) { scanf("%d",&a[i]); // 0, 1 のみを2進数8桁「下位」から入れる( [ 0 ] から [ 7 ]◆へ) } for(i=0;i<8;i++) { a[i]=a[i]*2^i; // 「べき乗」のつもり(未確認) } for(i=0;i<8;i++) { ans=ans+a[i]; // a[i] には、0, 1, 2, 4, 8, 16, 32, 64, 128 のいずれかが入っている▼ } printf("二進数"); for(i=8;i<=4;i--) // 未入力の [ 8 ]◆から出力 { printf("%d",a[i]); // a[i] には、0, 1 が入っているつもり▲ } コメントをつけてみれば・・、少なくとも「べき乗」部分以外は、他人に教えてもらうまでもないですよね。 「べき乗」部分だって、次に printf() 文を入れ結果を出力すれば、2^i では、べき乗にならないことに気づいたはず。 ☆goto 文を使っていることから、お金を出してC言語を勉強しているわけではなく「遊び」と思いますが、自己解決能力をつけることで、より楽しくC言語を遊べるかと思います。 蛇足  http://wisdom.sakura.ne.jp/programming/c/c11.html のようなページもあります。  プログラムって、どのように書こうが「自由」で、他人にとやかく言われる筋合いのないもの、と思います。  エラーが出たって、はたまた main() 関数が void 型であっても、誰にも迷惑かけないし・・。  (希に「規則で決まっている『から』」なんて言う教条主義的な輩もいるけど、規則破ったって、誰にも迷惑かけない)  重要な「警告」を無視し実行したって、結局は、天にしかツバは吐けない。 ☆ただ、ソースを他人に見せる(答案提出など)となると・・。  ↑知っていて損のない情報かと・・。 ---------------------------------------------------------- ☆下のソースでは、2進数8桁を「文字列」で入力しています。  文字 '0'→ 数字 0 http://e-words.jp/p/r-ascii.html 参照 #include <stdio.h> #include <string.h> int main() {  int i, ans, iNext;  char a[ 16 ]; // 半分しか使わないけど・・たっぷり用意  while( 1 ){   fprintf( stderr, "--- 2進数を10進数に変換するプログラム ---\n" );   fprintf( stderr, "  継続する場合は 1\n" );   fprintf( stderr, "  終了する場合は 0 を入力\n" );   scanf( "%d", &iNext );   if( 1 != iNext ) return( 0 ); // 正常終了   fprintf( stderr, "8桁の2進数を入力してください。\n" );   scanf( "%s", &a );   if( 8 != strlen( a ) ) return( 1 ); // 異常終了   printf( "二進数 " );   for( i= 0; i < 8; i++ ){    printf( "%c", a[ i ] );    if( 3 == i ) printf( " " ); // 4桁区切りで   }   for( ans = 0, i = 0; i < 8; i++ ){    if( ( '0' != a[ i ] ) && ( '1' != a[ i ] ) ) return( 2 ); // 異常終了    ans += ( ( a[ i ] - 0x30 ) << ( 7 - i ) ); // ans に加算   }   printf( " は、10進数で %d です。\n", ans );  } } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.3

>ああ調べてみたらXORだったんですね^^; >すみません。 >何とかがんばってみます! ヒントだけ。 1を0ビット分、左にシフトすると1です。 1を1ビット分、左にシフトすると2です。 1を2ビット分、左にシフトすると4です。 1を3ビット(ry 式で書くと 1 << 0; 1 << 1; 1 << 2; 1 << (ry と言う訳で、もし、「1 0 0 1 0 0 1 0」というように「上位ビットから順に」入力されたら ans = 0; ans <<= 1;ans |= 1; ans <<= 1;ans |= 0; ans <<= 1;ans |= 0; ans <<= 1;ans |= 1; ans <<= 1;ans |= 0; ans <<= 1;ans |= 0; ans <<= 1;ans |= 1; ans <<= 1;ans |= 0; を計算すればよい。 「2のi乗をa[i]に入れて…」とか「ansにa[i]を足して…」とかって計算は不要。なので配列も不要。 「今、入力されたのが、0なのか1なのか」さえ判れば済むと思いませんか? だって「ansを左に1ビットシフトして、最下位に0か1をオアするビットを作ってあげてから、0か1をオアする」ってのを8回やれば済むんだから。 そうすれば、質問者さんのプログラムのように「入力の時は下位ビットから順に入力して、出力の時に上位下位を逆順で表示」のように上位下位を逆にする必要もない。 もう一つ。 1回、2進数を入力して結果のansを表示した後、start:に戻ってもansを0に戻してませんよ。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

C言語において、演算子 ^ はべき乗の意味ではありません。

porn111
質問者

補足

ああ調べてみたらXORだったんですね^^; すみません。 何とかがんばってみます! 回答ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>scanf("%d",&a[i]); 変換前は2進数ですので、ここでは0か1の入力を求めている、 という風な理解でよいでしょうか? >a[i]=2^i; この文の意図するところを、文章で書いてみてください。

porn111
質問者

補足

>>scanf("%d",&a[i]); 変換前は2進数ですので、ここでは0か1の入力を求めている、 という風な理解でよいでしょうか? はい。その通りです。 >>a[i]=2^i; この文の意図するところを、文章で書いてみてください。 すみませんそこはa[i]=a[i]*2^i;にしたつもりでした。 修正したんですが望んだ結果が得られません。 これは二進数の0,1に2のi乗をかけるといった感じなんですが、間違ってますかね?

関連するQ&A

  • 素数判定の繰返し

    繰返し素数判定を行ない、CtrlーDで終了するプログラムをつくっています。 まず繰返しなしの素数判定プログラムを作り #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } return(0); } これはちゃんとできたのですがそれを繰り返すことができません。 #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); while((a=getchar())!=EOF){ if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } printf("自然数を入力:"); scanf("%d",&a); } printf("プログラムを終了します。\n"); return(0); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

  • 素数を判定するプログラム

    整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうもfor文が評価されていないような気がしますが、原因がわかりません。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n = 2; int i; printf("1より大きい整数を入力してください: "); scanf("%d",&number); while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d",&number); } if (number == 2) { printf("%dは素数です\n",number); goto OUT; } else { for (; n == number - 1; n++) { i = number % n; if (i == 0) printf("%dは素数ではありません\n", number); if (i == 0) goto OUT; } } printf("%dは素数です\n", number); OUT: return 0; } どうかよろしくお願いします。

  • 10進数から2進数へ・・・

    10進数から2進数に変換するプログラムを作っています。a[i]=(x/2)%2という式をforでまわせば、できると思うんですが、a[i]の配列をどうやって表示させるのかわかりません、 main以下をのせときます。 int x; int i; float a[i]; printf("10進数を入力してください>"); scanf("%d",&x); a[i]=(x/2)%2; printf("2進数は%d\n",a[i]); }

  • 3進数を10進数に変換

    3進数や5進数のように2の階乗ではない任意の進数の文字列を、C言語のビットシフトを使って10進数に変換するプログラムについて、質問させていただきます。 ビットシフトを使わないで、任意の進数の文字列を10進数に変換する方法は分かっていますが、ビットシフトを使った方が非常に計算が高速で出来るので、ビットシフトを使いたいと思っています。 下記のプログラムは4進文字列を10進整数に変換するものです。2進、8進文字列の場合は、シフトするビット数を1ビット、3ビット(つまり、ans <<= 1、ans <<= 3)にすれば計算することが可能です。しかし、3進数や5進数の場合、いろいろと考えたのですが、どのようにすれば良いのか分かりません。 下記のプログラムのようにビットシフトを使って3進数や5進数の文字列を10進数に変換するには、どのように工夫すれば良いでしょうか? どなたかご教授をお願いいたします。 #define STRING_NUM 2 /* 文字列の長さ */ int main(void) { int i; int ans = 0; /* 10進数の整数 */ char buf[STRING_NUM]; /* 4進数の文字列 */ buf[0] = '3'; buf[1] = '1'; for ( i = 0 ; i < STRING_NUM; i++ ){ printf(" %c", buf[i]); } printf("\n"); for ( i = 0 ; i < STRING_NUM; i++ ){ if ( buf[i] == '0' ){ ans <<= 2; /* シフトするビット数 */ ans |= 0; } if ( buf[i] == '1' ){ ans <<= 2; ans |= 1; } if ( buf[i] == '2' ){ ans <<= 2; ans |= 2; } if ( buf[i] == '3' ){ ans <<= 2; ans |= 3; } } printf( "ans = %d\n", ans ); return 0; }

  • 2つの自然数を入力しその間にある素数を表示する

    2つの自然数を入力して、その間にある素数を表示するプログラムです。 #include <stdio.h> main( ) { int a,b,c,i,j; printf("Input number 1:"); scanf("\n%d",&a); printf("Input number 2:"); scanf("\n%d",&b); if(a>b){ c=a; a=b; b=c; } for(i=a;a<b+1;i++){ for(j=2;j<i-1;j++){ if(i%j!=0){j++;} else{ if(i=j){ printf("\n%d",i); } } } } } i=aからbまで j=2からi-1まで iはjで 割り切れるか NO→(jを1つ増やす) YES→iはjと等しいか YES→iの値を表示 NO→(iを1つ増やす) END この部分がよくわかりませんfor文を使うんですか? ご指導お願いします。

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • 素数を判定するプログラム

    素数を判定するプログラムをC言語で作れという問題があったのですが、以下のものをビルドして実行したら途中で止まってしまいました。(例えば5と入力する)しかし、1以下の場合は正常にif文が評価されました。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n; int i; printf("1より大きい整数を入力してください: "); scanf("%d", &number); if (number <= 1) { printf("1より大きい整数を入力してください\a: "); scanf("%d", &number); } for (n = 2; n = number - 1; n++) { i = number % n; if (i = 0) { printf("%dは素数ではありません", number); break; } } printf("%dは素数です", number); return 0; } 自分ではどこがおかしいのかさっぱりわかりません。よろしくお願いします。

  • 2進数の加算の繰り上がり

    2進数の四則演算のプログラムを作りたいと思い、2進数を表示するところまではできたのですが、加算になると繰り上がりという壁にぶつかってしまいました。繰り上がりや桁上げなどがよく分からないので、お教えください。(下のソースコードが繰り上がりのない加算をするまでのものです) #include <stdio.h> int main(void) { int a,b,i,j,x[8],y[8],z[8]; do{ puts("二つの符号なし整数を入力してください。(ただしa>bとし、bはのべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); if(a < = b) puts("入力した値がa>bになっていません。\a"); }while(a < = b); for( i = 0; i < = 7; i + +){ x[i] = a % 2; a = a / 2; y[i] = b % 2; b = b / 2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for( i = 7; i > = 0; i - -){ printf("%d",x[i]); } puts(""); printf("b="); for( i = 7; i > = 0; i - -){ printf("%d",y[i]); } printf("となります。\n\n"); printf("<加算>\n"); printf("c=a+b="); for( j = 7; j > = 0; j - -){ z[j]=x[j]^y[j]; printf("%d",z[j]); } return(0); }

  • クイックソートプログラムでセグメンテーション違反がでるのですが

    クイックソートのプログラムを作成したのですが、 実行するとセグメンテーション違反が発生して、上手くいきません。何処に原因があるのでしょうか? また、セグメンテーションン違反とはどういったころなのでしょうか? アドバイス宜しくお願いします。 #include <stdio.h> int quick_sort(int *a,int start,int end); int partition(int *a,int start,int end); main() { int n; int a[n]; int i; printf("ソートしたい要素の個数は?\n"); scanf("%d",&n); for(i=0;i<=n-1;i++) a[i]=0; for(i=0;i<=n-1;i++){ printf("%dのデータを入力してください。\n",i+1); scanf("%d",&a[i]); } printf("ソート前のデータは以下の通り\n"); for(i=0;i<=n-1;i++) printf("%d ",a[i]); quick_sort(*a,1,n-1); printf("ソート後のデータは以下の通り\n"); for(i=0;i<=n-1;i++) printf("%d ",a[i]); } int quick_sort(int *a,int start,int end) { int pivot; if(end-start>0){ pivot=partition(a,start,end); quick_sort(a,start,pivot-1); quick_sort(a,pivot+1,end); } } int partition(int *a,int start,int end) { int i,j,pivot,tmp; i=start-1; j=end; pivot=a[end]; while(1){ while(a[++i]<pivot); while(i<--j && a[j]>pivot); if(i>=j) break; tmp=a[i]; a[i]=a[j]; a[j]=tmp; } a[end]=a[i]; a[i]=pivot; return i; }

  • 2進数の乗算と除算

    先日、桁上がりについて質問させていただいた者です。 加算と減算はなんとか完成したのですが、乗算と除算になって混乱してしまいました。 二進数の乗算、除算はビットシフトと関係がありますが、私の作っているものの場合はどのようなソースコードにすればよいでしょうか? (ちなみに、bの値は2のべき乗に限定しています。) int main(void) { int a,b,i; int x[8],y[8]; puts("二つの符号なし整数を入力してください。(ただしa>bとし、bは2のべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b);  printf("\n"); /*二進数の形に変換*/ for(i=0;i<=7;i++){ x[i]=a%2; a=a/2; y[i]=b%2; b=b/2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for(i=7;i>=0;i--){ printf("%d",x[i]); } puts(""); printf("b="); for(i=7;i>=0;i--){ printf("%d",y[i]); } printf("となります。\n\n");     return(0);  }

専門家に質問してみよう