못정함

C언어) 7-2장: 여러 가지 함수 유형 본문

C언어 공부/C언어 독학 (교재)

C언어) 7-2장: 여러 가지 함수 유형

hadara 2024. 9. 16. 21:48

함수 원형) 반환형 함수명(매개변수)  

언제나 함수에 반한형과 매개변수가 있는 건 아님 -> 매개변수가 없을 경우에는 void를 사용

*그래서 main(void) 인가보다

 


<매개변수가 없는 함수>

-함수 실행 시 input을 받을 때 활용

#include <stdio.h>

int get_num(void);

int main(void){

    int result;

    result = get_num(); //함수 호출하고, 반환값을 result에 저장
    printf("return : %d\n", result);

    return 0;
}

int get_num(void) //매개변수 없음 (void)써주면 됨
{
    int num;

    printf("input positive number: ");
    scanf("%d", &num);

    return num;
}

*void는 함수 정의나 선언에서 사용되며 호출할 땐 사용하지 않음

그냥 괄호 비워두면됨. result = get_num() 이렇게 호출함


<반환값이 없는 함수>

-데이터를 받아서 단지 화면에 출력하는 함수

-반환형의 자리에 void를 사용함

#include <stdio.h>

void print_char(char ch, int count); //반환값 없는 함수 선언

int main(void){

    print_char('@', 5); //함수 호출

    return 0;

}

void print_char(char ch, int count)
{
    int i;

    for (i=0; i < count; i++)
    {
        printf("%c", ch);
    }

    return;
}

*return; 으로 쓰면 됨 (반환값 없이 단독으로 사용 / return 생략해도 되긴함)

+)

함수 실행 중간에 함수 실행을 끝내고 싶으면 return;을 사용하면 도미

void print_char(char ch, int count)
{
	int i;
    
    if (count > 10) return;  // 여기서 return하면 함수의 실행을 종료함. 10보다 크면 함수 종료
    
    for (i=0; i < count; i++)
    {
    	printf("%c", ch);
    }
    
    return;
}

<매개변수와 반환값이 모두 없는 함수>

ex) 일정한 문자열을 여러 번 출력하는 함수

-매개변수와 반환형에 모두 void를 씀

#include <stdio.h>


void print_line(void);

int main(void)
{
    print_line(); // 함수 호출
    printf("studentID      name     major   grade\n");
    print_line();

    return 0;
}


void print_line(void)
{

    int i;

    for (i=0; i < 50; i++)
    {
        printf("-");
    }

    printf("\n");
}

<재귀호출 함수>

-recursive call function. 자기 자신을 호출함

-함수 안에 재귀함수를 멈추는 조건을 넣어줘야함 (아니면 무한증식함)

#include <stdio.h>


void fruit(void);

int main(void)
{
    fruit();

    return 0;
}

void fruit(void)
{
    printf("apple\n");
    fruit();  //자기 자신을 다시 호출

    /*반환 전에 자신을 호출하므로 처음부터 다시 시작하고 계속 apple 출력함*/
}

 

정상적으로 종료하려면 반복 고리를 끊어줘야함

#include <stdio.h>

void fruit(int count);

int main(void)
{
    fruit(1); //처음 호출하므로 1을 인수로 준다

    return 0;
}

void fruit(int count)
{
    printf("apple\n");
    if (count ==3)
    {
        return;
    }

    fruit(count + 1); //재호출 할 때 호출 횟수를 1 증가

}

<재귀호출과 반복문의 차이점>

*재귀함수는 직전에 호출한 곳으로 돌아간다

: 이전 함수의 호출 위치로 return => printf("jam\n"); 실행 (count=2의 함수) => 이전함수의 (count=1시절의 함수) printf("jam\n")실행 => 끝

(재귀함수는 실행 시 함수의 복사본을 만들어서 실행함. 계속 직전 호출한 곳으로 거슬러 올라감 (???)0
이해 안되면 교재 230p의 그림 참고하기

 

#include <stdio.h>

void fruit(int count);

int main(void)
{
    fruit(1); //처음 호출하므로 1을 인수로 준다

    return 0;
}

void fruit(int count)
{
    printf("apple\n");
    if (count ==3)
    {
        return;
    }

    fruit(count + 1); //재호출 할 때 호출 횟수를 1 증가
    printf("jam\n");

}

printf("jam\n"); 추가하면 

결과가)

apple

apple

apple

jam

jam

 

이렇게 나옴.

재귀함수는 함수의 복사본을 만들어 실행한다고 생각하면 이해하기 쉬움.

 

 

===> 복잡하다..메모리도 많이 잡아먹는다...쓰지말자...