C言語で簡単なプログラムを作りながら、その基本的な事柄を学んでいこう。
今回のテーマは、「関数」である。
英語の点数と数学の点数の合計点を平均点を求める
要素数がnであるint型の配列vの要素の合計点と平均点を返す関数を作ってみよう。
/* 英語の点数と数学の点数の合計点を平均点を求める 改訂版*/
#include <stdio.h>
#define NUMBER 5 //学生の人数
/*要素数nの配列vの合計点を返す*/
int sum_of(const int v[],int n)
{
int sum = 0;
for (int i = 0; i < n; i++)
sum += v[i];
return sum;
}
/*要素数nの配列vの平均点を返す*/
double ave_of(const int v[], int n)
{
int sum = 0;
sum = sum_of(v,n);
double average = (double)sum / n;
return average;
}
int main(void)
{
int i;
int eng[NUMBER];
int mat[NUMBER];
double ave_e,ave_m;
int sum_e,sum_m;
printf("%d人の点数を入力してください\n",NUMBER);
for ( i = 0; i < NUMBER; i++)
{
printf("[%d] 英語:",i+1); scanf("%d",&eng[i]);
printf(" 数学:"); scanf("%d",&mat[i]);
}
ave_e = ave_of(eng,NUMBER);
ave_m = ave_of(mat,NUMBER);
sum_e = sum_of(eng,NUMBER);
sum_m = sum_of(mat,NUMBER);
printf("英語の平均点= %.2f\n",ave_e);
printf("数学の平均点= %.2f\n",ave_m);
printf("英語の合計点= %d\n",sum_e);
printf("数学の合計点= %d\n",sum_m);
return 0;
}
実行結果(1)
5人の点数を入力してください
[1] 英語:53
数学:82
[2] 英語:49
数学:35
[3] 英語:21
数学:72
[4] 英語:91
数学:35
[5] 英語:77
数学:12
英語の平均点= 58.20
数学の平均点= 47.20
英語の合計点= 291
数学の合計点= 236
実行結果(2)念のため、別の数値で試してみた。
5人の点数を入力してください
[1] 英語:83
数学:17
[2] 英語:49
数学:35
[3] 英語:77
数学:78
[4] 英語:25
数学:67
[5] 英語:65
数学:20
英語の平均点= 59.80
数学の平均点= 43.40
英語の合計点= 299
数学の合計点= 217
このプログラムは、英語の点数と数学の点数を読み込んで、両方の合計点と平均点を求めるものである。
関数 sum_ofの頭部で、配列を受け取る仮引数vが「型名 引数名[]」の形式で宣言されている。(要素数は別の仮引数nとして宣言されている。)
一方で、関数を呼び出す側は、添え字演算子[ ]をつけずに、配列の名前だけを実引数として与えている。
main関数では、配列eng(あるいはmat)を実引数として渡しており、呼び出された関数sum_ofは、その配列を仮引数vに受け取る。
関数呼び出し式sum_of(eng,NUMBER)で呼び出された関数sum_ofの中では、仮引数の配列vは、(実質的に)実引数の配列engそのものになる。
例えば、v[0]は、eng[0]を表し、v[1]は、eng[1]を表す。
ただ、関数に渡す配列の中身を書き換えられると困ることになる。
そこで、仮引数の宣言にconstという型修飾子(type qualifier)を置いて宣言するだけで、受け取った配列は、関数内で書き換えられなくなる。
もし、関数sum_ofの中に次のコードがあれば、エラーとなる。
v[1] = 5; //エラー:const宣言された配列の要素には代入できない
(参考文献)新・明解C言語 入門編 第2版 柴田望洋著(SBクリエイティブ)新・解きながら学ぶC言語 第2版 柴田望洋・由梨かおる著(SBクリエイティブ)
コメント