• 締切済み

8桁の2進数を10進数に変換する方法を教えてください。

キーボードから2進数を入力した値を10進数に変換し、変換結果を出力する方法が解りません。作成するにあたり仕様があり、私一人では解決できないので相談させていただきました。 <仕様は以下の通りです> (1)このプログラム(8桁の2進数を10進数に変換)をする際は、最後に出力する時(printf)以外は関数を使ってはいけません。 (2)キーボードから2進数を入力させる。 (3)空白(ブランク)が入力されても変換可能にする。 (4)入力された2進数は8桁にし、8桁以上の場合はエラーを出す。 (5)2進数の「0」と「1」以外の文字が入力された場合はエラーを出す。 (6)バイナリ変換をし、変換結果を出力する。 以上になります。 まだ、C言語を勉強を習い始めの初心者です。どうか、ご回答のほど宜しくお願いします。

みんなの回答

noname#48699
noname#48699
回答No.7

(1週間遅れで「質問」が来た・・なぜ?) ★0 1 0は、010とします。【A】 ★8桁未満の2進数を「8桁に」するには、末尾に0を埋める方法【B】と、冒頭に0を埋める方法【C】の2とおりあり、双方求めます。  010 → 01000000 10進で64 【B】  010 → 00000010 10進で 2 【C】 ◆表示用に整形した文字列を作成しています【D】。 #include <stdio.h> #include <stdlib.h> #include <string.h> void Error_Stop( int iSw ) {  if( iSw ) printf( "エラー発生 CODE %d\n", iSw );  exit( 0 ); } void main() {  char cBinStr[64], cWork[16], cStrB[16], cStrC[16];  int i, nn, iErr, iValB, iValC;  while( 1 ){   printf( "2進数を8桁以内で( /:終了)\n" );   nn = 0;   gets( cBinStr );   strcpy( cStrB, "00000000" );   strcpy( cStrC, "00000000" );   for( i = 0; i < 64; i++ ){    if( 0x00 == cBinStr[i] ) break; // 終端    if( 0x20 == cBinStr[i] ) continue; // 【A】    if( 0x2F == cBinStr[i] ) Error_Stop( 0 ); // /(0x2F):終了    iErr = 0;    if( '0' != cBinStr[i] ) iErr++;    if( '1' != cBinStr[i] ) iErr++;    if( 2 == iErr ) Error_Stop( 5 ); // エラー(5)    cWork[nn++] = cBinStr[i];    if( 8 < nn ) Error_Stop( 4 ); // エラー(4)   }   for( i = 0; i < 8; i++ ){ // 8桁文字列作成【D】    if( i < nn ) cStrB[i] |= cWork[i]; //【B】    if( i > ( 7 - nn ) ) cStrC[i] |= cWork[nn+i-8]; //【C】   }   iValB = 0;   iValC = 0;   for( i = 0; i < 8; i++ ){    iValB += (int)( 0x01 & cStrB[i] ) << ( 7 - i ); // 【B】    iValC += (int)( 0x01 & cStrC[i] ) << ( 7 - i ); // 【C】   }   printf( "%s %3d\n", cStrB, iValB );   printf( "%s %3d\n", cStrC, iValC );  } } 注:インデントで全角空白を用いています(全角空白→タブコード)。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

やはり入力が一番難しいですね。 キーボードではなく標準入力でよいのであれば、C++なら (「C言語を勉強を習い始めの初心者です。」とはありますが、「C言語で作れ」とは書かれていないので) #include <iostream> #include <bitset> #include <stdio.h> int main() {  std::bitset<9> binary;  std::cin >> binary;  if (!std::cin)  {   printf("エラー\n");  }  else  {  if (binary[8])  {   printf("エラー\n");  }  else  {   printf("%lu\n", binary.to_ulong());  }  }  return 0; } とできるのかも知れません。 >>や!や[]は演算子だから関数を使ったわけではないというのは、ちょっと無理があるかもしれませんが...。 それに、前に0を多数入力して8桁を超えた場合にエラーにならないのも、不適合扱いされるかもしれません。

  • luckymako
  • ベストアンサー率55% (29/52)
回答No.5

