본문 바로가기
c언어 개발일지

[나도 코딩 C언어] 함수

by 노랑사랑팽이 2022. 8. 12.

✏️함수

🔎 선언/정의

함수는 먼저 선언해주고, main을 통해 함수 구현, main문 아래 함수 정의를 해주는게 일반적이다.

#include <stdio.h>

// 선언
void p(int num);

int main(void)
{
	//function
	//계산기

	int num = 2;
	//printf("num은 %d 입니다.\n", num);
	p(num);

	// 2 + 3 은?
	num = num + 3;
	//printf("num은 %d 입니다.\n", num);
	p(num);

	num *= 3;
	//printf("num은 %d 입니다.\n", num);
	p(num);

	num /= 6;
	//printf("num은 %d 입니다.\n", num);
	p(num);

	return 0;
}

// 정의
// 반환형 함수이름 (전달값)
void p(int num)
{
	printf("num 은 %d 입니다.\n", num);
}

 

🔎 반환값이 없는 함수

#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();

int main(void)
{
	int ret = function_with_return();
	printf("반환값은 %d 입니다.\n", ret);
	return 0;
}

int function_with_return()
{
	printf("반환값이 있는 함수입니다.\n");
	return 10;
}

 

🔎 파라미터

#include <stdio.h>

void function_without_params();
void function_with_params(int num1, int num2, int num3);
int apple(int total, int ate);


int main()
{
	// 파라미터(전달값)이 없는 함수
	function_without_params();

	//전달값이 있는 함수
	function_with_params(1, 2, 3);

	//파라미터도 받고 반환값이 있는 함수
	int ret = apple(5, 2); // 다섯개의 사과 중에서 2개 먹음
	printf("남은 사과는 %d개 입니다\n\n", ret);

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

	return 0;
}

void function_without_params()
{
	printf("전달값이 없는 파라미터입니다.\n");
}

void function_with_params(int num1, int num2, int num3)
{
	printf("전달값이 있는 함수이며, 전달받은 값은 %d %d %d 입니다.\n", num1, num2, num3);
}

int apple(int total, int ate)
{
	printf("전달값과 반환값이 있는 함수 입니다.\n");
	return total - ate;
}

✏️ 계산기

#include <stdio.h>

//계산기 함수
int add(int num1, int num2);
int sub(int num1, int num2);
int mul(int num1, int num2);
int div(int num1, int num2);
void p(int num);

int main()
{
	int num = 2;
	num = add(num, 3);
	p(num);

	num = sub(num, 1);
	p(num);

	num = mul(num, 24);
	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);
}

 

 

✏️ 프로젝트

🔎 비밀번호 마스터

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

int getRandomNumber(int level);
void showQuestion(int level, int num1, int num2);
void sucess();
void fail();

int main()
{
	// 문이 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 의 값은 얼마입니까?\n", 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)
		{
			//성공
			sucess();
			count++;
		}
		else
		{
			//실패
			fail();
		}
	}

	printf("\n\n 당신은 5개의 비밀번호 중 %d개를 맞췄습니다.", 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("%d X %d 의 값은 얼마입니까?\n", num1, num2);
	printf("#########################\n");
	printf("비밀번호를 입력하세요(종료 : -1) >> ");
}

void sucess()
{
	printf("\n >> GOOD! 정답입니다.\n");
}

void fail()
{
	printf("\n >> OMG! 틀렸습니다.\n");
}

 


🍏 KEEP, 습관 중요한 것

너무 어렵게만 생각하지 말고 다양한 프로젝트 경험을 통해 이렇게도 구현할 수 있구나 접해보고 시도해보는게 중요한 것 같다.

 

🍎 PROBLEM, 이슈, 에러, 오류

함수 이름이 길어질 수록 오타로 인해 실행이 안되는 부분이 많았다. 함수 이름을 그냥 복붙해서 쓰는게 오류를 줄이는 방법 같다.

은근 오류가 나 발견하면 코드 제일 마지막에 세미콜론(;)을 붙이지않아 발생하는 오류가 많았다.

 

 🍉 TRY 시도

레벨이 올라갈수록 더 어려운 수식 계산이 나오도록 설정하라는 문제를 봤을때, 사실 멘붕이었다. 이걸 어떤 식으로 구현해야 할까?

풀이방법을 보고 깜짝 놀랐다!

발상의 전환! 5번의 반복을 위해 카운트했던 i를 level로 설정해 레벨이 올라갈수록 더 큰 숫자가 나오도록 한 점이 색달랐다. 발상의 전환!

저번의 2개씩 늘어나는 별 찍는 것도 그렇고 이번에도 그렇고.

컴퓨터적 사고가 필요하다!

댓글