C/Chapter05. 제어문(if, switch), 반복문(for, while, do-while), 분기문(break, continue, goto, return)

lullaby ·2025년 10월 1일

C언어

목록 보기
5/10
post-thumbnail

1. 제어문 핵심 개념

조건문 (if와 switch)

1.1 if 문

  • 기본 구조: if (조건식) { 실행문; }
  • if-else: if (조건식) { 실행문1; } else { 실행문2; }
  • if-else if-else: 여러 조건을 순차적으로 확인할 때 사용
  • 중첩된 if: if 문 안에 다른 if 문을 사용
  • 주의사항: 복합문({})을 사용하여 여러 문장 묶기, 들여쓰기로 가독성 향상

1.2 switch 문

  • 기본 구조:
    switch (정수식) {
        case1: 실행문1; break;
        case2: 실행문2; break;
        default: 기본실행문; break;
    }
  • 특징: 정수식 값에 따라 다중 분기 실행
  • 주의사항:
    • case 끝에 break 필수 (없으면 다음 case도 실행)
    • 정수식만 가능 (실수, 문자열 불가)
    • default는 선택사항이지만 권장

반복문 (for, while, do-while)

2.1 for 문

  • 기본 구조: for (초기식; 조건식; 증감식) { 실행문; }
  • 특징: 반복 횟수가 정해진 경우 주로 사용
  • 중첩 for문: 행렬, 패턴 구현 등에 활용

2.2 while 문

  • 기본 구조: while (조건식) { 실행문; }
  • 특징: 조건이 참인 동안 계속 반복
  • 무한 루프: while(1) 형태로 구현

2.3 do-while 문

  • 기본 구조:
    do {
        실행문;
    } while (조건식);
  • 특징: 실행문을 최소 1번 실행 후 조건 검사

분기문 (break, continue, goto, return)

3.1 break

  • 용도: 반복문이나 switch문을 빠져나감
  • 활용: 무한 루프에서 탈출 조건 구현 시 사용

3.2 continue

  • 용도: 반복문의 현재 반복을 중단하고 다음 반복으로 이동
  • 활용: 특정 조건에 해당하는 반복만 건너뛸 때 사용

3.3 goto

  • 용도: 지정된 레이블로 프로그램 흐름 이동
  • 주의: 가독성이 저하되므로 꼭 필요한 경우에만 사용

3.4 return

  • 용도: 함수를 호출한 곳으로 되돌아감
  • 활용: 함수 내에서 조건에 따라 즉시 반환할 때 사용

2. 중요 예제 코드 정리

조건문 예제

if문을 이용한 성적 판단

#include <stdio.h>

int main(void) {
    int score;

    printf("점수를 입력하세요: ");
    scanf("%d", &score);

    if (score >= 90) {
        printf("A 학점입니다.\n");
    } else if (score >= 80) {
        printf("B 학점입니다.\n");
    } else if (score >= 70) {
        printf("C 학점입니다.\n");
    } else if (score >= 60) {
        printf("D 학점입니다.\n");
    } else {
        printf("F 학점입니다.\n");
    }

    return 0;
}

switch문을 이용한 메뉴 처리

#include <stdio.h>

int main(void) {
    int menu;

    printf("1.파일 열기\n");
    printf("2.파일 저장\n");
    printf("3.파일 인쇄\n");
    printf("메뉴 선택: ");
    scanf("%d", &menu);

    switch (menu) {
        case 1:
            printf("파일 열기를 선택했습니다.\n");
            break;
        case 2:
            printf("파일 저장을 선택했습니다.\n");
            break;
        case 3:
            printf("파일 인쇄를 선택했습니다.\n");
            break;
        default:
            printf("잘못된 메뉴를 선택했습니다.\n");
            break;
    }

    return 0;
}

반복문 예제

for문을 이용한 구구단 출력

#include <stdio.h>

