• 締切済み

2進数の出力について

10進数から2進数に変換するプログラムを作成したのですが、出力する値が5桁以上になると正確な値が出力されず悩んでいます。仕様としましては下記の内容です。 defineを使用し入力文字数を変更出来る(最大5桁入力可能) 入力された最大「99999」の10進数を2進数に変換。 下記のプログラムの何処を修正すれば出力出来るのでしょうか? //10進数文字を数字の2進数で表示// #include "stdafx.h" #define HEX 5 //「function」:入力文字された文字の処理// char ToInt( char cInt) { int mal=0; switch (cInt){ case '0': mal=0; break; case '1': mal=1; break; case '2': mal=2; break; case '3': mal=3; break; case '4': mal=4; break; case '5': mal=5; break; case '6': mal=6; break; case '7': mal=7; break; case '8': mal=8; break; case '9': mal=9; break; } return (mal); } //「function」:入力文字された文字数// char HexInt( char eInt) { char mul=0; switch (eInt){ case '0': mul='0'; break; case 0: mul='0'; break; case 1: mul='1'; break; } return (mul); } //「function」:桁数の計算(10×指数を計算)// int HexAcc( int n ) { int i; int ans=1; for( i=0; i<n; i++ ){ ans *= 10; } return (ans); } int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0,j=0,s=0,k=0,m=0,e=0,ans=0, add=0; char decimal[255], ditto[255],sub[255],temp[255],chg[255],siu[255]; //入力されない場合// if( argc > 1){ } else{ printf("10進数を入力してください。\n"); return 1; } for( k=0; k < HEX; k++ ){ //文字として'0'を代入//////////////////////////// sub[k] = '0'; //subに文字として'0'を代入// temp[k] = '0'; //tempに文字として'0'を代入// chg[k] = '0'; //chgに文字として'0'を代入// siu[k] = '0'; //siuに文字として'0'を代入// } //入力された文字数を受取る// for( i=0; argv[1][i] != '\0'; i++ ){ decimal[i] = argv[1][i]; } decimal[i] = '\0'; //空白文字のチェック// for( i=0; decimal[i] != '\0'; i++ ){ if( decimal[i] != ' ' ){ ditto[n] = decimal[i]; n++; } } //'\0'を代入(文字列の終端)// ditto[n]='\0'; //「0」から「9」のループ// for( n=0; ditto[n] != '\0'; n++ ){ if(( ditto[n] == '0' ) || ( ditto[n] == '1' ) || ( ditto[n] == '2' ) || ( ditto[n] == '3' ) || ( ditto[n] == '4' ) || ( ditto[n] == '5' ) || ( ditto[n] == '6' ) || ( ditto[n] == '7' ) || ( ditto[n] == '8' ) || ( ditto[n] == '9' )){ }else{ printf("エラー\n 10進数を入力してください。\n"); return 0; } } //桁数のループ// for( n=0; ditto[n] != '\0'; n++ ){ m = m + 1 ; } //桁数の判断// if( m <= HEX ){ }else{ printf("エラー\n入力文字数は、%d文字以内にしてください。\n",HEX); return 0; } //subにdittoを代入// for( n=0; ditto[n] != '\0'; n++){ sub[HEX-m+n] = ditto[n]; } sub[HEX] = '\0'; //'\0'を代入(文字列の終端)// //sub[0]からsub[9]の計算// for( n=0; sub[n] != '\0'; n++){ ans = ToInt(sub[n]); add += ans * HexAcc(HEX-n-1); } //2進数の計算・商が0になるまで// for( n=0; sub[n] != '\0'; n++ ){ temp[n] = add % 2; add = add / 2; if( add == 0){ break; } } temp[HEX] = '\0'; //'\0'を代入(文字列の終端)// //桁数のチェック(商・余り)// for( ; n>=0; n-- ){ e = e++; } //temp・値の入替え「tempからchg」// for( n=0; sub[n] != '\0'; n++ ){ chg[HEX-n-1] = temp[n]; } chg[HEX]='\0'; //'\0'を代入(文字列の終端)// //2進数に変換// for( n=HEX; n>=0; n--){ siu[n] = HexInt(chg[n]); } siu[HEX]='\0'; //'\0'を代入(文字列の終端)// //10進数文字を2進数で表示// printf("\n10進数文字を2進数で変換した値は・・・ %s \n",siu); }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

大枠は面倒なので細かいところだけ: やりがちなんですが e = e++; はやってはいけません. この 1文に e の変更が 2回ある (= による代入と ++ によるインクリメント) ので, 結果がどうなるか (さらにはプログラムの実行結果がどうなるか) については誰も保証してくれません.

すると、全ての回答が全文表示されます。
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

