第4回(5月8日):授業の資料 関数1

C言語プログラム応用 第4回 2014.5.8
• 関数
List6-1
(教科書115ページ~)
List6-2
List6-4
• 関数の設計
List6-7
(教科書122ページ)
• 演習課題4-1 ★ 提出
• 演習課題4-2 ★ 提出
1
関数(function)
• main関数
プログラムに必ず1つはmain関数が必要
• ライブラリ関数
printf関数
scanf関数
puts関数
putchar関数
これらの関数は stdio.h
で定義されている
#include <stdio.h>
• 関数を自分で作成する
プログラムが簡潔でわかりやすくなる
2
function のタイプ
• return文で値を返す
– List 6-1, 6-2, 6-4, 6-11
• 値を返さない関数
– List 6-7
3
List 6-1 二つの整数の大きい方の値を返す関数
フローチャート
main関数
start
a,bを入力
maxof 関数
int maxof(x,y)
max=maxof(a,b)
max ← 戻り値(整数)
maxを出力
x>y
no
yes
return(x)
return(y)
end
4
List 6-1
関数定義と関数呼出し
二つの整数の大きい方の値を返す関数
#include <stdio.h>
int maxof( int x, int y) {
[ 関数の定義]
返却値型 関数名 仮引数の宣言
if ( x > y )
int maxof ( int x, int y)
return (x) ; /* 返却値(戻り値) x */
else
[ 関数呼び出し]
return (y); /* 返却値(戻り値) y */
関数名 実引数の宣言
}
maxof (na, nb)
int main (void) {
int na, nb;
puts(“二つの整数を入力してください。");
na, nb
main 関数
printf ("整数1:"); scanf ("%d",&na);
printf ("整数2:"); scanf ("%d",&nb);
maxof 関数 int x, int y
printf(“大きい方の値は%dです。¥n”, maxof (na, nb) );
return(0);
}
5
List 6-2
三つの整数の最大値を返す関数
フローチャート
main関数
start
a,b,cを入力
max3 関数
int max3(x,y,z)
max = x
no
y > max
yes
max3(a,b,c)
最大値(戻り値:整数)
最大値を出力
max = y
z > max
yes
no
max = z
end
return(max)
6
List 6-2
三つの整数の最大値を返す関数
#include <stdio.h>
/*三つの整数の最大値を返す*/
int max3 ( int x, int y, int z)
{
int max=x;
if ( y > max ) max = y;
if ( z > max ) max = z;
return (max); /*返却値*/
main 関数 na, nb, nc
max3関数 x, y, z
}
int main (void) {
int na,nb,nc;
puts("三つの整数を入力してください。");
printf("整数1:"); scanf("%d",&na);
printf("整数2:"); scanf("%d",&nb);
printf("整数3:"); scanf("%d",&nc);
printf(“最も大きい値は%dです。¥n”, max3 (na, nb, nc) );
return(0);
}
7
List 6-4 べき乗( xn )を計算する関数
フローチャート
main関数
start
power 関数
xとnを入力
double power(dx,no)
power(x,n)
xn (戻り値:実数)
dxをno回乗算する.
結果はtmpに保存
計算値を出力
return(tmp)
end
8
List 6-4
べき乗( xn )を計算する関数
#include <stdio.h>
/* dx の no 乗を返す */
double power ( double dx, int no)
{
int i;
double tmp = 1.0;
for ( i=1; i <= no; i++)
tmp *= dx; /* tmp=dx*dx*・・・ */
int main(void) {
int n;
double x;
puts(“実数を入力してください:”);
scanf (“ %lf ", &x);
puts(“整数を入力してください:”);
scanf ( “ %d ", &n);
return (tmp);
}
printf(“%.2fの%d乗は%.2fです。¥n”, x, n, power(x,n) );
return(0);
}
/*返却値*/
main 関数 x, n
power関数 dx, no
返却値:実数
9
List6-7 直角三角形(n段で左下が直角の三角形)を表示するプログラム
フローチャート
値を返さない関数
main関数
start
段数(n段)
を入力
i=1
void put_star(no)
put_star(i)
i++
put_stars 関数
改行 (戻り値なし)
*をno個
表示する
yes
i<n
no
end
end
10
関数の設計 (値を返さない関数) #include <stdio.h>
List6-7
直角三角形(左下が直角)を表示
int main (void)
{
int i, ln;
printf ("何段ですか:");
scanf ("%d",&ln);
for ( i=1; i <= ln ; i++ ) {
put_stars ( i );
putchar (‘¥n’);
}
return (0);
}
/* *をno個連続表示 */
void put_stars (int no)
リターン文が無い
{
返却値型 void
while (no-- >0 )
putchar(‘*’);
}
while (no >0) {
no--;
putchar(‘*’);
}
と同じ
出力例
何段ですか:4
*
**
***
****
11
関数型宣言(プロトタイプ宣言)
List 6-1
#include <stdio.h>
int maxof( int x, int y) {
if ( x > y )
return (x) ;
else
return (y);
}
int main (void) {
int na,nb;
puts(“二つの整数を入力してください。");
printf ("整数1:"); scanf ("%d",&na);
printf ("整数2:"); scanf ("%d",&nb);
printf(“大きい方の値は%dです。¥n”, maxof(na,nb) );
return(0);
}
同じ
関数型宣言
これをmain関数の前に宣言してお
けば、関数は後ろにおいてもよい.
セミコロン;を忘れないこと!
#include <stdio.h>
maxof 関数を定義します.詳しく
int maxof( int x, int y);
はmain関数の後で述べますとい
int main (void) {
う意味
int na,nb;
puts(“二つの整数を入力してください。");
printf ("整数1:"); scanf ("%d",&na);
printf ("整数2:"); scanf ("%d",&nb);
printf(“大きい方の値は%dです。¥n”, maxof (na,nb) );
return(0);
}
int maxof( int x, int y) {
if ( x > y )
return (x) ;
else
return (y);
}
12
演習課題 4-1
・ 三つのint型整数の最大値を返す関数と最小値を返す関数
を作成し,main関数には下記のように,関数を呼び出し,
表示させるプログラムについて,次の2種類を作成せよ.
(1)関数をmain関数の前に記述するプログラム
(2)プロトタイプ宣言をして関数はmain関数の後ろに記述する
・ ソースと実行結果をwordに貼り付け提出せよ.
int main(void){
int na,nb,nc;
puts("三つの整数を入力してください。");
printf("整数1:"); scanf("%d",&na);
printf("整数2:"); scanf("%d",&nb);
printf("整数3:"); scanf("%d",&nc);
printf(“最も大きい値は%dです。¥n”,max3 (na, nb, nc) );
printf(“最も小さい値は%dです。¥n”,min3 (na, nb, nc) );
return(0);
}
13
演習課題 4-2
以下に示すプログラムの誤りを直して実行せよ.
#inclue<stdi0.h>
#defined MAX 100
void diffMAX(int x)
int main(void){
int no;
printf("整数:"); scamf(“&d",%na);
printf(“その整数と%dとの差は&dです¥n”,diffMAX,diff(no) );
return(0);
}
void diffMAX(int x) {
if (x>MAX) return(MAX-x);
eles rerutn(x);
}
14
演習課題 4-2 ヒント
以下に示すプログラムの誤りを直して実行せよ.
#inclue<stdi0.h>
#defined MAX 100
void diffMAX(int x)
//2箇所
//1箇所
//2箇所
int main(void){
int no;
printf(“整数:”); scamf(“&d”,%na);
//4箇所
printf(“その数と%dとの差は&dです¥n”,diffMAX,diff(no) ); //3箇所
return(0);
}
void diffMAX(int x) {
//1箇所
if (x>MAX) return(MAX-x); {
//1箇所
eles rerutn(x);
//3箇所
}
15