Presentation is loading. Please wait.

Presentation is loading. Please wait.

개정판 누구나 즐기는 C언어 콘서트 제8장 함수 출처: pixabay.

Similar presentations


Presentation on theme: "개정판 누구나 즐기는 C언어 콘서트 제8장 함수 출처: pixabay."— Presentation transcript:

1 개정판 누구나 즐기는 C언어 콘서트 제8장 함수 출처: pixabay

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

3 이번 장에서 만들 프로그램

4 되풀이 되는 작업

5 함수의 필요성 #include <stdio.h> int main(void) { printf("****************************\n"); printf("한국대학교 컴퓨터 공학과 \n"); printf("홍길동 \n"); return 0; }

6 함수의 필요성 #include <stdio.h> void print_name() { printf("****************************\n"); printf("한국대학교 컴퓨터 공학과 \n"); printf("홍길동 \n"); } int main(void) print_name(); return 0; 함수를 정의하였다. 함수는 한번 정의되면 여러 번 호출하여서 실행이 가능하다.

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

8 함수의 개념 함수(function): 특정 작업을 수행하여 그 결과를 반환하는 문장들 의 집합

9 함수는 프로그램을 이루는 빌딩블록

10 2가지 과정 함수를 작성한다. 함수를 호출한다.

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

12 반환형 함수 이름 앞에 반환하는 데이터의 유형을 표시한다. char, int, long, double … 등이 가능하다.
반환형이 없으면 void로 표시 int add(int x, int y) { …. } void print_info() { …. }

13 함수 이름 일반적으로 동사+명사 (예) compute_average(), get_integer() set_speed()
int add(int x, int y) { int result; result = x + y; return result; }

14 매개 변수 매개 변수(parameter): 함수가 외부로부터 전달받는 데이터를 가지 고 있는 변수
int add(int x, int y) { int result; result = x + y; return result; }

15 지역 변수 지역 변수(local variable): 함수 안에서 정의되는 변수 int add(int x, int y) {
int result; result = x + y; return result; }

16 함수 정의 예제 함수를 프로그램을 이루는 부품이라고 가정하자. 입력을 받아서 작업한 후에 결과를 생성한다.

17 예제 #1 사용자로부터 정수 반환 반환값: int 함수 이름: get_integer 매개 변수: 없음
{ int value; printf("정수를 입력하시오 : "); scanf("%d", &value); return value; }

18 예제 #2 두개의 정수중에서 큰 수를 계산하는 함수 반환값: int 함수 이름: get_max
매개 변수: int x, int y int get_max(int x, int y) {   if( x > y ) return(x);   else return(y); }

19 예제 #3 정수의 거듭 제곱값(xy)을 계산하는 함수 반환값: int 함수 이름: power
매개 변수: int x, int y int power(int x, int y) {         int i;         long result = 1;    for(i = 0; i < y; i++)                 result *= x;                   return result; }

20 중간 점검 1. 함수 이름 앞에 void가 있다면 무슨 의미인가? 2. 함수가 작업을 수행하는데 필요한 데이터로서 외부에서 주어지는 것을 무엇이라고 하는가? 3. 함수 몸체는 어떤 기호로 둘러 싸여 있는가? 4. 함수의 몸체 안에서 정의되는 변수를 무엇이라고 하는가?

21 함수 호출과 반환 함수 호출(function call): 함수를 사용하기 위하여 함수의 이름을 적어주는 것
함수안의 문장들이 순차적으로 실행된다. 문장의 실행이 끝나면 호출한 위치로 되돌아 간다. 결과값을 전달할 수 있다.

22 인수와 매개 변수 인수(argument): 실인수, 실매개 변수라고도 한다.
매개 변수(parameter): 형식 인수, 형식 매개 변수라고도 한다. int main(void) { sum = add(2, 3); } 인수 int add(int x, int y) { int result; result = x + y; return result; } 매개 변수

