このスライドの使い方
§ 6-1「関数とは」
(教 pp.142–151)
main 関数とライブラリ関数
(教 p.142)
関数とは
(教 p.142)
繰返し使うプログラムの一部の命令列を部品として、再利用できるようにしたもの
(他の言語ではサブルーチン・手続き・副プログラムなどと呼ばれる)
関数定義
(教 p.143)
分類 |
一般形 |
関数定義 |
型 関数名 ( 型 変数名1 ,
… , 型 変数名n ) 複合文 |
関数定義(つづき)
- C の関数定義は必ずプログラムのトップレベルに書く
- 関数定義の中に関数定義は書けない。
- 他のブレース「
{
」〜「}
」の中に入らない
-
後述のプロトタイプ宣言をしているときを除き、使うよりも先(上)に書く
関数呼出し
(教 p.144)
分類 |
一般形 |
関数呼出し式 |
関数名 ( 式1 , … , 式n ) |
関数呼出し(つづき)
関数を呼出すと、
-
プログラムの実行は呼び出された関数の定義の先頭に移り、
- 実引数の値が仮引数の変数の初期値になる
return 文
(教 p.145)
return 文を一個にする必要はない
3 値の最大値を求める関数
(教 p.147)
作業:
List 6-2
を実行する
関数の返却値を引数として関数に渡す
〜自作の関数を呼び出す関数
(教 pp.148–149)
作業:
List 6-3
を実行する
作業:
List 6-4
を実行する
値渡し(pass by value)
(教 p.150)
引数は基本的に値がやりとりされる
-
関数呼出しのたびに仮引数のための新しいメモリ領域(“箱”)が用意される
-
仮引数の変数に値の代入を行なっても、呼出し元の実引数は影響を受けない
作業:
List 6-6
を実行する
値呼びの確認
(まとめのプリント)
作業:
cbv.c
を実行する
作業:
まとめのプリント Q 6.1.2 をやってみる
§ 6-2「関数の設計」
(教 pp.152–171)
値を返さない関数
(教 p.152)
関数の定義の返却値型を書くところに void
と書く
作業:
List 6-7
を実行する
関数の汎用性
(教 p.152)
教科書を読んでおく
引数を受け取らない関数
(教 p.154)
rev_int
関数
(教 p.154)
こう書くべき
int rev_int(int num) {
int tmp = 0;
while (num > 0) {
tmp = tmp * 10 + num % 10;
num /= 10;
}
return tmp;
}
ブロック有効範囲 (スコープ、scope)
(教 p.155)
変数には有効範囲がある
ファイル有効範囲
(教 p.156)
宣言と定義
(教 p.156)
教科書を読んでおいてください
関数プロトタイプ宣言
(教 p.157)
分類 |
一般形 |
関数プロトタイプ宣言 |
型 関数名 ( 型 変数名 ,
… , 型 変数名 ) ; |
関数プロトタイプ宣言(つづき)
関数定義がその呼出しよりも前にある場合は、定義が宣言を兼ねるのでプロト
タイプ宣言は不要
- いずれにしても、実行は常に
main
から開始される
ヘッダーとインクルード
(教 p.158)
#include <stdio.h>
の stdio.h は、printf
, putchar
などの関数
のプロトタイプ宣言が集められたもの(通常はファイル)
このようにプロトタイプ宣言やマクロの定義が集められたものを
ヘッダーと呼ぶ
ヘッダーとインクルード(続き)
#include
はヘッダーの内容を、そっくりそのままその場所に読み込む
(インクルードする)指令である
-
標準のヘッダーがおかれる場所は処理系により異なる
-
ライブラリー関数(前もって用意された関数)を利用するときは、ほとんどの
場合、適切なヘッダーをインクルードする必要がある
- 例えば
sin
, cos
, sqrt
などの数学関数を
利用するときは math.h をインクルードする
関数の汎用性
(教 p.159)
できるだけ大域変数を使わないようにする
配列の受渡し
(教 p.160)
関数の引数として配列を渡すこともできる
仮引数の宣言は、
型 引数名[]
としておき、
実引数としては配列の名前だけ書く
配列の受渡し(つづき)
配列の受渡しと const
型修飾子
(教 p.162)
作業:
List 6-12
を実行する
関数の引数の配列が書換えられないことを保証するためには
const
という型修飾子を仮引数の宣言につける
const
をつけているのに、その配列を書き換えようとする
とコンパイル時にエラーになる
作業:
List 6-12x
を実行する
確認
(まとめのプリント)
作業:
cbr.c
を実行する
線形探索(逐次探索)
(教 p.164)
教科書を読んでおく
番兵法 (sentinel)
(教 p.166)
探索の対象となっているデータ(番兵 (sentinel))をデータの最後
に付け加えること
- 探索範囲の終わりのチェックをする必要がなくなるので、少し効率が良くなる
多次元配列の受渡し
(教 p.170)
教科書を読んでおく
作業:
List 6-16
を実行する
§ 6-3「有効範囲と記憶域期間」
(教 pp.172–177)
有効範囲と識別子の可視性
(教 p.172)
同名の変数の有効範囲が重なるとき、
より内側のブロックで宣言されているものが優先する
作業:
List 6-17
を実行する
記憶域期間
(教 p.174)
C 言語の変数の寿命(記憶クラス, storage class)には 2 種類のものがある
自動変数 (automatic variable)
— 自動記憶域期間を持つ変数
静的変数 (static variable)
— 静的記憶域期間を持つ変数
記憶域期間(つづき)
作業:
List 6-18
を実行する
作業:
まとめのプリント Q 6.3.2 をやってみる