4 データを渡す方法(p.214)

関数を使って処理を行う場合,呼び出す側の関数とと呼び出される側の関数とでデータの 受け渡しが必要である.呼び出す側は値(あるいは変数)を用意し,呼び出される側は変数 を用意する.呼び出す側の値を呼び出される側の変数にコピーすることで,データの受け 渡しが行われる.呼び出す側の関数の値(変数)を実引数,呼び出される側の関数の変数を 仮引数と言う.図3に示しているので,実引数と仮引数の 違いを理解せよ.

関数へのデータの渡し方に,2つの方法がある(通常は値渡し).

値渡し
呼び出す側と呼ばれる側の関数が各々変数を用意する.仮引数側の 変数の値は,実引数の側の変数の値のコピーとなる.呼ばれた関 数が変数の値を変えても,呼び 出した側の変数値には,影響が ない.
アドレス渡し
呼び出す側の実引数は,アドレスです.呼ばれる側は,ポ イ ンターを用意して,実引数のアドレスを受け取ります.呼ばれた 関 数が処理をすると,呼び出した側の実引数の変数にも影響が あります.

それでは,データの受け渡しについて,教科書を見ながら,練習せよ.

4.1 値による呼び出し(p.214)

以下の練習問題を実施せよ.
[練習1]
main関数から,角度[度]の値を関数に渡して,プログラマー 作成の関数で,$ \sin$$ \cos$$ \tan$を計算して,印刷す る.このプログラムを作成せよ.ただし,main関数で繰 り返し文を使い,0〜360[度]まで,1度間隔でデータを送るこ と.ヒントは以下の通り.
  • #include <math.h>を書く.三角関数のような 数学関数を使う場合,math.hというヘッダーファ イルが必要である.
  • 三角関数は,sin(a),cos(a),tan(a)と書けば計 算できる.単位は,[ラジアン]である.
  • コンパイルには,-lmオプションが必要で ある.このオプションは数学関数を使うときに必要で ある.実際には次のようにする.C言語のソースファ イルがhogehoge.cで,機械語の実行ファイルが fugafugaである.
    gcc -lm -o fugafuga hogehoge.c
[練習2]
リスト5の変数i,jの値が入れ替わら ない理由を考えよ.

   1 #include <stdio.h>
   2 
   3 void swap(int i, int j);               /* プロトタイプ宣言 */
   4 
   5 /*=====================================================================*/
   6 /*    メイン関数                                                      */
   7 /*=====================================================================*/
   8 int main(void){
   9   int a=2, b=3;
  10 
  11   printf("a=%d   b=%d\n", a, b);
  12 
  13   swap(a, b);
  14 
  15   printf("a=%d   b=%d\n", a, b);
  16 
  17   return 0;
  18 }
  19 
  20 /*=====================================================================*/
  21 /*    swap関数                                                      */
  22 /*=====================================================================*/
  23 void swap(int i, int j){
  24   int temp;
  25 
  26   temp = i;
  27   i=j;
  28   j=temp;
  29 
  30 }

4.2 アドレスによる呼び出し(p.216)

以下の練習問題を実施せよ.
[練習1]
リスト6の変数i,jの値が入れ替わる理由 を考えよ.

   1 #include <stdio.h>
   2 
   3 void swap(int *i, int *j);               /* プロトタイプ宣言 */
   4 
   5 /*=====================================================================*/
   6 /*    メイン関数                                                      */
   7 /*=====================================================================*/
   8 int main(void){
   9   int a=2, b=3;
  10 
  11   printf("a=%d   b=%d\n", a, b);
  12 
  13   swap(&a, &b);
  14 
  15   printf("a=%d   b=%d\n", a, b);
  16 
  17   return 0;
  18 }
  19 
  20 /*=====================================================================*/
  21 /*    swap関数                                                      */
  22 /*=====================================================================*/
  23 void swap(int *i, int *j){
  24   int temp;
  25 
  26   temp = *i;
  27   *i=*j;
  28   *j=temp;
  29 }

4.3 一次元配列を渡す(p.218)

以下の練習問題を実施せよ.
[練習1]
要素数が10000個の一次元配列に,整数の乱数を格納して,そ の最大値を求めるプログラムを作成せよ.
  • 最大値を求めるルーチンは,独立の関数とせよ.
  • その関数では,最大値の出力も行うこと.

4.4 多次元配列を渡す(p.220)

以下の練習問題を実施せよ.
[練習1]
要素数が1000$ \times$1000の二次元配列に,整数の乱数を格 納して,その最大値を求めるプログラムを作成せよ.
  • 最大値を求めるルーチンは,独立の関数とせよ.
  • その関数では,最大値の出力も行うこと.



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年5月23日


no counter