int main(void) {
    int i, j;

    for (i = 2; i <= 9; i++) {
        printf("== %d단 ==\n", i);
        for (j = 1; j <= 9; j++) {
            printf("%d * %d = %d\n", i, j, i * j);
        }
        printf("\n");
    }

    return 0;
}

while문을 이용한 합계 구하기

#include <stdio.h>

int main(void) {
    int i = 1;
    int sum = 0;

    while (i <= 100) {
        sum += i;
        i++;
    }

    printf("1부터 100까지의 합: %d\n", sum);

    return 0;
}

do-while문을 이용한 메뉴 반복 처리

#include <stdio.h>

int main(void) {
    int menu;

    do {
        printf("1.새 게임\n");
        printf("2.불러오기\n");
        printf("3.설정\n");
        printf("0.종료\n");
        printf("메뉴 선택: ");
        scanf("%d", &menu);

        switch (menu) {
            case 1:
                printf("새 게임을 시작합니다.\n");
                break;
            case 2:
                printf("저장된 게임을 불러옵니다.\n");
                break;
            case 3:
                printf("설정 메뉴로 이동합니다.\n");
                break;
            case 0:
                printf("게임을 종료합니다.\n");
                break;
            default:
                printf("잘못된 메뉴를 선택했습니다.\n");
        }
    } while (menu != 0);

    return 0;
}

분기문 예제

break를 이용한 루프 탈출

#include <stdio.h>

int main(void) {
    int i;
    int sum = 0;

    for (i = 1; i <= 100; i++) {
        sum += i;
        if (sum > 1000) {
            printf("합계가 1000을 초과했습니다! 현재 i = %d\n", i);
            break;
        }
    }

    printf("최종 합계: %d\n", sum);

    return 0;
}

continue를 이용한 특정 반복 건너뛰기

#include <stdio.h>

int main(void) {
    int i;
    int sum = 0;

    for (i = 1; i <= 100; i++) {
        if (i % 2 == 1) {  // 홀수인 경우
            continue;  // 다음 반복으로 건너뜀
        }
        sum += i;  // 짝수만 더함
    }

    printf("1부터 100까지의 짝수 합: %d\n", sum);

    return 0;
}

3. 예상 문제 및 풀이

문제 1: 조건문 활용

신호등의 색깔에 따라 "정지", "주의", "진행" 메시지를 출력하는 프로그램을 작성하시오. 단, 대소문자를 구분하지 않고 처리해야 합니다.

#include <stdio.h>

int main(void) {
    char color;

    printf("신호등 색깔을 입력하세요(R, Y, G): ");
    scanf("%c", &color);

    // 대소문자 무관하게 처리
    switch (color) {
        case 'R':
        case 'r':
            printf("정지\n");
            break;
        case 'Y':
        case 'y':
            printf("주의\n");
            break;
        case 'G':
        case 'g':
            printf("진행\n");
            break;
        default:
            printf("잘못된 색깔입니다.\n");
    }

    return 0;
}

문제 2: 이차방정식 근 구하기

이차방정식 ax² + bx + c = 0의 근을 계산하는 프로그램을 작성하시오. 계수 a, b, c를 입력받아 판별식을 계산하고 실근이 존재하는지 판단한 후, 실근이 존재하면 근을 출력하시오.

#include <stdio.h>
#include <math.h>

int main(void) {
    double a, b, c;
    double discriminant, root1, root2;

    printf("이차방정식의 계수 a, b, c를 입력하세요: ");
    scanf("%lf %lf %lf", &a, &b, &c);

    // a가 0인 경우 (일차방정식)
    if (a == 0) {
        if (b == 0) {
            printf("방정식이 성립하지 않습니다.\n");
        } else {
            printf("일차방정식의 근: %lf\n", -c/b);
        }
    } else {
        // 판별식 계산
        discriminant = b*b - 4*a*c;

        if (discriminant > 0) {
            // 서로 다른 두 실근
            root1 = (-b + sqrt(discriminant)) / (2*a);
            root2 = (-b - sqrt(discriminant)) / (2*a);
            printf("서로 다른 두 실근: %lf, %lf\n", root1, root2);
        } else if (discriminant == 0) {
            // 중근
            root1 = -b / (2*a);
            printf("중근: %lf\n", root1);
        } else {
            // 실근이 없는 경우
            printf("실근이 존재하지 않습니다.\n");
        }
    }

    return 0;
}
//예제2: 내가한거

