関数への道 元のプログラム #include int main(void) { int i

関数への道
元のプログラム
10
𝑘=1
1
𝑘 を求めるプログラム
#include <stdio.h>
int main(void) {
int i, num=10;
// numまでの和を求める
float ans=0.0;
for(i=1; i <=num; i++) {
ans += 1.0/i; // 1.0/i の値を加算
}
printf("1から%dまでの逆数の和= %f\n", num,ans);
return 0;
}
ここで問題…
10
突然教師の心が変わり、
𝑘=1
10
𝑘=1
1
𝑘
100
𝑘=1
1
𝑘
1000
𝑘=1
1
𝑘 を求めるプログラム
だけではなく、
1
𝑘
それぞれの値を比較せよ、というプログラムを書くことになった
…
#include <stdio.h>
ほとんど同じコードを書くことになった
int main(void) {
int i, num=10;
float ans=0.0;
for(i=1; i <=num; i++) {
ans += 1.0/i;
}
printf("1から%dまでの逆数の和= %f¥n", num,ans);
ans = 0.0; num = 100;
// 追加
for(i=1; i <=num; i++) {
ans += 1.0/i;
}
printf("1から%dまでの逆数の和 = %f¥n", num,ans);
ans = 0.0; num = 1000; // 追加
for(i=1; i <=num; i++) {
ans += 1.0/i;
}
printf("1から%dまでの逆数の和 = %f¥n", num,ans);
return 0;
}
でも、あの教師のことだから、どんどん要求が膨らむに違いない。。。
10
𝑘=1
1
𝑘
100
𝑘=1
1000
1
𝑘
10000
𝑘=1
𝑘=1
1
𝑘
1
𝑘
50000
𝑘=1
1
𝑘
だけではなく
100000
𝑘=1
1
𝑘
… と増えたらどうしよう?
そうだ、関数を利用しよう!
関数への道 (1) 処理の抜き出し
#include <stdio.h>
int main(void) {
int i, num=10;
// numまでの和を求める
変数宣言
float ans=0.0;
for(i=1; i <=num; i++) {
ans += 1.0/i;
// 1.0/i の値を加算
処理
}
printf("1から%dまでの逆数の和= %f\n",
num,ans);
return 0;
}
表示(出力)
#include <stdio.h>
int main(void) {
int i, num=10;
// numまでの和を求める
変数宣言
float ans=0.0;
for(i=1; i <=num; i++) {
ans += 1.0/i; // 1.0/i の値を加算
}
printf("1から%dまでの逆数の和= %f\n",
num,ans);
return 0;
}
処理
表示(出力)
関数への道 (2)データの特定(関数の入力=引数)
この値によって処理内容が変わる
for(i=1; i <=num; i++) {
ans += 1.0/i; // 1.0/i の値を加算
}
よって、num が入力である
⇒ これからつくる関数は num を引数とする
num以外の変数はみな、これからつくる関数の(局所)「変数」
i, ans
関数への道 (3) 関数の名前と引数の特定
大事なこと
それはこれからつくる関数に名前をつけること
invSum と命名しよう
すると
関数名
引数
invSum(num)
という「関数の形」が見えてきた
関数への道 (4)元のコードの書き直し
関数の呼び出しの形に(関数の入力=引数)
invSum を抜き去った元のプログラム:
これに invSum(num) を追加する
#include <stdio.h>
int main(void) {
int i, num=10;
// numまでの和を求める
float ans=0.0;
// ここで invSum の戻り値が float であることをチェック
ans = invSum(num);
printf("1から%dまでの逆数の和= %f\n",
num,ans);
return 0;
}
関数への道 (5)関数の整形(関数の出力=戻り値)
元のプログラムから抜き出した処理コード
for(i=1; i <=num; i++) {
ans += 1.0/i; // 1.0/i の値を加算
}
関数
invSum
で使われる局所変数 i, ans
float invSum(int num)
{
int i;
float ans=0.0;
// これは元のプログラムから
for(i=1; i <=num; i++) {
ans += 1.0/i; // 1.0/i の値を加算
}
return ans;
}
// invSum の戻り値はfloat
完成形
#include <stdio.h>
float invSum(int num) {
この内容を書こう
}
int main(void) {
int num=10;
// numまでの和を求める
ans=invSum(num);
printf("1から%dまでの逆数の和= %f\n",
num,ans);
return 0;
}
発展形
#include <stdio.h>
float invSum(int num) {
この内容を書こう
}
int main(void) {
int
num;
// numまでの和を求める
num=10;
printf("1から%dまでの逆数の和= %f\n", num,invSum(num));
num=100;
printf("1から%dまでの逆数の和= %f\n", num,invSum(num));
num=1000;
printf("1から%dまでの逆数の和= %f\n", num,invSum(num));
return 0;
}
おまけ:main関数に、同じような形の繰り返しがあることに気づいた君は…
#include <stdio.h>
float invSum(int num) {
// 中身は書いてね
}
void try(int num) {
printf("1から%dまでの逆数の和= %f\n", num,invSum(num));
return;
}
int main(void) {
try(10); try(100); try(1000);
return 0;
}