【6日でできるC言語入門】関数の演習プログラム①

 C言語で関数の基礎を学んだら、実践的な演習プログラムに挑戦することが理解を深める近道です。ここでは、関数を活用した2つの練習問題を用意し、「値の平均を求める関数」や「素数判定を関数で実装」することで、関数の使い方や応用力を身につけます。
 また、実際にプログラムを作る中で、プロトタイプ宣言や戻り値、関数内での値の扱い方も合わせて学んでいきましょう。

1.平均値を求める関数の演習

1.1. 問題とプログラム例

例題1
 「3つの実数を入力し、その平均値を計算して表示するプログラムを作成してください。平均値の計算はavg3という関数で行い、3つの実数を引数として受け取り、その平均値を戻り値として返すようにしましょう。」

サンプルプログラム1

プロジェクト/ファイル名: Lesson42_1/main.c

#include <stdio.h>

// 3つの実数の平均値を返す関数のプロトタイプ宣言
double avg3(double, double, double);

int main(void) {
    double nums[3];
    int i;
    double result;
    for (i = 0; i < 3; i++) {
        printf("%d番目の数値を入力してください:", i + 1);
        scanf("%lf", &nums[i]);
    }
    result = avg3(nums[0], nums[1], nums[2]);
    printf("入力された数値の平均値:%lf\n", result);
    return 0;
}

// 3つの実数の平均値を計算する関数
double avg3(double a, double b, double c) {
    return (a + b + c) / 3.0;
}

実行結果

「SDLチェック」を「いいえ」にして、プログラムを実行します。

1番目の数値を入力してください:2.5
2番目の数値を入力してください:4.0
3番目の数値を入力してください:5.5
入力された数値の平均値:4.000000

1.2. 解説

項目説明
avg3関数3つの実数値を引数で受け取り、その平均値を返す。
プロトタイプ宣言mainより前にavg3関数の宣言を記述
配列の利用入力値を配列に格納し、まとめて処理しやすくしている。

2.素数判定と表示の関数演習

2.1. 問題とプログラム例

例題2
 「入力した自然数n以下のすべての素数を表示するプログラムを作成してください。素数判定はnum_divisors関数(約数の個数を返す)で行い、素数の一覧表示はdisp_primes関数で実装します。」

サンプルプログラム2

プロジェクト/ファイル名: Lesson42_2/main.c

#include <stdio.h>

// 約数の個数を求める関数プロトタイプ宣言
int num_divisors(int);
// 素数を表示する関数プロトタイプ宣言
void disp_primes(int);

int main(void) {
    int limit;
    printf("調べたい上限の自然数を入力してください:");
    scanf("%d", &limit);
    disp_primes(limit);
    return 0;
}

// nの約数の個数を返す関数
int num_divisors(int n) {
    int i, count = 0;
    for (i = 1; i <= n; i++) {
        if (n % i == 0) {
            count++;
        }
    }
    return count;
}

// 2からnまでの素数を表示する関数
void disp_primes(int n) {
    int i, printed = 0;
    if (n <= 1) {
        printf("2以上の自然数を入力してください。\n");
        return;
    }
    printf("2から%dまでの素数:\n", n);
    for (i = 2; i <= n; i++) {
        if (num_divisors(i) == 2) {
            printf("%d ", i);
            printed++;
            if (printed % 10 == 0) printf("\n"); // 10個ごとに改行
        }
    }
    if (printed % 10 != 0) printf("\n");
}

実行例1

「SDLチェック」を「いいえ」にして、プログラムを実行します。

調べたい上限の自然数を入力してください:20
2から20までの素数:
2 3 5 7 11 13 17 19

実行例2

「SDLチェック」を「いいえ」にして、プログラムを実行します。

調べたい上限の自然数を入力してください:1
2以上の自然数を入力してください。

2.2. 解説

関数名引数・戻り値機能とポイント
num_divisorsint型引数、int型戻り値指定した値の約数がいくつあるかを返す
disp_primesint型引数、戻り値なし2〜nまでの素数を判定して表示。10個ごとに改行

まとめ

  • 演習を通じて、関数の定義とプロトタイプ宣言の重要性、および関数の呼び出し方を身につけることができました。
  • 配列やforループと組み合わせることで、より柔軟なプログラム作成が可能になります。
  • 複数の関数を組み合わせて使うことで、見やすく再利用性の高いコードが書けるようになります。