int main(void) {
	int a = 0;
	int b = 0;
	int c = 0;
	double root1 = 0, root2 = 0;
	float geun = 0;
	float answer = 0;

	printf("계수 a를 입력하시오: ");
	scanf("%d", &a);
	printf("계수 b를 입력하시오: ");
	scanf("%d", &b);
	printf("계수 c를 입력하시오: ");
	scanf("%d", &c);

	
	if (a == 0){
		if (b == 0){
			printf("방정식이 성립하지 않습니다.");
		}
		else {
			answer = (-1) * (c / b);
			printf("일차방정식의 근 = %.2f", answer);
		}
	}
	else {
		geun = b * b - 4 * a * c;
		if (geun < 0) {
			printf("실근이 존재하지 않습니다.");
		}
		else {
			root1 = (-b + sprt(geun)) / 2*a;
			root2 = (-b - sprt(geun)) / 2*a;
			printf("위의 이차 방정식의 실근은 %lf과 %lf 입니다.", root1, root2);
		}
			
		}

	return 0;

}

문제 3: 패턴 출력하기

다음과 같은 삼각형 패턴을 출력하는 프로그램을 작성하시오.

*
**
***
****
*****
#include <stdio.h>

int main(void) {
    int i, j;
    int height;

    printf("삼각형의 높이를 입력하세요: ");
    scanf("%d", &height);

    for (i = 1; i <= height; i++) {
        for (j = 1; j <= i; j++) {
            printf("*");
        }
        printf("\n");
    }

    return 0;
}

문제 4: 소수 판별

사용자로부터 양의 정수를 입력받아 해당 숫자가 소수인지 판별하는 프로그램을 작성하시오.

#include <stdio.h>

int main(void) {
    int num, i;
    int isPrime = 1;  // 1: 소수, 0: 소수 아님

    printf("양의 정수를 입력하세요: ");
    scanf("%d", &num);

    // 2 미만인 경우 소수가 아님
    if (num < 2) {
        isPrime = 0;
    } else {
        // 2부터 num-1까지 나누어 떨어지는지 확인
        for (i = 2; i < num; i++) {
            if (num % i == 0) {
                isPrime = 0;
                break;  // 소수가 아니면 반복 중단
            }
        }
    }

    if (isPrime) {
        printf("%d는 소수입니다.\n", num);
    } else {
        printf("%d는 소수가 아닙니다.\n", num);
    }

    return 0;
}

문제 5: 센티널 값을 이용한 합계 구하기

사용자로부터 여러 개의 정수를 입력받아 합계를 구하는 프로그램을 작성하시오. 단, 0이 입력되면 입력을 중단하고 합계를 출력하시오.

#include <stdio.h>

int main(void) {
    int num;
    int sum = 0;

    printf("정수들을 입력하세요 (0 입력 시 종료): \n");

    while (1) {
        scanf("%d", &num);

        if (num == 0) {
            break;  // 0이 입력되면 반복 종료
        }

        sum += num;
    }

    printf("입력된 정수들의 합: %d\n", sum);

    return 0;
}

4. 실전 문제 및 풀이

실전 문제 1: 구구단 출력 프로그램

사용자로부터 시작 단과 끝 단을 입력받아, 해당 범위의 구구단을 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main(void) {
    int start, end;
    int i, j;

    printf("시작 단: ");
    scanf("%d", &start);
    printf("끝 단: ");
    scanf("%d", &end);

    // 입력 검증
    if (start > end) {
        printf("시작 단이 끝 단보다 클 수 없습니다.\n");
        return 1;  // 오류 코드 반환
    }

    for (i = start; i <= end; i++) {
        printf("== %d단 ==\n", i);
        for (j = 1; j <= 9; j++) {
            printf("%d * %d = %d\n", i, j, i * j);
        }
        printf("\n");
    }

    return 0;
}

