🖥C & C++/인프런 기초학습

[C/C++] 31강~35강 정리

728x90
반응형


< 31강. 함수를 만들어보자!! >



#include <stdio.h>



// main이라는 함수를 정의했다.

// printf 함수는 stdio.h에 포함되어 있다.

// 함수 안에 있는 것은 "매개변수"

int main() {

    printf("Hello");

}





# 아이템 구매해보기. 


#include <stdio.h>


int main() {

    int itemCnt = 0;

    int money = 100;

    

    // 아이템을 산다.

    itemCnt++;

    money -= 10;

    

    printf("아이템을 구매했습니다.\n");

    printf("아이템 개수 : %d\n",itemCnt);

    printf("잔액 : %d\n",money);

}



* 결과 : 


아이템을 구매했습니다.

아이템 개수 : 1

잔액 : 90

Program ended with exit code: 0



아이템 가격이 바뀔 때 마다, 새로 일일이 바꿔줘야하는 번거로움이 발생한다! 그래서 함수를 사용해서 변수의 값을 설정할 수 있도록 하는 것이다!



함수를 만들어보자!


#include <stdio.h>

// 밖에다가 선언해줘야 함

// = 전역 변수      (내부에 선언된 변수는 지역변수!)

int itemCnt = 0;

int money = 100;


// 함수 선언

void buyItem(){

    itemCnt++;

    money -= 10;

    

    printf("아이템을 구매했습니다.\n");

    printf("아이템 개수 : %d\n",itemCnt);

    printf("잔액 : %d\n",money);

}



int main() {

    buyItem();

    // 아이템을 산다.

    buyItem();

}


void로 함수를 선언한다! 함수 이름은 기능을 명시해주도록 설정!



매개변수란도 채워보자.  아이템의 가격이 시시각각 바뀔 때를 반영하기 위함이다!



#include <stdio.h>

// 밖에다가 선언해줘야 함

// = 전역 변수      (내부에 선언된 변수는 지역변수!)

int itemCnt = 0;

int money = 100;

int cost;


// 함수 선언

void buyItem(){

    itemCnt++;

    money -= cost;

    

    printf("아이템을 구매했습니다.\n");

    printf("아이템 개수 : %d\n",itemCnt);

    printf("잔액 : %d\n",money);

}



int main() {

    cost = 30;

    buyItem();

    // 아이템을 산다.

    cost = 50;

    buyItem();

}



지역변수 cost의 값이 다르기에 각기 다르게 적용되어서 결과가 도출된다.


아이템을 구매했습니다.

아이템 개수 : 1

잔액 : 70

아이템을 구매했습니다.

아이템 개수 : 2

잔액 : 20

Program ended with exit code: 0




더 간단하게 만들 수도 있다!


#include <stdio.h>

// 밖에다가 선언해줘야 함

// = 전역 변수      (내부에 선언된 변수는 지역변수!)

int itemCnt = 0;

int money = 100;

int cost;


// 함수 선언

// 매개변수 설정!

void buyItem(int cost){

    itemCnt++;

    money -= cost;

    

    printf("아이템을 구매했습니다.\n");

    printf("아이템 개수 : %d\n",itemCnt);

    printf("잔액 : %d\n",money);

}



int main() {

    buyItem(30);

    // 아이템을 산다.

    buyItem(50);

}



아예 매개변수로 설정을 해준다! 이렇게 되면 함수내에서 값을 넣어주면 더 간단하게 사용할 수 있다. 결과는 위와 똑같다! ( 쉼표로 구분하여 매개변수를 추가할 수 있다)



#include <stdio.h>

// 밖에다가 선언해줘야 함

// = 전역 변수      (내부에 선언된 변수는 지역변수!)

int itemCnt = 0;

int money = 100;

int cost;


// 함수 선언

// 매개변수 설정!

void buyItem(int cost, int cnt){

    itemCnt += cnt;

    money -= cost;

    

    printf("아이템을 구매했습니다.\n");

    printf("아이템 개수 : %d\n",itemCnt);

    printf("잔액 : %d\n",money);

}



int main() {

    buyItem(30,5);

    // 아이템을 산다.

    buyItem(50,7);

}


아이템을 구매했습니다.

아이템 개수 : 5

잔액 : 70

아이템을 구매했습니다.

아이템 개수 : 12

잔액 : 20

Program ended with exit code: 0


매개 변수는 원하는 만큼 설정해서 사용하면 된다.



< 32강. 함수의 반환 >


return에 대해서 알아보자!


#include <stdio.h>


// 2개의 매개변수의 합을 반환

// void는 반환 값이 없다는 것을 반영

// 반환값이 정수라면 int    (반환값의 형을 먼저 적어주는 것!)


