본문 바로가기
개발자

두들낙서 C/C++ 31강~35강 함수, 함수의 반환, call by reference, 프로토 타입, 재귀 함수

by ⁖⁝‥ 2022. 6. 20.

 

int main() {
	int itemCnt = 0;
	int money = 100;

	//아이템을 산다.
	itemCnt++;
	money -= 10;
	printf("아이템을 구매했습니다\n");
	printf("  아이템의 개수 : %d\n", itemCnt);
	printf("  잔액 : %d\n", money);

	//아이템을 산다.
	itemCnt++;
	money -= 10;
	printf("아이템을 구매했습니다\n");
	printf("  아이템의 개수 : %d\n", itemCnt);
	printf("  잔액 : %d\n", money);

}

1)  전역변수, 지역변수

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//전역변수
int itemCnt = 0;
int money = 100;

void buyItem() {
	itemCnt++;
	money -= 10;
	printf("아이템을 구매했습니다\n");
	printf("  아이템의 개수 : %d\n", itemCnt);
	printf("  잔액 : %d\n", money);
}

int main() {
	//아이템을 산다.
	//지역변수
	buyItem();
	
	buyItem();
}

2) 함수에 매개변수 넣기

int itemCnt = 0;
int money = 100;

void buyItem(int cost) {
	itemCnt++;
	money -= cost;
	printf("아이템을 구매했습니다\n");
	printf("  아이템의 개수 : %d\n", itemCnt);
	printf("  잔액 : %d\n", money);
}

int main() {
	
	buyItem(30);
	buyItem(50);
}

결과 :

3) 매개변수 두개 넣기

int itemCnt = 0;
int money = 100;

void buyItem(int cost,int cnt) {
	itemCnt += cnt;
	money -= cost;
	printf("아이템을 구매했습니다\n");
	printf("  아이템의 개수 : %d\n", itemCnt);
	printf("  잔액 : %d\n", money);
}

int main() {
	//아이템을 산다.
	//지역변수
	
	buyItem(30, 5);
	
	buyItem(50, 7);
}

결과 :

int itemCnt = 0;
int money = 100;

void buyItem(int cost, int cnt) {
	if (money >= cost) {
		itemCnt += cnt;
		money -= cost;
		printf("아이템을 구매했습니다\n");
		printf("  아이템의 개수 : %d\n", itemCnt);
		printf("  잔액 : %d\n", money);
	}
	else {
		printf("잔액이 부족합니다.\n");
	}
}

int main() {
	//아이템을 산다.
	//지역변수

	buyItem(3000, 5);

	buyItem(50, 7);
}

결과 :

int itemCnt = 0;
int money = 100;
int result;

void buyItem(int cost, int cnt) {
	if (money >= cost) {
		itemCnt += cnt;
		money -= cost;
		printf("아이템을 구매했습니다\n");
		printf("  아이템의 개수 : %d\n", itemCnt);
		printf("  잔액 : %d\n", money);
		result = 0;
	}
	else {
		printf("잔액이 부족합니다.\n");
		result = -1;
	}
}

int main() {
	//아이템을 산다.
	//지역변수
	
	buyItem(3000, 5);
	if (result == -1) {
		printf("돈이 부족하시군여..\n");
	}
	buyItem(50, 7);
}

결과 :

int itemCnt = 0;
int money = 100;

int buyItem(int cost, int cnt) {
	if (money >= cost) {
		itemCnt += cnt;
		money -= cost;
		printf("아이템을 구매했습니다\n");
		printf("  아이템의 개수 : %d\n", itemCnt);
		printf("  잔액 : %d\n", money);
		
		return 0;
	}
	else {
		printf("잔액이 부족합니다.\n");
		return -1;
	}
}

int main() {
	int result;
	
	result = buyItem(3000, 5);
	if (result == -1) {
		printf("돈이 부족하시군여..\n");
	}
	result = buyItem(50, 7);
}

결과 :

int itemCnt = 0;
int money = 100;


int buyItem(int cost, int cnt) {
	if (money < cost) {
		printf("잔액이 부족합니다.\n");
		return -1;
	}

	itemCnt += cnt;
	money -= cost;
	printf("아이템을 구매했습니다\n");
	printf("  아이템의 개수 : %d\n", itemCnt);
	printf("  잔액 : %d\n", money);
	return 0;
	
}

int main() {
	int result;
	
	result = buyItem(3000, 5);
	if (result == -1) {
		printf("돈이 부족하시군여..\n");
	}
	result = buyItem(50, 7);
}

결과 :

32강. 함수의 반환

1) return : 반환

#include <stdio.h>

int plus(int a, int b) {
	return a + b;
}

