brunch

매거진 Sinclair

You can make anything
by writing

C.S.Lewis

by Sinclair Feb 10. 2016

제어문과 반복문

그리고 프로그램은 계속된다 I




자, 오늘은 제어문과 반복문에 대해 이야기하겠습니다.


거의 모든 프로그램은 조건에 따라 실행되며 또한 반복 실행합니다. 결국 컴퓨터가 하는 일, 음악을 들려주고 그림을 보여주고 영화를 보여준다거나 심지어 우리가 프로그래밍한 것을 컴파일 하는 일이라는 것이 조건에 따라 선택 실행하고 그것을 반복하는 일이 아니겠습니까? 그래서 이 세상에 제어문과 반복문이 빠진 프로그램은 존재할 수 없습니다. 제어문과 반복문이 없었다면 반복해야 하는 분량만큼 프로그램의 사이즈가 엄청나게 커질 것 입니다.   


if 와 else문  


if(조건식) {

    실행문;

} // end if  



if문은 조건에 따라 실행 여부를 결정할 수 있습니다. 조건식이 참일 경우 실행문을 수행한 후에 계속 진행합니다. 물론 거짓이라면 실행하지 않고 다음으로 계속 진행합니다. else문과 결합하면 조건식이 거짓일 경우 실행할 문장을 지정할 수 있습니다. if는 단독으로 사용 가능하지만 else는 if문이 없다면 사용할 수 없습니다.  


if(조건식) {

    실행문1 ;

} // end if

else {

    실행문2 ;

} // end else  



조건식이 참 일 경우에는 실행문1을 실행하고 거짓이라면 실행문2를 실행한 후에 프로그램은 계속 진행합니다. 앞에서 설명한 것처럼 위의 수식은 삼항 연산자로 바꿔 사용할 수 있습니다. 같은 동작을 합니다.  


조건식 ? 실행문1 : 실행문 2 ;  



훨씬 간단해 보입니다. 하지만 실행문1이나 실행문2가 다시 삼항 연산자라면 어떻게 되겠습니까? 프로그램을 간단하게 작성하려다가 알고리즘이 꼬이는 경우가 발생합니다.  

if else 뿐만 아니라 if문으로 다른 조건을 계속 추가할 수도 있습니다.  


if(조건식1) {

    실행문1 ;

} // end if

else if(조건식2) {

    실행문2 ;

} // end else if  



조건식1이 참이라면 실행문1 만을 조건식1이 거짓이고 조건식2가 참이라면 실행문2만을 실행합니다. 조건식1과 조건식2가 모두 거짓이라면 어떤 것도 실행하지 않고 그냥 프로그램은 진행하게 됩니다. 주의할 것은 조건식1이 이미 참이 되었다면 조건식2는 검사하지 않고 다음으로 계속 진행합니다. 거짓일 때만 조건식2를 검사합니다. 다시 여기에 else문을 덧붙여도 됩니다.


때문에 주어진 성적 점수에 따라 'A', 'B', 'C', 'D', 'F'를 출력하는 if문을 작성해 보면 다음과 같습니다.  



if( grade > 100 || grade < 0 ) {

    printf("%s" , "성적이 잘못 되었습니다") ;

} // end if

else if(grade >= 90) {

    putchar('A') ;

} // end else if

else if(grade >= 80) {

    putchar('B') ;

} // end else if

else if(grade >= 70) {

    putchar('C') ;

} // end else if

else if(grade >= 60) {

    putchar('D') ;

} // end else if

else {

    putchar('F') ;

} // end else  



이것을 삼항 연산자로 바꿔 보면 다음과 같습니다.  


( grade > 100 || grade < 0 ) ?

    printf("%s" , "성적이 잘못 되었습니다") :

    (grade >= 90) ?

        putchar('A') :

        (grade >= 80) ?

            putchar('B') :

            (grade >= 70) ?

                putchar('C') :

                (grade >= 60) ?

                    putchar('D') :

                    putchar('F') ;  



괄호와 들여쓰기, 줄 바꿈을 적절히 사용해서 조금 봐 줄만(?) 합니다. 하지만 원래 한 줄짜리 수식입니다.  


( grade > 100 || grade < 0 ) ?  printf("%s" , "성적이 잘못 되었습니다") : (grade >= 90) ? putchar('A') :  (grade >= 80) ? putchar('B') : (grade >= 70) ? putchar('C') : (grade >= 60) ? putchar('D')  : putchar('F') ;




삼항 연산자의 우선순위가 낮으니 괄호도 한 번 빼볼까요?  


grade > 100 || grade < 0  ?  printf("%s" , "성적이 잘못 되었습니다")  :  grade >= 90  ? putchar('A') :  

grade >= 80? putchar('B') : grade >= 70 ? putchar('C') : grade >= 60 ? putchar('D') : putchar('F') ;    



삼항 연산자를 이렇게 남발하면 소스를 분석하는 사람이 혀 깨물고 죽고 싶어지지 않겠습니까?  
















#Sinclair #씽클레어 #싱클레어 #씽클레어도씨 #씨언어 #씨프로그래밍  #C언어 #Cprogramming #C_Programming #C #Programming #Clanguage #C_Language

매거진의 이전글 제어문과 반복문
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari