Week 09
< 180516 >
0)
- break : 가장 가까이에 있는 반복문 하나를 빠져나간다.
- continue : 가장 가까이에 있는 반복문으로 돌아간다.
>> 보통 continue 문을 사용하지 않고 코딩이 가능하다..!!
1) 라이브러리 함수 vs 사용자 정의 함수
- 라이브러리 함수 : 이미 누군가가 만들어 놓은 함수
>> 우리는 가져다 쓰면 된다. 보통 어딘가의 헤더파일에 들어있다.
>> printf() 도 함수이다. stdio.h 라는 헤더파일에 들어있다. 문자열의 갯수를 리턴한다.
>> scanf() 도 함수이다. 어떤 값을 리턴하는지 검색해보길 바람..^^
- 사용자 정의 함수는 우리가 직접 만들어서 사용하는 함수..!!
2) 사용자 정의 함수의 종류는 크게 네종료
1 2 3 4 5 6 7 | void f1(void); void f2(int a); int f3(void); int f4(int a); | cs |
>> f1 함수는 함수의 결과로 아무것도 돌려주지 않고, 어떤 값도 전달 받지 않는 함수.
>> f2 함수는 함수의 결과로 아무것도 돌려주지 않고, 함수가 호출될 때 정수 데이터 한개를 전달받는 함수
>> f3 함수는 함수의 결과로 정수값을 리턴하고, 함수가 호출될 때 어떤 값도 전달받지 않는 함수
>> f4 함수는 함수의 결과로 정수값을 리턴하고, 함수가 호출될 때 정수 데이터 한개를 전달받는 함수
>> f1, f2 함수는 매개변수를 받지 않는 함수이다. 이런경우 void 를 쓰지만, 매개변수자리의 void 는 생략 가능하다.
>> 여기서 f2, f4 의 경우 변수 a를 매개변수라고 하며, 매개변수를 필요시 여러개를 설정할 수 있다.
>> f3, f4 는 리턴타입이 있는 함수로, 필요에 따라 우리가 알고 있는 자료형으로 대체해서 정의할 수 있다.
3) 위 함수들의 사용 예
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <stdio.h> void f1(void) { printf("Hello world\n"); } void f2(int a) { for(int i=1; i<=a; i++) printf("%d\n", i); } int f3(void) { int k; scanf("%d", &k); return k; } int f4(int a) { int sum=0; for(int i=1; i<=a; i++) sum += i; return sum; } int main() { f1(); f2(10); printf("%d\n", f3()); printf("%d\n", f4(10)); } | cs |
>> f1 함수는 "Hello world" 를 출력하는 함수
>> f2 함수는 1부터 전달받은 값까지 출력하는 함수
>> f3 함수는 값 하나를 입력한 다음 그 값을 리턴하는 함수
>> f4 함수는 1부터 전달받은 값까지의 합을 리턴하는 함수
4) 함수의 원형(프로토타입) 선언
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <stdio.h> void f1(void); void f2(int a); int f3(void); int f4(int a); int main() { f1(); f2(10); printf("%d\n", f3()); printf("%d\n", f4(10)); } void f1(void) { printf("Hello world\n"); } void f2(int a) { for(int i=1; i<=a; i++) printf("%d\n", i); } int f3(void) { int k; scanf("%d", &k); return k; } int f4(int a) { int sum=0; for(int i=1; i<=a; i++) sum += i; return sum; } | cs |
>> 이런식으로 함수를 main함수 아래에 적어도 된다.
하지만 이럴경우 함수의 원형을 위에 미리 선언을 해둬야 한다. (뒤에 세미콜론 주의!!)
5) 절대값을 출력하는 함수 vs 절대값을 리턴하는 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> int myAbs(int n) { return n > 0 ? n : -n; } void printAbs(int n) { int k = n > 0 ? n : -n; printf("%d\n", k); } int main() { int n; scanf("%d", &n); printAbs(n); printf("%d\n", myAbs(n)); } | cs |
6) 정수를 거꾸로 뒤집는 결과를 리턴하는 함수
ex) 1234 를 입력하면 4321 을 리턴한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> int reverseDigit(int n) { int ret=0; while(n) { ret *= 10; ret += n%10; n /= 10; } return ret; } int main() { int n; scanf("%d", &n); printf("%d\n", reverseDigit(n)); } | cs |
### 재귀함수 ###
- 자기가 자기 자신을 호출 하는 함수
- 탈출조건이 필요하다. 없으면 무한루프.
- 함수는 함수 고유의 기능이 있다. 그 기능을 어떻게 쪼개서 생각할지가 중요하다.
- 점화식을 알고 있으면 그대로 표현하면 된다.
1) fac(n) : n! 을 구하는 함수
1 2 3 4 5 | int fac(int n) { if(n == 0) return 1; return n * fac(n-1); } | cs |
>> n! = n * (n-1)! 이다
>> 0! = 1
2) Sum(n) : 1부터 n까지의 합을 구하는 함수.
1 2 3 4 5 | int Sum(int n) { if(n < 1) return 0; return n + Sum(n-1); } | cs |
>> 1부터 n까지의 합은 1부터 n-1까지의 합에 n을 더하면 된다.
>> 1보다 작은 수가 들어오면 0을 리턴하면 될 것 같다.
3) Pow(a, n) : a의 n승을 구한ㄴ 함수
1 2 3 4 5 | int Pow(int a, int n) { if(n == 0) return 1; return a * Pow(a, n-1); } | cs |
>> a의 n승은 a*(a의 n-1승)과 동일하다.
>> a의 0승은 1..!!
4) print1(n) : 1부터 n까지 출력하는 함수
1 2 3 4 5 6 | void print1(int n) { if(n < 1) return ; print1(n-1); printf("%d\n", n); } | cs |
>> 1부터 n까지 출력하는 것은 1부터 n-1까지 출력한 다음에 n만 출력하는 것과 같다.
5) print2(n) : n부터 1까지 거꾸로 출력하는 함수.
1 2 3 4 5 6 | void print2(int n) { if(n < 1) return ; printf("%d\n", n); print1(n-1); } | cs |
>> n부터 1까지 거꾸려 출력하는 것은 n을 먼저 출력하고 n-1부터 1까지 거꾸로 출력하는 것과 같다.