Document

プログラミング入門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