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