C言語プログラム応用 第5回 2014.5.15 • 多次元配列の受け渡し List6-17 (教科書138ページ) • 有効範囲と記憶域期間 List6-18 (教科書140ページ) List6-19 List6-20 • 演習課題5-1 ★ 提出 • 演習課題5-2 ★ 提出 1 List 6-17 多次元配列の受け渡し #include <stdio.h> /*2行3列の行列を加算する*/ List 5-14 と同じ動作 void mat_add ( const int ma[2][3] , const int mb[2][3], int mc[2][3]) { int i, j ; for ( i=0; i<2; i++) for ( j=0; j<3. j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main (void) { int i, j; int ma[2][3]={ { 1, 2, 3}, {4, 5, 6} }; int mb[2][3]={ { 6, 3, 4}, {5, 1, 2} }; int mc[2][3]={0}; mat_add(ma, mb, mc); for ( i=0; i < 2; i++) { for ( j=0; j < 3; j++) printf(“%3d”, mc*i+*j+); putchar(‘¥n’); } return(0); } /* maとmbの和をmcに格納する関数を呼ぶ */ 2 List 6-18 有効範囲の確認 #include <stdio.h> int x = 700; void print_x(void){ printf ( “x = %d ¥n”, x ); } int main (void) { int i; int x = 800 ; /* 関数の外で定義:ファイル有効範囲 */ /* main関数の中で有効:ブロック有効範囲 */ print_x( ) ; printf ( “x = %d ¥n”, x ); for ( i = 0; i < 5; i++) { int x = i * 100; /* for文の中で有効:ブロック有効範囲 */ printf ( “x = %d ¥n”, x ); } printf ( “x = %d ¥n”, x ); return(0); } 実行結果 x = 700 x = 800 x=0 x = 100 x = 200 x = 300 x = 400 x = 800 List 6-19 自動記憶域期間と静的記憶域期間 静的記憶域期間 #include <stdio.h> int fx = 0; void func(void){ static int sx = 0; int ax = 0; /* 静的記憶域期間 + ファイル有効範囲 */ /* 静的記憶域期間 + ブロック有効範囲 */ static をつけて宣言 関数の外で宣言 main 関数の実行する前に生成さ れ,プログラムの終了時に消滅 /* 自動記憶域期間 + ブロック有効範囲 */ 自動記憶域期間 printf ( “%3d%3d%3d ¥n”, ax++, sx++, fx++); } int main (void) { int i; puts(“ ax sx fx”); puts(“---------------”); for ( i = 0; i < 10; i++) func(); puts(“-------------”); return(0); } 実行結果 ax sx fx --------------0 0 0 0 1 1 0 2 2 0 3 3 0 4 4 0 5 5 0 6 6 0 7 7 0 8 8 0 9 9 --------------- 関数の中でstatic をつけずに宣言 宣言を通過する際に生成され,ブ ロックの終点で消滅 ax は関数 func の実行終了 とともに消滅する List 6-20 暗黙の初期化(静的記憶域期間の変数は0で初期化される) #include <stdio.h> int fx ; int main (void) { static int sx; int ax ; /* 静的記憶域期間 /* 静的記憶域期間 (0で初期化される) */ /* 自動記憶域期間 (不定値で初期化される) */ printf ( “ax = %d¥n”, ax); printf ( “ax = %d¥n”, sx); printf ( “ax = %d¥n”, fx); return(0); } (0で初期化される) */ 実行結果例 ax = 576 sx = 0 fx = 0 演習課題5-1 2行3列の行列maと3行2列の行列mbの積を,2行2列の行列mcに格納する関数 を作成し,下記のプログラムをこの関数を用いるプログラムに変更し,実行せよ. 左は次に示す行列x, yの積を求 め表示するプログラムである. 1 2 3 x 4 5 6 1 5 y 5 3 8 1 #include <stdio.h> int main(void) { int i, j, k; int ma[2][3]={ { 1, 2, 3}, { 4, 5, 6} }; int mb[3][2]={ { 1, 5}, {5, 3}, {8, 1} }; int mc[2][2]={0}; for ( i=0; i < 2; i++) for ( k=0; k < 2; k++) for ( j=0; j < 3; j++) mc[i][k] += ma[i][j] * mb[j][k]; for ( i=0; i < 2; i++) { for ( j=0; j < 2; j++) printf("%3d",mc[i][j]); putchar('¥n'); } return(0); } ここの部分を 関数にして、 main関数の 外に出す 演習課題5-2 左の2つの関数をmain 関数で呼び出 し,非負の整数をキーボードから読み 込み,読み込んだ値を反転させ表示す るプログラムを完成せよ。 ここで,12345 の反転は 54321 とな る。 /* 非負の整数を読む込む関数 */ int scan_unit(void){ int tmp; do { printf(“非負の整数を入力してください。”); scanf(“%d”,&tmp); if ( tmp < 0 ) puts(“負の数を入力しないでください。”); } while (tmp < 0); return (tmp); } /* 整数を反転する関数 */ int rev_int(int num) { int tmp=0; if (num > 0) { do { tmp = tmp*10+num%10; num/=10; } while (num > 0); } return(tmp); } 演習課題5-2 ヒント #include <stdio.h> /* 非負の整数を読む込む関数 */ int scan_unit(void){ } /* 整数を反転する関数 */ int rev_int(int num) { } int main(void) { 非負の整数を読み込み,変数に格納する. 読み込んだ変数を引数として整数を反転 する関数を読み込み,結果を表示する. return(0); } ここを考える. 演習課題5-2 解答例 #include <stdio.h> /* 非負の整数を読む込む関数 */ int scan_unit(void){ int tmp; do { printf(“非負の整数を入力してください。”); scanf(“%d”,&tmp); if ( tmp < 0 ) puts(“負の数を入力しないでください。”); } while (tmp < 0); return (tmp); } /* 整数を反転する関数 */ int rev_int(int num) { int tmp=0; if (num > 0) { do { tmp = tmp*10+num%10; num/=10; }while (num > 0); } return(tmp); } int main(void) { int nx=scan_unit(); return(0); }
© Copyright 2024 ExpyDoc