• ベストアンサー

最大10文字の10進数文字を16進数に変換し表示する

最大10桁の16進数文字を数字の10進数で表示するコードを記述する事は出来たのですが、その逆が、どうしてもうまくいきません。16進数文字を数字の10進数で表示させるコードをベースに何処の箇所を修正すれば10進数文字を16進数に変換出来るのでしょうか?初心者で難しいコードが解らない為、ダラダラとしたコードで申し訳ございません。 また、今、C言語の文字列の勉強をしてる為、いくつか仕様がありますので、宜しくお願いします。 (1)入力された10進数文字を数値の10進数に変換させた後に、16進数の文字として表示させる。 (2)「printf」以外の関数は使用しない。 (3)最後に表示させる時は「%s」を使用する。 ------------------------------------------------- 【最大10桁の16進数文字を数字の10進数で表示】 #include "stdafx.h" #define MEX 10 /*「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; case 'a': mal=10; break; case 'A': mal=10; break; case 'b': mal=11; break; case 'B': mal=11; break; case 'c': mal=12; break; case 'C': mal=12; break; case 'd': mal=13; break; case 'D': mal=13; break; case 'e': mal=14; break; case 'E': mal=14; break; case 'f': mal=15; break; case 'F': mal=15; break; } return (mal); } /*「function」:位の計算*/ double HexAcc( double n ) { int i; double ans=1; for( i=0; i<n; i++ ){ ans *= 16; } return (ans); } int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0,j=0,k=0,s=0,m=0; char decimal[ 255 ], ditto[ 255 ],sub[ 255 ]; /*入力されない場合*/ if( argc > 1 ){ decimal[s] = argv[1][i]; } else{ printf("16進数を入力してください。\n"); return 1; } /*subに文字として'\0'を代入*/ for( k=0; k<=128; k++ ){ sub[k] = '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' ) || ( ditto[n] == 'A' ) || ( ditto[n] == 'B' ) || ( ditto[n] == 'C' ) || ( ditto[n] == 'D' ) || ( ditto[n] == 'E' ) || ( ditto[n] == 'F' ) || ( ditto[n] == 'a' ) || ( ditto[n] == 'b' ) || ( ditto[n] == 'c' ) || ( ditto[n] == 'd' ) || ( ditto[n] == 'e' ) || ( ditto[n] == 'f' )){ }else{ printf("エラー\n 16進数以外の文字が含まれております。\n"); return 0; } } /*桁数のループ*/ for( n=0; ditto[n] != '\0'; n++ ){ m = m + 1 ; } /*桁数の判断*/ if( m <= MEX ){ }else{ printf("エラー\n入力文字数は、%d文字以内にしてください。\n",MEX); return 0; } /*subにdittoを代入*/ for( n=0; ditto[n] != '\0'; n++){ sub[MEX-m+n] = ditto[n]; } /*'\0'を代入(文字列の終端)*/ sub[MEX] = '\0';*/ /*「double型:addの初期化」「int型:ans初期化」add・ansの初期化*/ double ans=0; double add=0; /*sub[0]からsub[9]の計算*/ for( n=0; sub[n] != '\0'; n++){ ans = ToInt(sub[n]); add += ans * HexAcc(MEX-n-1); } /*最大10桁の16進数文字を数字の10進数で表示*/ printf("最大10桁の16進数文字を数字の10進数に変換した値は %f \n",add);

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

