スライド5

プログラミング演習Ⅱ
第5回
関数(1)
情報・知能工学系
山本一公
[email protected]
前回の課題の解説・ポイント
• 課題3-1・3-2
– 3重のforループ
– 初期化はできるだけ実際の処理の近くでやった方が、
後でプログラムを読むときに分かりやすい
for (i = 0; i < xcol; i++) {
for (j = 0; j < xrow; j++) {
c[i][j] = 0.0;
for (k = 0; k < yrow; k++) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
課題2の採点結果から
• 課題2-1
– 意図通りのプログラムになってない人がいた
• 「配列を逆順にコピー」なので、表示だけ逆順にしてもダメ
• 課題2-2
– 累和を取る際に初期化を行っていない
• 自分で初期化しないと(もともとメモリ上にあった)変な値
が入っていることがある
– 変な値の上に値を足すことになるので結果も変な値になる
• 処理系によって初期化の仕様は異なる
– 自動的な初期化に期待しないで、自分で初期化すること
• コメント以外の部分に全角スペースを入れない
こと
今日の内容
• 教科書 pp.114~129
• 関数
– 関数定義・関数呼び出し
– ライブラリ関数
– main関数
• 関数への値の渡し方・受け取り方
• 値を返さない関数
• 仮引数を受け取らない関数
• プロトタイプ宣言
関数とは?(1)
• 数学の「関数」(function)
– 「ある変数に依存して決まる値あるいはその対応を
表す式のこと」(Wikipediaより)
z  f ( x, y )
• プログラミング言語の「関数」
– 「プログラム中で意味や内容がまとまっている作業
をひとつの手続きとしたもの」(Wikipediaより)
– 数学の関数のように、値を与えると値を返す
– 値を与えなくても良いし、返さなくても良い
• 値を返すものをfunction(関数)、返さないものをprocedure
(手続き)として区別する言語もある(Pascal等)
• C言語はどちらもfunction
関数とは?(2)
• 関数の定義の仕方
返却値の型
関数名(仮引数1の型
仮引数2の型
……,
仮引数Nの型
仮引数1の変数名,
仮引数2の変数名,
仮引数Nの変数名)
{
変数宣言
処理
return
返却値の式;
}
– 仮引数(かりひきすう):関数に渡す値を定義しておくもの
– 返却値:関数が呼び出し元に返す値。「戻り値」とも言う。
• 仮引数と返却値はなくてもよい
関数とは?(3)
• 関数の呼び出し方
– 関数呼び出し式
返却値を入れる変数名=関数名(実引数1の変数名,実引数2の変数名,
……,実引数Nの変数名);
– 返却値を直接演算しても良い
y = f(x) * g(x);
z = f(g(x));
– 返却値のない関数、引数のない関数もある
perror(“main”); /* システムのエラーを表示する関数 */
ch = getchar();
/* 標準入力から1文字読み込む関数 */
関数とは?(4)
• ライブラリ関数
– これまでに既にたくさん使用している
•
•
•
•
•
printf関数、scanf関数
puts関数、putchar関数
fopen関数、fclose関数
fprintf関数、fscanf関数
fread関数、fwrite関数
– システムが用意してくれている関数
– 返却値の型や引数の数は、stdio.hに書いてあ
る!
関数とは?(5)
• mainも関数
– 関数の定義から考えれば当然のこと
• C言語は関数言語である
– 呼び出し元は、コマンドシェル(コマンドラインで
実行した場合)
– 返却値はコマンドシェルが受け取る
• returnで定義
• 通常 0 が正常終了を、それ以外の値は異常終了を示す
– 実行は必ずmain関数から!
• プログラム内に複数の関数があってもmainから!
• mainがプログラムの一番最後に書かれていてもmainから!
値の渡され方
• 関数が呼び出される際
– 実引数の値が仮引数にコピーされる
• 教科書 p.116, Fig.6-4
– 関数で変数をどう弄っても、
呼び出し元の変数には影響しない
• 教科書 p.121, List 6-5
– 実引数と仮引数はプログラム上で別物
• 実引数と仮引数の変数名が同じである必要もない!
• この仕組みを「値渡し」と言う
⇔「参照渡し」(変数の入れ物を渡すやり方)
関数の処理の流れと終了
• 関数が呼び出されると処理が関数に移る
• 関数の処理が実行される
• 関数は、
– 関数の終わりに到達する
– return文が実行される
のどちらかにより終了
• 呼び出されたところに処理を戻す
• returnの後ろに返却値の式を書かないと、返却値は不定
となる
– 返却値が不要ならreturnを書かなくても良い
値を返さない・受け取らない関数
• 返却値を持たない関数
– 返却値の型を void にする
– return文ではreturnのみを書くか、return文そのものを
書かない
– 教科書 p.122, List 6-7
• 仮引数を持たない関数
– 仮引数の宣言部分に void と書く
– 実引数の部分には何も書かない
– 教科書 p.124, List 6-9
関数プロトタイプ宣言
• プログラムの中で、関数が呼び出し元よりも後
に書かれている場合
– 呼び出し元では返却値の型と引数の型・数が分から
ない
– コンパイラがチェックできなくて困る!
• プログラムの先頭で、使う関数の返却値の型、
引数の型・数“だけ”を宣言しておく
– これを「プロトタイプ宣言」と言う
• 呼び出し式を関数定義の後ろに書けば、プロト
タイプ宣言は要らない
ヘッダとインクルード
• ライブラリ関数のプロトタイプ宣言は、stdio.h
に書かれている!
• これをプログラム内の関数呼び出し式の前に入
れる必要がある
– “#include <stdio.h>”が先頭にあるのはこのため!
• 自作の関数用に自前でヘッダファイルを用意す
ることもできる
– プログラムと同じ場所にヘッダファイル
(myheader.h)がある場合は、
#include “myheader.h”
のように”<””>”でなくダブルクォーテーションで囲む
今週の課題
1. 教科書 p.118, 演習6-2のプログラムを作成せよ。
演習6-1の問題文にあるように、main関数など
も作成して完成したプログラムを作ること。
2. 教科書 pp.105, List 5-15にある一番簡単な素数判
定アルゴリズムを利用して、int型整数の素数判
定を行う関数 int prime(int x) { /* … */ } を作成
せよ。返却値はxが素数の場合は1、それ以外の
場合は0とせよ。main関数なども作成して完成
したプログラムを作ること。
レポートについて
• 電子メールで提出
– 提出先は [email protected]
– Subjectを「プログラミング演習2 課題4提出
号・氏名 」とすること
– C言語ソースファイルを添付する
学籍番
• メールの本文には何も書かなくて良いです
– ソースファイルの頭にコメントで以下の情報を入れる
• 学籍番号・氏名
• プログラムの説明(どのように動くのか、工夫した点等)
• 実行結果(長い場合は一部)を貼る
– 提出締切は、11月7日(水) 12:00 (1週間後)
授業用Webサイト
• URL:
http://www.slp.cs.tut.ac.jp/~kyama/programming2/
– 課題のpdfファイルが置いてあります。
– 授業で使ったpptファイルを置いていきます。
• 質問メールは、以下のどちらかのアドレスまで
– [email protected][email protected]
• C-515へ直接質問しに来ても構いません