これでどうでしょ? #include<stdio.h> #define BITS 8 int main(){  char *bin;  int dec = 0;  int error = 0;  int i = 0;  printf("Bin : ");  gets(bin);    while(error == 0){   switch(bin[i]){   case ' ':   case '0':    dec <<= 1;    break;   case '1':    dec <<= 1;    dec += 1;    break;   case '\0':    error |= 1;    break;   default:    error |= 2;    break;   }   if(i > BITS)    error |= 4;   i++;  }  if(error == 1)   printf("Dec : %d\n", dec);  if(error & 2)   printf("Err : Input is wrong.\n");  if(error & 4)   printf("Err : Input is too long.\n"); }

  • tig33
  • ベストアンサー率50% (6/12)
回答No.4

ちょっと、誤字やら間違い(printf文の%dなど)がありました。再掲します。 > (1)このプログラム(8桁の2進数を10進数に変換)をする際は、最後に出力する時(printf)以外は関数を使ってはいけません。  この仕様(1)を正確に遵守すると、ANo.2のJactさんが回答されている通りなのですが、   > (2)キーボードから2進数を入力させる。  仕様(2)でキーボード入力を要求しているのですから、文字列入力関数くらいは、使用して良いものと解釈します。 問題の意図は、Cに用意されている標準関数(数学関数や文字列処理関数など)を使用しないで、自力で作りなさいと言うことだと思います。 > (3)空白(ブランク)が入力されても変換可能にする。  仕様(3)の意味は、ちょっと意味を理解しかねますが、キーボードから入力するのに、8桁に満たない場合を想定しているのか、0の代わりに空白を入力も可としているのかが明確ではありません。   > (4)入力された2進数は8桁にし、8桁以上の場合はエラーを出す。  仕様(4)では、8桁をオーバー(問題の8桁以上は間違い。8桁以上は8桁を含みます。)した場合を規定していますが、8桁未満を左詰の入力なのか右詰の入力なのかを規定していません。    以上の要件を補填して、以下の定義(規定)の下に、プログラムを作成すると、   (1) キーボード入力は、gets()関数を使用する。 (2) キーボード入力は、128文字以上の入力は、プログラムの動作を保証しない。 (3) 数字0の代わりに、空白の入力も可とする。 (4) 8桁未満の入力は、左詰、右詰両方の処理結果を表示する。 #define BIN_DIGIT  (8) #define BUFMAX   (128) char inbuf[BUFMAX];  /* キーボード入力文字列を入れる領域 */ int main(void) {   int textlen, ct, DecVal_L, DecVal_H, wk_L, wk_R;      /* 2進数の文字列をキーボードから入力する */   gets(inbuf);      /* 入力した文字列の検証 */   textlen = 0;   for(ct=0; ct<BUFMAX; ct++) {     if( (inbuf[ct] == '0') ||       (inbuf[ct] == '1') ||       (inbuf[ct] == ' ') ) {       textlen++;              /* 後の処理(10進数に変換)のため空白を0に書き替えておく */       if( inbuf[ct] == ' ' ) {         inbuf[ct] = '0';       }     } else {       if( inbuf[ct] != '\0' ) {         printf("入力に0,1以外の文字が入力されました。\n");         return(1);       }       break;     }   }      /* 入力文字列数が規定を超えたか? */   if( textlen > BIN_DIGIT ) {     printf("入力が%d桁を超えています。\n", BIN_DIGIT);     return(1);   }      /* 右詰の   DecVal_R = 0;   for(ct=0; ct<BIN_DIGIT; ct++) {     if( inbuf[ct] == '\0' ) break;          DecVal_R <<= 1;     if( inbuf[ct] == '1' ) {       DecVal_R |= 1;     }   }      /* 左詰の処理 (注:if文は無くて良い。0ビットのシフトは変化無いから)*/   DEcVal_L = DecVal_R;   if( textlen < BIN_DIGIT ) {     DecVal <<= BIN_DIGIT - textLen;   }      /* 結果の表示 */   printf( "2進数(%s)を10進数に変換すると、左詰(%d)、右詰(%d)になります。\n",                            inbuf, DevVal_L, DecVal_R );   return(0); } こんな具合ですね。

  • tig33
  • ベストアンサー率50% (6/12)
回答No.3

