• 締切済み

C言語プログラム 配列

C言語プログラム初心者です。以下のプログラムに対して、実行結果がなぜそうなるかがわからないので、詳しく教えてください。 #include<stdio.h> int func(int a[ ],int b[ ],int n); main(){ int i,k; static int a[12] ={1,2,3,4,5,(省略)・・・,12};  static int b[12] ={21,22,23,24,(省略)・・・,32}; k = func(a,b,6); k = func(b+3,a+3,6); printf("a = "); for(i=0;i<12;i++)printf("%d",a[i]); printf("\n = b"); for(i=0;i<12;i++)printf("%d",b[i]); printf("\n k = %d\n",k); } int func(int a[ ],int b[ ],int n){ int i,x=0; for(i=0;i<n;i++);{ a[i] = b[i]; x = x+a[i]; } return(x); } 結果: a = 21 22 23 .... 26 7 8 9 10 11 12 b = 21 22 23 .... 26 7 8 9 30 31 32 k = 99

みんなの回答

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

>以下のプログラムに対して、実行結果がなぜそうなるかがわからないので、詳しく教えてください。  まず、自身で実行してみることを強くお勧めします。  ちょっと見でも、実行結果は「そうはなりません」。 ++++++++++++++++++++++++++++++++++++++++++++++++ 以下のプログラムでは、   a = 1234562789101112    = b212223242526272829103132    k = 10    となるはずです(BorlandC++5.5.1で確認)。 《表示の不具合》   少なくとも、for(i=0;i<12;i++)printf("%d",a[i]); の   "%d" を "%d " とスペースを入れる必要があります( "%3d" でも可)。   http://www.k-cube.co.jp/wakaba/server/format.html 《実行結果の不具合》   お示しの「結果」にするには、func() 関数内の   for(i=0;i<n;i++);{ の ) と { の間の ; を取る必要があります。   このままですと、for(i=0;i<n;i++);{ は、i = n; { と同じです( n が正の整数の場合)。  (説明)    i と n が等しくなったとき、i < n の条件と合わず、for 文( ; まで)は終了します。    for 文が終了してから、{ ↓ } 内の処理に移ります。        {       a[i] = b[i];       x = x+a[i];     }    これは、一度のみ( i = n で)実行されます。    ; を取ることで、    { ↑ } 内の処理を含めた } までが for 構文となり、i < n の条件に合う間、{ } 内の処理が実行されます。   なお、{ } 内の処理が1ステップの場合、例えば上で引用した、    for(i=0;i<12;i++)printf("%d",a[i]); のように、{ } を省略することが可能です。 ★ for がどこまで有効か、習得して下さい。   http://www.kumei.ne.jp/c_lang/intro/no_14.htm ++++++++++++++++++++++++++++++++++++++++++++++++++ No.3 さんへの「補足」ソースでは、{ と } が「対」となっていません。   for(i=0; i<n; i++); 末尾の ; を { に変えることで、「対」となります。 #include<stdio.h> int func( int iLeft[], int iRght[], int n ) // // main() 関数の配列名と同じにすると、判りづらくなります // {  int i, x = 0;  for( i = 0; i < n; i++ ){   iLeft[ i ] = iRght[ i ]; // 代入   x = x + iLeft[ i ];  // 加算  }  return( x ); } void SubOutput( char *cMess, int ab[] ) {  int i;  printf( "%s", cMess );  for( i = 0; i < 12; i++ ) printf( "%3d", ab[ i ] );  printf( "\n" ); } void Output( int a[], int b[], int k ) {  SubOutput( "a = ", a );  SubOutput( "b = ", b );  printf( "k = %d\n\n", k ); } void main() {  int k;  int a[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12 };  int b[12] = { 21,22,23,24,25,26,27,28,29,30,31,32 };  Output( a, b, 0 ); // 初期状態  k = func( a, b, 6 );  Output( a, b, k );  k = func( b + 3, a + 3, 6 );  Output( a, b, k ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

k = func(a,b,6); k = func(b+3,a+3,6); これらの関数の呼び出し前と呼出し後で配列aとbの内容を確認なさってはいかがでしょう func(a,b,6); では 配列aの1番目から6番目の要素を配列bの要素で上書きします a : {1,2,3,4,5,6,7,8,9,10,11,12 } b : {21,22,23,24,25,26,27,28,29,30,31,32} がオリジナルで k = func(a,b,6);の実行後は a : {21,22,23,24,25,26,7,8,9,10,11,12 } b : {21,22,23,24,25,26,27,28,29,30,31,32} となり 21から26の合計が関数の戻り値としてkに代入されます k = func(b+3,a+3,6);の実行は b+3ですからbの4番目の要素から6個が対象ですので bの{24,25,26,27,28,29}がaの{24,25,26,7,8,9}で書き換えられますので a : {21,22,23,24,25,26,7,8,9,10,11,12 } b : {21,22,23,24,25,26,7,8,9,30,31,32} となり{24,25,26,7,8,9}の合計ですから kは99になります printf( "func(a,b,6)実行前 ---- \n"); printf("a = "); for(i=0;i<12;i++)printf("%d",a[i]); printf("\nb = "); for(i=0;i<12;i++)printf("%d",b[i]); k = func(a,b,6); printf( "func(b+3,a+3,6)実行前 ---- \n"); printf("a = "); for(i=0;i<12;i++)printf("%d",a[i]); printf("\nb = "); for(i=0;i<12;i++)printf("%d",b[i]); k = func(b+3,a+3,6); printf( "最終結果 ---- \n"); printf("a = "); for(i=0;i<12;i++)printf("%d",a[i]); printf("\nb = "); for(i=0;i<12;i++)printf("%d",b[i]); といった具合に確認してみましょう

19900226
質問者

お礼

ありがとうございます。よくわかりました。

19900226
質問者

補足

 お礼言った後にすいません。もうひとつお願いします。 最後の int func(int a[ ],int b[ ],int n){ int i, x=0; for(i=0; i<n; i++); a[i] =b[i]; x = x+a[i]; } return(x); } の意味がよくわからないので、教えてください。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

要素の中身が連番だから省略したのかもしれませんが、 仮にそうであるとして、そのことをこちらに伝えなければ わかりません。

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

>static int a[12] ={1,2,3,4,5,(省略)・・・,12}; >static int b[12] ={21,22,23,24,(省略)・・・,32}; 要素が12個しかないのですから、 省略せずに、ソースコードをコピー&ペーストして、 全部見せてください。 省略している部分にヒントが隠れている場合があります。

関連するQ&A