[나도코딩] 비밀번호 마스터

타키탸키·2021년 5월 11일
0

C언어(C, C++, C#)

목록 보기
4/14

🔒 계산기

#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입니다
  • printf가 다섯 번 반복
    • 함수를 통해 반복 줄이기
// 선언
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을 적어준다
  • 함수 호출 시, 반환값을 넣어줄 변수를 선언한다
    • int return_value

🔒 전달값이 있는 함수

// 선언
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문 안에 함수 자체를 넣을 수 있다
    • apple(10, 4)
  • 원하는 형식의 문구 출력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 언어 무료 강의 (입문부터 게임 개발까지)"
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글