★10進数4桁の 1023 は2進数の10桁です。 ☆質問者様は、10進数5桁を2進数5桁で表そうとしてします。 ところで、 //桁数のチェック(商・余り)// for( ; n>=0; n-- ){ e = e++; } これは、e = n + 1; でよいのでは? 同様の記述が多く見られることから、 質問者様は、より複雑なプログラムがいいプログラム、と考えていませんか。 プログラムはシンプルが「命」です。 ------------------------------------ ★他の方の同種質問への回答で用いたものを2進数表記の【参考】に・・。 #include <stdio.h> #include <stdlib.h> void toBinString( int iVal ) {  int i, nn = 31+3;  char cBinStr[64] = ""; // 文字列初期化  printf( "%11d", iVal ); // 10進数表記  for( i = 0; i < 32; i++ ){   if( i && ( 0 == ( i % 8 ) ) ){    cBinStr[nn--] = 0x20; // スペース   }   cBinStr[nn--] = 0x30 + abs( iVal % 2 ); // 数→文字、格納   iVal /= 2;  }  printf( " %s\n", cBinStr ); // 2進数表記 } void main() {  int k, iVal = 2147483645;  for( k = 0; k < 5; k++ ){   toBinString( iVal++ );  } } 注:インデントに全角空白を用いています(タブに置換して実行してみて下さい)。

すると、全ての回答が全文表示されます。
noname#50176
noname#50176
回答No.4

NO2 です。 <追加補足> //桁数のチェック(商・余り)// for( ; n>=0; n-- ){ e = e++; } <誤>これでは等差2の等差数列値になってしまいます。 ではなく <正>これでは等差1の等差数列値を再度等号で格納している でした

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

2進数への変換ループも終了条件がこれではまずいですよ sub[n]!='\0'ですと 文字列subの終端までしか走査しません やるなら add!=0 として 商が0以外ならループ続行 または add>0 として 商が0より大きいなら続行 といった具合にします temp自体は文字列ではないので 終端文字として'\0'を使うのはナンセンスに思います データの『0』と終端文字の『'\0'』をどのように区別するつもりなのでしょう Cのなかでは両者とも同じ物と考えてしまいますよ 文字列の終端文字として'\0'を使うのは一般的な文字列のなかに'\0'が含まれないために採用されています 計算したtempからchgに変換するループも何回ループするのかを見直しましょう chgの添え字と tempの添え字もこれでいいのか考えて見ましょう 2進数に変換するループで  siu[n] = HexInt( chg[n] ); としていますが このnは5から0までしか変化しません

すると、全ての回答が全文表示されます。
noname#50176
noname#50176
回答No.2

まず以下に変更して見て下さい。 動作するはずです。 <リスト> : : //2進数の計算・商が0になるまで// n=0; do { temp[n++] = add % 2; add = add / 2; } while (add); //桁数のチェック(商・余り)// e=n; //temp・値の入替え「tempからchg」// for(n=0 ; n<e ; n++ ){ chg[e-n-1] = temp[n]; } //2進数に変換// for( n=e-1; n>=0; n--){ siu[n] = HexInt(chg[n]); } siu[e]='\0'; //'\0'を代入(文字列の終端)// //10進数文字を2進数で表示// printf("\n10進数文字を2進数で変換した値は・・・ %s \n",siu); : : <コメント改善点> //sub[0]からsub[9]の計算// は //sub[0]からsub[n-1]の計算// ですね。 <元のリストの誤記> for( n=0; sub[n] != '\0'; n++ ){ ※これでは、10進数桁数分しかループしない したがって、HEX=5 以上である6桁からおかしくなる temp[n] = add % 2; add = add / 2; if( add == 0){ break; } } temp[HEX] = '\0'; //'\0'を代入(文字列の終端)// ※2進剰余値は整数配列です。 //桁数のチェック(商・余り)// for( ; n>=0; n-- ){ e = e++; } ※これでは等差2の等差数列値になってしまいます。 直前の「n」桁数とすればOKです。 for( n=0; sub[n] != '\0'; n++ ){ chg[HEX-n-1] = temp[n]; } chg[HEX]='\0'; //'\0'を代入(文字列の終端)// //2進数に変換// for( n=HEX; n>=0; n--){ siu[n] = HexInt(chg[n]); } HEX から逆インデックスを算出しても2進数値が10進桁にカット されてしまいます。 2進桁の「e」を使いましょう。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

> 出力する値が5桁以上になると正確な値が出力されず悩んでいます。 どういった入力データを与えたとき、 出力結果がどうなってしまうのでしょうか? 悩んでいらっしゃる内容を具体的にお伝えください。 なお、そのコードに拘泥する必要性がどこまであるかが、いささか疑問ではあります。

すると、全ての回答が全文表示されます。

関連するQ&A