- 締切済み
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
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- yama5140
- ベストアンサー率54% (136/250)
>以下のプログラムに対して、実行結果がなぜそうなるかがわからないので、詳しく教えてください。 まず、自身で実行してみることを強くお勧めします。 ちょっと見でも、実行結果は「そうはなりません」。 ++++++++++++++++++++++++++++++++++++++++++++++++ 以下のプログラムでは、 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)
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]); といった具合に確認してみましょう
- asuncion
- ベストアンサー率33% (2127/6289)
要素の中身が連番だから省略したのかもしれませんが、 仮にそうであるとして、そのことをこちらに伝えなければ わかりません。
- asuncion
- ベストアンサー率33% (2127/6289)
>static int a[12] ={1,2,3,4,5,(省略)・・・,12}; >static int b[12] ={21,22,23,24,(省略)・・・,32}; 要素が12個しかないのですから、 省略せずに、ソースコードをコピー&ペーストして、 全部見せてください。 省略している部分にヒントが隠れている場合があります。
お礼
ありがとうございます。よくわかりました。
補足
お礼言った後にすいません。もうひとつお願いします。 最後の 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); } の意味がよくわからないので、教えてください。