ているようですね。 ・今回は10進文字列→数値→16進文字列に変換したいのですか。  文字列のお勉強をしているようですが、C言語で数値をどう表現しているかも一緒に  お勉強して下さい。毎回『数値の10進数』と表現していますが最初読んだとき意味が  分かりませんでした。文字列を10進数で解釈して数値に変換するなら分かりましたけど。 ・C言語の char、short、int、long、long long 型(unsignedも含む)などはすべて内部では  2進数で表現(管理)しています。なので数値に変換した時点で『数値の10進数』とか  『数値の16進数』とか『数値の2進数』という区別はなくなります。全部2進表現ですので。  (もし表現するならば『文字列を10進数で解釈した数値』という方がしっくりします) >(1)入力された10進数文字を数値の10進数に変換させた後に、16進数の文字として表示させる。  ↑  入力された10進文字列を数値(double型)に変換させた後に16進文字列に変換して表示で良いかな。解釈。  大きく分けて2つの方法があります。 ・1つ目(小さい位の桁から変換)  (1)double 型の ans を 16 で割ったあまりを求める。  (2)求めたあまりを '0'~'9'、'A'~'F'の文字に変換。  (3)double 型の ans を 16 で割って ans に代入する。  (4)double 型の ans が 0 以上なら(1)へ戻り繰り返し、0 ならループを抜ける。  (5)小さい位の桁から変換しているので表示する際は逆に大きいくらいから表示すること。 ・2つ目(大きい位の桁から変換)  (1)最初に double 型の ans が 16 進数で何桁分あるか計測。  (2)仮に8桁であった場合は16^7乗(=268435456)から順に16^6乗、16^5乗、…16^0乗と割っていく。  (3)(2)で割った数値を tmp とすると、この tmp を 16 で割ったあまりを求める。  (4)求めたあまりを '0'~'9'、'A'~'F'の文字に変換。  (5)大きい位の桁(8とか)から小さい位の桁(1)まで順に処理して終了。  この2つの方法で実現できます。1つ目は変換と表示順が異なるので注意。 >(2)「printf」以外の関数は使用しない。  ↑  これは変換関数を自作せよという事でしょう。  上記の方法を関数名 ValueToHexStr() という感じで用意すれば良いでしょう。名前は自由ですが。  プロトタイプは  void ValueToHexStr( char buff[], double value );  という感じでしょうかね。 >(3)最後に表示させる時は「%s」を使用する。  ↑  char buff[ 32 ];  double ans = 11259375.0; ←16進数で『0xABCDEF』が入っている。    ValueToHexStr( buff, ans );  printf( "10進数を16進文字列に変換した文字列は %s\n", buff );  こんな感じの処理を質問にあるソースの最後に追加すれば良いだけです。 ・以上。出来たら捕捉に貼り付けてみて下さい。

mai-07_mai
質問者

お礼

補足欄にコードを書き込めなかったので、新規に質問ページに作成したコードを掲載しました。 http://oshiete1.goo.ne.jp/qa3748427.html

mai-07_mai
質問者

補足

Oh-Orangeさま mai-07_mai12と申します。 毎回、ご親切なアドバイスありがとうございます。 アドバイスを参考に、コードを作成してみました。当初は10桁で作成を行おうとしたのですが最終的に5桁になってしまいました。 どうしても、改善したい点があります。コード上の「商と余りを配列に代入」の箇所をfor文で作成したのですが、うまくいかず1文1文のコードになってしまいました。難しいコードですと理解出来ない場合がありますので「商と余りを配列に代入」する箇所の所だけ、for文で作成するコードを教えていただけないでしょうか?

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★頑張っているようですね。 と1行目を記述したかった。 文字が欠けてたね。

  • yphkz4063
  • ベストアンサー率23% (34/144)
回答No.2

>(1)入力された10進数文字を数値の10進数に変換させた後に、16進数の文字として表示させる。 >(2)「printf」以外の関数は使用しない。 >(3)最後に表示させる時は「%s」を使用する。 32bit限定。不足なら増やしてください。 char *s = "305441741";//10進文字列・・・例 char h[ 9 ];//16進文字列の格納領域 unsigned int n = 0;//10進数値の変数 int i; //printf( "%s\n", s ); //10進文字列表示・・・以下デバッグ用 while( *s ) { n *= 10; n += *s - '0'; s++; } //printf( "%d\n", n ); //10進数値表示 //printf( "%x\n", n ); //16進数値表示 s = h; for( i = 0; i < 8; i++ ) { *s++ = "0123456789ABCDEF"[ n / 0x10000000 ]; n <<= 4; } *s = '\0'; printf( "%s\n", h ); //16進文字列表示・・・これは答え

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