int plus(int a, int b){

    return a + b;

}


int main(){

    int sum = plus(3,5);

    printf("%d\n",sum);

}


출력이 정수형이라 int로 함수를 선언! 


return을 없애면 "값을 반환해야 합니다!" 라는 에러를 출력함!


main에 return이 없다면(명시하지 않았다면) 자동으로 0을 리턴한다. ( 끝에 써줘도 되고, 안써줘도 되고! )


int noMeaning(){

    printf("first\n");

    return 1;

    printf("second\n");

    return 2;

}

// 퍼스트가 먼저 출력되고 1을 반환하게됨, 그 밑은 실행되지 않음. 함수에서 return을 만나게 되면 어떤 위치라도 함수가 종료되게 된다!

int main(){

    int a ;

    a = noMeaning();

    

    printf("반환된 값 : %d\n",a);

}


   


void noMeaning(){

    printf("first\n");

    return;

    printf("second\n");

    return;

}

// 퍼스트가 먼저 출력되고 1을 반환하게됨, 그 밑은 실행되지 않음. 함수에서 return을 만나게 되면 어떤 위치라도 함수가 종료되게 된다!

int main(){

    noMeaning();

}


void의 경우는 return;만 적어주면 된다!   first만 출력하고 종료되게 된다.





#include <stdio.h>

// 밖에다가 선언해줘야 함

// = 전역 변수      (내부에 선언된 변수는 지역변수!)

int itemCnt = 0;

int money = 100;

int cost;


// 함수 선언

// 매개변수 설정!

void buyItem(int cost, int cnt){

    if (money >= cost){

    itemCnt += cnt;

    money -= cost;

    

    printf("아이템을 구매했습니다.\n");

    printf("아이템 개수 : %d\n",itemCnt);

    printf("잔액 : %d\n",money);

    }

    else{

        printf("잔액이 부족합니다. \n");

    }

}



int main() {

    buyItem(3000,5);

    // 아이템을 산다.

    buyItem(50,7);

}



조건문 넣어주기 !



#include <stdio.h>

// 밖에다가 선언해줘야 함

// = 전역 변수      (내부에 선언된 변수는 지역변수!)

int itemCnt = 0;

int money = 100;

int cost;


int result;


// 함수 선언

// 매개변수 설정!

int buyItem(int cost, int cnt){

    if (money >= cost){

    itemCnt += cnt;

    money -= cost;

    

    printf("아이템을 구매했습니다.\n");

    printf("아이템 개수 : %d\n",itemCnt);

    printf("잔액 : %d\n",money);

    return  0;

    }

    else{

        printf("잔액이 부족합니다. \n");

        return -1;

        

    }

}



int main() {

    int result;

    

    result = buyItem(3000,5);

    // 아이템을 산다.

    if (result == -1){

        printf("돈이 부족하시군요! \n");

    }

    buyItem(50,7);

}


잔액이 부족합니다. 

돈이 부족하시군요! 

아이템을 구매했습니다.

아이템 개수 : 7

잔액 : 50



#include <stdio.h>

// 밖에다가 선언해줘야 함

// = 전역 변수      (내부에 선언된 변수는 지역변수!)

int itemCnt = 0;

int money = 100;

int cost;


// 함수 선언

// 매개변수 설정!

int buyItem(int cost, int cnt){

    // 잔액이 부족할 때만 -1을 반환하고 즉시 함수를 종료!

    if (money < cost) return -1;

    

    itemCnt += cnt;

    money -= cost;


    printf("아이템을 구매했습니다.\n");

    printf("아이템 개수 : %d\n",itemCnt);

    printf("잔액 : %d\n",money);

    return  0;

}


int main() {

    int result;

    

    result = buyItem(3000,5);

    // 아이템을 산다.

    if (result == -1){

        printf("돈이 부족하시군요! \n");

    }

    buyItem(50,7);

}


return을 쓰면 굳이 else를 안써도 된다는 장점이 있다!



< 33강. call-by-value와 call-by-reference >


값에 의한 호출, 참조에 의한 호출! 영어가 더 간편한듯!


#include <stdio.h>


void swap(int x,int y){

    int tmp = x;

    x = y;

    y = tmp;

}


int main(){

    int a = 2;

    int b = 3;

    

    // 값을 서로 바꾸고 싶을 때!

    // a의 값을 잠시 다른 곳에다가 저장시킴

    

    swap(a,b);

    

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

}


tmp에 저장시켜주는 것.


이를 값만 넘겨준다고 해서 "call-by-value"라고 함!


포인터를 사용하면 주솟값을 바꾸는 것이기 때문에, 


#include <stdio.h>


void swap(int *x,int *y){

    int tmp = *x;

    *x = *y;

    *y = tmp;

}


int main(){

    int a = 2;

    int b = 3;

    

    // 값을 서로 바꾸고 싶을 때!

    // a의 값을 잠시 다른 곳에다가 저장시킴

    

    swap(&a,&b);

    

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

}


이렇게 작성해도 두 개의 변수 값이 서로 바뀌게 된다. 이렇게 매개변수들이 변수의 값만 가지고 다룬 것이 아니라 포인터를 이용해서 참조했다 해서 


"call-by-reference"라고 한다. 


reference 변수는 C++에만 존재하는데 한 번 봐보자!


#include <stdio.h>


void swap(int &x,int &y){

    int tmp = x;

    x = y;

    y = tmp;

}


int main(){

    int a = 2;

    int b = 3;

    

    // 값을 서로 바꾸고 싶을 때!

    // a의 값을 잠시 다른 곳에다가 저장시킴

    

    swap(a,b);

    

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

}



일반 포인터와 똑같지만 &를 변수명 앞에 붙여서 사용할 수 있다. C++에서만 가능한 방법! 



< 34강. 프로토타입 >


prototype : 원형, 시제품


함수의 원형을 미리 적어두는 것. 어떻게 생겼는지 간략하게 적어두는 것을 말한다. 정의는 나중에!


#include <stdio.h>


// 로봇 만들 때


// 걷기

void walk(int dist){

    printf("%dcm를 걸었습니다.\n",dist);

}


// 돌기

void rotate(int angle){

    printf("%d도 회전했습니다. \n",angle);

}


// 정사각형을 그리며 돌도록 만들기

void drawSquare(){

    for (int i = 1; i <= 4; i++){

        walk(10);

        rotate(90);

    }

}


// 함수 순서 잘 지켜서 써줘야 함! 미리 선언해야한다는 것.

int main(){

    drawSquare();

}


이게 정상.



#include <stdio.h>


// 로봇 만들 때


// 걷기

void walk(int dist);


// 돌기

void rotate(int angle);


// 정사각형을 그리며 돌도록 만들기

void drawSquare();


// 함수 순서 잘 지켜서 써줘야 함! 미리 선언해야한다는 것.

int main(){

    drawSquare();

}



이렇게 ;로만 작성해서 틀만 잡아준다. 기능은 모르지만 어떻게 생긴건지만 말해주는 것, 나중에 그 기능들을 적어주면 돌아간다. 


#include <stdio.h>


// 로봇 만들 때


// 걷기

void walk(int dist);


// 돌기

void rotate(int angle);


// 정사각형을 그리며 돌도록 만들기

void drawSquare();


// 함수 순서 잘 지켜서 써줘야 함! 미리 선언해야한다는 것.

int main(){

    drawSquare();

}


void walk(int dist){


    printf("%dcm를 걸었습니다.\n",dist);


}




// 돌기


void rotate(int angle){


    printf("%d도 회전했습니다. \n",angle);


}




// 정사각형을 그리며 돌도록 만들기


void drawSquare(){


    for (int i = 1; i <= 4; i++){


        walk(10);


        rotate(90);


    }


}



더 나아가서 매개변수도 타입만 적어줘도 됨. int int 처럼.  순서도 굳이 신경쓰지 않고 적어도 됨! 문제는 발생하지 않음 



< 35강. 재귀 함수 >


재귀 함수 :   


학 ( 배울 학 ) 교 ( 학교 교 )         자기 정의 안에 다시 자기 자신이 들어가는 것. 



#include <stdio.h>


void rec(){

    printf("***\n");

    rec();

}


int main(){

    rec();

}

// 프로그램이 계속 무한 반복된다!



#include <stdio.h>


void rec(int n){

    printf("n = %d\n",n);

    rec(n + 1);

}


int main(){

    rec(1);

}

// 프로그램이 계속 무한 반복된다!

// ctrl + c 누르면 강제종료!


계속 1씩 더해지는 과정을 볼 수 있다. 


#include <stdio.h>


void rec(int n){

    if (n>5) return;

    printf("n = %d\n",n);

    rec(n + 1);

}


int main(){

    rec(1);

}


이러면 n = 5 일 때, return하고 종료하게 됨. 6일 때는 조건문에 걸림.


팩토리얼 : 5! = 5x4x3x2x1 = 120 

n! = n* (n-1)!     재귀라는 것을 알 수 있음


재귀 함수로 만들어보기.  


#include <stdio.h>


int factorial(int n){

    if (n == 1) return 1;

    return n * factorial(n-1);

    

}


int main(){

    printf("%d\n",factorial(5));

}


























728x90
반응형