23 반환값 반환값(return value): 호출된 함수가 호출한 곳으로 작업의 결과값 을 전달하는 것
인수는 여러 개가 가능하나 반환값은 하나만 가능

24 예제 #1 #include <stdio.h> // 함수를 정의한다. int get_integer() {
int value; printf("정수를 입력하시오 : "); scanf("%d", &value); return value; } int main(void) int x = get_integer(); // 함수를 호출한다. int y = get_integer(); // 함수를 호출한다. int result = x + y; printf("두수의 합 = %d \n", result); return 0;

25 실행 결과

26 예제 #2 // 두수 중에서 큰 수를 찾는 함수 예제 #include <stdio.h> // 함수를 정의한다.
int get_integer() { int value; printf("정수를 입력하시오 : "); scanf("%d", &value); return value; } int get_max(int x, int y) if (x > y) return(x); else return(y);

27 예제 #2 int main(void) { int a = get_integer(); // 함수 호출
int b = get_integer(); // 함수 호출 printf("두수 중에서 큰 수는 %d입니다.\n", get_max(a, b)); // 함수 호출 return 0; }

28 예제 #3 #include <stdio.h> // 함수를 정의한다. int get_integer() {
int value; printf("정수를 입력하시오 : "); scanf("%d", &value); return value; } int power(int x, int y) int i; long result = 1; for (i = 0; i < y; i++) result *= x; // result = result * x return result;

29 예제 #3 int main(void) { int x = get_integer(); // 함수를 호출한다.
int y = get_integer(); // 함수를 호출한다. int result = power(x, y); printf("%d의 %d승 = %d \n", x, y, result); return 0; }

30 중간 점검 1. 인수와 매개 변수는 어떤 관계가 있는가? 2. 반환값이 double형으로 정의된 함수에서 정수를 반환하면 어떤 일 이 발생하는가?

31 함수 원형 함수 원형(function prototyping): 컴파일러에게 함수에 대하여 미리 알리는 것 함수 원형
#include <stdio.h> int compute_sum(int n); int main(void) { int sum; sum = compute_sum(100); printf("1부터 100까지의 합 = %d \n", sum); return 0; } int compute_sum(int n) int i; int result = 0; for (i = 1; i <= n; i++) result += i; return result; 함수 원형

32 lab: 온도 변환 함수 섭씨 온도를 화씨 온도로 변환하여 반환하는 함수 FtoC()를 작성하 고 테스트하라.

