前回に引き続き関数を取り上げます.
・長方形の二辺の長さを渡すと,面積を戻す関数を作成してみよう.
/* 長方形の二辺の長さを渡すと,面積を戻す関数 */
#include <stdio.h>
int area(int a, int b)
{
return a * b;
}
void main()
{
int a, b;
printf("たて="); scanf("%d", &a);
printf("よこ="); scanf("%d", &b);
printf("面積=%d", area(a,b));
}
・円の半径を渡すと,面積を戻す関数を作成してみよう. 面積は,実数であることに注意.
/* 円の半径を渡すと,面積を戻す関数 */
#include <stdio.h>
float carea(int r)
{
return r * r * 3.14;
}
void main()
{
int r;
printf("半径="); scanf("%d", &r);
printf("面積=%f", carea(r));
}
ある数 n の階乗 n! を求めるプログラムを,関数を用いて作成せよ
ただし,0! = 1 であることに注意.
/* ある数 n の階乗 n! を求めるプログラム */
#include <stdio.h>
float fact(int n)
{
int i;
float f = 1.0;
for(i=0; i<n; i++){
f *= (i + 1);
}
return f;
}
void main()
{
int n;
printf("n="); scanf("%d", &n);
printf("n!=%.f", fact(n));
}
ここで, n! = n * (n-1)! であることを利用してプログラムを書くと,どうなるか?考えてみよう.
C言語では,関数の中から自分自身を呼び出すことができます.(これを再帰といいます)
どうなっているのか,わかるかな?
/* ある数 n の階乗 n! を求めるプログラム */
/* 再帰関数バージョン*/
#include <stdio.h>
float fact(float n)
{
if(n == 0){
return 1.0;
}else{
return n * fact(n-1);
}
}
void main()
{
int n;
printf("n="); scanf("%d", &n);
printf("n!=%.f", fact(n));
}

簡単なプログラムで確認してみましょう.
#include <stdio.h>
int test(int a)
{
a += 10;
return a;
}
void main()
{
int a, b;
printf("aの値を入力してください:");
scanf("%d", &a);
b = test(a);
printf("aの値は%d\nbの値は%d\n", a, b);
}
aに2を入力すると,結果はどのように表示されるだろう.
これまでは,一つの値しか関数から戻すことができなかった.また,同じ変数名を使っていても,関数の方で値を変えても,mainでは変化しなかった.これは,関数には変数の中身が伝えられているためです.
では,関数に変数をしまってある場所を伝えたらどうなるだろう...これは,来週のお楽しみ
変数は,宣言する場所によって,その有効範囲が異なります.同じ変数名なのに,関数によって値が違ってくるのは,このためです.
ある関数の中で宣言した変数のことをローカル変数といいます.ローカル変数を利用できる範囲は,変数を宣言した関数の中に限られます.この変数の有効範囲のことを変数のスコープと呼びます.
| int funca() { int y; ..... return y; |
変数yの有効範囲
変数yは,関数funcaの中のみ有効 |
| void main() { int x; x = 3; y = 4; ×エラー!! } |
main関数では,変数yは使えません |
関数の外で宣言した変数のことをグローバル変数といいます.グローバル変数は,どの関数からも参照できます.
| int y; int funca() { .... return y; |
変数yの有効範囲
変数yは,main関数の中でも使える |
| void main() { int x; x = 3; y = 4; ◎ } |
よく使う関数を用意しておこう.
1.二つの整数を渡すと,大きい方を答える関数
2.整数の2乗を計算する関数
3.整数の3乗を計算する関数
4.整数のn乗を計算する関数
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("a^3 + b^2 + a^n =", *********);
}
できた人へ:
フィボナッチ数列を求めるプログラムを作ってみよう.(再帰呼び出しの練習)
フィボナッチの数列とは,(n番目の値)=(n-1番目の値)+(n-2番目の値)
1 1 2 3 5 8 13 21 34...