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

本日の課題