190 likes | 261 Views
本日の課題. 関数とは ? 関数とポインタの関係. 関数の働き. そもそも, 「関数」 って何?. 何かが入力 されると・・. その入力に応じた 何かが出力される. あるルールに従って. このような関係にあるものを「関数」と呼びます。. 一体,何が便利なの? 同じ処理が何度も出てくる時は,一度「関数」として作っておけば,そこに入力するデータを変えるだけで結果を得られるので,プログラムが短くて済みます。 何度も同じ処理を書かなくて良いので,プログラムがスッキリ見やすくなります。. 関数の働き. 例えば,こういう働きをするものは何?.
E N D
本日の課題 • 関数とは? • 関数とポインタの関係
関数の働き • そもそも,「関数」って何? 何かが入力 されると・・ その入力に応じた 何かが出力される あるルールに従って このような関係にあるものを「関数」と呼びます。 • 一体,何が便利なの? • 同じ処理が何度も出てくる時は,一度「関数」として作っておけば,そこに入力するデータを変えるだけで結果を得られるので,プログラムが短くて済みます。 • 何度も同じ処理を書かなくて良いので,プログラムがスッキリ見やすくなります。
関数の働き • 例えば,こういう働きをするものは何? “Hello, world” printf( ) ですね。 つまり, printf( )も関数の一つなのです! • このように,プログラムは,いろんな関数の集まりでできています。 • 関数は,自分で作る事ができます!
関数の働き(まとめ) • 関数とは,ある入力を与えると,ルールに従ってある結果を返してくれるもの • プログラムは関数の集まりでできており,言語が用意しているもの(printfやscanf)だけでなく,自分自身で作る事もできる • main関数は特別な関数で,プログラム中に必ず存在し,この関数からプログラムは実行されます。 • つまり,main関数からいろんな関数が呼び出され,実行されます。 • 頻繁に繰り返される処理を関数として作っておくと,必要な時に関数を呼び出し,入力するデータだけを変更すれば良く,プログラムが短く分かり易くなる • 関数ごとに役割を決め,関数の集まりとしてプログラムを作成することにより,誰が見ても分かり易く,使いやすくなる • データの受け渡し方法など約束を決める必要がある • 「printfへ入力する文は,”“で囲め」,など
簡単な関数の例では,関数を作ってみよう! • 数学における関数を思い出しましょう。 関数 f に x を与えたときの結果を y に代入する これは,こう書きましたね。 実際に,関数 f が x をもらってどういう計算をしているかは,・・ と定義しましたね。
簡単な関数の例では,関数を作ってみよう! • プログラミング言語の場合も同じです。 • 関数の宣言は,main関数の外で行います。 • 関数は,main関数など他の関数の中で利用されます。 • 自分自身の中で呼び出すこともできます(再帰処理) と関数を宣言して, のように利用します。
簡単な関数の例では,関数を作ってみよう! • #include <stdio.h> • double f( double x) • { • double y; • y = x*x+3*x+2; • return y; • } • int main(void) • { • double x,y; • printf("x=?"); • scanf("%lf", &x); • y = f(x); • printf("y=%f\n",y); • } ここが関数の宣言部です
引数 簡単な関数の例では,関数を作ってみよう! • #include <stdio.h> • double f( double x) • { • double y; • y = x*x+3*x+2; • return y; • } • 関数の処理は,{ }で囲んで表します。 • プログラム内では,変数は型指定されなければなりません。 • 関数が呼び出されたところから受け取るデータを引数といいます。 • 関数の答えが何型になるのか,の指定も行います。 • 計算した後,関数の答えとして出力する変数の値はreturn文で返します。 • 関数の中で宣言される変数をローカル変数と言います。関数の中だけで有効です。 ローカル変数
簡単な関数の例では,関数を作ってみよう! 必ず,main関数から実行されます • #include <stdio.h> • double f( double x) • { • double y; • y = x*x+3*x+2; • return y; • } • int main(void) • { • double x,y; • printf("x=?"); • scanf("%lf", &x); • y = f(x); • printf("y=%f\n",y); • } 引数の値が 渡されます。 両方ともロー カル変数の ため,変数名 は同じですが まったく別の 変数です。 渡された引数を元に 処理を行います。 関数が呼び 出されます 処理結果のyが関数の結果 として呼び出し元に返されます。 結果が画面に表示されます。
#include <stdio.h> void f(int x, double y){ y=0.5*x*x+3*x+0.5; } void main(void){ int z; double y; scanf(“%d”,&z); f(z, y); printf(“y=%lf\n”,y); } 間違いやすい例ensyu6.cを実行してみましょう
#include <stdio.h> void f(int x, double y){ y=0.5*x*x+3*x+0.5; } void main(void){ int z; double y; scanf(“%d”,&z); f(z, y); printf(“y=%lf\n”,y); } 解決方法 * * &
問題 • double型の引数を2つ受け取り,その2つの数値の四則演算結果(和・差・積・商)を返す関数を作り,実行しなさい。
関数と配列-演習 • 配列に保存されたデータを引数として関数に渡し,その平均値を返値とする関数を考えましょう。 • ensyu7.cを完成させてください。 • 配列の全ての要素を引数として羅列するのは現実的ではないですよね。どうすればよいでしょう? • ヒント:配列名は,配列の先頭アドレスを表しますね。
解説 • 基本の考え方は,「5つのデータを渡す」ではなく,「先頭アドレスと,そこからいくつのデータがあるか,その個数を渡す」という考え方です。 • 今,個数は5個であることが分かっているので,先頭アドレスのみを引数として与えます。
関数とポインタ-演習 • ローカル変数のアドレスを関数に渡す,ということは,「ローカル変数の値を,関数側で更新できる」つまり「データ値を共有する」ということです。 • ensyu8.cを実行して,このことを確認しましょう。
解説 • forループのprintf文について • 配列zには,1~5の値が初期値として代入されています。 • しかし,kansuに配列の先頭アドレスと要素数が渡され,kansu内で要素の値は0にクリアされています。 • よって,出力は,すべて0となってしまいます。 • 最後のprintf文について • 変数bには,初期値として10が代入されています。 • kansu には,この値10が渡されており,変数bのアドレスは渡されていません。 • よって,関数内でb=0を実行しても,main内の変数bは影響を受けません。 • よって,出力はそのまま10の値が出力されます。
関数とポインタ-演習 • ensyu9.cを見てみましょう。 • 二つの変数の値を交換する関数です。つまり,二つの変数の値が変更になるため,関数の結果はreturn文では返せません。 • きちんと結果を得るためには,どのようにすればよいでしょうか? • ヒントは,ポインタです。
解説 • 二つの変数,aとbの値が更新されるため,これらのアドレスを関数へ渡さなければなりません。 • 関数側では,アドレスを受け取るため,引数はポインタで宣言されます。 • cを媒介変数として,データの交換を行います。ポインタが指している領域の値を操作するときは,*を付けます。
次回予告 • 住所録プログラムに,入力部と出力部の関数を追加します。 • ヘッダファイルを用いたプログラムの作成を行います。 • 入力したデータにファイル名を付けて保存する,ファイル操作について学習します。