C Part3. 조건문(if문, if else문, switch 조건문), 반복문(for 반복문, while, do~while 반복문), 별찍기, break 제어문, continue 제어문, go to 문

08. 조건문

제어문 (=조건문)

제어문은 프로그램의 실행 흐름을 제어하는 문법이다.


if문
  • if(data = 3){} -> 대입연산자 잘못 사용
  • if(data == 3){} -> 올바름
  • 위의 실수를 줄이기 위해 if(3 == data){}로 사용할 수 있음. 실수로 if(3 = data){} 이렇게 사용해도 값(상수)에 값을 넣을 수 없어 오류가 발생하여 거를 수 있다.
void main(){

    int score = 92;
    char grade;

    if(score >= 90){
        grade = 'A';
        printf("점수는 %d이고 등급은 %c입니다.\n", score, grade);
    }else{
        grade = 'B';
        printf("점수는 %d이고 등급은 %c입니다.\n", score, grade);
    }
    printf("작업종료");

    //결과 -> 점수는 92이고 등급은 A 입니다.
    //        작업종료
}

조건 수식 연산자(3항 연산자?) : 간단한 if문을 쓸 때 사용한다.

결과 값 = (조건 수식)?수식1(참일 때 실행해 결과 값에 저장) : 수식2(거짓일 때 실행해 결과 값에 저장);

point = (value >= 10000) ? value * 0.1 : value * 0.5;
if(data > 5){
    return 1;
}else{
    return 0;
}

//삼항으로 변환
return (data > 5) ? 1 : 0;

if else문
void main(){

    int score = 86;
    char grade;

    if(score >= 90){
        grade = 'A';
    }else if(score >= 80){
        grade = 'B';
    }else if(score >= 70){
        grade = 'C';
    }else{
        grade = 'D';
    }

    printf("점수는 %d, 등급은 %c", score, grade);
    
    //결과 -> 점수는 86, 등급은 B
    
}

switch 조건문

변수 값이 이미 정해져 있는 상수들과 비교할 때는 switch 조건문이 유리하다.

void main(){

    int score = 86;
    char grade;

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

    printf("점수는 %d, 등급은 %c", score, grade);
    
    //결과 -> 점수는 86, 등급은 B
}

09. 반복분

for 반복문

for 반복문은 반복의 3요소(시작 조건, 종결 조건, 조건 변화 수식)를 제일 단순하고 정확하게 표현한 반복문이다. 특히 시작과 끝이 명확한 반복 작업에 많이 사용된다.

예제)

void main(){

    int sum = 0, num;

    for(num = 1; num <= 5; num++){
        printf("num(%d) + sum(%d) = ", num, sum);
        sum += num;
        printf("%d\n", sum);
    }
    printf("\n result : num = %d, sum : %d", num, sum);
}
//결과 -> num(1) + sum(0) = 1
//        num(2) + sum(1) = 3
//        num(3) + sum(3) = 6
//        num(4) + sum(6) = 10
//        num(5) + sum(10) = 15
//        
//        result : num = 6, sum : 15

for문이 반복의 3요소(시작조건, 종결조건, 조건변화 수식)를 사용할수 있도록 기본적인 형식을 제공하지만 그 형식을 꼭 지켜야하는 것은 아니다.

예제) 시작조건 생략

//시작조건은 이미 변수에서 초기화 했기 때문에 생략 가능
int sum = 0, num = 1;
for( ; num <= 5; num++){...}

//또는 시작조건에 쉼표를 사용하여 여러 개의 변수 초기화 가능
int sum, num;
for(sum = 0, num = 1; num<=5; num++){...}


예제) for 반복문으로 무한 루프 만들기(3요소를 모두 적지 않는 경우)

void main(){

    int sum = 0;
    int num = 1;  //시작조건
    for( ; ; ){  //무한루프
        printf("num(%d) + sum(%d) = ", num, sum);
        sum += num;
        printf("%d\n", sum);
        num++;  //조건변화 수식
        if(num > 5){  //반복문 종료
            break;
        }
    }
    printf("\n result : num = %d, sum : %d", num, sum);
}
//결과 -> num(1) + sum(0) = 1
//        num(2) + sum(1) = 3
//        num(3) + sum(3) = 6
//        num(4) + sum(6) = 10
//        num(5) + sum(10) = 15
//        
//        result : num = 6, sum : 15

