Chapter 08 함수
01 함수의개요 02 함수사용하기 03 함수와배열 04 재귀함수
함수의필요성을인식한다. 함수를정의, 선언, 호출하는방법을알아본다. 배열을함수의인자로전달하는방법과사용시장점을알아본다. 재귀호출로해결할수있는문제의특징과해결방법을알아본다.
1.1 함수의정의와기능 함수 (function) 특별한기능을수행하는것 여러가지함수의예 Page 4
1.2 함수사용의장점 함수를이용할때프로그램의실행흐름 Page 5
1.2 함수사용의장점 1~10 을더하는프로그램 반복문사용 int i, sum = 0; for(i = 1; i < 11; i+ +) sum += i; 함수사용 int sum = 0; sum = Summation(1, 10); 잘설계된함수의장점 반복적으로실행해야할내용을함수로만들어필요할때마다호출해서사용 프로그램이모듈화되므로읽기쉽고, 디버깅과편집이수월 프로그램의기능과구조를한눈에알아볼수있음. 다른프로그램에서재사용할수있음. Page 6
2.1 시스템라이브러리함수와사용자정의함수 시스템라이브러리함수 자주사용하는유용한함수를사용자가바로이용할수있게 C 시스템에미리 만들어놓은것 사용자정의함수 사용자자신이원하는기능을직접만든함수 Page 7
2.2 함수의정의 사용자정의함수 Page 8
2.2 함수의정의 함수의정의형태 [ 함수의정의 ] ❸ 반환되는자료형 ❶ 함수명 (❷ 입력 ) { ❹ 기능 ( 하는일 ); ❸ return 반환값 ; } [ 함수의예 ] int SumTwo (int a, int b) { int result; result = a + b; return result; } 1 함수명 : 식별자작성규칙에따라명명 2 입력 : 인자의자료형과개수를순서대로작성 3 반환값 : 함수가입력을받아기능을수행한후에반환되는결과값 4 기능 : 함수를통해사용자가구현하려는내용대부분을여기에기록 Page 9
2.2 함수의정의 MultiTwo( ) 함수 정수 2 개 (a, b) 를입력받아곱한결과를 result 에저장하고그값을반환 int MutiTwo(int a, int b) { int result; result = a * b; return result; } int MutiTwo(int a, int b) { return a * b; } Page 10
2.2 함수의정의 Big( ) 함수 정수 2 개 (a, b) 를입력받아두수중에서큰수를출력 int Big(int a, int b) { if (a > b) return a; else return b; } Page 11
2.3 함수의선언 함수의선언 함수원형 (prototype) 이라고도함. 사용자정의함수에무엇이있는지알려주며, 함수를정의하기전에선언 [ 선언형태 ] 반환되는자료형함수명 ( 매개변수들 ); [ 선언의예 ] int SumTwo(int a, int b); 구체적인인자명을기록하지않고인자의자료형과개수만나타내도됨. int Sum (int, int); Page 12
2.4 함수의호출 함수의호출 함수가정의된형태에맞추어입력과출력을고려하여함수를사용 함수호출의예 int x = 10, y = 20, value; value = SumTwo(x, y); Page 13
2.4 함수의호출 01 #include <stdio.h> 02 03 int SumTwo(int a, int b); // 함수선언 04 05 int main(void) 06 { 07 int x = 10, y = 5; 08 int value; 09 10 value = SumTwo(x, y); // 함수호출 11 12 printf(" 두수의합 : %d\n", value); 13 14 return 0; 15 } 16 17 int SumTwo(int a, int b) // 함수정의 18 { 19 int result; 20 result = a + b; 21 return result; 22 } Page 14
2.4 함수의호출 01 #include <stdio.h> 02 03 float Average(float x, float y); // 함수선언 04 05 int main(void) 06 { 07 float num1, num2, result; 08 printf(" 실수 2개를입력하세요 : "); 09 scanf("%f %f", &num1, &num2); 10 11 result = Average(num1, num2); // 함수호출 12 13 printf(" 두실수의평균 : %f\n", result); 14 15 return 0; 16 } 17 18 float Average(float x, float y) // 함수정의 19 { 20 float z; 21 z = (x + y) / 2; 22 return z; 23 } Page 15
2.4 함수의호출 시작값과종료값을입력하면그사이의값을모두더하는함수 int Integral(int start, int end) { int sum = 0, i; for(i = start; i <= end; i++) sum += i; return sum; } Page 16
2.4 함수의호출 01 #include <stdio.h> 02 03 int Integral(int start, int end); // 함수선언 04 05 int main(void) 06 { 07 int result = 0, i; 08 09 printf(" 함수를사용하지않고합을구함 \n"); 10 for(i = 1; i <= 10; i++) 11 result += i; 12 13 printf("1부터 10까지합은 %d다.\n", result); 14 15 result = 0; // result 값을다시 0으로초기화함 16 17 for(i = 7; i <= 17; i++) 18 result += i; 19 20 printf("7부터 17까지합은 %d다.\n", result); 21 printf("*************************************\n"); 22 printf(" 함수를사용하여합을구함 \n"); 23 printf("1부터 10까지합은 %d다.\n", Integral(1, 10)); 24 printf("7부터 17까지합은 %d다.\n", Integral(7, 17)); Page 17
2.4 함수의호출 25 26 return 0; 27 } 28 29 int Integral(int start, int end) // 함수정의 30 { 31 int sum = 0, i; 32 for(i = start; i <= end; i++) 33 sum += i; 34 return sum; 35 } Page 18
2.4 함수의호출 시작값부터 1 씩증가시키며종료값까지의값을구하는일반적인함수 int Integral(int start, int end, int index) { int sum = 0, i; for(i = start; i <= end; i += index) sum += i; return sum; } 세번째인자로시작값과종료값사이의간격을정해주는요소를추가하면 다양한형태의합을구할수있음. Integral(1, 10, 2); Integral(2, 10, 2); Integral(3, 10, 3); // 1부터 10까지홀수의합 // 1부터 10까지짝수의합 // 1부터 10까지 3의배수의합 Page 19
2.4 함수의호출 01 #include <stdio.h> 02 03 int SumTwo(int a, int b) // 함수정의 04 { 05 int result; 06 result = a + b; 07 08 return result; 09 } 10 11 int main(void) 12 { 13 int x = 10, y = 5; 14 int value; 15 16 value = SumTwo(x, y); // 함수호출 17 18 printf(" 두수의합 : %d\n", value); 19 20 return 0; 21 } Page 20
2.4 함수의호출 01 #include <stdio.h> 02 03 void upper_case(char ch); 04 int main(void) 05 { 06 char ch1, ch2; 07 while((ch1 = getchar( ))!= EOF) { 08 upper_case(ch1); 09 } 10 return 0; 11 } 12 13 void upper_case(char ch) 14 { 15 char res; 16 if(ch > = 'a' && ch <= 'z') 17 res = ch-32; 18 else 19 res = ch; 20 putchar(res); 21 } Page 21
2.4 함수의호출 사용자정의헤더파일을만들고프로그래밍하는방법 사용자가만든함수의선언은일반적으로사용자가만든헤더파일에포함 Page 22
2.4 함수의호출 test.c 파일 01 #include "myheader.h" // 헤더파일을프로그램에포함한다. 02 03 int main(void) 04 { 05 int x = 10, y = 5; 06 int value; 07 08 value = SumTwo(x, y); // 함수호출 09 10 printf(" 두수의합 : %d\n", value); 11 12 return 0; 13 } 14 15 int SumTwo(int a, int b) 16 { 17 int result; 18 result = a + b; 19 20 return result; 21 } myheader.h 파일 01 #include <stdio.h> 02 int SumTwo(int a, int b); Page 23
2.4 함수의호출 1 test.c 파일이만들어진상태에서 [File]-[New]-[File] 메뉴를선택 [New File] 대화상자가나타나면 ❶ [Visual C++] 를선택하고 ❷ [Header File(.h)] 을선택한뒤 ❸ <Open> 을클릭 Page 24
2.4 함수의호출 2 헤더파일을작성할수있는소스작성창이나타나면 myheader.h 파일내용입력 Page 25
2.4 함수의호출 3 저장하기위해 [File]-[Save Header1.h] 를선택 [Save File As] 대화상자에서 ❶ 파일이름에 myheader 를입력하고 ❷ test.c 파 일이있는폴더를선택한후 ❸ <Save> 클릭하면 myheader.h 파일이만들어짐. Page 26
3.1 함수와배열 함수와배열 1 차원배열 int a[ ] = {10, 5, 15, 20, 30}; 모든원소의합을반복문으로작성 int i, sum = 0; for(i = 0; i < 5; i+ +) sum += i; 배열의원소를모두더하는기능을하는함수인 SumArray( ) int SumArray(int Array[], int Size) { ❶ 배열 ❷ 원소개수 int1, result = 0; for(i = 0; i < Size; i ++) ❸ 내용 result += Array[i]; } return result; ❹ 반환값 Page 27
3.1 함수와배열 SumArray( ) 함수 1 배열 : 배열명은가인자이기때문에식별자작성규칙에따라임의로작성 int SumArray(int Array[4], ) // 이경우는배열의원소개수가 4개인 { // 배열만인자로사용될수있다. } 2 원소개수 : 일반적으로배열명에는빈대괄호 [ ] 를사용하고실제배열의원 소개수는두번째인자로표시 ( 변수 Size 는배열의원소개수를나타냄 ) 3 내용 : 인자로사용된배열과원소개수를이용하여필요한기능을작성 4 반환값 : 함수에서계산된결과값을반환 Page 28
3.1 함수와배열 배열을인자로사용하는함수의호출 배열이인자인함수를호출할때배열부분에배열명만넣음. int main( ) { Int Sum, a[] = {10, 5, 15, 25, 7}; Sum = SumArray(a, 5); // 함수호출 } return 0; Page 29
3.1 함수와배열 01 #include <stdio.h> 02 03 int SumArray(int Array[ ], int Size); // 함수정의 04 05 int main(void) 06 { 07 int a[ ] = {10, 5, 15, 25, 7}; 08 int Sum; 09 Sum = SumArray(a, 5); // 함수호출 10 printf(" 배열원소의합 : %d\n", Sum); 11 return 0; 12 } 13 14 int SumArray(int Array[ ], int Size) // 함수정의 15 { 16 int result = 0, i; 17 for(i = 0; i < Size; i + +) 18 result += Array[i]; 19 20 return result; 21 } Page 30
4.1 재귀함수 재귀호출 (recursion) 함수에서그함수를다시호출하는것 데이터 N 개로이뤄진문제가 N-1 개문제를해결하면간단하게해결될때사용 N! 수식표현 N! = N * (N-1) * (N-2) * (N-3) * 1 N! = N * (N-1)! (N-1)! = (N-1) * (N-2)! Page 31
4.1 재귀함수 factorial( ) 함수 함수에서자기자신을다시호출 int factorial(int n) { return n * factorial(n-1); } 종료조건을결정해야무한히반복하지않음. int factorial(int n) { if(n <= 1) return 1; else return n * factorial(n-1); } // 종료조건 Page 32
4.1 재귀함수 01 #include <stdio.h> 02 03 int factorial(int n); 04 int main(void) 05 { 06 int fact_num; 07 fact_num = factorial(10); 08 09 printf("10 팩토리얼 : %d\n", fact_num); 10 11 return 0; 12 } 13 14 int factorial(int n) 15 { 16 if(n <= 1) 17 return(1); 18 else 19 return(n * factorial(n-1)); 20 } Page 33
4.1 재귀함수 01 #include <stdio.h> 02 03 int sum(int a); 04 int main(void) 05 { 06 int input, s = 0; 07 printf(" 양의정수를입력하세요 : "); 08 scanf("%d", &input); 09 10 s = sum(input); 11 printf(" 재귀함수를이용한 1 부터 %d 까지합 : %d\n", input, s); 12 return 0; 13 } 14 15 int sum(int a) 16 { 17 if(a <= 1) 18 return 1; 19 else 20 return a + sum(a-1); 21 } Page 34
감사합니다. C 로시작하는컴퓨터프로그래밍개정 3 판