関数への道 元のプログラム 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; }
© Copyright 2025 ExpyDoc