while 반복문

while 반복문은 끝이 정해져 있지 않을 때 사용, 기약없는 반복문을 쓸 때 사용.
while(종결조건) { 명령문; }

예제)

void main(){

    int sum = 0;
    int num = 1; //시작조건
    while(num <=5 ){ //종결조건
        printf("num(%d) + sum(%d) = ", num, sum);
        sum += num;
        printf("%d\n", sum);
        num++; //조건 변화 수식
    }
    printf("resut = num : %d, sum : %d", num, sum);
}
//결과 -> num(1) + sum(0) = 1
//        num(2) + sum(1) = 3
//        num(3) + sum(3) = 6
//        num(4) + sum(6) = 10
//        num(5) + sum(10) = 15
//        resut = num : 6, sum : 15

결론적으로 3요소가 분명하게 정해져 있다면 for 반복문을, 시작조건이나, 조건 변화 수식이 다양하거나, 수치로 정할 수 없는 상황이라면 while문 을 사용하는게 편할 수 있다.


while 반복문으로 무한 루프 만들기

while 반복문은 ‘종결조건’을 생략할 수 없기 때문에 괄호 안에 상수값이나 수식을 반드시 적어야 한다. while(1){ … }


do~ while 반복문

while은 먼저 비교하고,
do while은 나중에 비교한다. 잘 쓰지는 않으며 명령문을 무조건 한번은 탄다.

void main(){

    do{
        명령문;
    }while(종결조건);
}

예제) for 반복문을 중첩 사용해서 구구단 전체를 출력하기

void main(){

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

//결과 - > 2 * 1 = 2
//         2 * 2 = 4
//            ...
//         9 * 7 = 63
//         9 * 8 = 72

예제) 별찍기

#define max 5
void main(){

    for(int col = 1; col <= max; col++){
        for(int i = 1; i < col; i++){
            printf("*");
        }
        printf("\n");
    }
}

//결과 - > *
//         **
//         ***
//         ****

예제) 뒤집어진 별찍기

#define max 5
void main(){

    for(int col = max; col > 1; col--){
        for(int i = 1; i < col; i++){
            printf("*");
        }
        printf("\n");
    }
}

//결과 -> ****
//        ***
//        **
//        *

예제) 공백있는 별찍기

#define max 5
void main() {
    int sc = 0;
    for (int step = 1; step <= max; step += 2) {

        sc = (max - step) / 2;
        for (int s = 1; s <= sc; s++) {
            printf(" ");
        }

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

// 결과 - >   *
//           ***
//          *****

break 제어문

break는 하나의 반복문에만 미치기 때문에 중첩된 반복문에서도 하나의 반복문에만 적용된다.
따라서 특정 상황에서 반복문을 둘 다 종료시키고 싶다면 바깥쪽 반복문에도 조건문을 사용하여 break문을 적어줘야 한다.

void main(){
    int m, n;
    for(m = 5; m < 7; m++){
        for(n = 0; n < 3; n++){
            if(m == 5 && n ==1){ //m값은 5이고 n값은 1일 때 break문 수행
                break;
            }
            printf("m(%d) - n(%d)", m, n);
        }
        if(m == 5 && n == 1){
            break;
        }
    }
}

//결과 -> m(5) - n(0)

continue 제어문

continue문은 1회성 취소를 사용한다. (이번 반복은 skip이다 할 때 사용)

void main(){
    int m;
    for(m = 5; m < 8; m++){
        if(m == 6){  //m값이 6일 때 continue문 수행
            continue;
        }
        printf("m(%d)\n", m);
    }
}
// 결과 -> m(5)
//         m(7)

go to 문

go to ~~~;라고 선언 해주면 go to 문 만났을 때 ~~~라고 선언 해 준 부분으로 그냥 바로 이동해 버린다. go to 문은 되도록 사용하지 않는 것이 좋으며 실무에서 쓰면 돌맞는다. 걍 이런게 있다 정도로만~


Comments