이 영역을 누르면 첫 페이지로 이동
caputdraconis 블로그의 첫 페이지로 이동

caputdraconis

페이지 맨 위로 올라가기

caputdraconis

네트워크 관점에서의 클라우드 컴퓨팅을 공부하는 중입니다 :)

C/C++ 기초 강의 요약 (섹션4)

  • 2020.03.27 19:23
  • Security/지옥방 스터디
글 작성자: caputdraconis
반응형

#include <stdio.h>

int itemCnt=0;
int money=100;


void buyItem(int cost, int cnt){
    itemCnt+=cnt;
    money -=cost;
    printf("아이템을 구매했습니다\n");
    printf("    아이템 개수 : %d\n", itemCnt);
    printf("    잔액 : %d\n", money);
    }


int main(){

    buyItem(20, 5);


    buyItem(30, 7);


}



함수를 정의하고 사용해보았다.
buyItem이라는 함수를 선언해 인자로 cost와 cnt값을 받는다. cost는 가격, cnt는 구매한 개수. 즉 buyItem(cost, cnt);를 실행하면 money값에는 cost가 빠진 값이 저장되고, itemCnt에는 cnt만큼 더해진 값이 저장된다.

#include <stdio.h>


int plus(int a, int b){
    return a+b;
}
int main(){
    int sum=plus(3,5);
    printf("%d\n", sum);

}

return 돌려주다. 반환!
지금까지 main함수를 선언하면서 main이라는 글자 앞에 int를 붙였었다. 이는 main()함수는 int형의 값을 반환한다는 것이다.
위의 코드에서도 마찬가지다. plus()라는 함수를 정의했는데 그 함수의 반환값을 int형으로 했고 함수가 끝날때 return을 사용하여 값을 반환하게 된다.
return을 만나게 되면 그 즉시 그 함수를 빠져나오게 된다. 즉 함수 내에 return이 두 번 있다면 첫번째 return 문을 실행하고 그 뒤의 코드는 실행이 되지않는다.

#include <stdio.h>


void swap(int x, int y){
    int tmp;
    tmp=x;
    x=y;y=tmp;
}

int main(){
    int a,b;

    scanf("%d %d", &a, &b);
    swap(a,b);

}

기대했던 결과는 a와 b의 결과가 서로 바뀌는것이다.하지만 결과는 그렇지 않을 것이다

#include <stdio.h>


void swap(int *x, int *y){
    int tmp;
    tmp=*x;
    *x=*y;*y=tmp;
}

int main(){
    int a,b;

    scanf("%d %d", &a, &b);
    swap(&a, &b);
    printf("%d %d\n", a, b);

}  

이전에 배운 포인터 개념을 사용해 위에서 원했던 기능을 구현한것이다.

//prototype : 원형, 시제품
#include <stdio.h>

void walk(int distance);
void rotate(int angle);
void drawSquare();

}
int main(){
    drawSquare();
}

//걷기
void walk(int distance){
    printf("%dkm를 걸었습니다\n" , distance);
}

//돌기
void rotate(int angle){
    printf("%d도 회전했습니다\n", angle);
}

void drawSquare(){
    for(int i=0;i<4;i++){
        walk(10);
        rotate(90);
    }


prototype 원형, 시제품
prototype은 뜻 그대로 시제품, 먼저 보여준다..?의 느낌이다. 위의 코드를 보자. main함수 전에 함수의 본체는 없이 앞대가리만 써져있는게 보일 것이다. 그리고 main함수가 다 끝나고 나서 다시 한 번 앞서 정의되어있던 함수를 본체도 포함해 작성된 것을 볼 수 있다. 컴파일러는 위에서부터 명령문을 실행하다보니 만약 main앞에 저렇게 프로토타입을 설정해놓지 않고 main 뒤에서 정의를 한다면, main함수에서 실행된 함수는 정의되지 않은 함수가 되기 때문에 오류가 발생한다. 이를 막기 위해 prototype을 작성한다. 이는 필수적인 것은 아니지만 코드의 간결함과 가독성을 올리는데는 확실한 기여를 한다는 것을 알 수 있다.

#include <stdio.h>

void rec(int n){
    printf("n=%d\n",n);
    rec(n+1);
}
int main(){
    rec(1);
}

재귀함수 함수가 자신을 호출하는 함수 recursion
위의 코드를 보면, main안에서 rec(1)을 호출했을때 n=1을 출력하고 호출된 rec함수가 끝나기 전에 rec(2)로 다시 호출이 된다. 이를 반복한다.
중간에 조건문을 넣어 무한 재귀를 제어할 수 있다.

//팩토리얼
//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(6));
}

팩토리얼 값을 출력하는 코드를 재귀함수를 사용해 구현한것이다. factorial(3)을 호출하면 return 3*factorial(2)을 하게 되는데
여기서 다시 factorial(2)를 호출하게 된다. 이렇게 차차 수가 작아지다가 factorial(1)을 호출하게 됐을때 if(n==1) 조건문에 성립하게 되어 1!=1을 반환하게 된다.

