C 언어 함수 실습 예제 모음

성적 등급 변환 함수

정수형 점수를 입력받아 등급 문자를 반환하는 함수를 구현합니다. 10점 단위로 구간을 나누어 A부터 E까지의 등급을 부여합니다.

#include <stdio.h>

char calculate_grade(int mark);

int main() {
    int mark;
    char level;
    
    while (scanf("%d", &mark) != EOF) {
        level = calculate_grade(mark);
        printf("점수: %d, 등급: %c\n\n", mark, level);
    }
    
    return 0;
}

char calculate_grade(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 = 'E';
    }
    
    return result;
}

주요 확인사항: 문자 상수는 반드시 작은따옴표(')를 사용해야 하며, 각 case 문 뒤에 break를 빠뜨리면 의도치 않은 fall-through가 발생합니다.

자릿수 합계 계산

반복문을 활용하여 정수의 각 자릿수를 분리하고 합산하는 함수입니다. 재귀적 접근법으로도 동일한 결과를 얻을 수 있습니다.

#include <stdio.h>

int digit_sum(int num);

int main() {
    int num, total;
    
    while (printf("숫자 입력: "), scanf("%d", &num) != EOF) {
        total = digit_sum(num);
        printf("n = %d, 합계 = %d\n\n", num, total);
    }
    
    return 0;
}

int digit_sum(int num) {
    int total = 0;
    
    while (num != 0) {
        total += num % 10;
        num /= 10;
    }
    
    return total;
}

른 거듭제곱 알고리즘

분할 정복 기법을 적용한 거듭제곱 계산 함수입니다. 지수가 짝수일 때 절반으로 나누어 계산한 뒤 제곱하면 시간 복잡도를 O(log n)으로 개선할 수 있습니다.

#include <stdio.h>

int fast_pow(int base, int exp);

int main() {
    int base, exp, result;
    
    while (printf("밑과 지수 입력: "), scanf("%d%d", &base, &exp) != EOF) {
        result = fast_pow(base, exp);
        printf("%d^%d = %d\n\n", base, exp, result);
    }
    
    return 0;
}

int fast_pow(int base, int exp) {
    int half;
    
    if (exp == 0)
        return 1;
    else if (exp % 2 == 1)
        return base * fast_pow(base, exp - 1);
    else {
        half = fast_pow(base, exp / 2);
        return half * half;
    }
}

삼각형 분류 함수

세 변의 길이를 입력받아 삼각형의 종류를 판별합니다. 삼각형 불등식을 먼저 검증한 후, 등변, 직각, 정삼각형 여부를 순차적으로 확인합니다.

#include <stdio.h>

int triangle_type(int x, int y, int z);

int main() {
    int x, y, z, kind;
    
    while (scanf("%d%d%d", &x, &y, &z) != EOF) {
        kind = triangle_type(x, y, z);
        switch (kind) {
            case 0: printf("삼각형 아님\n"); break;
            case 1: printf("일반 삼각형\n"); break;
            case 2: printf("정삼각형\n"); break;
            case 3: printf("이등변삼각형\n"); break;
            case 4: printf("직각삼각형\n"); break;
        }
    }
    
    return 0;
}

int triangle_type(int x, int y, int z) {
    if (x + y <= z || x + z <= y || y + z <= x)
        return 0;
    if (x == y && y == z)
        return 2;
    if (x == y || x == z || y == z)
        return 3;
    if (x*x + y*y == z*z || x*x + z*z == y*y || y*y + z*z == x*x)
        return 4;
    
    return 1;
}

조합 계산: 반복 vs 재귀

이항 계수 nCm을 계산하는 두 가지 방식을 비교합니다. 반복문 방식은 메모이제이션 효과를 활용하고, 재귀 방식은 파스칼의 항등식 C(n,m) = C(n-1,m) + C(n-1,m-1)을 직접 구현합니다.

// 반복적 접근법
#include <stdio.h>

int comb_iter(int n, int r);

int main() {
    int n, r, val;
    
    while (scanf("%d%d", &n, &r) != EOF) {
        val = comb_iter(n, r);
        printf("C(%d,%d) = %d\n\n", n, r, val);
    }
    
    return 0;
}

int comb_iter(int n, int r) {
    if (r > n) return 0;
    if (r == 0 || r == n) return 1;
    if (r > n - r) r = n - r;
    
    int res = 1;
    for (int i = 1; i <= r; i++) {
        res = res * (n - r + i) / i;
    }
    return res;
}
// 재귀적 접근법
#include <stdio.h>

int comb_recur(int n, int r);

int main() {
    int n, r, val;
    
    while (scanf("%d%d", &n, &r) != EOF) {
        val = comb_recur(n, r);
        printf("C(%d,%d) = %d\n\n", n, r, val);
    }
    
    return 0;
}

int comb_recur(int n, int r) {
    if (r > n) return 0;
    if (r == 0 || r == n) return 1;
    
    return comb_recur(n - 1, r) + comb_recur(n - 1, r - 1);
}

세 수의 최대공약수

세 정수의 공통 약수 중 가장 큰 값을 찾는 함수입니다. 세 수의 최솟값부터 1까지 역순으로 검색하여 처음 발견하는 공약수를 반환합니다.

#include <stdio.h>

int find_gcd_triple(int p, int q, int r);

int main() {
    int p, q, r, common;
    
    while (scanf("%d%d%d", &p, &q, &r) != EOF) {
        common = find_gcd_triple(p, q, r);
        printf("최대공약수: %d\n\n", common);
    }
    
    return 0;
}

int find_gcd_triple(int p, int q, int r) {
    int smallest = p;
    if (q < smallest) smallest = q;
    if (r < smallest) smallest = r;
    
    for (int d = smallest; d >= 1; d--) {
        if (p % d == 0 && q % d == 0 && r % d == 0)
            return d;
    }
    return 1;
}

패턴 출력: 캐릭터 라인

중첩 반복문과 보조 함수를 활용해 감소하는 패턴의 캐릭터 라인을 출력합니다. 각 행마다 머리, 몸통, 다리를 구성하고 들여쓰기로 삼각형 형태를 만듭니다.

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

void draw_scene(int cnt);
void draw_head(void);
void draw_torso(void);
void draw_legs(void);

int main() {
    int cnt;
    printf("줄 수 입력: ");
    scanf("%d", &cnt);
    draw_scene(cnt);
    
    return 0;
}

void draw_head(void)  { printf(" O\t"); }
void draw_torso(void) { printf("<H>\t"); }
void draw_legs(void)   { printf("I I\t"); }

void draw_scene(int cnt) {
    int row, space, fig;
    
    for (row = 0; row < cnt; row++) {
        int figures = 2 * cnt - 2 * row - 1;
        
        for (space = 0; space < row; space++) printf("\t");
        for (fig = 0; fig < figures; fig++) draw_head();
        for (space = 0; space < row; space++) printf("\t");
        printf("\n");
        
        for (space = 0; space < row; space++) printf("\t");
        for (fig = 0; fig < figures; fig++) draw_torso();
        for (space = 0; space < row; space++) printf("\t");
        printf("\n");
        
        for (space = 0; space < row; space++) printf("\t");
        for (fig = 0; fig < figures; fig++) draw_legs();
        for (space = 0; space < row; space++) printf("\t");
        printf("\n");
    }
}

태그: C 재귀함수 반복문 알고리즘 함수

6월 13일 17:10에 게시됨