How We Coding

Week 09

Tutoring/18-1 C Lang2018. 5. 16. 20:18

< 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 == 0return 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 < 1return 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 == 0return 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 < 1return ;
    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 < 1return ;
    printf("%d\n", n);
    print1(n-1);
}
cs


>> n부터 1까지 거꾸려 출력하는 것은 n을 먼저 출력하고 n-1부터 1까지 거꾸로 출력하는 것과 같다.


'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 11  (0) 2018.05.30
Week 10  (0) 2018.05.23
Week 08  (0) 2018.05.09
Week 07  (0) 2018.05.05
Week 06  (0) 2018.04.23