이전 포스트 이어서...
오류가 뜸!
메인 함수 이전에 함수가 정의 되어야 에러가 안남.
#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를 붙이니 해결되었다.