#include <stdio.h>

void doubleArr(int arr[4]){
    for(int i=0;i<4;i++){
        arr[i]*=2;
    }
}

int main(){
    int arr[4]={1,2,3,4};
    doubleArr(arr);


    for(int i=0;i<4;i++){
        printf("%d\n", arr[i]);
    }
}

위의 함수를 실행했을때 2 4 6 8이 출력되는걸 보면 doublaArr에 인자로 주어진 arr[4]에 arr을 대입시키면 call-by-reference가 된다는것을 알 수 잇다 .여기서 더 정확히 하고자 한다면 int doubleArr(int *arr)로 선언을 하면 arr은 &arr[0] 이기 때문에 포인터와 주소 개념이 정확히 성립한다.

<종합문제>

//정수 하나를 입력 받아서 그 수가 짝수이면 0 ,홀수 이면 1을 반환하는 함수를 작성해보세요.
#include <stdio.h>

int q1(int n){
    if(n%2==0) return 0;
    return 1;
}

int main(void){
    int a;
    scanf("%d", &a);
    printf("입력한 숫자가 짝수라면 0 ,홀수라면 1 >>>%d\n", q1(a));
}

Q1.정수 하나를 입력 받아서 그 수가 짝수이면 0 ,홀수 이면 1을 반환하는 함수를 작성해보세요.

슬롯 0의 아이템을 1번 썼습니다.
슬롯 1의 아이템을 1번 썼습니다.
슬롯 2의 아이템을 1번 썼습니다.
슬롯 3의 아이템을 0번 썼습니다.
슬롯 4의 아이템을 2번 썼습니다.

Q2.주어진 프로그램의 출력값을 적어보시오.

5
4
3
2
1
1
2
3
4
5

Q3.주어진 프로그램의 출력값을 적어보시오.
return을 하면 방금 그 함수가 호출된 곳으로 돌아간다. 문제의 코드에서는 rec(0)이 호출되어 rec함수로 들어갔을때 조건문에 걸려 return을 하게 된다. 그럼 방금 rec(0)을 호출한 rec(n-1)으로 돌아와 그 밑의 printf("%d\n",n);을 실행하고 rec(1)이 끝나며 rec(2)함수 내의 rec(n-1)함수로 돌아가게 된다. 이렇게 반복을 하다가 n=5까지 가게 되면 위의 실행값이 나온다.


#include <stdio.h>
#include <string.h>

void print_noSpace(char *str){
    for(int i=0;i<strlen(str);i++){
        if(str[i]==' ') continue;
        printf("%c", str[i]);
    }
}


int main(void){
    print_noSpace("Hello, World!\n");
    print_noSpace("My name is Doodle\n");
}

Q4.주어진 문자열을 공백없이 출력하는 함수를 만드시오.

반응형

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 지옥방 포너블 1주차 과제

    지옥방 포너블 1주차 과제

    2020.03.30
  • C/C++ 기초 강의 요약 (섹션7)

    C/C++ 기초 강의 요약 (섹션7)

    2020.03.27
  • C/C++ 기초 강의 요약 (섹션3)

    C/C++ 기초 강의 요약 (섹션3)

    2020.03.27
  • C/C++ 기초 강의 요약 (섹션2)

    C/C++ 기초 강의 요약 (섹션2)

    2020.03.27
다른 글 더 둘러보기

정보

caputdraconis 블로그의 첫 페이지로 이동

caputdraconis

  • caputdraconis의 첫 페이지로 이동

검색

메뉴

    카테고리

    • 분류 전체보기 (168)
      • Cloud (3)
      • Computer Network (12)
      • Database (2)
      • Terraform (2)
      • 🥚고리즘 (13)
      • 겅부겅부🙃 (10)
        • Naver CS50 코칭스터디 (2)
        • Machine Learning (1)
        • Computing System (6)
      • 언어&프레임워크 (20)
        • Python (4)
        • Django (10)
        • Node JS (1)
        • C++ (2)
        • Java (1)
        • Flutter (2)
      • Security (76)
        • WebHacking Study (11)
        • 지옥방 스터디 (22)
        • 여름방학 스터디 (2)
        • PWN Study (6)
        • SUA Reversing Study (3)
        • PWN (3)
        • WebHacking (20)
        • Reversing (4)
      • 알고 있으면 도움되지 않을까,,? (23)
      • 일상다반사 (1)
      • 근황 정리 (1)
      • 42 Seoul (1)
        • Setting (1)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • old-16
    • 웹해킹.kr
    • 리스트함수
    • 드림핵
    • 파이썬기초
    • 파이썬함수
    • 파이썬
    • Python

    나의 외부 링크

    • Github
    • solved.ac
    • caputdraconis@kakao.com

    정보

    caputdraconis의 caputdraconis

    caputdraconis

    caputdraconis

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. Copyright © caputdraconis.

    티스토리툴바