関数ですが,関数を使うことはできても,関数を定義するのが難しい様です。今週は,引き続きいろいろな関数の定義を演習を通して学習する。
キーワード:「関数」「引数」「戻り値」
関数とは,引数を渡すと,関数の定義に基づいて戻り値を届けてくれる。
戻り値の型 関数名(引数1の型 変数名1,引数2の型 変数名2, ...)
{
/* ここに処理を記述 */
return xxx; /* xxxが戻り値 */
}
関数の書き方のルール
bekijo(a, b)
の部分)から「引数」a, b を伴って関数bekijoに処理が移る。処理の流れ,引数(変数)のコピーや,return による値の戻りをよく理解すること。
関数の中で宣言する変数のことをローカル変数という. ローカル変数を利用できる範囲は,変数を宣言した関数の中,即ち { から } までのブロック内に限られる.この変数の有効範囲のことを変数のスコープと呼ぶ.したがって,異なる関数内に「同じ名前」の「異なる変数」を用いる事が可能である.
以下のプログラムで,どのような結果が得られるか,考えなさい.
#include <stdio.h>
void funca(int x)
{
/*この変数は main 内の x とは別物*/
printf("funca_xの初期値:%d¥n",x); /* funca内のxの初期値の表示 */
x += 5;
printf("funca_xの結果:%d¥n",x); /* funca内で演算した結果の表示 */
}
void main()
{
int x; /* この変数は funca 内の x とは別物 */
x = 3;
printf("main_xの初期値:%d¥n",x); /* main内のxの初期値の表示 */
funca(x);
printf("main_xの結果:%d¥n",x); /* funca実行後のmain内のxの値の表示 */
}
画面に表示される結果
main_xの初期値:3
funca_xの初期値:?
funca_xの結果:?
main_xの結果:?
さて,それぞれなんと表示されるだろう。まずは考えて見て,次にプログラムを実行して確認すること。
三角形の底辺の長さと高さを入力する時,面積を求めて戻す関数を作成せよ
#include <stdio.h> float sankaku(int a, int b) { float s; s = a * b / 2.0; return s; } void main() { int a, b; float s; printf("三角形の面積を求めます\n"); printf("底辺の長さを入力してください:"); scanf("%d", &a); printf("高さを入力してください:"); scanf("%d", &b); s = sankaku(a, b); //関数を呼び出す printf("三角形の面積は,%fです.", s); }
(1)よく使う関数を用意しておこう.
1.二つの整数を渡すと,大きい方を答える関数
2.整数の2乗を計算する関数
3.整数の3乗を計算する関数
4.整数のn乗を計算する関数
5.整数の階乗を計算する関数
main関数の部分はこんな感じ.あとは,関数の定義部分を作ってみよう.
void main()
{
int a, b, n;
printf("aの値を入力してください:");
scanf("%d", &a);
printf("bの値を入力してください:");
scanf("%d", &b);
printf("n乗のnの値を入力してください:");
scanf("%d", &n);
printf("大きい数の値は%d\n", large(a, b));
printf("aの2乗は%d\n", square(a));
printf("bの3乗は%d\n", cube(b));
printf("aの%d乗は%d\n", n, power(a, n));
printf("bの階乗は%d\n", factorial(b));
}
(2)半径を入力すると,球の表面積および体積を求めるプログラムを,関数square, cubeを用いて作成せよ.面積は実数であることに注意.ただし,円周率は3.14とする.
(3)実数xの値を入力し,y=5x5-12x4+3x+1を求めるプログラムを関数powerを用いて作成せよ.
(アドバンスド)先週の階乗を求める関数を,n! = n * (n-1)! であることを利用してプログラムを書くと,どうなるか?考えてみよう.C言語では,関数の中から自分自身を呼び出すことができます.(これを再帰呼出といいます)