• ベストアンサー

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

  • お願いします、教えてください。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); }

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

  • 簡単なfor文

    #include <stdio.h> int main(void) { int n; int i; for(n=0 ;n<10;n++){ for(i=0; i<=n ;i++){ printf("*"); } printf("\n"); } return(0); } こういったプログラムを実行すると、以下のように表示されるのですがなんででしょうか? * ** *** 以下略 自分の考えですと、*は毎回一つしか表示されずに改行されると思うのですが・・・ * * * * 以下略 i個分の*を表示するなどという指示をプログラムはなされていないと思うのですがなぜなんでしょうか? 一つ目のfor文では10回ループが繰り返され改行 二つ目のfor文で*を永遠に表示 といった僕の解釈ではおかしいですよね。 当方C言語初心者で、周りに聞く人がいないため教えていただけると非常に助かりますm(__)m

  • for文の中にswitch文はいれられない??

    題名の通りfor文の中にswitch文はいれられないのでしょうか? 例えばの例ですが、 for(i=1;i<3;i++){ switch (i) { case 1: printf("←\r"); Sleep(400); break; case 3: printf("↑\r"); Sleep(400); break; default: printf("others\n"); break; } } このようなプログラムはかけないのでしょうか。 実行すると何も表示されないのですが、どこかおかしいのでしょうか?? どなたかご指導お願いします><

  • C言語 switch文について

    C言語初心者です。 以下のようにC言語でプログラムを書いてみたのですが、 一つの入力に対して、対応するcase文に加えてdefault部の内容も表示されてしまいます。 (aを入力すると day before yesterday と day after tomorrowが表示されるような感じです) i,j,k などを使ってどう実行されているかを調べると、どうやら一回の入力に対して二回switch部を回っているようです。 そうにしろなぜaに対してdefaultへ飛ぶのか理解できませんが・・ また、最初の宣言をchar から int にして(caseは、case 1とかに適当に変えて)やると、正常に動くのも不可解です。 どうなっているんでしょうか・・ どなたかご教授願えると幸いです。よろしくお願いいたします。 #include <stdio.h> int main(void) { char n; int i=0,j=0,k=0; k++; while(scanf("%c",&n),n!='E'){ i++; switch(n){ case 'a': puts("day before yesterday"); break; case 'b': puts("yesterday"); break; case 'c': puts("today"); break; case 'd': puts("tomorrow"); break; default: puts("day after tomorrow"); break; j++; } } printf("%d\n",i); printf("%d\n",j); printf("%d\n",k); return 0; }

  • FFTをc言語でプログラミング

    助けてください↓c言語でFFTをプログラミングしているのですがバグが発見できずに困り果て居ます。 プログラミングは以下の通りです。画像はカラーではなく、グレースケールのMANDRILLに対して行っています。 for(n=0;n<M;n++){    for(i=0;i<N;i++){ for(j=0;j<N;j++){ Imbatx[n][i][j]=0; } } } //行FFT //まずはソート for(i=0;i<N;i++){ int x=1; for(j=0;j<N;j++){ if(j<N/2){        //左半分 if(j%2!=0) //jが奇数 batx[0][i][j]=imagein[i][j+N/2-1]; if(j%2==0) //jが偶数 batx[0][i][j]=imagein[i][j]; } if(N/2<=j && j<N){ //右半分 if(j%2!=0) //jが奇数 batx[0][i][j]=imagein[i][x+N/2-1];      if(j%2==0) //jが偶数 batx[0][i][j]=imagein[i][x]; x++; } } } for(i=0;i<N;i++){ for(n=1;n<M+1;n++){ k=0; for(j=0;j<N;j++){ mul=(int)pow(2.0,(double)n); if(j%mul < mul/2){ //偶数列 batx[n][i][j] = batx[n-1][i][j]+cos(2*PI*k/mul)*batx[n-1][i][j+mul/2]- sin(2*PI*k/mul)*Imbatx[n-1][i][j+mul/2]; Imbatx[n][i][j]=Imbatx[n-1][i][j]+sin(2*PI*k/mul)*batx[n-1][i][j+mul/2]+ cos(2*PI*k/mul)*Imbatx[n-1][i][j+mul/2]; k++; } else{ //奇数列 batx[n][i][j] = cos(2*PI*k/mul)*batx[n-1][i][j] + batx[n-1][i][j-mul/2]- sin(2*PI*k/mul)*Imbatx[n-1][i][j]; Imbatx[n][i][j]=Imbatx[n-1][i][j-mul/2]+sin(2*PI*k/mul)*batx[n-1][i][j]+cos(2*PI*k/mul)*Imbatx[n-1][i][j]; k++; } Re_countx[i][j] = batx[M][i][j]; Im_countx[i][j] = Imbatx[M][i][j]; } } } for(i=0;i<N;i++){ for(j=0;j<N;j++){ FFT[i][j]=pow(pow(Re_countx[i][j],2)+pow(Im_countx[i][j],2),0.5); FFT[i][j]=log10(FFT[i][j]); if(FFT[i][j]>max) max=FFT[i][j]; imageout[i][j]=(unsigned char)255*FFT[i][j]/max; } } 結果的に出力される画像は以下の画像になります。 ごらんのように縞模様が出てしまいます。 分かる方どうかお願いいたします。

  • ガウスの消去法、後退代入について

    ガウスの消去法で、n変数n式の連立一次方程式を解くプログラムを 作っています。 ですが、前進消去およびピボット選択ははおそらくできたのですが 後退代入が悪いのか、答えが出ません。 もしかしたら前進消去部分も悪いのかもしれませんが;; いろいろ調べたのですが どうしたら直るのかわからなくなってしまいました。 どのようにして直せばいいのか教えてください。 プログラムは以下です。 #include<stdio.h> #include<math.h> #define SIZE 100/*上限MAXのマクロ定義*/ #define EPS (1.0e-5) int main() { /*変数宣言*/ int n; /*連立方程式の式数*/ int i; /*1つ目のループカウンタ*/ int j; /*2つ目のループカウンタ*/ int k;/*3つ目のループカウンタ*/ int pivot; /*pivot選択を行う際に使用する変数*/ double max; /*pivot選択用の絶対値が最大の値*/ double matrix_a[SIZE][SIZE]; /*変数xijの係数aij*/ double matrix_b[SIZE]; /*式iの定数項bi*/ double a_hozon;/*matrix_aの値を一時保存する変数*/ double b_hozon;/*matrix_bの値を一時保存する変数*/ double r_hozon;/*前進消去法をする時使用する値を一時保存する変数*/ int l; int m; /*入力処理*/ /*未知数nの入力*/ printf("n変数n式の連立一次方程式を解きます。\n"); printf("式数n(1~100)を入力してください。 n=?\n"); scanf("%d",&n); /*未知数nのチェック*/ if(n>SIZE||n<1) { printf("\n\nn=%dはプログラムの利用可能範囲外です。\n",n); return -1; } printf("%d変数%d式の一次方程式を入力して下さい。\n",n,n); printf("入力は、式毎に係数、定数項の順に行ってください。\n\n"); printf("連立一次方程式の拡大係数行列を表示します。\n"); for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%lf",&matrix_a[i][j]); } scanf("%lf",&matrix_b[i]); } for(i=0; i<n; i++) { for(j=0; j<n; j++) { printf("%6.2f",matrix_a[i][j]); } printf("|%6.2f\n",matrix_b[i]); } printf("計算します。\n"); /*pivot選択*/ for(k=0; k<n; k++) { max=0.0; pivot=0; for(i=k; i<n; i++) { if(fabs(matrix_a[i][k])>max) { max=fabs(matrix_a[i][k]); pivot=i; } } if(matrix_a[pivot][k]==0.0) { printf("正則性なし\n"); } if(pivot!=k) { for(j=0; j<n; j++) { a_hozon = matrix_a[k][j]; matrix_a[k][j] = matrix_a[pivot][j]; matrix_a[pivot][j] = a_hozon; } b_hozon = matrix_b[k]; matrix_b[k] = matrix_b[pivot]; matrix_b[pivot] = b_hozon; } } /*入れ換え後の行列を表示*/ for(l=0; l<n; l++) { for(m=0; m<n; m++) { printf("%6.2f",matrix_a[l][m]); } printf("|%6.2f\n",matrix_b[l]); } /*消去法*/ for(k=0; k<n; k++) { for(i=k+1; i<n-1; i++) { r_hozon = matrix_a[i][k]/matrix_a[k][k]; for(j=k; j<n; j++) { matrix_a[i][j] = matrix_a[i][j]-r_hozon*matrix_a[k][j]; } matrix_b[i] = matrix_b[i]-r_hozon*matrix_b[k]; } } /*後退代入*/ for(i=n-1; i>=0; i--) { matrix_b[i]=0.0; for(j=i+1; j<n; j++) { matrix_b[i]=matrix_b[i]-matrix_a[i][j]*matrix_b[j]; } } /* for(i=n-1; i>0; i--) { temp = 0.0; for(j=i+1; j<n; j++) { xn = b[n]/a[n][n]; xn-1 = (-a[n-1][n]*x[n]+b[n-1])/a[n-1][n-1]; xn-2 = (-a[n-2][n-1]*x[n-2]+a[n-2][n]*x[n]+b[n-2])/a[n-2][n-2]; xn-j = (-a[i][n-j]*x[i+1]+b[i])/a[i][i]; temp = matrix_a[][] temp=temp+matrix_a[i][j]*matrix_a[j][n]; matrix_a[i][n]=matrix_a[i][n]-temp; matrix_a[i][n]=matrix_a[i][n]/matrix_a[i][i]; } } */ /*不定、不能の判別*/ if(matrix_a[k][k]<EPS) { printf("解は一意に求まらない。\n"); return -1; } /*出力処理*/ printf("連立一次方程式の解を表示します。\n"); for(i=0; i<n; i++) { printf("x%d = %6.2f\n",i,matrix_b[i]); } return 0; }

  • JAVAのfor文で困っています。

    JAVAの勉強をしていますが、本の練習問題でわからなくて困っています。for文で以下の処理を行いたいです(do,whileはなしです)が、 *を5個ごとに改行したいのですが、改行してくれません。 問題の部分↓ if (n % 5 == 0) System.out.println(); 何か良い方法はありませんか?お願いします。 ------------------------------------------------- //(数を読み込んで)だ個数だけ * を5個ごと改行しながら表示 int n = 0; for (int i = n; n <= 0;){ System.out.print("何個*を表示しますか : "); n = stdIn.nextInt(); } for (int i = 1; i <= n; i++){ System.out.print("*"); if (n % 5 == 0) System.out.println(); } ------------------------------------------------

    • ベストアンサー
    • Java
  • do - while 文

    以下のコードをコンパイル後実行すると、0~9までの出現回数がわかるのですが、処理を続けますか?と出た後yを入力するともう一度 do 以降を実行するようにしたいのですが、yを入力する前にプログラムが終了してしまいます。何がいけないんでしょうか? #include <iostream> using namespace std; int main (void) { int i; char cont; char c; int count[10] = {0}; do{ while (cin.get(c)){ switch (c){ case '0': count[0]++; break; case '1': count[1]++; break; case '2': count[2]++; break; case '3': count[3]++; break; case '4': count[4]++; break; case '5': count[5]++; break; case '6': count[6]++; break; case '7': count[7]++; break; case '8': count[8]++; break; case '9': count[9]++; break; } } for (i =0; i < 10; i++) cout << i << "の出現回数は" << count[i] << "\n"; cout <<"処理を続けますか?(y/N)"; cin >>cont; }while (cont == 'y'); }

専門家に質問してみよう