プログラミング演習Ⅱ 第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へ直接質問しに来ても構いません
© Copyright 2024 ExpyDoc