Eat Study Love

먹고 공부하고 사랑하라

SW 만학도/C

Review 2 - Control Structures / Functions in C

eatplaylove 2024. 7. 3. 21:10

https://eglife.tistory.com/69

 

Review 1 - C programming basics

이번엔 C 언어에 대한 복습이다. Python, C, C++ 이 3대장 중에 제일 까다로운 녀석... 당연히 예전에 배웠던 것 죄다 까먹은 상태인데, 얼른 복습해봅시다!! 1. Hello C 일단 기본적으로, VS Code를 사용

eglife.tistory.com

늘 느끼지만, Python 이건 C건 C++ 건 이론을 아는 것도 중요한데,

 

진짜 실전연습을 하지 않으면 하등 쓸모가 없다.

 

아무리 필기내용을 많이 숙지하고 가도, 막상 실전문제를 보면 얼어버리는 게 현실..

 

코린이로서 최대한 빠르게 내용을 훑고 실전 Coding 연습에 전념해야겠다.

 

리트코드, 백준, GeeksForGeeks 등을 적극 활용하자.

 

이번엔 C에서 각종 Condition 조건 쓰는 걸 알아보자.

 

 

1. If statement

C++과 같은 구조다. 중괄호로 구분

#include <stdio.h>

int main(void){
    int month;
    printf("Enter num of month: ");
    scanf("%d",&month);

    if(month == 4 || month == 6 || month == 9 || month == 11){
        printf("30days\n");
    }
    else if(month == 1 || month ==3 || month ==5 || month ==7
    || month == 8 || month ==10 || month == 12){
        printf("31days\n");
    }
    else{
        printf("I dont know \n");
    }
    return 0;
}

 

이렇게 scanf 로 data를 입력 받은 뒤 if / else if (Python에선 elif) / else 로 Condition을 구분할 수 있다.

if / else 등은 한 줄의 statement를 입력할 땐 중괄호가 필요 없지만.. 그래도 실수를 방지하기 위해 중괄호는 써주길 권장

 

else가 어디 if랑 match가 될까? Python에선 같은 indentation이 되어 있는 것들끼리 묶이는데, C에선 else가 가장 가까이에 있는 if와 Match가 된다. 하지만 특별히 특정 if와 match 시키고 싶으면, 중괄호로 구분!

 

Switch Statement -> if문을 좀 더 예쁘게 표현하는 case

(Switch 마다 break를 해줘야 한다. 한 case 실행하고 밖으로 out하게 하기 위하여. 이거 안 하면 특정 case 들어가고 그 밑까지 쭈욱 실행이 된다.)

