本日の課題
DESCRIPTION
本日の課題. 関数とは ? 関数とポインタの関係. 関数の働き. そもそも, 「関数」 って何?. 何かが入力 されると・・. その入力に応じた 何かが出力される. あるルールに従って. このような関係にあるものを「関数」と呼びます。. 一体,何が便利なの? 同じ処理が何度も出てくる時は,一度「関数」として作っておけば,そこに入力するデータを変えるだけで結果を得られるので,プログラムが短くて済みます。 何度も同じ処理を書かなくて良いので,プログラムがスッキリ見やすくなります。. 関数の働き. 例えば,こういう働きをするものは何?. - PowerPoint PPT PresentationTRANSCRIPT
本日の課題
関数とは ?
関数とポインタの関係
関数の働きそもそも,「関数」って何?
何かが入力されると・・
その入力に応じた何かが出力される
あるルールに従って
このような関係にあるものを「関数」と呼びます。
一体,何が便利なの? 同じ処理が何度も出てくる時は,一度「関数」として作っておけ
ば,そこに入力するデータを変えるだけで結果を得られるので,プログラムが短くて済みます。
何度も同じ処理を書かなくて良いので,プログラムがスッキリ見やすくなります。
関数の働き例えば,こういう働きをするものは何?
“Hello, world”
printf( ) ですね。
printf( ) も関数の一つなのです!
つまり,
このように,プログラムは,いろんな関数の集まりでできています。関数は,自分で作る事ができます!
関数の働き(まとめ)関数とは,ある入力を与えると,ルールに従ってある結果を返してくれるものプログラムは関数の集まりでできており,言語が用意しているもの (printf や scanf) だけでなく,自分自身で作る事もできるmain 関数は特別な関数で,プログラム中に必ず存在し,この関数からプログラムは実行されます。つまり, main 関数からいろんな関数が呼び出され,実行されます。頻繁に繰り返される処理を関数として作っておくと,必要な時に関数を呼び出し,入力するデータだけを変更すれば良く,プログラムが短く分かり易くなる関数ごとに役割を決め,関数の集まりとしてプログラムを作成することにより,誰が見ても分かり易く,使いやすくなる データの受け渡し方法など約束を決める必要がある
「 printf へ入力する文は,” “で囲め」,など
簡単な関数の例では,関数を作ってみよう!
数学における関数を思い出しましょう。
関数 f に x を与えたときの結果を y に代入するこれは,こう書きましたね。
)(xfy
実際に,関数 f が x をもらってどういう計算をしているかは,・・
23)( 2 xxxfと定義しましたね。
関数の宣言は, main 関数の外で行います。関数は, main 関数など他の関数の中で利用されます。自分自身の中で呼び出すこともできます(再帰処理)
簡単な関数の例では,関数を作ってみよう!
23)( 2 xxxf
のように利用します。)3(fy
と関数を宣言して,
プログラミング言語の場合も同じです。
簡単な関数の例では,関数を作ってみよう!
#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);}
ここが関数の宣言部です
簡単な関数の例では,関数を作ってみよう!
関数の処理は, { } で囲んで表します。プログラム内では,変数は型指定されなければなりません。関数が呼び出されたところから受け取るデータを引数といいます。関数の答えが何型になるのか,の指定も行います。計算した後,関数の答えとして出力する変数の値はreturn 文で返します。関数の中で宣言される変数をローカル変数と言います。関数の中だけで有効です。
#include <stdio.h>
double f( double x){
double y;
y = x*x+3*x+2;
return y;}
引数
ローカル変数
簡単な関数の例では,関数を作ってみよう!
#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);}
必ず, main 関数から実行されます
関数が呼び出されます
引数の値が渡されます。両方ともローカル変数のため,変数名は同じですがまったく別の変数です。渡された引数を元に
処理を行います。
処理結果の 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);}
解決方法
#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 を媒介変数として,データの交換を行います。ポインタが指している領域の値を操作するときは,*を付けます。
次回予告
住所録プログラムに,入力部と出力部の関数を追加します。ヘッダファイルを用いたプログラムの作成を行います。入力したデータにファイル名を付けて保存する,ファイル操作について学習します。