C言語のきほん「合計点と平均点を返す関数を作ろう」

スポンサーリンク
C言語

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クリエイティブ)

コメント

タイトルとURLをコピーしました