33 Sol. #include <stdio.h> double FtoC(double temp_f); // 함수 원형 정의
int main(void) { double c, f; f = 32.0; c = FtoC(f); // 함수 호출 printf("화씨온도 %f은 섭씨온도 %f에 해당한다. \n", f, c); return 0; } double FtoC(double temp_f) // 함수 정의 double temp_c; temp_c = (5.0 * (temp_f – 32.0)) / 9.0; return temp_c;

34 lab: 그개픽 함수 정의 다음과 같은 원형을 가지는 함수를 정의해보자.
void line(HDC hdc, int x1, int y1, int x2, int y2) { ... }

35 Sol. #include <windows.h> #include <stdlib.h>
#include <stdio.h> // (x1, y1)에서 (x2, y2)까지 직선을 그리는 함수 void line(HDC hdc, int x1, int y1, int x2, int y2) { MoveToEx(hdc, x1, y1, NULL); LineTo(hdc, x2, y2); } // [x1, y1] 구간에서 난수를 발생하는 함수 int randint(int x1, int x2) return x1 + rand() % (x2 - x1);

36 Sol. int main(void) { int i;
HDC hdc = GetWindowDC(GetForegroundWindow()); for (i = 0; i < 30; i++) { int x1 = randint(0, 300); int y1 = randint(0, 300); int x2 = randint(0, 300); int y2 = randint(0, 300); line(hdc, x1, y1, x2, y2); Sleep(100); // 100ms 동안 잔다. }

37 중간 점검 1. 함수 정의의 첫 번째 줄에는 어떤 정보들이 포함되는가? 이것을 무 엇이라고 부르는가? 2. 함수가 반환할 수 있는 값의 개수는? 3. 함수가 값을 반환하지 않는다면 반환형은 어떻게 정의되어야 하는 가? 4. 함수 정의와 함수 원형의 차이점은 무엇인가? 5. 함수 원형에 반드시 필요한 것은 아니지만 대개 매개 변수들의 이름 을 추가하는 이유는 무엇인가? 6. 다음과 같은 함수 원형을 보고 우리가 알 수 있는 정보는 어떤 것들 인가? double pow(double, double);

38 지역 변수와 전역 변수 함수 안에서 정의되는 변수는 지역 변수라고 불리고 해당 함수 안에 서만 사용이 가능하다. 함수의 외부에서 선언되는 변수는 전역변수 라고 불린다.

39 지역 변수 지역 변수(local variable): 함수나 블록 안에 선언되는 변수 int compute_sum(int n)
{ int i, result = 0; for(i=0; i<=n; i++) result += i; return result; } 지역 변수

40 지역 변수의 사용 범위 int sub1() { 지역 변수 x의 유효한 범위 int I; … } void sub2()
printf(“%d \n”, x); 지역 변수 x의 유효한 범위

41 블록 안에서의 지역 변수

42 지역 변수의 초기값 int compute_sum(int n) { int i, result;
for(i=0; i<=n; i++) result += i; return result; }

43 전역 변수 전역 변수(global variable): 함수의 외부에 선언되는 변수 초기값을 주지 않으면 0이다.
#include <stdio.h> int global = 123; void sub1() { printf("%d\n", global); } void sub2() int main(void) sub1(); sub2(); return 0;

44 실행 결과

45 같은 이름의 전역 변수와 지역 변수 #include <stdio.h> int sum = 123;
int main(void) { int sum = 321; printf("%d \n", sum); return 0; } 지역 변수가 전역 변수를 가린다.

46 중간 점검 1. 변수의 범위는 대개 무엇으로 결정되는가? 2. 똑같은 이름의 지역 변수가 서로 다른 함수 안에 정의될 수 있는가? 3. 지역 변수의 초기값은 얼마인가? 4. 전역 변수는 어디에 선언되는가? 5. 전역 변수의 생존 기간과 초기값은? 6. 똑같은 이름의 전역 변수와 지역 변수가 동시에 존재하면 어떻게 되 는가?

47 Lab: 전역 변수 사용하기 우리의 그래픽 프로그램에서는 항상 hdc라는 변수가 필요하다. 이 렇게 여러 부분에서 공통적으로 필요한 변수를 전역 변수로 선언하 는 것이 좋다. hdc를 전역 변수로 선언하고 여러 함수에서 사용하여 보자.

48 Sol: #include <windows.h> #include <math.h>
#include <stdio.h> HDC hdc; // 전역 변수 hdc 선언 void line(int x1, int y1, int x2, int y2) // 매개 변수가 더 간단해진다. { MoveToEx(hdc, x1, y1, NULL); // 전역 변수 hdc 사용 LineTo(hdc, x2, y2); // 전역 변수 hdc 사용 } int main(void) { int i; int x1 = 200; int y1 = 200; int x2 = 400; int y2 = 200; hdc = GetWindowDC(GetForegroundWindow()); // 전역 변수 hdc 사용 for (i = 0; i<30; i++) { line(x1, y1, x2, y2); y1 -= 10; y2 += 10; Sleep(100); Sol:

49 static 지정자 정적 변수: 블록에서만 사용되지만 블록을 벗어나도 자동으로 삭제 되지 않는 변수
 정적 변수: 블록에서만 사용되지만 블록을 벗어나도 자동으로 삭제 되지 않는 변수 앞에 static을 붙인다. void sub() { static int count; …. return; } 정적 변수

50 저장 유형 지정자 static #include <stdio.h> void sub(void) {
int auto_count = 0; static int static_count = 0; auto_count++; static_count++; printf("auto_count=%d\n", auto_count); printf("static_count=%d\n", static_count); } int main(void) sub(); return 0;

51 실행 결과

52 순환호출 순환은 함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법이다

53 순환호출 #include <stdio.h> long factorial(int n); int main(void) {
int x = 0, result; printf("정수를 입력하시오:"); scanf("%d", &x); result = factorial(x); printf("%d!은 %d입니다.\n", x, result); return 0; } int factorial(int n) printf("factorial(%d)\n", n); if (n <= 1) return 1; else return n * factorial(n - 1);

54 실행 결과

55 Lab: 동심원 그리기 순환 호출을 이용하여서 동심원을 그려보자.

56 Sol: #include <windows.h> #include <stdio.h> HDC hdc;
void draw_circle(int x, int y, double radius) { // 화면에 원을 그린다. Ellipse(hdc, x - radius, y - radius, x + radius, y + radius); if (radius > 2.0) { // 반지름이 2.0 이상이면 radius *= 0.75; // 반지름을 줄인다. draw_circle(x, y, radius); // 순환호출한다. } int main(void) { hdc = GetWindowDC(GetForegroundWindow()); draw_circle(300, 200, 200.0); return 0;

57 라이브러리 함수 라이브러리 함수(library function): 컴파일러에서 제공하는 함수 표준 입출력 수학 연산
문자열 처리 시간 처리 오류 처리 데이터 검색과 정렬

58 난수 함수 난수(random number)는 규칙성이 없이 임의로 생성되는 수이다.
난수는 암호학이나 시뮬레이션, 게임 등에서 필수적이다. rand() 난수를 생성하는 함수 0부터 RAND_MAX까지의 난수를 생성

59 예제: 로또 번호 생성하기 1부터 45번 사이의 난수 발생

60 난수 발생 코드 #include <stdio.h> #include <stdlib.h>
int main(void) { int i; for(i = 0; i < 6; i++) printf("%d ", rand()); return 0; } 0에서 사이의 정수로 생성

61 1부터 45 사이로 제한 printf("%d ", 1+(rand()%45));
하지만 실행할 때마다 항상 똑같은 난수가 발생된다.

62 실행할 때마다 다르게 하려면 매번 난수를 다르게 생성하려면 시드(seed)를 다르게 하여야 한다.
#include <stdlib.h> #include <stdio.h> #include <time.h> #define MAX 45 int main( void ) { int i; srand( time( NULL ) ); for( i = 0; i < 6; i++ ) printf("%d ", 1+rand()%MAX ); return 0; } 시드를 설정하는 가장 일반적인 방법은 현재의 시각을 시드로 사용하는 것이다. 현재 시각은 실행할 때마다 달라지기 때문이다.

63 수학 라이브러리 함수

64 Sin 함수 그리기 0도 부터 180도까지 싸인 함수를 화면에 그려보자. 윈도우의 GDI 함수인 SetPixel()을 사용한다.

65 SetPixel() 함수

66 #include <windows.h>
#include <math.h> #include <stdio.h> double deg_to_rad(int degree) // 도를 라디안으로 변환한다. { return *degree / 180.0; } int main(void) HDC hdc = GetWindowDC(GetForegroundWindow()); int i; MoveToEx(hdc, 0, 200, NULL); // x좌표축을 그린다. LineTo(hdc, 600, 200); for (i = 0; i < 360; i++) { double value = sin(deg_to_rad(i)); SetPixel(hdc, i, 200-value*100, RGB(0, 0, 0)); return 0;

67 중간 점검 1. 90도에서의 싸인값을 계산하는 문장을 작성하여 보라. 2. rand() % 10 이 계산하는 값의 범위는?

68 Q & A


Download ppt "개정판 누구나 즐기는 C언어 콘서트 제8장 함수 출처: pixabay."

Similar presentations


Ads by Google