C言語プログラミング演習:関数とアルゴリズム

演習課題1:成績評価システム

#include <stdio.h>

char evaluate_score(int mark);  // 関数宣言

int main() {
    int mark;
    char evaluation;
    
    while(scanf("%d", &mark) != EOF) {
        evaluation = evaluate_score(mark);  // 関数呼び出し
        printf("得点: %d, 評価: %c\n\n", mark, evaluation);
    }
    
    return 0;
}

// 関数定義
char evaluate_score(int mark) {
    char result;
    
    switch(mark/10) {
    case 10:
    case 9:   result = 'A'; break;
    case 8:   result = 'B'; break;
    case 7:   result = 'C'; break;
    case 6:   result = 'D'; break;
    default:  result = 'F';
    }
    
    return result;
}

問題1:入力された百分評価を対応する等級に変換する。引数の型:int、戻り値の型:char 問題2:各case文の後にbreak文がない場合、次のcase文が実行されてしまう。単一文字は' 'で囲む必要がある。

演習課題2:数字の各桁の合計

#include <stdio.h>

int calculate_digit_sum(int num);  // 関数宣言

int main() {
    int num;
    int result;
    
    while(printf("数値を入力: "), scanf("%d", &num) != EOF) {
        result = calculate_digit_sum(num);  // 関数呼び出し
        printf("入力値: %d, 合計: %d\n\n", num, result);
    }
    
    return 0;
}

// 関数定義
int calculate_digit_sum(int num) {
    int total = 0;
    
    while(num != 0) {
        total += num % 10;
        num /= 10;
    }
    
    return total;
}

問題1:整数の各桁の数字を合計する 問題2:再帰呼び出しを使用することも可能

演習課題3:べき乗計算

#include <stdio.h>

int compute_power(int base, int exponent);  // 関数宣言

int main() {
    int base, exponent;
    int result;
    
    while(printf("底と指数を入力: "), scanf("%d%d", &base, &exponent) != EOF) {
        result = compute_power(base, exponent);  // 関数呼び出し
        printf("%dの%d乗: %d\n\n", base, exponent, result);
    }
    
    return 0;
}

// 関数定義
int compute_power(int base, int exponent) {
    int temp;
    
    if(exponent == 0)
        return 1;
    else if(exponent % 2)
        return base * compute_power(base, exponent-1);
    else {
        temp = compute_power(base, exponent/2);
        return temp*temp;
    }
}

問題1:整数xのn乗を計算する 問題2:再帰関数である。nが奇数の場合、power(x,n)=x*power(x,n-1)。nが偶数の場合、power(x,n)=power(x,n/2)*power(x,n/2)。nが0の場合、power(x,n)=1。

演習課題4:三角形の分類

#include <stdio.h>
int identify_triangle(int side1, int side2, int side3);
int main(){
    int side1, side2, side3, classification;
    while(scanf("%d%d%d", &side1, &side2, &side3) != EOF){
        classification = identify_triangle(side1, side2, side3);
        switch(classification){
        case 0: printf("三角形を形成できません\n\n");
            break;
       
        case 1:printf("不等辺三角形\n\n");
            break;
        
        case 2:printf("正三角形\n\n");
            break;
        
        case 3:printf("二等辺三角形\n\n");
            break;
        
        case 4:printf("直角三角形\n\n");
            break;
        }
    }

        return 0;
    }

int identify_triangle(int side1, int side2, int side3){
    if(side1 >= side2 + side3 || side2 >= side1 + side3 || side3 >= side1 + side2)
        return 0;

    if(side1 == side2 && side2 == side3)
        return 2;

    if(side1 == side2 || side1 == side3 || side3 == side2)
        return 3;

    if(side1*side1 == side2*side2 + side3*side3 || side2*side2 == side1*side1 +side3*side3 || side3*side3 == side1*side1 + side2*side2)
        return 4;

    else
        return 1;
}

演習課題5:組み合わせ計算

#include <stdio.h>

int combination(int total, int select);
int main() {
    int total, select;
    int result;
    while(scanf("%d%d", &total, &select) != EOF) {
        result = combination(total, select);
        printf("総数: %d, 選択数: %d, 結果: %d\n\n", total, select, result);
    }
    return 0;
}

int combination(int total, int select) {
   
    if (select > total) return 0;
    if (select == 0 || select == total) return 1;
    
    return combination(total - 1, select) + combination(total - 1, select - 1);
}

演習課題6:最大公約数

#include <stdio.h>

int find_gcd(int num1, int num2, int num3);
int main() {
    int num1, num2, num3;
    int result;
    while (scanf("%d%d%d", &num1, &num2, &num3) != EOF) {
        result = find_gcd(num1, num2, num3);
        printf("最大公約数:%d\n", result);
    }
    return 0;
}

int find_gcd(int num1, int num2, int num3) {
    int smallest = num1;
    int i;
    
    if(num2 < smallest)
        smallest = num2;
    if(num3 < smallest)
        smallest = num3;
    
    for (int i = smallest; i >= 1; i--) {
        if(num1%i == 0 && num2%i == 0 && num3%i == 0) {
           return i;
        }
    }
}

演習課題7:文字パターン出力

#include <stdio.h>
#include <stdlib.h>
void display_pattern(int level);
int main() {
        int level;
        printf("レベルを入力: ");
        while (scanf("%d", &level) != EOF) {
                printf("入力レベル: %d\n", level);
                display_pattern(level);
                printf("\nレベルを入力: ");
        
    }
        return 0;
    
}

void display_pattern(int level) {
        for (int row = 1; row <= level; row++) {
                for (int space = 1; space < row; space++) {
                        printf("\t");
            
        }
                for (int element = 1; element <= 2 * (level - row) + 1; element++) {
                        printf("  O  \t");
            
        }
                printf("\n");
        
                for (int space = 1; space < row; space++) {
                        printf("\t");
            
        }
                for (int element = 1; element <= 2 * (level - row) + 1; element++) {
                        printf(" <H> \t");
            
        }
                printf("\n");
        
                for (int space = 1; space < row; space++) {
                        printf("\t");
            
        }
                for (int element = 1; element <= 2 * (level - row) + 1; element++) {
                        printf(" I I \t");
            
        }
                printf("\n");
        
    }
    
}

タグ: C言語 関数 再帰 アルゴリズム プログラミング演習

7月3日 21:29 投稿