본문 바로가기

공부/C언어

C언어(함수)

함수는 특정 기능을 제공하는 일련의 코드를 묶어서 이름을 붙인것이다. 종류에는 1.진입점 함수 2.라이브러리 함수 3.사용자 정의 함수가 있다.

1.진입점 함수는 프로그램이 시작될 때 운영체제에 의해 호출된다. ex) int main(void)

2.라이브러리 함수는 입출력과 같은 고유의 기능을 제공한다. 라이브러리 함수를 호출하려면 라이브러리 함수가 필요하다. 라이브러리가 제공하므로 만들 필요가 없고 사용만 하면 된다.

ex) #include <stdlib.h>

     char ch;

     printf("%c", ch);

     scanf("%c", &ch);

3.사용자 정의 함수는 프로그래머가 직접 정의하는 함수이다.

 

 

1)리턴값과 매계변수가 없는 함수의 사용

 

#include <stdio.h>
void hi(void) // 리턴형과 매개변수가 없는 함수
{
   printf("Hi! Let's enjoy C progrmaming.\n");
} // 함수의 끝을 만나면 리턴한다.
void bye() { printf ("Bye!\n"); } // 간단한 함수는 한줄로 작성할 수 있다.
int main(void)
{
   hi();
   bye();
   hi();
   bye();

   return 0;
}   

실행결과

Hi! Let's enjoy C programming

Bye!

Hi! Let's enjoy C programming

Bye!

 

함수는 특정 기능을 수행하는 코드를 한 번만 작성해두고, 필요할 때마다 불러쓰는(호출) 기능이다. 함수를 호출할 때는 함수 이름 다음에 ()를 쓰고, ()안에 함수의 인자를 쓴다.

ex) 함수이름(함수인자)  함수를 호출할 때 넘겨준 인자가 매개변수로 전달된다.

 

리턴값과 매개변수가 없는 함수에는

hi(); // 함수 이름 다음에 빈 괄호를 적어준다. ()가 없으면 함수 호출이 아니다.

 

 

2)지역 변수의 생성과 소멸과정

 

#include <stdio.h>
void dummy()
{
   int y = 456; // 함수가 호출 될 때마다 매번 다시 생성된다.
   printf("y = %d\n", y);
   y--; // 감소된 y는 함수가 리턴할 때 소멸된다.
}

int main(void)
{
   int i;
   for (i = 0; i < 3; i++)
      dummy();
   for (i = 0; i < 3; i++)
   {
      int x = 123;
      printf("x = %d\n", x);
      x++;
   }
return 0;
}

실행결과

y = 456

y = 456

y = 456

x = 123

x = 123

x = 123

 

 

함수안에 선언된 지역변수는 함수가 호출되는 횟수 만큼 생성되고 소멸된다. 마찬가지로 반복문안에 선언된 지역변수는 반복문이 호출되는 횟수 만큼 생성된고 소멸된다.

구분 지역변수 전역변수
선언 위치 함수나 블록 안 함수 밖
사용 범위 변수가 선언된 함수나 블록 안 소스파일 전체
생존 기간 변수가 선언된 블록에 들어갈 때 생성되고 블록을 빠져나갈 때 소멸 프로그램이 시작될때 때 생성되고 프로그램이 종료될 때 소멸
초기화 하지 않는 경우 쓰레기 값 0으로 초기화

 

3)[리턴값은 있고 매개변수는 없는 함수] 다음과 같이 메뉴를 출력하고 선택된 메뉴 항목의 번호를 리턴하는 choose_menu함수를 작성하시오. 만일 잘못된 번호를 선택하면 올바른 번호를 선택할 때까지 계속 메뉴를 출력하고 다시 선택 받아야한다. 즉, choose_menu 함수는 반드시 0~3 사이의 값을 리턴해야 한다. choose_munu의 리턴값에 따라 어떤 메뉴가 선택되었는지 간단히 출력하는 프로그램을 작성하시오.

 

#include <stdio.h>
int choose_menu(void)
{
   int menu = 0;
   do{
      printf("[1.파일열기 2.파일저장 3.인쇄 0.종료] 선택?");
      scanf("%d", &menu);
     } while(menu < 0 || menu > 3);
     
     return menu;
}

int main(void)
{
   while(1)
   {
      int menu = choose_menu();
      if(menu == 0)
         break;
      switch(menu)
      {
      case 1:
         printf("파일 열기를 수행합니다.\n");
      	 break;
      case 2:
         printf("파일 저장을 수행합니다.\n");
         break;
      case 3:
         printf("파일 인쇄를 수행합니다.\n");
         break;
      }
   }
   return 0;
}

실행결과

[1.파일열기 2파일저장 3.인쇄 0.종료] 선택? 2

파일 저장을 수행합니다.

[1.파일열기 2파일저장 3.인쇄 0.종료] 선택? 5

[1.파일열기 2파일저장 3.인쇄 0.종료] 선택? 0

case뒤에 띄어쓰기를 하지 않으면 올바르게 실행값이 나오지 않으니 주의하자.

 

 

4)[표준C라이브러리 함수] 프로그램을 작성하다보면 0~(N-1)범위에 있는 정수를 생성해야 하는 경우가 자주 있다. 표준 C 라이브러리의  rand 함수를 이용해서 0에서 (N-1) 사이에 있는 정수를 리턴하는 random 함수를 정의하시오. random 함수를 이용해서 0~99범위에 있는 임의의 정수 10갸룰 생성하고 그 합계를 구하는 프로그램을 작성하시오.

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int random(int range)
{
	return rand() % range;
}

int main(void)
{
	int sum = 0;
	int i;
	srand((unsigned int) time(0));
	printf("0~99사이의 임의의 정수를 10개 생성해서 합계를 구합니다.\n");
	for (i=0; i<10; i++)
	{
		int num = random(100);
		printf("%4d", num);
		sum += num;
	}
	printf("\n 합계: %d\n", sum);
	
	return 0;
}

실행결과

0~99사이의 임의의 정수를 10개 생성해서 합계를 구합니다.

0 85 12 32 12 48 60 55 2 77

합계 : 383

stdlib.h 헤더파일은 주로 exit(), atoi(), rand(), srand(), system() 등의 함수가 쓰인다.

rand()는 난수를 생성하고, srand()는 난수의 시드를 생성하여 rand()가 매번 다른값이 나오도록 한다. 

'공부 > C언어' 카테고리의 다른 글

C언어(배열)  (0) 2019.12.18