• ベストアンサー

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

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

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

★繰り返し文(for,while,do-while)を復習しなおしましょう。 ・過去に幾つかのソースを見ましたが上から順に処理するやり方なら理解できるようですね。  繰り返し文は変化する場所を変数に置き換えてしまえば良いだけなんですが…。  そんなに難しく考えずに最初は上から下へ処理するソースを書きましょう。  その後に変化する場所を変数に置き換えて for 文などで書き直せば分かりやすいです。 //商と余りを配列に代入// 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;  ↓ 商と余りに『/』と『%』演算子を使って書き直してみる。  ↓ sam1 = add / 16; ←商 mas1 = add % 16; ←余り temp[0] = mas1; sam2 = sam1 / 16; mas2 = sam1 % 16; temp[1] = mas2; sam3 = sam2 / 16; mas3 = sam2 % 16; temp[2] = mas3; sam4 = sam3 / 16; mas4 = sam3 % 16; temp[3] = mas4; sam5 = sam4 / 16; mas5 = sam4 % 16; temp[4] = mas5;  ↓ 『mas1』~『mas5』を直接 temp[n] に代入。 『商』より『余り』を先に計算するように順番を変える。  ↓ temp[0] = add % 16; sam1 = add / 16; temp[1] = sam1 % 16; sam2 = sam1 / 16; temp[2] = sam2 % 16; sam3 = sam2 / 16; temp[3] = sam3 % 16; sam4 = sam3 / 16; temp[4] = sam4 % 16; sam5 = sam4 / 16;  ↓ 『sam1』~『sam5』を『add』の1つに代入する。 『sam1』を『add』にその次の行の『sam2』を『add』…と変換。  ↓ temp[0] = add % 16; add = add / 16; temp[1] = add % 16; add = add / 16; temp[2] = add % 16; add = add / 16; temp[3] = add % 16; add = add / 16; temp[4] = add % 16; add = add / 16;  ↓ temp[0]~temp[4]の添え字を変数iで置き換える  ↓ i=0; temp[i++] = add % 16; add = add / 16; temp[i++] = add % 16; add = add / 16; temp[i++] = add % 16; add = add / 16; temp[i++] = add % 16; add = add / 16; temp[i++] = add % 16; add = add / 16;  ↓ さぁ。for文に書き換えてみて下さい。 これでfor文を使って配列に余りを格納できます。 出来上がったソースは補足に貼り付けてみて下さい。 それでゎ。

mai-07_mai
質問者

補足

Oh-Orangeさま いつも解り易い、ご説明をいただき本当に感謝しております。 私の理解度まで把握していただき、丁寧な回答に満足です。以下に、アドバイスを頂いた内容でfor文を作成しました。 for( n=0; sub[n] !='\0'; n++){ temp[n] = add %16; add = add / 16; } 今度は、10進数を2進数に変換するプログラムを作成しているのですが解らず煮詰まってます。お暇な時に、ご教授いただければ幸いです。 http://oshiete1.goo.ne.jp/qa3766282.html

その他の回答 (4)

noname#50176
noname#50176
回答No.5

差し支えなければ以下の1行でどうでしょうか? for (i=0;add && i<HEX-1;add/=16) temp[i++]=add%16;

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

