(5月15日):授業の資料 関数2

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