본 내용은 해당 강의 토대로 작성
함수
입력값이 있으면 동작을 한 뒤 출력을 하는 것을 함수라고 한다.
계산기
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 +3
과 num+=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
의 전달값에 들어가서 문구를 출력하게 된다. 아래를 참고.
전달값이 없는 함수
파라미터(전달값)이 없는 함수의 예시이다. 전달값이 없을 때도 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
라는 변수를 출력해서 아래와 같이 결과가 나온다.
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
으로 인해 각 결과들이 이어지면서 진행되는 것을 볼 수 있다.
비밀번호 마스터
아래의 조건으로 비밀번호 마스터 게임을 만들어 본다.
수식 문제를 맞추는 게임
맞히면 통과, 틀리면 실패
기회는 총 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)
: 프로그램 종료
느낀점
재밌었다! 이해가 잘 되어서 좋았다. return에 대해서 확실하게 알 수 있었고 각각 함수들의 특징과 용도들도 알 수 있었다. 코드를 보면 이해는 되는데, 내가 짜보려니까 엄두가 안난다. 아직은 연습이 더 필요하다.
'programming study > C' 카테고리의 다른 글
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (6)(2020.12.28) (0) | 2020.12.28 |
---|---|
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (5)(2020.12.27) (2) | 2020.12.27 |
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (3)(2020.12.26) (0) | 2020.12.26 |
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (2)(2020.12.26) (0) | 2020.12.26 |
[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (1)(2020.12.25) (0) | 2020.12.25 |