戻り値

第11回[平成15年7月3日(木)]:PN03-11.ppt
関数(1)
今日の内容
1
2
3
4
5
関数とは、関数の必要性
戻り値のある関数
引数と関数呼び出し
戻り値の無い関数
関数による配列の取扱い
関数の必要性
複数のN×Nの掛け算表を出力する
int a, b;
printf("まず、3×3の表\n");
for ( a=1; a<=3; a++) {
for ( b=1; b<=3; b++)
printf("%3d",a*b);
printf("\n"); }
ab 1
1
1
2
2
3
3
1 2 3
2 4 6
3 6 9
4 8 12
5 10 15
6 12 18
printf("次に、6×6の表\n");
for ( a=1; a<=6; a++) {
for ( b=1; b<=6; b++) {
printf("%3d",a*b);
printf("\n"); }
/*つづく*/
2
2
4
6
4
8
12
16
20
24
3
3
6
9
5
10
15
20
25
30
6
12
18
24
30
36
printf("次に、9×9の表\n");
for ( a=1; a<=9; a++) {
for ( b=1; b<=9; b++)
printf("%3d",a*b);
printf("\n"); }
結局、3,6,9という数値Nが違うだけ
for ( a=1; a<=N; a++) {
for ( b=1; b<=N; b++)
printf("%3d",a*b);
printf("\n"); }
これをNをいろいろ変えて実行できると良い
ひとまとまりの仕事を関数 NN_Table(N) で与える
関数の導入
戻り値の無い関数
ひとまとまりの仕事を
何回か呼び出したい
例[定まった形式で何回か
印刷する]
ある計算方法で何回
か結果を得たいとき
例[複雑な計算を何回か
行う]
値を
返さない
関数
値を返す
関数
戻り値のある関数
戻り値のある関数
• 自分独自の関数を定義し、標準関数[sqrt,
pow, sinなど]と同じように利用する
例 z = myfn(2.5);
• 関数値(戻り値)を返す
返す値の型を指定して関数定義する
関数頭部
double myfn(double x)
{ double f;
f = x + 2.0*x - 5.5*x*x;
return (f);
}
関数本体
戻り値のある関数の定義
例:整数値を受け取り、その値が偶数なら
ば 0、 奇数ならば 1 を与える関数を
作成せよ。
int evod( int k ) {
int q;
q = k % 2;
return (q);
}
関数の定義はmain()関数の外に記述する
関数の定義と実行
#include <stdio.h>
int evod(int k) {
int q;
q = k % 2;
return (q);
}
int main(void) {
int i, n;
for ( i=1; i<=10; i++) {
printf("整数を入力="); scanf("%d",&n);
printf("偶数か?>%d\n",evod(n)); }
return (0); }
関数の定義と実行(補足)
#include <stdio.h>
int evod(int k);
int main(void) {
int i, n;
for ( i=1; i<=10; i++) {
printf("整数を入力="); scanf("%d",&n);
printf("偶数か?>%d\n",evod(n)); }
}
int evod(int k) {
return ( k % 2 );
}
main()関数より後で定義する場合
間違い探し問題(1)
int Sum(int A, int B, int C) {
int k;
k = A+B+C;
return k;
}
double Sum(double X, Y) {
double S;
S = X+Y;
return;
}
間違い探し問題(2)
#include <stdio.h>
int Upper(char X) {
if (X <= 'Z')
return (1);
int main(void) {
else
char A,B,C;
return (0);
int T1, T2, T3;
}
・・・
T1 = Upper(A);
・・・
T2 = Upper(B,C);
・・・
T3 = Upper(T1);
・・・
}
引数と呼び出しにつて
引数:関数の中に入る式(変数、値)
関数の定義の中での引数
仮引数
関数を呼び出す時の引数
実引数
呼び出し方(値呼び出し)
実引数の 式(変数や定数など)の値
値を
実引数の値は
仮引数に
コピー
変化しない !!
間違い探し問題(3)
int Sum(int A, int B, int C) {
int Sum;
Sum = A+B+C;
return (Sum);
}
double S1(double A, double B) {
double Sum;
Sum = A+B;
if ( B > 0 ) return (A/B);
else
return (Sum); }
戻り値のある関数の特徴と一般形
特徴
• 関数の計算結果をreturnで呼出し側に返す
• 変数名は命令の定義を行うところでのみ有効
一般形
int fff(int a, int b, double d)
//関数の型 関数名(型 変数名, 型 変数名, ...)
{ int x,y;
{関数の中だけで使う変数を宣言}
・・・
return (関数の結果値);
・・・
}
戻り値の無い関数の定義と実行
#include <stdio.h>
void NN_Table(int N)
{ ..(関数定義の本体).. }
int main(void) {
printf("3×3の表\n");
NN_Table(3);
printf("6×6の表\n");
NN_Table(6);
printf("9×9の表\n");
NN_Table(9);
}
関数の
定義
関数の
呼出し
#include <stdio.h>
void NN_Table(int N) {
int i, j;
for (i=1; i<=N; i++) {
for (j=1; j<=N; j++)
printf("%3d",i*j);
printf("\n");
}
}
int main(void)
{ ・・・
printf("6×6の表\n");
NN_Table(6);
・・・
}
戻り値の無い関数の特徴と一般形
特徴
• 一連の文を一まとまりの命令として定義
• 仮引数と実引数の関係、関数内で宣言された変
数の扱いは、戻り値のある関数の場合と同じ
一般形
void ZZZ(int a, int b, double d)
//void 関数名(型 変数名,....)
{ int x,y; //関数内で使う変数を宣言
命令の集まり(仕事の手順)
}
戻り値の有無による関数の違い
戻り値のある関数
戻り値の無い関数
returnの型(関数
の型)で宣言
void で宣言される
return 式 で呼び
出し側に値を返す
式を伴ったreturn
は無い(returnその
ものはあっても良い)
関数は呼び出し側では、
文の一部となる
..; x=ff(a);..
文そのものとなる
..; xyz(7);..
引数に関する考え方は全く同じである
引数の無い関数の特徴と一般形
特徴
• 戻り値のある場合、無い場合がある
• 呼び出し側からは引数を書かない 関数名( )
• 関数定義で引数のところは void とする
一般形
int ZZZ(void)
//戻り値の型 関数名(void)
{ int x,y; /*関数内の変数の宣言*/
命令の集まり(仕事の手順)
}
関数(引数、戻り値)のまとめ
戻り値有り
引 int fn(int a) {
数 double x; int
有 k;
・・・
り
戻り値無し
void fn(int a){
double x, y;
・・・
return; ・・・ }
return (k); ・・ }
引 int fn(void) {
数 double x; int
無 k;
し
・・・
void fn(void) {
double x, y;
・・・
return; ・・・ }
(標準)ライブラリ関数
• よく用いられる関数などをまとめたファイル
• ヘッダファイル[***.h]
• #include <***.h> で取り込む
入出力関係
stdio.h
scanf,printf
math.h 数学関数
cos, sin, tan, exp,
log, log10, sqrt
stdlib.h 一般ユーティリティ
abs, rand, srand
配列の受け渡し
• 仮引数の配列に[]を付け、要素数は別引数で
与える int max_of(int vc[], int
no)
• 実引数には、配列名と要素数を与える
int eng[100];
= max_of(eng,
100)
intmax_e
max_of(int
vc[], int
no)
{ int i;
int max = vc[0];
配列vc[i]
for ( i=1; i<no; i++) ・・・ を使う
return (max);
}
#include <stdio.h>
#define NUMBER 5
int max_of(int vc[], int no )
{ int i;
int max = vc[0];
for (i=1; i<no; i++) {
if (vc[i]>max) max=vc[i];
return (max);
}
int main(void)
{ ・・・
int eng[NUMBER];
k = max_of(eng, NUMBER);
・・・ }
多次元配列の受け渡し
• 仮引数の配列の[]の中に要素数を明記する
int max( int vc[5][10])
ただし、第1添え字は省略可能
int max( int vc[][10], int
no1)
• 実引数には、配列名だけを与えればよい。
define Num1 5
define Num2 10
int eng[Num1][Num2];
max_e = max(eng);
max(eng , int
Num1);
• 仮引数の配列は実引数の配列そのもの
→ 書き換えが可能
P入門(第11回)は
終了です。
次回(第12回)は
7月10日
続いて、P演習に入ります。
では、しばらく休憩します。