> (1)このプログラム(8桁の2進数を10進数に変換)をする際は、最後に出力する時(printf)以外は関数を使ってはいけません。  この仕様(1)を正確に遵守すると、ANo.2のJactさんが回答されている通りなのですが、   > (2)キーボードから2進数を入力させる。  仕様(2)でキーボード入力を要求しているのですから、文字列入力関数くらいは、使用して良いものと解釈します。 問題の意図は、Cに用意されている標準関数(数学関数や文字列処理関数など)を使用しないで、自力で作りなさいと言うことだと思います。 > (3)空白(ブランク)が入力されても変換可能にする。  仕様(3)の意味は、ちょっと意味を理解しかねますが、キーボードから入力するのに、8桁に満たない場合を想定しているのか、0の代わりに空白を入力も可としているのかが明確ではありません。   > (4)入力された2進数は8桁にし、8桁以上の場合はエラーを出す。  費用(4)では、8桁をオーバー(問題の8桁以上は間違い。8桁以上は8桁を含みます。)した場合を規定していますが、8桁未満を左詰の入力なのか右詰の入力なのかを規定していません。    以上の要件を補填して、以下の定義(規定)の下に、プログラムを作成すると、   (1) キーボード入力は、gets()関数を使用する。 (2) キーボード入力は、128文字以上のの入力は、プログラムの動作を保証しない。 (3) 数字0の代わりに、空白の入力も可とする。 (4) 8桁未満の入力は、左詰、右詰両方の処理結果を表示する。 #define BIN_DIGIT  (8) #define BUFMAX   (128) char inbuf[BUFMAX];  /* キーボード入力文字列を入れる領域 */ int main(void) {   int textlen, ct, DecVal_L, DecVal_H, wk_L, wk_R;      /* 2進数の文字列をキーボードから入力する */   gets(inbuf);      /* 入力した文字列の検証 */   textlen = 0;   for(ct=0; ct<128; ct++) {     if( (inbuf[ct] == '0') ||       (inbuf[ct] == '1') ||       (inbuf[ct] == ' ') ) {       textlen++;              /* 後の処理(10進数に変換)のため空白を0に書き替えておく */       if( inbuf[ct] == ' ' ) {         inbuf[ct] = '0';       }     } else {       if( inbuf[ct] != '\0' ) {         printf("入力に0,1以外の文字が入力されました。\n");         return(1);       }       break;     }   }      /* 入力文字列数が規定を超えたか? */   if( textlen > BIN_DIGIT ) {     printf("入力が%d桁を超えています。\n", BIN_DIGIT);     return(1);   }      DecVal_R = 0;   for(ct=0; ct<BIN_DIGIT; ct++) {     if( inbuf[ct] == '\0' ) break;          DecVal_R <<= 1;     if( inbuf[ct] == '1' ) {       DecVal_R |= 1;     }   }      /* 左詰の処理 (注:if文は無くて良い。0ビットのシフトは変化無いから)*/   DEcVal_L = DecVal_R;   if( textlen != BIN_DIGIT ) {     DecVal <<= BIN_DIGIT - textLen;   }      /* 結果の表示 */   printf( "2進数(%s)を10進数に変換すると、左詰()、右詰()になります。\n",                            inbuf, DevVal_L, DecVal_R );   return(0); } こんな具合ですね。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

printf以外の関数が使えないのであれば、キーボードからの入力はI/Oを直接制御するしかありません。当然それにはハードウェアの仕様がわかる必要がありますし、環境によってはI/O制御が制限されるので実現できないこともあります。 なお、main関数が受け取る引数は、キーボードから入力されたものとは限らないので、仕様を満たすことができません。

回答No.1

#include <stdio.h> int main(int argc, char *argv[]) { char *p; int n, i, j; if(argc == 1){ printf("引数がない\n"); return 1; } for(i = 1, n = j = 0; i < argc; i ++){ p = argv[i]; while(*p){ if(j == 8){ printf("桁が多い\n"); return 1; } if(*p != '0' && *p != '1'){ printf("'%c'は使えない\n", *p); return 1; } n = n * 2 + (*p == '1'); p ++; j ++; } } printf("答え %d\n", n); return 0; }