int main(void){

    int key;
    printf("Gimme some number: ");
    scanf("%d",&key);

    switch (key){
        case 1 :{
            printf("one\n");
            break;
        }
        case 2 :{
            printf("two\n");
            break;
        }
        default:{
        printf("iDontKnow\n");
        break;}
    }

 

2. Iteration ( while, for loop )

 

int main(void){

    int x = 0;
    while(x<10){
        printf("%d ",++x);
    }
    printf("\n");
    int y = 0;
    while(y<10){
        printf("%d ",y++);
    }
1 2 3 4 5 6 7 8 9 10 
0 1 2 3 4 5 6 7 8 9

++ 위치를 바꿔서 표현해봤다. C++과 같이 while 문 뒤에 괄호로 컨디션 주고, 중괄호로 statement 를 구분해서 실행시켜준다.

 

- Do While 구문 : 일단 한 번은 돌리고 그 다음부터 돌릴 지는 while문으로 판단한다.

    int x = 0;
    do{
        printf("%d ",x);
        x += 1;
    }while(x<0); //세미콜론 잊지 말기
 // 일단 do를 해야하기 때문에 0이 출력된다.

 

- For 문

 

    for(int x = 0; x<5 ; ++x){
        printf("%d ",x);
    }
    printf("\n");
    for(int x = 0; x<5 ; x++){
        printf("%d ",x);
    }
0 1 2 3 4 
0 1 2 3 4

 

update 조건은 ++x , x++ 이 둘은 똑같다.

요렇게 nested for loop을 쓸 수도 있다.

 

    for(int x=0;x<10;x++){
        for(int y=0;y<10;++y){
            printf("%d\t",x*y);
        }
        printf("\n");
    } // 10 * 10 행렬
0       0       0       0       0       0       0       0       0       0
0       1       2       3       4       5       6       7       8       9
0       2       4       6       8       10      12      14      16      18
0       3       6       9       12      15      18      21      24      27
0       4       8       12      16      20      24      28      32      36
0       5       10      15      20      25      30      35      40      45
0       6       12      18      24      30      36      42      48      54
0       7       14      21      28      35      42      49      56      63
0       8       16      24      32      40      48      56      64      72
0       9       18      27      36      45      54      63      72      81

 

C 언어 for loop 역시 break; , continue;기능이 있다. 세미콜론 必

 

    for(int x = 0; x < 10 ; x ++){
        if(x==5){ break; }
        printf("%d\t",x);
    }
    printf("\n");
    for(int x = 0; x < 10 ; x ++){
        if(x==5){ continue;; }
        printf("%d\t",x);
    }
0       1       2       3       4
0       1       2       3       4       6       7       8       9

 

3. Functions in C - Grammer

 

사실 Function이 무엇인지는 Python과 다를 게 없다. 다만 C에 특화된 Grammer를 좀 더 알아야 그 Function을 표현할 수 있을 뿐이다. 따라서 기존에 아는 것처럼 input을 받아서 output을 내놓는, 우리가 알고 있는 function의 개념을 어떻게 C에서 효율적으로 표현할 수 있을 지 몇몇 예시를 통해 학습해보자.

 

#include <stdio.h>

int Factorial(int n);

int main(void){

    int number;
    int answer;
    printf("Input a number : ");
    scanf("%d",&number);
    answer = Factorial(number);
    printf("The factorial of %d is %d\n",number,answer);
}

int Factorial(int n){
    if(n<0) return -1;
    int result = 1;
    for(int i=1;i<=n;i++){
        result *= i;
    }
    return result;
}

 

여기서 Factorial 안에 있는 result 는 Local Variable이라 Factorial 중괄호{} 안에서 태어나고 죽는다.

 

함수 header를 미리 선언하는 건, Python interpreter에선 허용이 안 된다. 코드를 한 줄 한 줄 읽고 실행시키기 때문에, header만 있는 함수를 실행시킬 수 없다고 error가 뜬다.

 

하지만 C Compiler에선 괜찮다. 전체적으로 해석만 가능하기만해도 괜찮기 때문이다. header만 있어도 function 해석이 가능하다.

 

 

4. Memory Operation of C

 

 

Local Variable / Function 이 선언될 때 어떻게 메모리구조가 변하는지에 대한 설명이다.

 

Runtime Stack 부분에 Memory가 쌓여가는 구조를 봅시다. Function이 Call 되면 될 수록 Memory 값이 작아지는 방향, 즉 윗방향으로 차곡차곡 Data가 쌓여간다.

R5 : Frame Pointer (현 Scope의 bottom을 포인팅한다<가장 값이 큰 메모리>)

R6 : Stack Pointer(Local Val이 많아질수록 점점 위로 이동하며 Memory 공간을 할당한다<Memory 값이 낮아지는 방향으로> )

 

Volt 함수는 젤 마지막에 Push 되었는데, Volt 함수 Call이 끝나면 가장 먼저 Pop된다 = Stack 구조(LIFO)

( 함수는 가장 마지막에 Call된 함수가 가장 먼저 끝난다. 그래서 Stack 구조를 쓰는 것이다. )

 

 

5. Memory Operation Details

 

중간에 뜨는 "PC"는 Program Counter라고 한다.

 

솔직히 이거까진 완벽히 이해하기 좀 복잡할 수 있지만,

 

골자는 Local Scope에서 Function이 call 되어 Stack에 Memory가 쌓일 때, Function의 attribute 말고도 그 function의 return 값을 위한 공간, 그 function이 return 될 장소에 대한 정보도 Memory에 저장한다는 것이다.

 

이건 다소 심화과정이라 그냥 이런게 있다~ 정도로만 이해하자.

 

 

Function 예제) 최대공약수 구하기

 

#include <stdio.h>

int GCD(int a, int b);

int main(void){

    int a = 10;
    int b = 45;
    int c = 128;
    int d = 96;
    
    printf("gcd of %d and %d is %d\n",a,b,GCD(a,b));
    printf("gcd of %d and %d is %d\n",c,d,GCD(c,d));


    return 0;
}

int GCD(int a, int b){
    if(a==0) return b;
    if(b==0) return a;

    if(a >= b){
        GCD(a%b,b);
    }
    else{
        GCD(b%a,a);
    }

}

 

나는 요렇게 코딩해봤고, 답은 잘 나왔다.

 

근데 GPT 돌리니까 훨씬 간단한 거였네;;

 

GPT답안:

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    } else {
        return gcd(b, a % b);
    }
}

int main() {
    int a1 = 10, b1 = 45;
    int a2 = 128, b2 = 96;

    printf("GCD of %d and %d is %d\n", a1, b1, gcd(a1, b1));
    printf("GCD of %d and %d is %d\n", a2, b2, gcd(a2, b2));

    return 0;
}

 

- E. O. D -

 

 

 

 

 

'SW 만학도 > C' 카테고리의 다른 글

Review 4 - File I / O in C  (0) 2024.07.07
Review 3 - Pointer & Array in C  (0) 2024.07.04
Review 1 - C programming basics  (0) 2024.07.03
5. Pointer - Motivation in C  (1) 2024.03.26
4. Function ic C - Grammer  (1) 2024.03.25