실전 문제 2: 다이아몬드 패턴 출력

사용자로부터 정수 n을 입력받아 n행의 다이아몬드 패턴을 출력하는 프로그램을 작성하시오. (n은 홀수로 제한)

#include <stdio.h>

int main(void) {
    int n, i, j;

    printf("홀수를 입력하세요: ");
    scanf("%d", &n);

    // n이 홀수인지 확인
    if (n % 2 == 0) {
        printf("홀수를 입력해야 합니다.\n");
        return 1;
    }

    // 상단부 (삼각형)
    for (i = 0; i < n/2 + 1; i++) {
        // 공백 출력
        for (j = 0; j < n/2 - i; j++) {
            printf(" ");
        }
        // 별표 출력
        for (j = 0; j < 2*i + 1; j++) {
            printf("*");
        }
        printf("\n");
    }

    // 하단부 (역삼각형)
    for (i = 0; i < n/2; i++) {
        // 공백 출력
        for (j = 0; j < i + 1; j++) {
            printf(" ");
        }
        // 별표 출력
        for (j = 0; j < n - 2*(i + 1); j++) {
            printf("*");
        }
        printf("\n");
    }

    return 0;
}

실전 문제 3: 사칙연산 계산기

무한 루프를 이용하여 두 수와 연산자를 입력받아 계산하는 프로그램을 작성하시오. 연산자로 'q'가 입력되면 프로그램을 종료하시오.

#include <stdio.h>

int main(void) {
    double num1, num2, result;
    char op;

    while (1) {
        printf("계산식을 입력하세요 (예: 5 + 3, 종료는 q): ");

        // 연산자 먼저 확인
        if (scanf("%lf %c %lf", &num1, &op, &num2) != 3) {
            scanf("%c", &op);  // 버퍼에서 문자 하나 읽기

            if (op == 'q' || op == 'Q') {
                printf("계산기를 종료합니다.\n");
                break;
            } else {
                printf("올바른 형식이 아닙니다. 다시 입력하세요.\n");
                // 입력 버퍼 비우기
                while (getchar() != '\n');
                continue;
            }
        }

        switch (op) {
            case '+':
                result = num1 + num2;
                printf("%.2lf + %.2lf = %.2lf\n", num1, num2, result);
                break;
            case '-':
                result = num1 - num2;
                printf("%.2lf - %.2lf = %.2lf\n", num1, num2, result);
                break;
            case '*':
                result = num1 * num2;
                printf("%.2lf * %.2lf = %.2lf\n", num1, num2, result);
                break;
            case '/':
                if (num2 == 0) {
                    printf("0으로 나눌 수 없습니다.\n");
                } else {
                    result = num1 / num2;
                    printf("%.2lf / %.2lf = %.2lf\n", num1, num2, result);
                }
                break;
            default:
                printf("지원하지 않는 연산자입니다.\n");
        }

        // 입력 버퍼 비우기
        while (getchar() != '\n');
    }

    return 0;
}

실전 문제 4: 최대공약수(GCD) 구하기

두 양의 정수를 입력받아 유클리드 알고리즘을 이용하여 최대공약수를 구하는 프로그램을 작성하시오.

#include <stdio.h>

int main(void) {
    int a, b, temp;
    int original_a, original_b;

    printf("두 양의 정수를 입력하세요: ");
    scanf("%d %d", &a, &b);

    // 원본 값 저장
    original_a = a;
    original_b = b;

    // 유클리드 알고리즘으로 최대공약수 계산
    while (b != 0) {
        temp = b;
        b = a % b;
        a = temp;
    }

    printf("%d와 %d의 최대공약수: %d\n", original_a, original_b, a);

    return 0;
}

0개의 댓글