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

C言語の関数は、プログラムを効率よく組み立てるための最重要要素です。
ここでは、基本から応用まで、関数作成の演習プログラムを通して実践力を養います。
入出力・条件分岐・ループ・乱数・ファイル分割などもあわせて学び、
自分だけの関数を自在に設計できるようにしましょう。

1.3つの整数値の合計を求める関数の作成

1.1. 機能と概要

関数名引数戻り値概要
add3int x, int y, int z3つの合計3つの整数値の合計を返す

1.2. サンプルプログラム

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

#include <stdio.h>

// 3つの整数の合計を返す関数
int add3(int x, int y, int z) {
    return x + y + z;
}

int main(void) {
    int a, b, c, total;
    printf("aの値を入力してください:");
    scanf("%d", &a);
    printf("bの値を入力してください:");
    scanf("%d", &b);
    printf("cの値を入力してください:");
    scanf("%d", &c);
    total = add3(a, b, c);
    printf("a + b + c = %d\n", total);
    return 0;
}

実行結果

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

aの値を入力してください:7
bの値を入力してください:2
cの値を入力してください:9
a + b + c = 18

2.自作の絶対値関数を使ったプログラム

2.1. 機能と概要

関数名引数戻り値概要
my_absint valvalの絶対値整数の絶対値を返す

2.2. サンプルプログラム

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

#include <stdio.h>

// 整数の絶対値を返す関数
int my_abs(int val) {
    if (val < 0) return -val;
    else return val;
}

int main(void) {
    int num;
    printf("整数値を入力してください:");
    scanf("%d", &num);
    printf("%dの絶対値は%dです。\n", num, my_abs(num));
    return 0;
}

実行結果

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

3.乱数を使った計算クイズゲーム

3.1. 機能と概要

関数名引数戻り値概要
judge_sumint a, int b, int ca+b==cなら1a+bがcと等しければ1, 違えば0を返す

3.2. サンプルプログラム

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

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 合計値を判定する関数
int judge_sum(int a, int b, int c) {
    return (a + b == c) ? 1 : 0;
}

int main(void) {
    int num1, num2, answer, result;

    srand((unsigned)time(NULL)); // 乱数の初期化
    num1 = rand() % 10 + 1; // 1〜10
    num2 = rand() % 10 + 1; // 1〜10

    printf("計算問題:%d + %d\n", num1, num2);

    do {
        printf("合計を入力してください:");
        scanf("%d", &answer);
        result = judge_sum(num1, num2, answer);
        if (result)
            printf("正解です!\n");
        else
            printf("間違いです\n");
    } while (!result);

    return 0;
}

実行結果

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

計算問題:6 + 8
合計を入力してください:9
間違いです
合計を入力してください:15
間違いです
合計を入力してください:14
正解です!

4.関数のファイル分割の実践

4.1. 概要

関数の定義をヘッダファイル・ソースファイルに分け、main.cでは関数を呼び出すだけにします。

triangle.h

プロジェクト/ファイル名: Lesson48_4/triangle.h

#ifndef TRIANGLE_H
#define TRIANGLE_H

void printStars(int n);
void printTriangle(int n);

#endif

triangle.c

プロジェクト/ファイル名: Lesson48_4/triangle.c

#include <stdio.h>
#include "triangle.h"

// n個の★を横並びで表示
void printStars(int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("★");
    }
    printf("\n");
}

// n段の三角形を表示
void printTriangle(int n) {
    int i;
    for (i = 1; i <= n; i++) {
        printStars(i);
    }
}

main.c

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

#include <stdio.h>
#include "triangle.h"

int main(void) {
    int num;
    printf("段数を入力してください:");
    scanf("%d", &num);
    if (num > 0) {
        printTriangle(num);
    } else {
        printf("1以上の数を入力してください。\n");
    }
    return 0;
}

4.2. 実行方法

1.「SDLチェック」を「いいえ」にします。

2.「ビルド」 メニューから「ソリューションのビルド」を選択します。

3.ビルドが成功すると、「main.c」「mathops.c」「screen.c」の両方がコンパイルされ、正しくリンクされます。

4.「デバッグ」 メニューから「デバッグなしで開始」を選択します。

5.結果ウィンドウに、次のような出力が表示されます。

実行結果

段数を入力してください:5
★
★★
★★★
★★★★
★★★★★

まとめ

  • 複数の関数を組み合わせることで、柔軟なプログラム作成が可能になります。
  • 関数のファイル分割や自作関数の活用により、保守性・再利用性も高まります。
  • 乱数や条件分岐も関数と一緒に活用してみましょう。