중첩 for문의 활용
#include<stdio.h>
const int BREAD = 1500; //빵 가격
const int SNACK = 1700; //과자 가격
const int DRINK = 1400; //음료수 가격
int main(void)
{
int i, j, k;
int money;
printf("현재 당신이 소유하고 있는 금액: ");
scanf_s("%d", &money);
for (i = 1; i < money / BREAD; i++) //빵을 몇개 살 수 있는가
{
for (j = 1; j < money / SNACK; j++) //과자 몇개 살 수 있는가
{
for (k = 1; k < money / DRINK; k++) //음료수 몇개 살 수 있는가
{
if (money == BREAD * i + SNACK * j + DRINK * k)
{
printf("크림빵 %d개, ", i);
printf("새우깡 %d개, ", j);
printf("콜 라 %d개, \n", k);
}
}
}
}
printf("어떻게 구입하시겠습니까? \n");
return 0;
}
//각각 의 수가 늘어날 수록 다른 항목당 개수는 줄어든다.
지역변수의 활용
#include<stdio.h>
int SimpleFuncOne(void)
{
int num = 10; //이후부터 SimpleFuncOne의 num 유효
num++;
printf("SimpleFunOne num: %d \n", num);
return 0;
}
int SimpleFuncTwo(void)
{
int num1 = 20; //이후부터 num1 유효
int num2 = 30; //이후부터 num2 유효
num1++, num2--;
printf("num1 & num2: %d %d \n", num1, num2);
return 0; //num1, num2가 유효한 마지막 문장
}
int main(void)
{
int num = 17;//이후 부터 main의 num 유효
SimpleFuncOne();
SimpleFuncTwo();
printf("main num: %d \n", num);
return 0;
}
메인함수에서 출력이 이루어짐
메모리 할당과 소멸은 LIFO방식
나중에 온놈이 먼저 나간다.
#include<stdio.h>
int main(void)
{
int num = 1;
if (num == 1)
{
int num7; //이 행을 추석처리하고 실행결과 확인해보자
num += 10;
printf("if 문 내 지역변수 num: %d \n", num);
}
printf("main 함수 내 지역변수 num: %d \n", num);
return 0;
}
if문 내에서 작동하는 지역변수
#include<stdio.h>
int main(void)
{
int num = 1;
if (num == 1)
{
int num = 7; //이 행을 추석처리하고 실행결과 확인해보자
num += 10;
printf("if 문 내 지역변수 num: %d \n", num);
}
printf("main 함수 내 지역변수 num: %d \n", num);
return 0;
}
값을 전달하는것을 Call by value 라고 한다.
유니티에서 OnCollisionEnter 같은 함수를 생각해보자
전역 변수예제
#include<stdio.h>
void Add(int val);
int num;
int main(void)
{
printf("num: %d \n", num);
Add(3);
printf("num: %d \n", num);
num++; //전역변수인 num 값 1 증가
printf("num: %d \n", num);
return 0;
}
void Add(int val)
{
num += val; //전역변수 num의 값 val만큼 증가
}
처음 num을 호출 했을 경우 초기화를 하지 않았기 때문에 0으로 표시된다.
Add함수에 인자를 넣었을 때, 전역변수 3이 더해져서 3이 출력 되었고
마지막으로 1을 더한 값이 출력 되었다.
모든 함수 내에서 선언없이 쓰였다는 특징이 있다 이미 전역으로 선언되었기 때문
Add 함수 내에 num 이라는 함수를 추가로 선언 할 경우(지역변수)
main 함수 내에서 num(전역) 값의 변화는 일어나지 않는다.
#include<stdio.h>
void Add(int val);
int num;
int main(void)
{
printf("num: %d \n", num);
Add(3);
printf("num: %d \n", num);
num++; //전역변수인 num 값 1 증가
printf("num: %d \n", num);
return 0;
}
void Add(int val)
{
int num = 4; //지역변수로 num을 선언 할 경우 전역변수 num은 무시된다.
num += val; //전역변수 num의 값 val만큼 증가
}
반환값이 없기 때문에 1, 2번째 결과값에 변동 없음
#include<stdio.h>
int Add(int val);
int num = 1;
int main(void)
{
int num = 5;
printf("num: %d \n", Add(3));
printf("num: %d \n", num + 9);
return 0;
}
int Add(int val)
{
int num = 9;
num += val;
return num;
}
지역변수에 static 선언을 추가한 static 변수
#include<stdio.h>
void SimpleFunc(void)
{
static int num1 = 0; //선언부와 초기화가 동시에 되기 때문에 두번째 호출 부터는 0으로 초기화를 하지 않음
int num2 = 0; // 그 전값을 기억하고 있지 않기 때문에 계속 선언과 초기화가 반복된다.
num1++, num2++;
printf("static: %d, local: %d \n", num1, num2);
//static을 붙인 변수는 함수 호출이 끝나도 끝까지 남아있다.
}
int main(void)
{
int i;
for (i = 0; i < 3; i++)
SimpleFunc();
return 0; //메인 함수가 프로그램 종료 될 때까지 static num1은 살아있다.
}
함수를 빠져나가도 계속 메모리 공간에 존재할 필요가 있을 경우 static 지역변수를 사용한다.
재귀 함수
재귀함수의 기본적인 이해
알고리즘에서 많이 쓰인다.
일단 예제를 써보자ㅇ
#include<stdio.h>
void Recursive(int num)
{
if (num <= 0) //재귀의 탈출 조건
return; //재귀의 탈출
printf("Recursive call! %d \n", num);
Recursive(num - 1);
}
int main(void)
{
Recursive(3);
return 0;
}
Recursive 함수가 인자 값으로 3을 받으면 매개변수 num이 3으로 설정 되고
0이 될 때 까지 -1씩 반복 하면서 printf문을 출력한다.
while 문과 성격이 비슷하다.
팩토리얼 함수의 예
#include<stdio.h>
int Factorial(int n)
{
if (n == 0)
return 1;
else
return n * Factorial(n - 1);
}
int main(void)
{
printf("1! = %d \n", Factorial(1));
//인자값으로 1이 들어갔기 때문에 else 문만 보면 1 * 1 = 1
printf("2! = %d \n", Factorial(2));
//2 * (1 * 1) = 2
printf("3! = %d \n", Factorial(3));
//3 * {2 * (1 * 1)}
printf("4! = %d \n", Factorial(4));
//4 * [3 * {2 * (1 * 1)}]
printf("9! = %d \n", Factorial(9));
return 0;
}
재귀 함수의 예
#include<stdio.h>
int Power(int n)
{
if (n == 0)
return 1;
return Power(n - 1) * 2;
}
int main(void)
{
int num;
printf("정수 입력: ");
scanf_s("%d", &num);
printf("2의 %d승은 %d \n", num, Power(num));
return 0;
}
'게임프로그래밍 개발 수업 > C언어 수업' 카테고리의 다른 글
C언어 배열에 문자열 대입, 포인터의 개념 이해하기 (0) | 2023.03.29 |
---|---|
C언어 1차원 배열, 문자열의 입력과 출력 (0) | 2023.03.28 |
C언어 스위치문과 3항연산자 (0) | 2023.03.24 |
게임 개발반 프로그래밍 07 C언어 else if, do while문, Continue, Break, 3항연산자 (0) | 2023.03.23 |
게임 개발반 프로그래밍 05 C언어 수업 상수와 기본 자료형, (0) | 2023.03.21 |