プログラミング実験レポート

1. 点数評価システム


#include <stdio.h>

char calculateGrade(int score);
int main() {
    int score;
    char result;

    while (printf("点数を入力してください: "), scanf("%d", &score) != EOF) {
        result = calculateGrade(score);
        printf("Score: %d, Grade: %c\n\n", score, result);
    }

    return 0;
}

char calculateGrade(int score) {
    char grade;

    switch (score / 10) {
        case 10:
        case 9: grade = 'A'; break;
        case 8: grade = 'B'; break;
        case 7: grade = 'C'; break;
        case 6: grade = 'D'; break;
        default: grade = 'E';
    }

    return grade;
}

問題1: 100点満点の点数を評価等級に変換するシステムを作成します。

問題2: 70-100点の範囲で不正な評価が発生するバグを修正します。

2. 数字の桁和計算


#include <stdio.h>

int sumDigits(int num);
int main() {
    int num;
    int total;

    while (printf("整数を入力してください: "), scanf("%d", &num) != EOF) {
        total = sumDigits(num);
        printf("入力された数: %d, �桁和: %d\n\n", num, total);
    }

    return 0;
}

int sumDigits(int num) {
    int sum = 0;
    int digit;

    while (num != 0) {
        digit = num % 10;
        sum += digit;
        num /= 10;
    }

    return sum;
}

問題1: 整数の各桁の数字の和を計算します。

問題2: 桁和を計算するための2つのアルゴリズム(再帰と反復)を説明します。

3. 幂数計算


#include <stdio.h>

int computePower(int base, int exponent);
int main() {
    int base, exponent;
    int result;

    while (printf("基数と指数を入力してください: "), scanf("%d%d", &base, &exponent) != EOF) {
        result = computePower(base, exponent);
        printf("指数: %d, 結果: %d\n\n", exponent, result);
    }

    return 0;
}

int computePower(int base, int exponent) {
    if (exponent == 0) {
        return 1;
    } else if (exponent % 2 == 1) {
        return base * computePower(base, exponent - 1);
    } else {
        int temp = computePower(base, exponent / 2);
        return temp * temp;
    }
}

4. 孪生素数検出


#include <stdio.h>

int checkPrime(int number);
int main() {
    int i, number, twin, count = 0;

    printf("100以下の孨生素数:\n");
    for (i = 2; ; ++i) {
        number = i;
        twin = i + 2;

        if (twin > 100) {
            break;
        }

        if (checkPrime(number) && checkPrime(twin)) {
            printf("%d, %d\n", number, twin);
            count++;
        }
    }

    printf("100以下の孨生素数の個数: %d個\n", count);
    return 0;
}

int checkPrime(int number) {
    if (number <= 1) {
        return 0;
    }

    for (int divisor = 2; divisor * divisor <= number; ++divisor) {
        if (number % divisor == 0) {
            return 0;
        }
    }

    return 1;
}

5. ハノイの塔


#include <stdio.h>

int solveHanoi(unsigned int disks, char source, char target, char auxiliary);
void moveDisk(unsigned int diskNum, char from, char to);

int main() {
    unsigned int disks;

    while (printf("ディスクの数を入力してください: "), scanf("%u", &disks) != EOF) {
        int moveCount = solveHanoi(disks, 'A', 'C', 'B');
        printf("%u個のディスクを移動した回数: %d回\n\n", disks, moveCount);
    }

    return 0;
}

int solveHanoi(unsigned int disks, char source, char target, char auxiliary) {
    int moveCount = 0;

    if (disks == 1) {
        moveDisk(1, source, target);
        moveCount++;
    } else {
        moveCount += solveHanoi(disks - 1, source, auxiliary, target);
        moveDisk(disks, source, target);
        moveCount++;
        moveCount += solveHanoi(disks - 1, auxiliary, target, source);
    }

    return moveCount;
}

void moveDisk(unsigned int diskNum, char from, char to) {
    printf("%u: %c → %c\n", diskNum, from, to);
}

6. 組み合わせ計算

方法1:


#include <stdio.h>

int combination(int n, int m);
int main() {
    int n, m;
    int result;

    while (printf("nとmを入力してください: "), scanf("%d%d", &n, &m) != EOF) {
        result = combination(n, m);
        printf("n = %d, m = %d, 組み合わせ数 = %d\n\n", n, m, result);
    }

    return 0;
}

int combination(int n, int m) {
    if (m < 0 || n < m) {
        return 0;
    }

    int numerator = 1;
    int denominator1 = 1;
    int denominator2 = 1;

    for (int i = 1; i <= n; ++i) {
        numerator *= i;
    }
    for (int i = 1; i <= m; ++i) {
        denominator1 *= i;
    }
    for (int i = 1; i <= n - m; ++i) {
        denominator2 *= i;
    }

    return numerator / (denominator1 * denominator2);
}

方法2:


#include <stdio.h>

int combination(int n, int m);
int main() {
    int n, m;
    int result;

    while (printf("nとmを入力してください: "), scanf("%d%d", &n, &m) != EOF) {
        result = combination(n, m);
        printf("n = %d, m = %d, 組み合わせ数 = %d\n\n", n, m, result);
    }

    return 0;
}

int combination(int n, int m) {
    if (n == m) {
        return 1;
    } else if (m == 0) {
        return 1;
    } else if (n < m) {
        return 0;
    } else {
        return combination(n - 1, m) + combination(n - 1, m - 1);
    }
}

7. 最大公約数計算


#include <stdio.h>

int gcd(int a, int b, int c);
int main() {
    int a, b, c;
    int result;

    while (printf("3つの整数を入力してください: "), scanf("%d%d%d", &a, &b, &c) != EOF) {
        result = gcd(a, b, c);
        printf("最大公約数: %d\n\n", result);
    }

    return 0;
}

int gcd(int a, int b, int c) {
    int temp;
    while (b != 0) {
        temp = a % b;
        a = b;
        b = temp;
    }

    temp = a;
    a = c;
    while (b != 0) {
        temp = a % b;
        a = b;
        b = temp;
    }

    return a;
}

タグ: C言語 関数 スイッチ文 再帰 素数

7月19日 17:22 投稿