- 締切済み
8桁の2進数を10進数に変換する方法を教えてください。
キーボードから2進数を入力した値を10進数に変換し、変換結果を出力する方法が解りません。作成するにあたり仕様があり、私一人では解決できないので相談させていただきました。 <仕様は以下の通りです> (1)このプログラム(8桁の2進数を10進数に変換)をする際は、最後に出力する時(printf)以外は関数を使ってはいけません。 (2)キーボードから2進数を入力させる。 (3)空白(ブランク)が入力されても変換可能にする。 (4)入力された2進数は8桁にし、8桁以上の場合はエラーを出す。 (5)2進数の「0」と「1」以外の文字が入力された場合はエラーを出す。 (6)バイナリ変換をし、変換結果を出力する。 以上になります。 まだ、C言語を勉強を習い始めの初心者です。どうか、ご回答のほど宜しくお願いします。
- yuka6319ri
- お礼率0% (0/7)
- C・C++・C#
- 回答数7
- ありがとう数1
- みんなの回答 (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)
やはり入力が一番難しいですね。 キーボードではなく標準入力でよいのであれば、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)
これでどうでしょ? #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)
ちょっと、誤字やら間違い(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)
> (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)
printf以外の関数が使えないのであれば、キーボードからの入力はI/Oを直接制御するしかありません。当然それにはハードウェアの仕様がわかる必要がありますし、環境によってはI/O制御が制限されるので実現できないこともあります。 なお、main関数が受け取る引数は、キーボードから入力されたものとは限らないので、仕様を満たすことができません。
- yaemon_2006
- ベストアンサー率22% (50/220)
#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; }
- 締切済み
- C・C++・C#
- Excelで16桁の16進数を10進数に変換
Excelを使って、16桁の16進数を10進数に変換したいと考えております。 HEX2DECでは、桁数が多すぎてエラーとなってしまいました。 関数の組み合わせでも、VBAで組むのでもどちらでも構いません。 こうすればできる、というようなアイデアだけでも、いただけるとうれしいです。 宜しくお願いいたします。
- ベストアンサー
- オフィス系ソフト
- 2進数を10進数へ変換したいのですが・・・
初心者です、お願いします 任意の2進数を入力してそれを10進数に変換して画面上に出力したいのですが、どなたかヒントをください 自分なりに考えた結果は、[17]以上の配列を用意してそこに格納する、その格納された桁数をstrlenで割り出してからひとつずつ2の重みで計算をしてそれを足していく・・・こんな考え方でいいのでしょうか?ここまで出間違っていることや、それともほかにもっと簡単な方法がありましたら教えてください お願いします。
- ベストアンサー
- C・C++・C#
- コマンドライン引数を使って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; }
- ベストアンサー
- C・C++・C#
- 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を出力する、という方針です。 初期値の設定辺りが間違っているのだと思いますが、これ以上いくら考えても正解が得られません。どこがどう間違っているのでしょうか。どなたかご教授頂きたく、お願い致します。
- ベストアンサー
- C・C++・C#
- 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; } です。
- ベストアンサー
- C・C++・C#