본문 바로가기

programming study/C

[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (4)(2020.12.27)

본 내용은 해당 강의 토대로 작성


함수

입력값이 있으면 동작을 한 뒤 출력을 하는 것을 함수라고 한다.

계산기

C에서 함수를 선언, 정의하는 방법은 아래와 같다.

#include<stdio.h>
void p(int num); // 함수 선언
int main(void)
{
return 0;
}
void p(int num) // 함수 정의
{
    printf("num 은 %d 입니다\n", num);
}

int main(voud) 함수의 밖을 기준으로, 맨 위에는 선언을 아래에는 정의를 한다.

정의한 함수로 계산기를 만들어 본다.

#include<stdio.h>
void p(int num);    // 함수 선언
int main(void)
{
  int num = 2;
  p(num); //2 출력

  // 2 + 3 은?
  num = num + 3; // num+=3;
  p(num); // 5 출력

  // 5 - 1 은?
  num -= 1; // num = num -1;
  p(num); //4 출력

  // 4 x 3 은?
  num *= 3;
  p(num); //12 출력

  // 12 / 6 은?
  num /=6;
  p(num); //2 출력

  return 0;
}
void p(int num) // 함수 정의
{
  printf("num 은 %d 입니다\n", num);
}

num = num +3num+=3은 같은 표현이다.(다른 사칙연산도 동일)

함수의 형태

함수의 기본적인 형태는 아래와 같다.

자료형 함수이름(전달값)

{

return 실행할 명령

}

반환형 함수는 함수를 실행하고 값을 반환하는 것이다. 반환형 함수에서, 동작을 수행하고 반환해주는 값은 보내준 값에 자료형을 맞춰야 한다. 즉, 정수 연산을 할때는 int, 실수를 연산할 때는 float, 문자를 다룰 때는 char을 쓴다. retrun은 실행할 명령 앞에 써준다. 값을 반환한다는 의미이다. 전달값 도 자료형이 있고 여러개를 받을 수 있다. 여기서, 함수를 정의할 때 파일 상단에서 함수를 선언한 것과 자료형과 전달값을 동일하게 써야한다.

반환을 하지 않는 함수는 함수이름 앞에 자료형void를 사용한다. 아래에 구체적인 예시를 들어보겠다.

반환깂이 없는 함수

반환형이 아닌 함수는 자료형에 void를 사용한다.

#include<stdio.h>
void function_without_return();  //함수 선언
int main(void)
{
function_without_return(); //정의한 문구 출력
return 0;
}
void function_without_return()  //함수 정의
{
  printf("반환값이 없는 함수입니다.\n");
}

반환값이 있는 함수

#include<stdio.h>
int function_with_return();  //함수 선언
void p(int num);            //함수 선언
int main(void)
{
int ret = function_with_return(); //문구 출력 후 정수 10 retrun
p(ret);                          //10 입력, "num은 10 입니다."
return 0;
}
int function_with_return()  //함수 정의
{
printf("반환값이 있는 함수입니다.\n");
return 10;
}
void p(int num) // 함수 정의
{
  printf("num 은 %d 입니다\n", num);
}

함수 function_with_return()return이 있는 함수이다. 함수가 문구를 출력하고 10을 리턴값으로 주고 변수 ret에 10이 들어간다. 이 10은 다시 함수p의 전달값에 들어가서 문구를 출력하게 된다. 아래를 참고.

스크린샷 2020-12-26 오후 11.42.59

전달값이 없는 함수

파라미터(전달값)이 없는 함수의 예시이다. 전달값이 없을 때도 void를 사용한다.

#include<stdio.h>
void function_without_params(); //함수 선언
int main(void)
{
function_without_params();
return 0;
}
void function_without_params(){ //함수 정의
  printf("전달값이 없는 함수입니다\n");
}

전달값이 있는 함수

파라미터(전달값)이 있는 함수의 예시

#include<stdio.h>
void function_with_params(int num1, int num2, int num3); //함수 선언
int main(void)
{
function_with_params(1, 2, 3);
return 0;
}
void function_with_params(int num1, int num2, int num3) //함수 정의
{
  printf("전달값이 있는 함수이며, 전달받은 값은 %d, %d, %d 입니다\n", num1, num2, num3);
}

반환값과 전달값이 있는 함수

반환값과 파라미터(전달값)이 있는 함수의 예시

#include<stdio.h>
int apple(int total, int ate); //함수 선언
int main(void)
{
int ret = apple(5, 2);
printf("사과 5개 중에 2개를 먹으면? %d 개가 남아요\n", ret);
return 0;
}
int apple(int total, int ate)
{
  printf("전달값과 반환값이 있는 함수입니다\n"); //함수 정의
  return total - ate;
}

함수 apple이 연산을 하고 그 값을 return하면, ret라는 변수를 출력해서 아래와 같이 결과가 나온다.

스크린샷 2020-12-27 오전 12.25.32

printf("사과 %d개 중에 %d개를 먹으면? %d 개가 남아요\n", 10, 4, apple(10,4));

위 처럼, printf 함수 안에 return함수를 넣어서 바로 출력할 수 있다.

함수를 이용한 계산기

배운 개념을 응용해서 함수를 이용한 계산기를 만들어보자.

#include<stdio.h>
int add(int num1,int num2);  //add 함수 선언
int sub(int num1,int num2);  //sub 함수 선언
int mul(int num1,int num2);  //mul 함수 선언
int div(int num1,int num2);  //div 함수 선언
void p(int num);            //p 함수 선언
int main(void)
{
int num = 2;
num = add(num, 3);           //2 + 3 = 5
p(num);

num = sub(num, 1);           //5 - 1 = 4
p(num);

num = mul(num, 3);          //4 * 3 = 12
p(num);

num = div(num, 6);         //12 * 6 = 2
p(num);

return 0;
}
int add(int num1,int num2)  //add함수 정의
{
return num1 + num2;
}
int sub(int num1,int num2)  //sub함수 정의
{
return num1 - num2;
}
int mul(int num1,int num2)  //mul함수 정의
{
return num1 * num2;
}
int div(int num1,int num2)  //div함수 정의
{
return num1 / num2;
}
void p(int num)             //p함수 정의
{
    printf("num 은 %d 입니다\n", num);
}

return으로 인해 각 결과들이 이어지면서 진행되는 것을 볼 수 있다.

스크린샷 2020-12-27 오전 12.49.15

비밀번호 마스터

아래의 조건으로 비밀번호 마스터 게임을 만들어 본다.

수식 문제를 맞추는 게임

맞히면 통과, 틀리면 실패

기회는 총 5회

-1입력하면 게임 종료

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int getRandomNumber(int level);                          //getRandomNuber 함수 선언
void showQuestion(int level, int num1, int num2);        //showQuestion 함수 선언
void success();                                         //success 함수 선언
void fail();                                           //fail 함수 선언


int main(void)
{
  srand(time(NULL));                   //난수 초기화
  int count = 0;                       //맞힌 문제
  for (int i = 1; i <= 5; i++)         //i가 1부터 5와 같거나 작을 때 까지 +1,총 5번 반복
  {
    int num1 = getRandomNumber(i);      //num1에 getRandomNuber(i)의 리턴 값 대입,i를 받아 난수 생성
    int num2 = getRandomNumber(i);      //num2에 getRandomNuber(i)의 리턴 값 대입
    printf("%d x %d ?", num1, num2);    //곱할 수 화면에 출력
    showQuestion(i, num1, num2);        //showQuestion 출력

    int answer = -1;                                        //대답을 입력하는 answer 기본값 -1
    scanf("%d", &answer);               //정수를 받아서 answer에 입력
    if (answer == -1)                   //answer에 -1을 입력하면,
    {
      printf("프로그램을 종료합니다\n");
      exit(0);                          //프로그램을 종료
    }
    else if(answer == num1 * num2)      //answer과 답이 같으면,
    {
      success();                       //success함수 실행 후, 맞춘 개수 count에 +1
      count++;
    }
    else                              //틀린 경우
    {
      fail();                        //fail함수 실행
    }

  }
  printf("\n\n 당신은 5개의 비밀번호 중 %d 개를 맞혔습니다\n", count);     //for문 종료 후, 게임의 결과 출력
  return 0;
}

int getRandomNumber(int level)                     //getRandomNuber함수 정의
{
  return rand() % (level * 7) + 1;                 //정수 level파라미터를 받아서 7을 곱한 뒤 +1한 값을 난수의 범위로 출력
}
void showQuestion(int level, int num1, int num2)  //showQuestion함수 정의 반환값x
{
  printf("\n\n\n########## %d 번째 비밀번호 ##########\n", level); //level인자에 i,num1,num2에는 난수를 사용하여
  printf("\n\t%d X %d 는?\n\n", num1, num2);                    //문구 화면 출력
  printf("####################\n");
  printf("\n비밀번호를 입력하세요 (종료 : -1) >> ");
}
void success()                                      //success함수 정의 반환값x
{
  printf("\n >> Good! 정답입니다\n");                 //정답시 문구 출력
}
void fail()                                       //fail함수 정의 반환값x
{
  printf("\n >> 땡! 틀렸습니다\n");                  //정답시 문구 출력
}

exit(0): 프로그램 종료

스크린샷 2020-12-27 오전 1.35.51

느낀점

재밌었다! 이해가 잘 되어서 좋았다. return에 대해서 확실하게 알 수 있었고 각각 함수들의 특징과 용도들도 알 수 있었다. 코드를 보면 이해는 되는데, 내가 짜보려니까 엄두가 안난다. 아직은 연습이 더 필요하다.