본문 바로가기

카테고리 없음

함수 (2)

이전 포스트 이어서...

 

오류가 뜸!

메인 함수 이전에 함수가 정의 되어야 에러가 안남.

#include<stdio.h>

//걷기
void walk(int distance);

//돌기
void rotate(int);

void drawSquare();

int main() {
	
}

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);
	}
}

프로토타입을 사용해 보기 편하게 할 수 있다.

반환형, 이름, 매개변수 리스트를 쓰고 정의는 쓰지 않으면 된다.

매개변수의 자료형과 갯수는 맞춰야 하지만 이름은 쓰지 않아도 된다.

메인 함수 이후에 함수들을 정의할 때, 순서는 상관은 없다.

 

 

35 - 재귀함수

#include<stdio.h>

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

무한 반복...하다가 멈춤.

 

#include<stdio.h>

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

함수 안에 n의 조건을 넣어서 return 하면 중간에 멈출 수 있음.

 

#include<stdio.h>
// 팩토리얼
int factorial(int n) {
	if (n == 1) {
		return 1;
	}

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

재귀함수를 쓸 때에는 보통 base가 있어야 함.

 

 

36 - 배열을 매개변수로 넘기기

#include<stdio.h>

void printArr(int arr[4]) {
	for (int i = 0; i < 4; i++) {
		printf("%d ", arr[i]);
	}
}
int main() {
	int arr[4] = { 1,2,3,4 };
	
	printArr(arr);
}

배열을 출력.

 

#include<stdio.h>

void printArr(int arr[4]) { //int *arr
	for (int i = 0; i < 4; i++) {
		arr[i] *= 2;
	}
}
int main() {
	int arr[4] = { 1,2,3,4 };
	
	printArr(arr);

	for (int i = 0; i < 4; i++) {
		printf("%d ", arr[i]);
	}
}

실행해보면 함수가 call by reference로 실행되는 것을 알 수 있다.

즉, 굳이 함수 매개변수 리스트에 *arr이라 쓸 필요는 없지만 이해하긴 편하다.

 

int *arr라 쓰면 *(arr + i)로 계산.

 

#include<stdio.h>

void printArr(int arr[2][3]) { // int (*arr)[3]
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int main() {
	int arr[2][3] = { {1,2,3}, {4,5,6} };
	printArr(arr); // &arr[0]을 의미함.
}

 

 

37 - 섹션 4 (함수) 종합문제

 

1. 정수 하나를 매개변수로 받아, 그 정수가 짝수이면 0, 홀수이면 1을 반환하는 함수를 만들어라.

#include<stdio.h>

int parity(int n) {
	if (n % 2 == 0) {
		return 0;
	}
	else {
		return 1;
	}
}

int main() {
	printf("%d\n", parity(5));
	printf("%d\n", parity(-3));
	printf("%d\n", parity(6));
}

// 그냥 (n%2+2)%2를 해도 됨.

 

2. 출력 결과 예상.

#include<stdio.h>

int useCnt[5] = { 0 };

void useItem(int);

int main() {
	useItem(4);
	useItem(2);
	useItem(1);
	useItem(4);
	useItem(0);
	
	for (int i = 0; i < 5; i++) {
		printf("슬롯 %d의 아이템을 %d번 썼습니다.\n", i, useCnt[i]);
	}
}

void useItem(int itemNum) {
	useCnt[itemNum]++;
}

출력 결과)

슬롯 0의 아이템을 1번 썼습니다.

슬롯 1의 아이템을 1번 썼습니다.

슬롯 2의 아이템을 1번 썼습니다.

슬롯 3의 아이템을 0번 썼습니다.

슬롯 4의 아이템을 2번 썼습니다.

 

3. 출력 결과 예상

#include<stdio.h>

void rec(int n) {
	if (n == 0) {
		return;
	}
	printf("%d", n);
	rec(n - 1);
	printf("%d", n);
}
int main() {
	rec(5);
}

출력 결과)

5432112345

 

4. 문자열을 매개변수로 받아 그 문자열에서 공백을 제거해 출력하는 함수를 작성해 보세요.

#include<stdio.h>

void print_noSpace(const char str[]) {
	for (int i = 0; str[i] != '\0'; i++) {
		if (str[i] != ' ') {
			printf("%c", str[i]);
		}
	}
}
int main() {
	print_noSpace("Hello, World!\n");
	print_noSpace("My name is daekwon\n");
}

강의에서는 함수 매개변수에 char str[]를 썼는데 오류가 떠서 앞에 const를 붙이니 해결되었다.