>5桁の10進数文字を16進数に変換する ★「10進数5桁の文字列を16進数で『表記』する」だよね。 そのつもりで、ソースを見ると・・。 ★ ToInt() 関数 ・関数名・戻り値の型と、関数の型が・・、(少し経つと自分でも・・)。 ・10行ほどの switch 文と return 文は、1行の return( cInt - 0x30 ); と同じ。 ・メモリの中は、どうなっているか把握する(参考URL) ★ HexInt() 関数 ・関数名が・・、DecChr2HexChr() 位の工夫も・・(名は体を表す?)。 ・case 文で 0-15 の「整数」を用いてるけど、まっ、127 を超えないことが判ってのことか。 ・視認性をよくするなら、呼び出すおおもとの配列 temp[] は、整数がいいのでは・・。 ・ソースは、if 文を使って、    if( 10 > eInt ) return( eInt + 0x30 );  if( 10 == eInt ) return( 'A' );  if( 11 == eInt ) return( 'B' );  if( 12 == eInt ) return( 'C' );  if( 13 == eInt ) return( 'D' );  if( 14 == eInt ) return( 'E' );  if( 15 == eInt ) return( 'F' );  return( '@' );    少しスッキリするかな。 ★下の引用、ちょっと工夫の余地が・・。  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++ ){     if( ! isdigit( ditto[n] ){       printf( "エラー\n 10進数を入力してください。\n" );    return 0;   }  }  または、if 文部分を     if( ( '0' > ditto[n] ) || ( '9' < ditto[n] ) ){       printf( "エラー\n 10進数を入力してください。\n" );    return 0;   }  の方が、スッキリしている。  ◆ヒント ・したいことの関数はないか、if 文で連続するものを判定する場合、簡略化出来ないか。 ・質問者様のですと、却って '0' から '9' までの間に《除外するもの》があるのか、と別のことを考えてしまう。 ●と、つらつらと書きましたが、プログラムが書けるようになって、自分の「思っていること」が、ほぼ実現できるようになって、じゃあ今度はそれを「スマート」に、と《非常に良い》プログラミングの発展状況が伝わってきます。 ●ともかく、たくさん書きましょう。 ●その中で、いろんな工夫(バグを潜ませない自分なりの工夫記述等)がなされることでしょう。 年寄りのソースを示します(参考にはなりません、「文字」は?、「数」は?が学習できない)。 でも「機能」的には質問者様の目的にかなっていると思います。 なお、入力した数字列も表示しているため、「数字でない」、「桁あふれ」のチェックはしていません。 (入力した人が、自分の入力ミスを一番よく判る。また、int の限界も・・) #include <stdio.h> #include <stdlib.h> void main( int iArgc, char *cArgv[] ) {  int iVal;  if( 2 != iArgc ){   printf( ">hoge.exe 12345\n" );   exit( 0 );  }  iVal = atoi( cArgv[1] );  printf( "in=%s Dec=%d Hex=%X\n", cArgv[1], iVal, iVal ); } 注:インデントに全角空白を用いています。

参考URL:
http://e-words.jp/p/r-ascii.html
noname#50176
noname#50176
回答No.2

あくまで骨組みとしてなのですが、 以下ではどうですか? : : for (i=0;add&240&&(i<HEX-1);i++) {  sam=add/16;  mas=add-sam*16;  add=mas;  temp[i]=sam; } temp[i]=add%16; for( a=0; a<2; a++ ){ b = temp[a]; temp[a] = temp[4-a]; temp[4-a] = b; } temp[++i]='\0'; : :

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

あえて答えは書きません. 例えば sam2 = sam1 / 16; mas2 = sam1 - sam2 * 16; temp[1] = mas2; sam3 = sam2 / 16; mas3 = sam2 - sam3 * 16; temp[2] = mas3; の部分は, 前半が「前段から sam1 を受け取り次段に sam2 を送る」, 後半が「前段から sam2 を受け取り次段に sam3 を送る」という形です. これでは都合がわるいので, まず「前段から受け取る変数と次段に送る変数を同じにする」ことをしてみてください. また, mas2 や mas3 はそれぞれの部分でしか使われていませんから, 実際には 1つの変数にまとめることができます. このようにして, 「配列の添字以外は同じ」という形にしておけば, 簡単に for ループに変更できるはずです.

mai-07_mai
質問者

補足

Tacosanさま mai-07_maiと申します。 ご返答、誠にありがとうございます。 アドバイスされた内容でコードを考え記述しましたが、商の値しか代入されず正確な変換が行えませんでした。C言語を習い始めたばかりで、どのようなロジックを組んでいいかが解りません。出来ましたらfor文のコードを教えていただければ大変、助かります。宜しくお願いします。

関連するQ&A