Computer Science/C

C언어 4강 | Flow of Control | 반복문, 조건문, 순차 구조

토마토. 2021. 12. 16. 22:32

제어 구조 Flow of control

프로그램은 보통 순차 제어 구조로 진행된다. sequential flow of control

그런데 어떤 경우에는 선택, 반복 구조를 차용해야 할 때가 있다. 

선택 구조 : a choice of action

if, if-else, switch

반복 구조 : repetition

while, for, do

 

Relational, Equality, Logical operators

true인 경우 nonzero value

false인 경우 zero value 리턴함

relational : < <= > >= 

equality : == !=

logical operators : && || 

 

Relational operators and expressions

< <= > >= 등이 있다.

만약 (a < b)가 true이면, 1을 return하고

false이면, 0을 return한다. 

 

산술적인 형 변환

기계가 취급을 할 때는 a < b 비교 연산자를 a-b < 0과 같이 실행한다. 

 

equality operators and expressions

== !=

 

logical operators and expressions

!expr

!expr는 unary negation 부정 연산자

not expr 정도로 이해해두자

똑같이 true이면 1 false이면 0

|| logical or

&& logical and

&&가 ||보다 우선순위 높다. 

i && j && k : 3 or 3 or 3 : 1

 

short circuit evaluation

참인지 거짓인지 결과가 나오면, 끝까지 수행하지 않고 탈출한다. 

예를 들면, expr1 && expr2 구문에서 expr1이 false인 경우(zero)

아니면 expr1 || expr2에서 expr1이 true인 경우(nonzero)

 

compound statement

{}으로 묶음

 

expression and empty statement

expression statement 단위는 ;으로 정함

 

if and if-else statements

 

while statement

while ((c=getchar())==' ')
;

특정한 input을 패스하기 위해 사용하는 코드

 

for statement

for (int i =1;i<=10;i++)
factorial *= i;

 

comma operator

expr1, expr2;

expr1 실행한 뒤에 expr2 실행함

 

do statement

#include <stdio.h>

int main(void){
    int error = 1, n=0;
    do {
        printf("input");
        scanf("%d", &n);
        error = (n<=0);
        if (error) {
            printf("ERROR");
        }
        } while (!error);
    return 0;
}

 

 

break and continue statements

break

loop나 switch문에서 탈출하게 해준다. 

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

int main(void){
    double x;
    while (1) {
        scanf("%lf", &x);
        if (x<0.0){
        break;
        }
        printf("%f\n", sqrt(x));
    }
}

 * math.h 등 포함시켰을 때는 gcc -o c c.c -lm 주의 * 

 

continue

#include <stdio.h>

int main(void){
    char c;
    for (int i =0;i<10;++i){
        c = getchar();
        if (c>='0' && c<='9')
            continue;
        printf("%c", c);
    }
    return 0;
}

 

switch statement

if else랑 유사함

기본 구조는
switch (c) { // c는 integral type이어야 한다. 
case 'a' :
     // 수행할 문장
     break;
...
default:
      // 
}

 

conditional operator

expr1 ? expr2 : expr3

expr1이 true이면, expr2 수행

expr1이 false이면, expr3 수행

 

exercise 1

피보나치 수열

f0 = 0

f1 = 1

fn+1 = fn + fn-1

#include <stdio.h>

int fib(int);

int main(void){
    int i;
    scanf("%d", &i);
    for (int j = 0;j<=i;j++){
        printf("%d\n", fib(j));
    }
    return 0;
}

int fib(int k){
    if (k==0){
        return 0;
    }
    else if (k==1){
        return 1;
    }
    else {
        return (fib(k-1) + fib(k-2));
    }
}

 

exercise 2

sqrt a

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

double newsqrt(double);

int main(void){
    double tmp = 0;
    while (tmp >= 0){
        scanf("%lf", &tmp);
        printf("%f\n", newsqrt(tmp));
    }
    return 0;
}

double newsqrt(double tmp){
    return sqrt(tmp);
}