카테고리 없음

[혼공C] 3주차. Ch.5 선택문 ~ Ch.6 반복문

H 기록 2024. 7. 20. 11:42

Ch.5 선택문

(1) if 문

조건에 따라 실행문이 실행되지 않아야 할 때 사용하는 제어문 중 하나.

조건에 부합하면 중괄호 안의 실행문을 실행하고, 부합하지 않으면 실행되지 않고 지나감.

 

[종류]

- if ~ else문

조건에 부합하면 if 아래의 실행문이, 부합하지 않으면 else 아래의 실행문이 실행됨. 

실행 조건 1가지

 

- if ~ else if ~ else문

if 조건에 부합하면 if 아래의 실행문이, else if 조건에 부합하면 else if 아래의 실행문이, 둘 다 부합하지 않으면 else 아래의 실행문이 실행됨.

실행 조건 원하는 만큼 추가할 수 있음

if 아래에 else if를 계속 추가하면 됨!!

 

* 조건문을 작성할 때, if, else if, else의 조건에 부합하는 경우에만 실행되도록 제어해야 하므로, 해당 실행문의 코드를 중괄호({})로 묶어 구분하는 게 편리함.

 

(2) if 활용과 switch ~ case문

- if 활용 : 중첩

  선행 조건이 필요한 경우, if문 안에 if문을 넣어서 사용함.

  선행 조건이 있으면 반복해서 확인해야 하는 조건을 하나로 단축할 수 있음.

 

 * 분할 정복 기법(divide - conquer)

  : 가장 기본적으로 사용되는 효율적인 코드 작성법. 전체를 다 점검해야 할때 공통되는 일부를 묶어서 점검해서 총 횟수를 줄임. 

 

 ** C언어는 컴파일러가 들여쓰기를 인식하지 못하기 때문에, 조건문을 작성할 때 중괄호로 묶어서 구분해줘야 인식할 수 있음!

 

 

- switch ~ case문

  한 가지 변수에 대해서, 여러 조건을 두고 다른 케이스로 구분해야 하는 경우 사용.

  (예시 : 만약 a 가 1이면 A, 2면 B, 3이면 C ... )

int a;
char m;

switch(a){
	case 1:
    	m = A;
        break;
    case 2:
    	m = B;
        break;
    case 3:
    	m = C;
        break;
    default:
    	m = F;
        break;
}

 

변수 a의 값이 case에 해당하는 경우, 그 case 아래의 실행문을 실행하는 제어문 형식

case에 해당하는 경우, 그 아래의 실행문 만 ! 실행되어야 하기 때문에, case는 break;를 포함해야 한다. break;는 해당 블록을 탈출하는 데 사용되는데, 블록의 기준은 중괄호로 묶이는 부분이다. (해당하는 경우 전부 실행되어야 하면 break를 생략하기도 함) 

아래의 case에 해당되지 않는 경우, default가 실행된다.   

 

 

* if문과 switch~ case문은 동일한 기능을 하기 때문에, 실행 결과가 같은 경우 둘 중 어떤 구문을 사용할지 선택할 수 있다. 더 적합한 구문을 선택하기 위해서, 보통 if문은 값의 범위를 검사하는 경우에, switch~ case문은 값에 따라 실행 문장을 선택하는 경우에 좋은 구문이다.

 

<코드>

(1) if의 기본 형식

#include <stdio.h>

int main(){
    int a = 20;
    int b = 0;

    if(a > 10){
        b = a;
    }

    printf("a : %d, b : %d\n", a, b);

    return 0;
}

 

(2) if ~ else문

#include <stdio.h>

int main(){
    int a = 10;

    if(a >= 0){
        a = 1;
    }
    else{
        a = -1;
    }

    printf("a : %d\n", a);

    return 0;
}

 

(3) if ~ else if ~ else문

#include <stdio.h>

int main(){
    int a = 0, b = 0;

    if(a > 0){
        b = 1;
    }
    else if(a == 0){
        b = 2;
    }
    else{
        b = 3;
    }

    printf("b : %d\n", b);
}

 

(확인문제)

#include <stdio.h>