まず、手で計算するときにはどうするかを考えてみます。 例えば、十進数の1234567890(十二億三千四百五十六万七千八百九十)を 十六進数に変換する場合、繰り返し16で割り、商と余りを保存します。 こんな風になります。 16)1234567890 16)77160493  … 2 16)4822530   … 13 16)301408   … 2 16)18838    … 0 16)1177    … 6 16)73     … 9 16)4      … 9 これ以上割れなくなりました。この状態で、 最後の商(4)から始めて、余りを下(最後)から上(最初)に 向かって順にたどります。途中の13はDとなります。 結果として、十進数の1234567890を十六進数に変換すると、499602D2となります。 このロジックをプログラミングしてください。 ただし、10桁の十進数はunsigned long型でも格納しきれない場合があります。この場合は別の考え方が必要です。

関連するQ&A

  • お願いします、教えてください。10進数を2進数に変換するには・・・。

    10進数を2進数に変換するプログラムを作成したのですが、うまく動作しません、どうしても解らないので教えてください。 サンプルコードを元に「define」は5で稼動出来る様にしたいのですが、動作せず困っています。以下の、どの部分を修正すれば変換出来るのでしょうか? ご教授よろしくお願いいたします。 //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 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( 1 > argc ){ } else{ printf("10進数を入力してください。\n"); return 1; } for( k=0; k<255; 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-2] = temp[n]; } chg[HEX]='\0'; //'\0'を代入(文字列の終端)// //2進数に変換// for( ; n>=0; n-- ){ siu[n] = HexInt(chg[n]); } siu[HEX]='\0'; //'\0'を代入(文字列の終端)// printf("\n10進数文字を2進数で変換した値は・・・ %s \n",siu); }

  • 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); }

  • for文を使用して値を代入したいです。教えてください。

    5桁の10進数文字を16進数に変換するコードを作成したのですが、コード上の「商と余りを配列に代入」の箇所をfor文で作成したいのですが、うまくいかず1文1文のコードになってしまいました。「商と余りを配列に代入」する箇所に、当てはまるfor文のコードの所だけ、書き換えたいので教えていただけないでしょうか? //10進数文字を数字の16進数で表示// #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 1: mul='1'; break; case 2: mul='2'; break; case 3: mul='3'; break; case 4: mul='4'; break; case 5: mul='5'; break; case 6: mul='6'; break; case 7: mul='7'; break; case 8: mul='8'; break; case 9: mul='9'; break; case 10: mul='A'; break; case 11: mul='B'; break; case 12: mul='C'; break; case 13: mul='D'; break; case 14: mul='E'; break; case 15: mul='F'; 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,k=0,s=0,m=0; char decimal[255], ditto[255],sub[255],temp[255],flip[255],na[255]; int u=0,odd=0; int a=0,b=0; int sam1=0,sam2=0,sam3=0,sam4=0,sam5=0; int mas1=0,mas2=0,mas3=0,mas4=0,mas5=0; if( argc > 1 ){ decimal[s] = argv[1][i]; } else{ printf("10進数を入力してください。\n"); return 1; } for( k=0; k<=HEX; k++ ){ sub[k] = '0'; } for( k=0; k<=HEX; k++ ){ temp[k] = '0'; } for( k=0; k<=HEX; k++ ){ flip[k] = '0'; } for( k=0; k<=HEX; k++ ){ na[k] = '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++; } } ditto[n]='\0'; 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; } for( n=0; ditto[n] != '\0'; n++){ sub[HEX-m+n] = ditto[n]; } sub[HEX] = '\0'; int ans=0, add=0; for( n=0; sub[n] != '\0'; n++){ ans = ToInt(sub[n]); add += ans * HexAcc(HEX-n-1); } //商と余りを配列に代入// sam1 = add / 16; mas1 = add - sam1 *16; temp[0] = mas1; sam2 = sam1 / 16; mas2 = sam1 - sam2 * 16; temp[1] = mas2; sam3 = sam2 / 16; mas3 = sam2 - sam3 * 16; temp[2] = mas3; sam4 = sam3 / 16; mas4 = sam3 - sam4 * 16; temp[3] = mas4; sam5 = sam4 / 16; mas5 = sam4 - sam5 * 16; temp[4] = mas5; //商と余りを配列に代入・ここまでfor文に変更したいです// temp[5]='\0'; for( a=0; a<2; a++ ){ b = temp[a]; temp[a] = temp[4-a]; temp[4-a] = b; } temp[n]='\0'; for( n=0; sub[n] != '\0'; n++){ na[n] = HexInt(temp[n]); } na[5]='\0'; printf("\n10進数文字を16進数で変換した値は %s \n",na); }

  • コマンドライン引数を使って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進数を10進数に変換させたい

    先日も同じプログラムについて質問させていただきました。まだ解決しないので再度、質問させてください。私なりに考えてコードを書いたのですが、おもったように2進数を10進数に変換出来ません。C言語を習い始めたばかりで難しいコードが解りません。出来ましたら作成途中のコードをベースに正常に動くプログラムを教えていただければ幸いです。仕様としては、コマンドラインを使って引数を持たせて動くようにすることです。作成環境は「Windows XP」「Visual Studio .net 2003」 -------------------------------------------------------- <作成したコード> // binary.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include "stdafx.h" #include <stdlib.h> int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0; char decimal[ 128 ], binary[ 128 ]; if( argc < 2 ){ printf("2進数を入力してください。\n"); return 0; } // printf( "arg[0] = %s\n", argv[0] ); // printf( "arg[1] = %s\n", argv[1] ); for( i=0; argv[1][i] != '\0'; i++ ){ binary[i] = argv[1][i]; } binary[i] = '\0'; //空白文字のチェック/////////////////////////////////////////////// for( i=0; i<binary[i]; i++ ){ if( binary[ i ] != ' ' ){ decimal[ n ] = binary[ i ]; n++; } } //'\0'を代入(文字列の終端)/////////////////////////////////////////////////// decimal[ n ]='\0'; //「0」と「1」のループ/////////////////////////////////////////////////////// for( i=0; i<decimal[i]; i++ ){ if(( decimal[ n ] == '0' ) || ( decimal[ n ] == '1' )){ //「0」または「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 1; } -------------------------------------------------------- 近くにC言語を相談出来る方がいません、この場をお借りして解決の糸口を見つけたいです。宜しくお願いします。

  • 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; }

  • 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);

  • 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"); } 期待した結果が得られないのですがどこが違っているのか教えていただきたいです、お願いします。

  • 【c++】2進数の表示が上手くいきません

    サブ関数を利用して、-15~15までの値を1刻みで10進数16進数8進数2進数を表示するプログラムを作っているのですが悩んでいます。 以下のようにやってるのですがデバッグが上手くいきません。 どこが悪いのでしょうか? #include<stdio.h> void sub(int a) { int i,wc; for(i=31;i>=0;i--) { wc=(a>>i)&0x01; if(i%4==3) printf(" "); printf("%1d",wc); } printf("\n"); return; } int main(void) { int wc,a,s,j,b; printf("10進数,16進数,8進数,2進数\n"); for(s=-15;s<=15;s++) { printf("%d %x %o \n",s,s,s); printf("%d\n",sub(a)); } return 0; } 初心者なのでありえない間違えがあるかと思います。 ご教授お願いしますm(_ _)m

  • 教えて下さい 文字数最大制限20文字まで暗号化

    忙しい中失礼します。 先程質問したものですが、1つ聞き忘れていたことがあるため、再度質問させてください。 現在暗号化(原文字から3文字ずらす)するためのプログラムを作成しています。 下記のプログラムの文字数制限を20文字にしたいのですが、どこをどういじれば 20文字 という条件制約を加えることが出来るのでしょうか。 文字数制限20文字:PROGRAM HA MUZUKASII(→ここまでで20文字) SOSITE TAIHEN(→21文字目からは表示されない) 暗号に変換後:SURJUDP KD PXCXNDCLL(→20文字目までが表示される。それ以降は表示されない) 宜しければ教えて下さい。お願いします。 下記が私のプログラムです。 #include <stdio.h> #include <stdlib.h> int main(void) { char *upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int c, i; while((c = getchar()) != '\n') { for(i = 0; upper[i]; i++) { if(c == upper[i]) { c = upper[(i + 3) % 26]; break; } } putchar(c); } system("pause"); return 0; }

専門家に質問してみよう