🔒 계산기
#include <stdio.h>
int main(void)
{
// function
// 계산기
int num = 2;
printf("num은 %d입니다\n", num);
// 2 + 3은?
num = num + 3; // num += 3;
printf("num은 %d입니다\n", num);
// 5 - 1은?
num -= 1; // num = num - 1;
printf("num은 %d입니다\n", num);
// 4 x 3은?
num *= 3;
printf("num은 %d입니다\n", num);
// 12 / 6은?
num /= 6;
printf("num은 %d입니다\n", num);
return 0;
}
num은 2입니다
num은 5입니다
num은 4입니다
num은 12입니다
num은 2입니다
// 선언
void p(int num);
int main(void)
{
(생략)
}
// 정의
void p(int num)
{
printf("num은 %d입니다\n", num);
}
- 함수 선언은 main 함수 위에, 정의는 main 함수 아래에
- p: 함수명
- 함수명(파라미터)
int num = 2;
p(num)
- 위 코드의 printf 부분을
p(num)
으로 바꾼다
🔒 함수의 형태
반환형 함수이름(전달값)
- 반환형: 함수의 반환값의 자료형
- 반환값(
return
) 없을 때, void
- 반환값 있을 때, 함수 내
return
- 전달값 여러 개 가능, 자료형 서로 달라도 됨
- 정의한 함수는 반드시 선언해야 함
🔒 반환값/전달값이 없는 함수
// 선언
void function_without_return();
int main(void)
{
function_without_return();
return 0;
}
// 정의
void function_without_return()
{
printf("반환값이 없는 함수입니다\n");
}
- 반환값이 없으면 자료형 표시 공간에
void
- 전달값이 없으면 호출명 옆에 아무 값도 넣지 않아도 된다
🔒 반환값이 있는 함수
// 선언
void function_without_return();
int main(void)
{
int return_value = function_with_return();
p(return_value)
return 0;
}
// 정의
int function_with_return()
{
printf("반환값이 있는 함수입니다\n");
return 10;
}
- 반환값이 있을 때는 자료형 표기
- return을 적어준다
- 함수 호출 시, 반환값을 넣어줄 변수를 선언한다
🔒 전달값이 있는 함수
// 선언
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("전달값이 있는 함수입니다.\n");
printf("전달값은 %d, %d, %d입니다\n", num1, num2, num3);
}
- 전달값은 자료형과 전달값 이름을 적는다
- main 함수에서는 자료형에 맞는 값을 넣는다
- main 함수에서 전달 받은 값으로 함수가 동작한다
🔒 반환값/전달값 있는 함수
// 선언
int apple(int total, int ate); // 전체, 먹은 수
int main(void)
{
int return_value = apple(5, 2); // 5개의 사과 중 2개를 먹음
printf("사과 %d개 중에 %d개를 먹으면 %d개가 남아요\n", return_value);
printf("사과 %d개 중에 %d개를 먹으면 %d개가 남아요\n", 10, 4, apple(10, 4));
return 0;
}
// 정의
void apple(int total, int ate)
{
printf("전달값과 반환값이 있는 함수입니다.\n");
return total - ate;
}
- 원하는 연산은 정의 부분에서 한다
- main에서는 호출과 전달값만 입력한다
- return에 연산을 넣는다
- printf 함수와 헷갈리지 말 것
- printf문 안에 함수 자체를 넣을 수 있다
- 원하는 형식의 문구 출력은 main 함수에서 한다
🔒 함수를 이용한 계산기
// 선언
void p(int num);
int add(int num1, int num2);
int sub(int num1, int num2);
int mul(int num1, int num2);
int div(int num1, int num2);
int main(void)
{
int num = 2;
num = add(num, 3);
p(num);
num = sub(num, 1);
p(num);
num = mul(num, 3);
p(num);
num = div(num, 6);
p(num);
return 0;
}
// 정의
int add(int num1, int num2)
{
return num1 + num2;
}
int sub(int num1, int num2)
{
return num1 - num2;
}
int mul(int num1, int num2)
{
return num1 * num2;
}
int div(int num1, int num2)
{
return num1 / num2;
}
void p(int num)
{
printf("num은 %d입니다\n", num);
}
num은 5입니다
num은 4입니다
num은 12입니다
num은 2입니다
🔒 프로젝트
#include <stdio.h>
#include <time.h>
int getRandomNumber(int level);
void showQuestion(int level, int num1, int num2);
void success();
void fail();
int main(void)
{
// 문이 5개가 있고, 각 문마다 점점 어려운 수 연산 퀴즈 출제
// 맞히면 통과, 틀리면 실패
srand(time(NULL));
int count = 0; // 맞힌 문제 개수
for (int i = 1; i <= 5; i++)
{
// x * y = ?
int num1 = getRandomNumber(i);
int num2 = getRandomNumber(i);
// printf("%d X %d?", num1, num2);
showQuestion(i, num1, num2);
int answer = -1;
scanf_s("%d", &answer);
if (answer == -1)
{
printf("프로그램을 종료합니다\n");
exit(0); // 프로그램을 바로 끝냄
}
else if (answer == num1 * num2)
{
// 성공
success();
count++;
}
else
{
// 실패
fail();
}
}
printf("\n 당신은 5개의 비밀번호 중 %d개를 맞혔습니다\n", count);
return 0;
}
int getRandomNumber(int level)
{
return rand() % (level * 7) + 1;
}
void showQuestion(int level, int num1, int num2)
{
printf("\n\n\n########## %d번째 비밀번호 ##########\n", level);
printf("\n\t%d x %d는?\n\n", num1, num2);
printf("####################################\n");
printf("\n비밀번호를 입력하세요 (종료: -1) >> ");
}
void success()
{
printf("\n >> Good! 정답입니다 \n");
}
void fail()
{
printf("\n >> 땡! 틀렸습니다 \n");
}
- getRandomNumber 함수
- 랜덤으로 수를 받아온다
#include <time.h>
헤더 쓰고
srand(time(NULL))
로 난수 초기화
- int형 리턴값 반환하므로 리턴값 받을 변수 각각 선언한다
- 파라미터로 level을 받는데 level 값은 반복문의 인덱스로 설정한다
- 인덱스가 올라감에 따라 level이 올라간다
- 랜덤 수는
(level * 7) + 1
- 난이도가 올라갈수록 문제를 어렵게 하기 위해 레벨에 따라 랜덤 수의 범위를 넓힌다
- showQuestion 함수
- 파라미터로 level과 랜덤 수 두 개를 받는다
- 랜덤 수는 getRandomNumber로부터 받은 수들로, 그들을 담고 있는 변수 이름으로 불러온다
- 리턴값 없이 printf 함수만 수행한다
- 문제에 대한 틀을 출력한다
- success / fail 함수
- 파라미터와 리턴값이 없다
- 정답 문구와 오답 문구를 출력한다
- 문제를 총 다섯 번 출제할 것이므로 반복문 조건은 1부터 5까지
- 중간에 틀렸다고 반복문 탈출하지 않는다
- 오로지 사용자가 -1을 입력할 때만 탈출한다
exit(0)
: 조건에 상관 없이 반복문 종료
- 사용자로부터 값을 입력 받고 그 값과 랜덤 수의 곱이 서로 같은지 확인한다
- 같으면, success 함수 호출
- 틀리면, fail 함수 호출
- count 변수를 이용해 성공했을 경우, 맞힌 개수를 늘리도록 한다
- 반복문 탈출 후, count를 출력하여 맞힌 문제 수를 보여준다
* 출처: 나도코딩 "C 언어 무료 강의 (입문부터 게임 개발까지)"