今まで写経のように書いてきた『void main()』も、これでようやく話ができる! 第8章 自分で関数を作れること ~関数~ 今まで写経のように書いてきた『void main()』も、これでようやく話ができる! 第8章 関数
前回やったこと double 型は小数を扱い、bool 型は真偽のみを 扱うデータ型 データ型は暗黙の型変換とキャスト2つの方法 で変換することができる コメントは『//』や『/*~*/』でもって挿入が できる 第8章 関数
今日の予定 関数とは 関数全般の説明 main 関数 何もいらない関数 値が必要な関数 値を返す関数、return 文 第8章 関数
関数とは(1) C言語において、プログラムは関数が集まって できている 関数とは、コンピュータのいくつかの処理をま とめたものである(と前に説明したと思う) 最も大きな関数は main 関数と呼ばれるもので、 他のすべての関数はこの main 関数内で呼び出 されることで、使用できる 第8章 関数
関数とは(2) massage 関数 宣言 shohizei 関数 宣言 main 関数 図にしてみると、こんな具合かな? 第8章 関数
関数とは(3) 一般的に関数は、宣言して定義してから呼び出 しをすることで使うことができる(前頁参照) 実は今まで使ってきた printf や scanf もヘッ ダーファイルというところで定義されている 関数は標準で用意されているものの他に、自作 することができる(今日はそのあたりの説明をし ていくよ) 第8章 関数
main 関数(1) C言語のプログラムにおいて、最初に実行され る関数にして、最も肝心な関数 void main(){ } 第8章 関数
main 関数(2) いろんな説明を省くため 今まではとある事情からこの『void main()』 を使ってきたが、C言語の規格上以下の『int main()』をこれから使っていくことにする この『return 0;』は、main 関数の終了を意味 し、早い話プログラムをここで終了しますよ、 ということを表しているよ int main(){ return 0; } 第8章 関数
何もいらない関数(1) これから自作の関数の作り方・使い方を見てい こうと思う 何もいらない関数とは、特に数値が必要のない 関数を便宜上こう呼ぶことにしてみたやつ さっきも説明したが、関数はまず宣言・定義を して、そして main 関数内で呼び出しをするこ とで使える。その時必ず宣言は、main 関数よ り前に行うように! 第8章 関数
何もいらない関数(2) 関数の宣言・定義例: まず関数の型(正確には違うけど)を void に決め た後、関数の名前を入れる(今回はmessage) 『()』の中に何も入れず『{}』内にやってほし い処理を書き入れる void message(){ printf(“関数を呼び出しました\n”); } 宣言終了。次は呼び出し 第8章 関数
何もいらない関数(3) 呼び出し例: 関数名と『()』を main 関数内で書き入れ、こ れで呼び出しができる(『;』忘れずに!) 下の『return 0;』は main 関数の終了でしたね int main(){ massage(); return 0; } 第8章 関数
何もいらない関数(4) でもって以下のプログラムを実行してみよう #include <stdio.h> void message(){ printf(“関数を呼び出しました\n”); } int main(){ message(); printf(“終了します\n”); return 0; 第8章 関数
何もいらない関数(5) 実行結果は、こう なんとなくご理解いただけたかな? main 関数内にすべての処理を書き込むのは非 効率。なので、よくやる処理は関数化しておく ことで、効率よくプログラミングすることがで きるよ 第8章 関数
練習問題1 テストの点数を入力させ、それを表示させると いう testscore 関数をつくり、main 関数で呼 び出してみよう 実行結果は以下の通り ヒント: if 文で分岐させた後、 『return;』とだけ 書き入れてみよう 想定しない値が入力され たら、強制的に関数を終了 させたいような・・・ 第8章 関数
練習問題1 回答例 return 文については後ほど解説するよ ここで return; は関数 からの強制脱出の意味を持つ #include <stdio.h> void testscore(){ int score; printf("テストの結果を入力してください > "); scanf("%d",&score); if(score > 100 || score < 0) return; printf("私のテストの結果は%d点です\n",score); } int main(){ testscore(); printf("終了します\n"); return 0; return 文については後ほど解説するよ 第8章 関数
補足 ローカル変数とは 基本的に、関数の中で定義された変数は、その 関数の中でしか使えない(有効じゃない) そのような変数をローカル変数という だから上の例だと、変数 score は、この testscore 変数内でしか使えないよ void testscore(){ int score; } 逆に関数の外で定義すると、どの関数でも使える変数になる → グローバル変数 第8章 関数
値が必要な関数(1) 関数によっては、main 関数で入力した値を渡 して処理を行わなくてはならないものがある こうした関数は、宣言・定義の時点で値が必要 であることを明記し、呼び出す段階で、必要な 値を入力させなくてはならない 詳細は次のスライドで 第8章 関数
値が必要な関数(2) 宣言・定義例: 上の例では、テストの点数を testscore 関数に 渡しておかないと正しく処理が行われない 『()』内の値は引数(ひきすう)という 宣言・定義例: 上の例では、テストの点数を testscore 関数に 渡しておかないと正しく処理が行われない あらかじめどんな値を渡すのか、『()』内で変 数を宣言しておいて、『{}』内の処理でそれを 使っている void testscore(int a){ printf(“A君の成績は%d点です\n”, a); } 次の呼び出し例とあわせるとわかりやすいかな? 第8章 関数
値が必要な関数(3) 呼び出し例: この『()』内の『70』が、さっきの宣言の『int a』に代入され、printf の処理に使われている 宣言の引き数の数と呼び出しの『()』内の数値 の数は一致させておいてね int main(){ testscore(70); return 0; } 第8章 関数
値が必要な関数(4) これらを踏まえ、以下のプログラムを実行して みよう #include <stdio.h> void testscore(int a){ printf(“A君の成績は%d点です\n”, a); } int main(){ int num = 70; testscore(num); return 0; 第8章 関数
値が必要な関数(5) 実行結果 このように関数の『()』内に変数を入れても問 題ない また『(int a, int b)』や『(int a, double b)』 のように必要に応じて引き数を複数宣言・定義 することもできるよ 第8章 関数
練習問題2 三角形の面積を計算し、それを表示する tri 関 数を作ってみよう 高さと数値を入力させる記述は main 関数内に 書こう(以下実行例) 今回は全部 double 型にしています 第8章 関数
練習問題2 回答例 double 型は『%lf』や『%f』を使うの覚えてた かな? #include <stdio.h> void tri(double a, double b){ printf("三角形の面積は%fです\n", a * b / 2); } int main(){ double height,base; printf("底辺 > "); scanf("%lf",&base); printf("高さ > "); scanf("%lf",&height); tri(base,height); return 0; double 型は『%lf』や『%f』を使うの覚えてた かな? 第8章 関数
値を返す関数(1) 処理を行った後で、何かしらの値を返してくる 関数もある そういうときに使われるのが return 文 return の後に返したい値を書きいれ、関数の処 理が終わった後、その値を main 関数のほうに 返してくる どんな値を返すかは、関数の型にも影響するよ 第8章 関数
値を返す関数(2) 宣言・定義例: この tax 関数は return 文で変数 zei を返す値 としている。この値を返り値、ないし戻り値と いう 関数名の前の int は、返り値にどんな値を設定 するのか、を定める返り値型というものになる よ int tax(int a){ int zei = a * 0.08; return zei; } 第8章 関数
値を返す関数(3) 呼び出し例: 返り値型が void (ない)ということは、値を返さ ない関数であることを表している int main(){ int num = tax(1000); printf(“消費税は%d円\n”, num); return 0; } 第8章 関数
値を返す関数(4) それでは、以下のプログラムを実行してみよう #include <stdio.h> int tax(int a){ int zei = a * 0.08; return zei; } int main(){ int price; printf(“いくらの商品を買う? > ”); scanf(“%d”,&price); int n = tax(price); if(n >=0) printf(“消費税は%d円です\n”, n); return 0; } 第8章 関数
値を返す関数(5) 実行結果例はこちら 第8章 関数
補足 return 文 前述したとおり『return;』で、その関数から脱 出できる return 文は条件分岐を使って複数おいていいし、 また戻り値は実数でもOK! 例: int charge(int a){ if( a >= 10) return 13000; if( a > 0 && a < 10 ) return 15000; if( a <= 0 ) return; } 第8章 関数
練習問題3 A,B,Cチームの得点を入力し、その合計と平均 を算出する cal1,cal2 関数を作ってみよう 得点は int 型で(小数点以下切捨て) 余裕があったら、得点値を「0~100」に定め、 違反する入力はエラーにする記述を入れてみよう 第8章 関数
練習問題3 回答例 既に定義された cal1関数を もう使っている 何回 a,b,c は出ているのだろうか #include <stdio.h> int cal1(int a ,int b, int c){ int n = a + b + c; return n; } int cal2(int a, int b, int c){ int n = cal1(a,b,c) / 3; return n; int main(){ int a,b,c; printf("a > "); scanf("%d",&a); printf("b > "); scanf("%d",&b); printf("c > "); scanf("%d",&c); printf("3チームの合計点は%dです\n",cal1(a,b,c)); printf("3チームの平均点は%dです\n",cal2(a,b,c)); return 0; 何回 a,b,c は出ているのだろうか 第8章 関数
次回予告 文字列について 入力の仕方、特徴 文字列用のデータ型 char の登場!! 第8章 関数
テンプレ テンプレ 第8章 関数