int main() {
	int sum = plus(3, 5);
	printf("%d\n", sum);
}

2) main 함수에는 return 0; 을 안적어도 자동으로 들어간다.

근데 plus 함수에는 return 값을 꼭 적어야 한다.

int noMeaning(){
	printf("first\n");
	return 1;
	printf("second\n");
	return 2;
}

int main() {
	int a; 
	a = noMeaning();
	printf("반환된 값 : %d\n", a);
}

return을 만나면 그 즉시 함수가 종료되어 버려서 첫번째 리턴 밑에 있는애들은 실행이 안된다.

3) void 함수에서 리턴을 만나면 어떻게 되나?

void noMeaning(){
	printf("first\n");
	return;
	printf("second\n");
	return;
}

int main() {
	noMeaning();
}

void 함수는 리턴값이 필요 없기 때문에 return 뒤에 숫자를 지운다.

33강. call by value, call by reference

1) a 와 b 의 값을 맞바꾸기

int main() {
	int a, b;
	scanf("%d%d", &a, &b);

	int tmp;
	tmp = a;
	a = b;
	b = tmp;
	
	printf("%d %d", a, b);
}

결과 : 

2) a 와 b를 맞바꾸는 함수 만들기

void swap(int x, int y) {
	int tmp = x;
	x = y;
	y = tmp;
}

int main() {
	int a, b;
	scanf("%d%d", &a, &b);

	swap(a, b);
	
	printf("%d %d", a, b);
}

결과 :

왜 안바뀌었을까? - a ,b와 x, y 가 따로 놀고 있기 때문에

해결책 : 포인터로 바꾼다.  = call by reference

void swap(int *x, int *y) {
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

int main() {
	int a, b;
	scanf("%d%d", &a, &b);

	swap(&a, &b);
	
	printf("%d %d", a, b);
}

포인터로 바꿨을때

결과 : 

 call by reference C++

void swap(int &x, int &y) {
	int tmp = x;
	x = y;
	y = tmp;
}

int main() {
	int a, b;
	scanf("%d%d", &a, &b);

	swap(a, b);
	
	printf("%d %d", a, b);
}

34강. 프로토 타입 prototype

prototype : 원형, 시제품

함수의 원형을 적어놓고 정의 는 나중에

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

void walk(int distance) {
	printf("%dcm를 걸었습니다.\n",distance);
}
void rotate(int angle) {
	printf("%d도 회전했습니다.\n", angle);
}
void drawSquare() {
	for (int i = 1; i <= 4; i++) {
		walk(10);
		rotate(90);
	}
}
int main() {
	drawSquare();
}

결과 : 

void walk(int distance) {
	printf("%dcm를 걸었습니다.\n",distance);
}
void rotate(int angle) {
	printf("%d도 회전했습니다.\n", angle);
}

int main() {
	drawSquare();
}

void drawSquare() {
	for (int i = 1; i <= 4; i++) {
		walk(10);
		rotate(90);
	}
}

오류. 함수를 밑에 적으면 실행이 안됨

void walk(int distance);
void rotate(int angle);
void drawSquare();

int main() {
	drawSquare();
}

void walk(int distance) {
	printf("%dcm를 걸었습니다.\n", distance);
}
void rotate(int angle) {
	printf("%d도 회전했습니다.\n", angle);
}
void drawSquare() {
	for (int i = 1; i <= 4; i++) {
		walk(10);
		rotate(90);
	}
}
void walk(int);
void rotate(int);
void drawSquare();

int main() {
	drawSquare();
}

void walk(int distance) {
	printf("%dcm를 걸었습니다.\n", distance);
}
void rotate(int angle) {
	printf("%d도 회전했습니다.\n", angle);
}
void drawSquare() {
	for (int i = 1; i <= 4; i++) {
		walk(10);
		rotate(90);
	}
}

프로토 타입의 장점 : 

1) 함수 순서를 신경쓸 필요 없음

2) 어떤 함수가 있는지 한눈에 볼 수 있음

 

35강. 재귀 함수

void rec() {
	printf("***\n");
	rec();
}

int main() {
	rec();
}

무한반복

void rec(int n) {
	printf("n = %d\n",n);
	rec(n + 1);
}

int main() {
	rec(1);
}

1) 재귀함수에 종료조건 넣기

void rec(int n) {
	if (n > 5) return;
	printf("n = %d\n",n);
	rec(n + 1);
}

int main() {
	rec(1);
}

결과 :

2) 팩토리얼

5! = 5 *  4 * 3 * 2 * 1 =120

int factorial(int n) {
	if (n == 1) return 1;
	return n * factorial(n - 1);
}

int main() {
	printf("%d\n", factorial(5));
}

반응형

댓글