プログラミング入門2 第5回 関数(1) 芝浦工業大学情報工学科 青木 義満 今回の講義内容 関数 画面表示の関数 printf, puts, putchar キーボード読み込み scanf ()内に決められたパラメータを与え, 命令を実行(あらかじめ用意された関数) 自分で好きな処理を行う命令を作れない? 自作関数 プログラミング入門2 2 例えば・・・・ 最大体重と最小体重を求めるプログラム(一部) double weight[NUM]; double min, max; min = max = weight[0]; for( i= 1; i < NUM; i++ ){ 最大値・最小値を求める処理 if ( weight[i] > max ) max = weight[i]: if ( weight[i] < min ) min = weight[i]: その他の数値データ ・得点,収入,身長,座標値,etc } に対しても全く同様の処理を適用可能 処理をひとまとめにして, 関数として定義 プログラミング入門2 3 おまじないの謎(main関数) #include <stdio.h> int main(void) { ・・・・・ ・・・・・ return(0); } main関数 ・C言語のプログラム中には 必ず一つ必要 ・プログラムの本体 ・main自体が一つの大きな関数 プログラミング入門2 4 ライブラリ関数 今まで使用してきたC言語の命令 printf( “羊が%d匹 ¥n”, num ); ライブラリ関数 puts( “あいうえお” ); C言語が用意する標準的な関数群 scanf( “%d” , &num ); どれも()内に決められたパラメータを受け取り, 仕事をこなす(画面表示,値読込み等) プログラミング入門2 5 関数を作る上での重要事項 関数は()内に決められたパラメータを受け取り, 定められた仕事をこなす 関数の名前? どんな値(型,個数)を受け取る? 何の仕事をさせる? 結果として,計算結果を返すか? 関数定義 が必要! プログラミング入門2 6 おまじないの謎(#include <stdio.h>) #include <stdio.h> int main(void) { printf(・・・・); scanf(・・・・); ライブラリ関数 関数を使うために必要な, ・()内に受け取るもの ・処理内容 はどこに定義? return(0); } #include <stdio.h> インクルード(取り込む) 標準入出力ヘッダファイル (Standard input output header) ・printf, puts, scanf などの入出力関数の宣言 printfなどの関数をプログラム中で使うために,その内容が記述されている ヘッダファイル(stdio.h)をインクルード(プログラムに読み込む)している プログラミング入門2 7 最初の関数プログラム ソースファイル名:list0601.c (p.115) 内容:二つの整数の大きい方の値を返す関数を作る ねらい: 関数定義と関数呼び出しの理解 #include <stdio.h> int maxof(int x, int y) { if (x > y) 関数定義 return (x); else return (y); } int main(void) { 関数定義は, main文の前! int na, nb, max; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &na); printf("整数2:"); scanf("%d", &nb); (後ろに書く方法もあり) 関数呼び出し max = maxof( na, nb ); printf("大きい方の値は%dです。¥n", max ); return (0); } プログラミング入門2 8 関数定義部の構造 ここで作りたい関数 2つの整数のデータを渡して,そのうち大きい方のデータを返す 返却値の型 処理をさせる関数の名前を,maxof としよう 受け取る値(引数)は,整数値2つなので,int型が2つ必要 大きい方の値を求めて,その値(int型)を返す 関数名 仮引数 int maxof( int x, int y ) { if (x > y) return (x); else return (y); 関 数 本 体 } int型の2つの値を受け取り,(仮引数) 結果をint型の値で返す(返却値型) maxofという名前の関数を定義(関数名) 処理内容を記述 この場合,受け取った2つの値の 大小を判定し,大きい方を返す(return) プログラミング入門2 9 関数呼び出し部の構造 定義したmaxof関数に判定したい2つの整数の値を渡し, 結果として大きい方の値を返してもらいたい <main文中の関数呼び出し> int na, nb, max; max = maxof( na, nb ); 関数名 int maxof( int x, int y ) 実引数 実引数 maxof関数本体 { if (x > y) return (x); else 式maxof(na, nb)の値が, 関数の返り値となる! return (y); } プログラミング入門2 10 関数呼び出しと引数の引渡し過程 main関数 重要 int main(void) { 実引数na, nbの値が,仮引数x, yに それぞれコピーされる int na, nb, max; na = 24; nb = 62; (変数そのものでなく,中に格納されている値 が受け渡される!) 実引数 max = maxof( na, nb ); ・・・・ 62 62 24 } int maxof( int x, int y ) 62 仮引数 { if (x > y) return (x); else return (y); returnか,関数最後の } で 呼び出し元へ戻る } プログラミング入門2 11 練習問題 List0601を変更し,int型整数の小さい方を返す関数 int minof(int x, int y){ ・・・・・ } を作成しなさい 。 ※動作確認のため,main文も書くこと #include <stdio.h> int minof(int x, int y) { if (x < y) return (x); else return (y); } int main(void) { int na, nb, min; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &na); printf("整数2:"); scanf("%d", &nb); min = minof( na, nb ); printf(“小さい方の値は%dです。¥n", min ); return (0); } プログラミング入門2 12 3値(実数)の最大値 ソースファイル名:list0602.c (p.118) (若干変更) 内容:3つの実数(double型)のうち,最大値を返す関数を作る #include <stdio.h> double max3(double x, double y, double z) { double max = x; if (y > max) max = y; if (z > max) max = z; return (max); } int main(void) { double na, nb, nc; puts(“三つの実数を入力してください。"); printf(“実数1:”); scanf("%lf", &na); printf(“実数2:”); scanf("%lf", &nb); printf(“実数3:”); scanf("%lf", &nc); double型の場合, scanfは%lfで読込み! printf(“最も大きい値は %f です。¥n", max3(na, nb, nc)); return (0); } プログラミング入門2 13 解説 double max3(double x, double y, double z) { double max = x; if (y > max) max = y; if (z > max) max = z; 仮引数,関数の返り値の型を double に変更 関数の中で使う変数を 関数の先頭で宣言 注)寿命は関数の中のみ。 関数を抜けた時点でmaxという変数は消滅 return (max); } printf(“最も大きい値は %f です。¥n", max3(na, nb, nc) ); 関数呼出し 返り値(最大値) プログラミング入門2 14 三角形の面積 ソースファイル名: menseki.c 直角三角形のa, bの長さを与え,面積を求める関数を作成 (a, bはキーボードから入力,以下の関数の中身を各自記述) #include <stdio.h> b S a double menseki(double x, double y ) { double s; s = x * y / 2.0; return( x * y / 2.0 ); return (s); } int main(void) { double a, b; puts(“2辺の長さを入力"); printf(“実数1:”); scanf("%lf", &a); printf(“実数2:”); scanf("%lf", &b); printf(“斜辺の長さは %f です。¥n", menseki( a, b) ); return (0); } プログラミング入門2 15 値を返さない関数 ソースファイル名: hello.c 画面に「Hello!」と表示して改行を行う関数を作成 #include <stdio.h> void hello(void) { puts( “Hello!!” ); } int main(void) { hello( ); return (0); } プログラミング入門2 16 値を返さない関数 (解説) 関数定義部 void hello(void) 返却値型 引数型 特に値を返す必要がない時,関数の返却値型を void(空) と宣言 引数を受け取る必要のない時,引数を受け取らないという意 味で,void と宣言 main関数 引数は受け取らない (受け取ることもできる) int main(void) { return (0); } プログラムの最後で, intの値(0)を返す プログラミング入門2 17 例題 *をno個連続して表示する関数 void put_stars( int no ) { ・・・・・・ } を作成し,動作を確かめよ ソースファイル名: stars.c #include <stdio.h> void put_stars( int no ) { while( no-- > 0 ) putchar( ‘*’ ); --no > 0 とすると? } int main(void) { int x; printf( “input no: ” ); scanf( “%d”, &x ); put_stars( x ); return (0); } プログラミング入門2 18 後置・前置 増分(減分)演算子 • 後置の場合: 式全体を評価してから,値を減らす(増やす) while( no-- > 0 ) putchar( ‘*’ ); no : 5→4→3→2→1 ***** no > 0 を評価 no-- を実行 (noを一つ減らす) • 前置の場合: 値を増減してから,式全体を評価 while( --no > 0 ) putchar( ‘*’ ); no : 4→3→2→1 **** no-- を実行 (noを一つ減らす) no > 0 を評価 プログラミング入門2 19 関数利用のメリット main関数の部分を簡潔に記述可能 頻繁に使う処理を関数(サブルーチン)として まとめておくことで,他のプログラムへの移 植,流用が容易になる 汎用性の高いプログラムの作成 プログラミング入門2 20 演習課題(第5回目) 1.自然数xの階乗を計算し、計算結果を返す関数 int kaijou( int x ){ ・・・・・・・ } を作成せよ。main関数を作り,キーボードから自然数を入力して,関数の動作を確認すること。 kadai5-1.c 2. 2つの2次元ベクトル P1 x1, y1 P2 x2 , y2 の内積値を返す関数 double naiseki( double x1, double y1, double x2, double y2){ ・・・・・・・ } を作成せよ。main関数で各ベクトルの成分をキーボードから入力し,関数の動作を確認すること。 Kadai5-2.c 3. 以下の2x3行列(A)と3x2行列(B)の積を計算して表示する プログラムを作成せよ。 1 5 1 2 3 A B 5 3 4 5 6 8 1 Kadai5-3.c プログラミング入門2 21 ソースファイル3つ(それぞれ,kadai5-1.c 〜 kadai5-3.c) をメールに 添付して提出せよ。 注:授業中にできた課題は授業中にチェックしてもらうこと。 注:授業中チェック済みの人も、メールにて課題を提出すること。 提出方法: メールの題名(subjet)を, pro2-5 学籍番号 自分の苗字 (全て半角英数文字にて)とする。 例) pro2-5 L02001 aoki 提出先: [email protected] (青木アドレス) 提出期限: 11月5日(月) 13:00まで(時間厳守) プログラミング入門2 22 中間テスト 日時:11月19日(月)3限に実施 場所:未定 内容: 最初〜関数まで 期末と並んで評価の上で重要な試験、しっかり準備して のぞむこと。 プログラミング入門2 23
© Copyright 2024 ExpyDoc