int main(){
    float height = 179.5;
    float weight = 75.0;

    if(height >= 187.5 && weight < 80){
        printf("ok\n");
    }
    else{
        printf("cancel\n");
    }
    return 0;
}

 

(4) 중첩된 if문

#include <stdio.h>

int main(){
    int a = 20, b = 10;

    if(a > 10){
        if(b >= 0){
            b = 1;
        }
        else {
            b = -1;
        }
    }

    printf("a : %d, b : %d\n", a, b);
}

 

(5) 중괄호

#include <stdio.h>

int main()
{
    int a = 10, b = 20;

    if(a < 0)
    //{
        if(b > 0)
        {
            printf("ok");
        }
    //}  /*중괄호를 생략하는 경우, else를 가장 가까운 if와 연결하기 때문에 아무것도 출력되지 않음.*/
    else
    {
        printf("ok");
    }

    return 0;
}

 

(확인문제)

/*입력한 정수가 3의 배수이면 거짓을, 아니면 참을 출력하는 코드*/

#include <stdio.h>

int main(){
    int n;
    printf("정수 입력 : ");
    scanf("%d", &n);

    switch(n % 3){
        case 0 : 
            printf("거짓");
            break;
        default:
            printf("참");
            break;
    }
}

 

(숙제 코드) 크리스마스 소개팅 코드

#include <stdio.h>

int main(){
    printf("[크리스마스 소개팅]\n");

    printf("오늘 날짜를 입력해주세요 (1월 1일이면 1 1 형태로 입력): ");
    int m, d;
    int love;

    scanf("%d %d", &m, &d);
    if(m == 12 && d >= 25){
        printf("애인이 생겼나요? (생겼으면 0, 아니면 1을 입력해주세요): ");
        scanf("%d", &love);
        if(love == 1){
            printf("소개팅을 주선해 드리겠습니다\n");
        }
        else{
            printf("축하합니다! 좋은 사랑 하세요~\n");
        }
    }
    else{
        printf("아직 크리스마스가 아닙니다.\n");
    }
}

 

(확인 문제 확장)

날짜는 1~12월, 달에 따라 30, 31, 28일까지 있는데, 이를 잘못 입력하는 경우 "날짜가 잘못 입력되었습니다" 라고 출력하는 코드 짜기

#include <stdio.h>

int main(){
    printf("[크리스마스 소개팅]\n");

    printf("오늘 날짜를 입력해주세요 (1월 1일이면 1 1 형태로 입력): ");
    int m, d;
    int love;

    scanf("%d %d", &m, &d);
    if(m == 12 && d >= 25 && d <= 31){
        printf("애인이 생겼나요? (생겼으면 0, 아니면 1을 입력해주세요): ");
        scanf("%d", &love);
        if(love == 1){
            printf("소개팅을 주선해 드리겠습니다\n");
        }
        else{
            printf("축하합니다! 좋은 사랑 하세요~\n");
        }
    }
    else if(m > 0){
        switch(m){
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                if(d > 31){
                    printf("날짜가 잘못 입력되었습니다\n");
                }
                else{
                     printf("아직 크리스마스가 아닙니다.\n");
                }
                break;
            case 4: case 6: case 9: case 11:
                if(d > 30){
                    printf("날짜가 잘못 입력되었습니다\n");
                }
                else{
                    printf("아직 크리스마스가 아닙니다.\n");
                }
                break;
            case 2:
                if(d > 29){
                    printf("날짜가 잘못 입력되었습니다\n");
                }
                else{
                    printf("아직 크리스마스가 아닙니다.\n");
                }
                break;
            default:
                printf("날짜가 잘못 입력되었습니다\n");
        }
    }
    else{
        printf("아직 크리스마스가 아닙니다.\n");
    }
}

 

(도전 실전 예제)

#include <stdio.h>