関連するQ&A

  • 10進数から8けたの2進数に変換

    10進数から2進数への変換はわかるのですが 10進数から8桁の2進数への変換がわかりません。 仮に10進数の38を8桁の2進数に直す場合、どんな過程を経て、8桁の2進数になるのでしょうか。 どなたか教えていただけますと有難いです。 宜しくおねがいします。

  • 2進数1101.011に2進数の桁の重みをかけると

    2進数1101.011に2進数の桁の重みをかけるとなぜ10進数になるんでしょうか? それはそういう結果になるからだ、というのはわかっているんですが、私が知りたいのは 2進数1101.011 に10進数の桁の重みをかけたら、10進数に変換される 2進数1101.011 に8進数の桁の重みをかけたら、8進数に変換される 2進数1101.011 に16進数の桁の重みをかけたら、16進数に変換される というのなら納得できるんですが 2進数1101.011 に2進数の桁の重みをかけたら 10進数 というのが納得できません。なぜ、8進数、16進数、3,4,5,6,7,ではなく10進数になるんでしょうか?2進数の桁の重みなのに。

  • 2進数から10進数へ変換

    C言語で、2進数から10進数に変換するプログラムを作ろうと思っています。 手計算で行う場合は2進数の 下1桁目×1 下2桁目×2 下3桁目×4。。。と計算しています。 下○桁目を取り出す方法を考えているのですが、思いつきません。 3桁の2進数を変換するプログラム(とりあえず101を変換することを考えて・・・)を書いてみたのですが、101を考えすぎたためか上手くいきませんでした。 最終的には10進数でintの範囲内程度の2進数の変換ができるプログラムを書きたいと思っています。 アドバイスをお願いします。 ちなみに、考えてみたプログラムは以下の通りです。 101以外で上手く変換できませんね・・・ ここに貼り付けるのが恥ずかしいです。 #include <stdio.h> main() { int x ,i ,z[3]; scanf("%d",&x); z[0]=x/100*4; z[1]=(x/10-10)*2; z[2]=(x-110)*1; printf("%d",z[0]+z[1]+z[2]); return 0; }

  • Excelで16桁の16進数を10進数に変換

    Excelを使って、16桁の16進数を10進数に変換したいと考えております。 HEX2DECでは、桁数が多すぎてエラーとなってしまいました。 関数の組み合わせでも、VBAで組むのでもどちらでも構いません。 こうすればできる、というようなアイデアだけでも、いただけるとうれしいです。 宜しくお願いいたします。

  • 2進数を10進数へ変換したいのですが・・・

    初心者です、お願いします 任意の2進数を入力してそれを10進数に変換して画面上に出力したいのですが、どなたかヒントをください 自分なりに考えた結果は、[17]以上の配列を用意してそこに格納する、その格納された桁数をstrlenで割り出してからひとつずつ2の重みで計算をしてそれを足していく・・・こんな考え方でいいのでしょうか?ここまで出間違っていることや、それともほかにもっと簡単な方法がありましたら教えてください お願いします。

  • コマンドライン引数を使って2進数を10進数に変換させたい

    2進数を入力し10進数に変換するプログラムを作成したのですが、うまく動作しないので質問させてください。 コマンドライン引数を使って実行したいのですが2進数も入力出来ず困っています。作成したコードの何処に問題があるのかも解らずにいます。 宜しくお願いします。 作成環境は「Windows XP」「Visual Studio .net 2003」 <作成したコードです> *********************************************************** // binary.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include "stdafx.h" #include <stdlib.h> int _tmain(int argc, _TCHAR* argv[]) { if( argc < 8 ){ printf("2進数を入力してください。\n"); exit(1); } //空白文字のチェック// int i=0,n=0; char decimal[ 128 ], binary[ 128 ]; for( i=0; i<argc; i++ ){ if( binary[ i ] != ' ' ){ decimal[ n ] = binary[ i ]; n++; } } //'\0'を代入(文字列の終端)// decimal[ n ]='\0'; //「0」と「1」のループ// for( i=0; i<argc; i++ ){ if(( decimal[ n ] == '0' ) || ( decimal[ n ] == '1' )){ }else{ printf("エラー\n 「0」と「1」以外の文字が入力されております\n"); } } //桁数のループ// int m = 0; for( i=0; i<'\0'; i++ ){ m = m +1 ; } //桁数の判断/// if( m == 8 ){ }else{ printf("エラー\n2進数(0,1)を8桁、入力して下さい。\n"); } //add・初期化// int add = 0; //decimal[0]~decimal[7]の判断// if( decimal[ 0 ] == '1' ){ add += 128; } if( decimal[ 1 ] == '1' ){ add += 64; } if( decimal[ 2 ] == '1' ){ add += 32; } if( decimal[ 3 ] == '1' ){ add += 16; } if( decimal[ 4 ] == '1' ){ add += 8; } if( decimal[ 5 ] == '1' ){ add += 4; } if( decimal[ 6 ] == '1' ){ add += 2; } if( decimal[ 7 ] == '1' ){ add += 1; } //2進数を10進数に変換した値の出力// printf("2進数を10進数に変換した値は %d \n",add); return 0; }

  • 2進数からBCDコードへの変換

    今,2進カウンタを作り,これから7セグメントLEDへ出力する回路を作りたいのですが,1桁の場合は,デコーダICでそのまま変換可能なのですが,10進数に直したときに2桁以上になるものは,デコーダの前で各桁ごとのBCDコードに分けてあげないといけなくなります。ここが分からないのです。 回路の構成としては,カウンタ部分をアナログで構成し,そこで8個のスイッチをつけて,それぞれ2進数の各桁の入力としています。これと,3個のデコーダICと7セグメントLEDで2^8=255までを表示させたいのですが,どのような回路構成だとシンプルに作れるのでしょうか。また,そのようなICは存在するのでしょうか。

  • 2進数の1の数を数える問題

     次の問題に対して、以下のソースを考案し、実行したところ、以下のようになりました。 【問】 ◆◆◆◆◆  与えられた10進数の整数Nを2進数に変換したときの1の個数を答えよ。  整数の10進数を2進数に変換するには、変換したい10進数を商が0になるまで2で割り続け、求めた余りの部分を逆順に並べる。 例) 13が入力として与えられた場合、以下のように2で割り続け2進数を求める。 13 / 2 = 6 ・・・余り 1 6 / 2 = 3 ・・・余り 0 3 / 2 = 1 ・・・余り 1 1 / 2 = 0 ・・・余り 1  求められたそれぞれの余りを逆順に並べたものが2進数への変換結果となる。  よって入力が13ならば2進数への変換結果は 1101 になり、1は3個あるので出力は3になる。 [入力例1] 13 [出力例1] 3 [入力例2] 45 [出力例2] 4 ◆◆◆◆◆ (自分の解答、□はタブ) ◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS */ int main(void) { □int n, bit, s; □scanf("%d", &n); □ □bit = n % 2; □n /= 2; □s = 0; □while(n) { □□if (bit) □□□s++; □bit = n % 2; □n /= 2; □} □printf("%d", s); □return EXIT_SUCCESS; } ◆◆◆◆◆ (実行結果1) ◆◆◆◆◆ [入力] 13 [出力] 2 ◆◆◆◆◆ (実行結果2) ◆◆◆◆◆ [入力] 45 [出力] 3 ◆◆◆◆◆ となり、正解となりません。  自分の考えとしては、入力された数値を変数nに収め、これをどんどん2で割っていき、そのときの余り(0か1)を変数bitに収めていき、nが0になるまで処理を繰り返し、bitが0でないとき、変数s(初期値0)に1ずつ加算していき、最後にsを出力する、という方針です。  初期値の設定辺りが間違っているのだと思いますが、これ以上いくら考えても正解が得られません。どこがどう間違っているのでしょうか。どなたかご教授頂きたく、お願い致します。

  • 2進数を36進数に変換する

    2進数を36進数に変換する際、2進数の何桁ごとに区切ればよいのでしょうか? 16進の場合は、4ケタごとに区切ってやるような感じです。

  • 10進数を2進数に変換したいのですが・・・

    こんばんは。 入力された10進数を2進数に変換するというプログラムを、一応作成することができたのですが、表示される結果が逆に表示されてしまいます。(例えば、4なら001) どのようにすれば、正しく表示することができるのでしょうか??ちなみにプログラムは #include<stdio.h> int main(void) { int num; printf("数字を入れてください。\n"); scanf("%d", &num); for(num = num ; num>1 ; num = num/2) printf("%d",num%2); printf("%d\n",num); return 0; } です。

専門家に質問してみよう