1 / 38

쉽게 풀어쓴 C 언어 Express

쉽게 풀어쓴 C 언어 Express. 제 8 장 함수. C Express. 이번 장에서 학습할 내용. 규모가 큰 프로그램은 전체 문제를 보다 단순하고 이해하기 쉬운 함수로 나누어서 프로그램을 작성하여야 한다 . . 모듈 함수의 개념 , 역할 함수 작성 방법 반환값 인자 전달 함수를 사용하는 이유. 모듈의 개념. 모듈 (module) 독립되어 있는 프로그램의 일부분 모듈러 프로그래밍 (modular programming) 모듈 개념을 사용하는 프로그래밍 기법 모듈러 프로그래밍의 장점

medea
Download Presentation

쉽게 풀어쓴 C 언어 Express

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 쉽게 풀어쓴 C언어 Express 제8장 함수 C Express

  2. 이번 장에서 학습할 내용 규모가 큰 프로그램은 전체 문제를 보다 단순하고 이해하기 쉬운 함수로 나누어서 프로그램을 작성하여야 한다. • 모듈 • 함수의 개념, 역할 • 함수 작성 방법 • 반환값 • 인자 전달 • 함수를 사용하는 이유

  3. 모듈의 개념 • 모듈(module) • 독립되어 있는 프로그램의 일부분 • 모듈러 프로그래밍(modular programming) • 모듈 개념을 사용하는 프로그래밍 기법 • 모듈러 프로그래밍의 장점 • 각 모듈들은 독자적으로 개발 가능 • 다른 모듈과 독립적으로 변경 가능 • 유지보수가 용이 • 모듈의 재사용 가능

  4. 함수의 개념 • 함수(function):특정한 작업을 수행하는 독립적인 부분 • 함수 호출(function call): 함수를 호출하여 사용하는 것 • 함수는 입력을 받으며 출력을 생성한다.(함수는 인자를 전달 받아 결과를 반환할 수 있다.)

  5. 함수의 필요성 #include<stdio.h> voidprint_star(void) { inti; for (i = 0; i < 10; i++) printf("*"); } int main(void) { print_star(); ... print_star(); ... print_star(); return 0; } #include<stdio.h> intmain(void) { inti; for (i = 0; i < 10; i++) printf("*"); ... for (i = 0; i < 10; i++) printf("*"); ... for (i = 0; i < 10; i++) printf("*"); return0; } 함수는 한번 정의하면 여러 번 호출하여 실행 가능하다.

  6. 함수의장점 • 함수를 사용하면 코드가 중복되는 것을 막을 수 있다. • 한번 작성된 함수는 여러 번 재사용할 수 있다. • 함수를 사용하면 전체 프로그램을 모듈로 나눌 수 있어서 개발 과정이 쉬워지고 보다 체계적이 되면서 유지보수도 쉬워진다.

  7. 프로그램은 함수들로 구성된다. 함수 호출을 통하여 서로 연결된다. 제일 먼저 호출되는 함수:main 함수들의 연결

  8. 함수의 종류

  9. 함수의 정의 • 반환형(return type) • 함수 헤더(function header) • 함수 몸체(function body)

  10. 함수의 구조

  11. 반환형

  12. 매개변수(인자, 인수)

  13. 예제 #1 • 정수의 제곱값을 계산하는 함수 반환값: int/함수 이름: square/인자: int n intsquare(int n) { return n * n; }

  14. 예제 #2 • 별표 기호를 이용하여 정사각형을 그리는 함수 반환값: void /함수 이름:draw_rect/인자: int side voiddraw_rect(int side){ int x, y; for (y = 0; y < side; y++) { for (x = 0; x < side; x++) printf("*"); printf("\n");         } return; // 생략 가능 }

  15. 예제 #3 • 정수의 거듭 제곱값(xy)을 계산하는 함수 반환값: long/함수 이름: power / 인자: int x, int y longpower(int x, int y){ inti; long result = 1; for (i = 0; i < y; i++)                 result *= x; returnresult; }

  16. 함수 호출과 반환 • 함수 호출(function call): 함수이름(인자 리스트) • 인자 전달(매개변수 전달) • 호출자(caller)의 인자를 피호출자(callee)의 인자로 전달 • 함수 몸체 수행 • 호출 위치로 복귀: 결과값 반환 가능 main: caller add: callee

  17. 인자 전달(parameter passing) • 실인자 형식인자 • caller의 인자: 실인자, 실매개변수, actual argument • callee의 인자: 형식인자, 형식매개변수, formal parameter • 대표적인 인자 전달 방식 • call-by-value: 값 전달, 값 호출 • call-by-reference: 참조 전달, 참조 호출

  18. 인자 전달: call-by-value • 형식인자는 실인자와 별도로 존재 • 함수 호출 시 실인자의 값 복사 메모리 사용과 실행 속도 측면에서 비효율적임 • callee측에서 형식인자를 변경해도 실인자는 바뀌지 않음 부작용(side effect)이 없음 • C는 call-by-value 방식만 지원 x = 1; f(x); // x = 1 void f(int y) { y++; } y x 1 1  2

  19. 인자 전달: call-by-reference • 형식인자는 실인자와동일 • 함수 호출 시 실인자의 값을 복사하지 않음 메모리 사용과 실행 속도 측면에서 효율적임 • callee측에서 형식인자를 변경하면 실인자도 바뀜 부작용(side effect)이 있음 • C++는 call-by-value와 call-by-reference 방식 모두 지원 x = 1; f(x); // x = 2 void f(int&y) { y++; } x ≡ y 1  2

  20. 반환값(return value) • 인자는 여러 개 가능하나 반환값은최대 하나만 가능 return; // return type이 void인 경우 return0; returnx; return x * x + 2 * x + 1;

  21. 예제 #1 // 정수의 제곱을 계산하는 함수 #include<stdio.h> int square(int n) { return n * n; } int main(void) { int result; result = square(5); printf("%d\n", result); return 0; } 25

  22. 예제 #2 // 두수 중에서 큰 수를 찾는 함수 #include<stdio.h> intget_max(int x, int y) { return (x > y) ? x : y; } intmain(void) { int a, b; printf("두개의 정수를 입력하시오: "); scanf("%d %d", &a, &b); printf("두 수 중에서 큰 수는 %d입니다.\n", get_max(a, b)); return 0; } 두개의 정수를 입력하시오: 2 3 두 수 중에서 큰 수는 3입니다.

  23. 함수 원형(function prototype) • 함수에 대하여 컴파일러에게 미리 알리는 것 전방향 선언(forward declaration) #include<stdio.h> intget_max(int x, int y); int main(void) { int a, b; printf("두개의 정수를 입력하시오: "); scanf("%d %d", &a, &b); printf("두수 중에서 큰 수는 %d입니다.\n“, get_max(a, b)); return 0; } intget_max(int x, int y) { return (x > y) ? x : y; } 함수 원형(function prototype) 함수 정의(function definition)

  24. 함수 원형 • 함수의 인터페이스(interface) 정보 표현 • intget_integer(void); • int combination(int n, int r); • intget_integer(void); • intcombination(int, int); 반환형 함수이름(인자 리스트); 자료형만 명시해도 허용

  25. 함수 원형과 헤더 파일 • 보통 헤더 파일에는 함수 원형이 선언되어 있다.

  26. 조합(combination) 계산 예제 main get_integer combination factorial

  27. 조합 계산 예제 #include<stdio.h> intget_integer(void); int combination(int n, int r); intfactorial(intn); intmain(){ inta, b; a = get_integer(); b = get_integer(); printf("C(%d, %d) = %d\n", a, b, combination(a, b)); return0; } int combination(int n, int r){ return(factorial(n) / (factorial(n - r) * factorial(r))); } intget_integer(void){ intn; printf("정수를 입력하시오: "); scanf("%d", &n); returnn; } intfactorial(intn){ inti, result = 1; for (i= 1; i <= n; i++) result *= i; returnresult; } 정수를 입력하시오: 10 정수를 입력하시오: 3 C(10, 3) = 120

  28. 소수(prime number) 판단 예제 • 정수의소수여부를 판단하는프로그램 • 소수: 암호학에서많이 사용 • n이 소수인지 판단하는 방법 (n >= 2) • [2, n/2] 범위의 값으로 나누어 떨어지면 소수가아님 정수를 입력하시오: 23 23은 소수입니다.

  29. 소수 판단 예제 intis_prime(unsignedn) { inti, n2; if (n < 2) return 0; for(n2 = n / 2, i= 2; i <= n2; i++) if(n % i== 0) return 0; return1; } #include<stdio.h> intmain() { intis_prime(unsigned n); // fun. prototype unsigned n; printf("정수를 입력하시오: "); scanf("%d", &n); if (is_prime(n)) printf("%d은 소수입니다.\n", n); else printf("%d은 소수가 아닙니다.\n", n); return 0; } 정수를 입력하시오: 23 23은 소수입니다.

  30. C 표준 라이브러리 • C standard library: C 언어에서 표준으로 규정한 라이브러리 • 표준을 준수하는 모든 컴파일러에서 사용 가능 • 라이브러리: 공통적으로 많이 사용되는 코드들의 집합 • 표준 라이브러리 함수 • 표준 입출력 • 수학 계산 • 문자열 처리 • 시간/날짜 처리 • 데이터 검색과 정렬 • . . .

  31. 난수 함수 • 난수(random number):규칙성이 없이 임의로 생성되는 수 • 암호학,시뮬레이션, 게임 등에서 유용함 • int rand(void) • 의사 난수(pseudo random number) 생성 함수 • [0, RAND_MAX] 범위의 난수반환 • RAND_MAX: 보통 32767 • 헤더: <stdlib.h>

  32. 로또 번호 생성 예제 • 1 ~45 범위의 난수6개 생성 // 로또 번호 생성 예제 – 잘못된 경우 // [1, 45] 범위가 아니라 [0, RAND_MAX] 범위 생성 // 실행 시마다 항상 동일한 번호 생성 #include<stdio.h> #include<stdlib.h> int main() { inti; for (i = 0; i < 6; i++) printf(" %d", rand()); printf("\n"); return 0; } 41 18467 6334 26500 19169 15724

  33. 로또 번호 생성 예제 • voidsrand(unsigned seed): 난수 발생의 시드(seed) 설정 // 로또 번호 생성 예제 // 실행 시마다 항상 다른번호 생성 #include<stdio.h> #include<stdlib.h> #include<time.h> #defineMAX 45 int main() { inti; srand(time(NULL)); for (i = 0; i < 6; i++) printf(" %d", 1 + rand() % MAX); printf("\n"); return 0; } 42 18 35 41 45 20

  34. 난수 함수 응용 • 정수 [0, 9] : rand() % 10 • 정수 [1, 10] : 1 + rand() % 10 • 정수 [min, max] : min + rand() % (max – min + 1) • 실수 [0, 1] : (double)rand() / RAND_MAX • 실수 [0, 1) : rand() / (RAND_MAX + 1.0)

  35. 수학 함수 • 헤더: <math.h> • (x, y: double ; return type: double)

  36. 예제 // 삼각 함수 #include<stdio.h> #include<math.h> intmain(){ const doublepi = 3.1415926535;         doublex = pi / 2, y;         y = sin(x); printf("sin(%f) = %f\n", x, y);         y = sinh(x); printf("sinh(%f) = %f\n", x, y);         y = cos(x); printf("cos(%f) = %f\n", x, y);         y = cosh(x); printf("cosh(%f) = %f\n", x, y); return 0; } sin(1.570796) = 1.000000 sinh(1.570796) = 2.301299 cos(1.570796) = 0.000000 cosh(1.570796) = 2.509178

  37. <math.h> double fabs(double x) : 실수형절댓값 fabs(-3.67) // 3.67 double pow(double x, double y) : 거듭제곱,xy pow(2.0, 3.0) // 8.0 doublesqrt(double x) : 제곱근 sqrt(9.0) // 3.0 double ceil(double x) : 올림 ceil(-2.9) // -2.0 ceil(2.9) // 3.0 double floor(double x) : 내림 floor(-2.9) // -3.0 floor(2.9) // 2.0 수학 함수 • <stdlib.h> • int abs(int x)long labs(long x) : 정수형 절댓값 • abs(-9) // 9 • labs(-9L) // 9L • floor(x + 0.5) : 반올림 • floor(1.4 + 0.5) // 1.0 • floor(1.6 + 0.5) // 2.0 • (int)x : 소수점 이하 버림 • (int)(2.9) // 2 • (int)(-2.9) // -2

  38. 함수를 사용하는 이유 • 소스 코드의 중복을 없애준다. • 한번 만들어진 함수를 여러 번 호출하여 사용할 수 있다. • 한번 작성된 함수를 다른 프로그램에서도 사용할 수 있다. • 복잡한 문제를 단순한 부분으로 분해할 수 있다. voidprint_heading(void) { printf("*****************************"); printf("  NAME    ADDRESS      PHONE "); printf("*****************************"); } intmain(void) { // 출력이 필요한 위치 #1 print_heading();    ... // 출력이 필요한 위치 #2 print_heading();    ... } intmain(void) { ... read_list(); sort_list(); print_list(); ... }

More Related