int main(){
    printf("[계산기]\n");

    printf("사칙 연산 입력 (정수) : ");
    int a, b;
    char op;

    scanf("%d%c%d", &a, &op, &b);

    switch(op){
        case '+':
            printf("%d%c%d = %d", a, op, b, a+b);
            break;
        case '-':
            printf("%d%c%d = %d", a, op, b, a-b);
            break;
        case '*':
            printf("%d%c%d = %d", a, op, b, a*b);
            break;
        case '/':
            printf("%d%c%d = %d", a, op, b, a/b);
        default:
            printf("입력 오류\n");
    }
}

 

 

Ch 6. 반복문

(1) while문, for문, do~ while문

-whlie문

 조건식을 검사하고, 조건식이 참인 동안 실행문을 반복하는 제어문.

 반복을 진행해야 하는 '사건' 이 명확함.

 

- for문

  실행문을 원하는 횟수만큼 반복할 수 있는 제어문.

  반복을 진행해야 하는 '횟수' 가 명확함.

 

-do while문

 일단 실행문을 한 번 실행한 후에 반복 조건을 검사하여 이후 반복을 진행할지를 결정하는 제어문.

 

 

(2) 반복문 활용

- 중첩 반복문

  반복문 아래의 실행문 위치에, 반복문이 포함된 형태. 반복문의 조건을 검사할 때 변수를 사용해서 조건식을 작성하는데, 중첩 반복문을 사용할 경우 두 반복문에 사용하는 변수를 다르게 해서 작성해야 오류가 발생하지 않음. 제어 변수가 동일할 경우 반복문을 실행하는 도중 의도와 다르게 변수의 값이 변하게 되므로 주의해야 함!!

 

- break, continue 분기문

반복문 안에서 해당 블록을 탈출하면서 반복을 즉시 끝낼 때 사용하는 break; 

반복문 안에서 반복문의 일부를 건너뛰는, 즉 실행 중인 반복 단계를 곧바로 끝내고 다음 반복으로 넘어갈 대 사용하는 continue;

 

두 분기문을 사용하여 반복문의 실행 방식을 바꿀 수 있음!

 

 

< 코드 >

(1) while

#include <stdio.h>

int main(){
    int a = 1;

    while(a < 10){
        a = a * 2;
    }

    printf("a : %d\n", a);
}

/결과 a : 16

 

(2) for

#include <stdio.h>

int main(){
    int a = 1;
    int i;

    for(i = 0; i < 3; i++){
        a = a * 2;
    }

    printf("a : %d\n", a);
    
}

/결과 a : 8 
/3번 반복

 

(3) do ~ while

#include <stdio.h>

int main(){
    int a = 1;

    do
    {
        a = a*2;
    }while(a < 10);
    printf("a : %d\n", a);
    
}

/결과 a : 16
/한 번 실행한 후 반복 진행

 

(확인문제)

#include <stdio.h>

int main(){
    int i;

    for(i = 0; i < 10; i++){
        printf("$");
    }
}

 

(4) 중첩 반복문

#include <stdio.h>

int main(){
    int i, j;

    for(i = 0; i < 3; i++){
        for(j = 0; j < 5; j++){
            printf("*");
        }
        printf("\n");
    }
}

 

(5) break

#include <stdio.h>

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

    for(i = 1; i <= 10; i++){
        sum += i;
        if(sum > 30) break;
    }

    printf("누적한 값: %d\n", sum);
    printf("마지막으로 더한 값: %d\n", i);
}

 

(확인 문제)

#include <stdio.h>

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

    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(i == j || i + j == n-1){
                printf("*");
            }
            else{
                printf(" ");
            }
        }
        printf("\n");
    }
}

 

(도전 실전 예제)

#include <stdio.h>

int main(){
    printf("2부터 n까지의 소수 출력 프로그램\n");
    printf("2이상의 정수를 입력하세요 : ");
    
    int n;
    scanf("%d", &n);


    for(int i = 2; i <= n; i++){
        int isprime = 1;
        for(int j = 2; j < i; j++){
            if(isprime == 1 && i % j == 0){
               isprime = 0;
               break; 
            }
        }
        if(isprime == 1){
            printf("%d ", i);
        }
    }
}

 

*혼공 용어 노트 활용

 

(추가 확장)

- 별 찍기

2024.07.20 - [분류 전체보기] - [혼공C] 별 찍기 프로그램