의문점

15
의의의 의의의 의 의의의 . main() 의의 의 의의 의의의 의의의… 의의 의의의의 . 의의의의의의 의의의의의의 의의 의의 , 의의의의의 의의의 의의의의의 의의의의의 의의의 의의의 의의의의 의의의의 의의 의의의 의의의 의의의 의의의 의의의 . 의의 의의의의의 의의의 . void main(){ printf(“ 의의 의의의 의의의 의 의의의 의의의의 .\n”); } • 의 의의의 의의 의의의 의의의의의 의의의 의의의 의의의 의의의 . •의의 의의의의 의의 의의의 . 의의의의 . •의의의 의의 의의의 . 의 ! 의의 의의의의 의의의의 의의의의의의 의의 의의의 1 의의의의의 의의의의 . 의 의의의의의 printf 의의의 의의의의 “의의 의의의 의의의 의 의의의 의의의의 .\n” 의의 의의의의 의의의의의 의의의의 . •의 . 의의의의 . 의의의 의의 의의의 의의 의의의 의의의의 ? 의의의 의의의의 의의의 . •의의의의의 . 의 의의의의의 printf 의의 의의의 의의의의 의의 의의의의 의의의의 “의의 의의의 의의의 의 의의의 의의의의 .\n” 의의 의의의의 의의의의 의의의의 . 의의의 의의의 의의 의 ??

Upload: kasper-finch

Post on 02-Jan-2016

25 views

Category:

Documents


1 download

DESCRIPTION

의문점. 함수를 왜 쓰나요 . main() 안에 다 때려 넣으면 편한데 … 정말 그렇군요 . 프로토타입도 만들어야되고 반환 규칙 , 매개변수를 귀찮게 정해야되며 프로그램이 어디서 어떻게 흐르는지 헷갈리게 하는 함수를 일부러 만들어 쓰는거 같군요 . 다음 소스코드를 봅시다. void main(){ printf(“ 나는 도대체 함수를 왜 쓰는지 모르겠다 .\n”); }. 이 코드가 어떤 동작을 일으키는지 아직도 모르는 학생은 없겠죠 . 물론 자신있게 말할 겁니다 . 이렇게요 . - PowerPoint PPT Presentation

TRANSCRIPT

의문점• 함수를 왜 쓰나요 . main() 안에 다 때려 넣으면 편한데…

– 정말 그렇군요 . 프로토타입도 만들어야되고 반환 규칙 , 매개변수를 귀찮게 정해야되며프로그램이 어디서 어떻게 흐르는지 헷갈리게 하는 함수를 일부러 만들어 쓰는거 같군요 .

– 다음 소스코드를 봅시다 .

void main(){printf(“ 나는 도대체 함수를 왜 쓰는지 모르겠다 .\n”);

}

• 이 코드가 어떤 동작을 일으키는지 아직도 모르는 학생은 없겠죠 .•물론 자신있게 말할 겁니다 . 이렇게요 .

•조교님 장난 칩니까 . 흥 ! 저를 뭘로보고 이래뵈도 중간고사까지 치룬 베테랑 1 학년생이란 말입니다 . 이 프로그램은 printf 함수를 사용해서 “ 나는 도대체 함수를 왜 쓰는지 모르겠다 .\n” 라는 문자열을 출력하는것 아닙니까 .

•오 . 그렇군요 . 이렇게 대답 할려고 했던 학생이 있습니까 ? 있다면 칭찬하고 싶군요 .•그렇습니다 . 이 프로그램은 printf 라는 함수를 이용해서 매우 간단하게 모니터에 “ 나는 도대체 함수를 왜 쓰는지 모르겠다 .\n” 라는 문자열을 출력하는 것입니다 . 그런데 함수가 없다면 ??

의문점 계속• printf 라는 함수가 없다면 main 함수에는 어떤

것을 넣어야 할까요 ?– printf 함수가 할 수 있는 일을 넣어야겠죠 .– 오 훌륭합니다 . 근데 그게 뭐죠 ?– 음… 문자를 그래픽 카드를 통하여 모니터에 출력하는

것 ?– 오 . 맞습니다 . 그럼 그런 기능을 이번 실습시간에

한번 만들어 보도록 할까요 ?– ㅁ니ㅏ리머랴ㅐㅓㅣㅏㅓㅟ 차라리 방사능 값을

이용한 암석의 나이 구하기가 쉽겠네요 .

• 이제 함수를 왜 써야 되는지 의문점이 풀렸나요 ?

의문점 계속

• 함수는 좀더 쉬운 프로그램을 위하여 만들어진 프로그래머의 친구 입니다 .–남이 만들어 놓은 코드들이거나–여러 번 구현하기가 쉽지 않은 코드들이거나–정말로 자주 사용해야 되는 코드들이거나–함수가 있어야겠죠 ?

매개변수의 이름 ??

int sample(int apple){return apple++;

}

void main(){int orange = 2;sample(orange);

}

매개변수는 함수 만의 것…다른 함수에서 쓰던 말던 매개변수의 이름은 그 함수 안에서는 자유롭다…따라서 main 함수에서 apple 을 썼다고 하더라도 sample 함수의 매개변수의 이름으로 apple 을 쓸 수 있다 . 다만 main 함수의 apple 이 정적변수로 선언되면 안됨 .

그리고 main 함수에서 sample에 값을 매개변수를 통하여 전달할때 매개변수 이름이 apple이라고 좌측에 보이는 orange 를 apple 이라고 할 필요가 없다 .

5

prototype.c

실행결과 : 정수를 하나 입력하세요 . 123

123 의 바로 다음 정수는 124 이고123 의 반은 61.5 입니다 .

제가 맞게 계산했나요 ?

add1 과 half 의prototype

add1 과 half정의

• 프로토타입 선언후에는 선언한 함수를사용할 수 있다 .

6

함수 밖에 있는 변수• 지역변수 (local variable)

– 함수 내에 있는 변수– 함수 내부에서만 볼 수 있음– 함수가 호출될 때 생성되므로 동적변수 (dynamic

variable) 임• 비지역변수 (nonlocal variable)

– 함수 밖에 있는 변수– 여러 함수에서 볼 수 있음

• 전역변수 (global variable): 프로그램 전체에서 볼 수 있음• 파일범위변수 (file scope variable): 같은 파일 내의

함수에서만 볼 수 있음• 지역변수

– 프로그램이 시작할 때 생성되므로 정적변수 (static variable) 임

7

nonlocal.c• 비지역 변수 GX 는 세

함수에서 모두 볼 수 있다 .• 이렇게 선언된 GX 는

전역변수다 .• 다른 파일에서 GX 를 볼려면

extern int GX;선언을 해 주어야 한다 .

실행결과 :[main 에서 ] GX = 12345

[f 에서 ] GX = 12345

[g 에서 ] GX = 12345

8

파일범위 변수와 전역변수• 함수 밖에 선언된 변수 중 static 으로 선언된 변수• 파일범위 변수는 전역변수와는 달리 다른 파일에서는 볼 수 없음

nonlocal1.c nonlocal2.c볼 수 있음

볼 수 없음

9

count.c정적변수 초기화

• 모든 정적변수는 초기화해야 한다 .

• 초기화하지 않았을 경우엔 0으로 초기화 된다 .

지역 정적변수타입이 생략되었으므로 자동으로 int형이다 .호출 사이에 값이 보존된다 .

실행결과 :count = 1count = 2count = 3count = 4count = 5

10

변수 분류• 유효범위 (scope): 해당 변수를 볼 수 있는 범위• 지속시간 (lifetime): 변수가 생성과 소멸 사이의 시간

지속시간유효범위

동적변수(dynamic variable)

정적변수(static variable)

지역변수(local)

함수 본체 내부에 그냥 선언

함수 블록 내부에static 으로 선언

파일범위변수(file-scope)

선언 불가함수 외부에

static 으로 선언전역변수(global)

선언 불가함수 외부에그냥 선언

지속시간이 길어짐

유효

범위

가 넓

어짐

11

재귀함수• 재귀호출 (recursive call)

– 어떤 함수가 종료되지 않은 상황에서 자신을 다시 호출하는 것• 재귀함수 (recursive function)

– 재귀호출을 이용하는 함수• 재귀적인 그림

Niklaus Wirth, Algorithms + Data Structures = Programs( 발췌 )

12

fact.c

• 계승 (factorial) 정의n ! = n × (n – 1) × … × 1

• 재귀적인 계승 정의0 ! = 1n ! = n × (n – 1) !

실행결과 :자연수를 하나 입력하세요 : 10fact(10) = 3628800 입니다 .

재귀호출

13

재귀 함수#include <stdio.h>

void recursive(int i);

void main(){int i = 0;recursive(i);

}

void recursive(int i){if(i == 10)

return;i++;recursive(i);printf("%d\n",i);

}

스택

recursive(1)

recursive(2)

recursive(3)

recursive(4)

recursive(5)

14

max.c : 매크로 함수• 매크로 함수

– 인수를 받는 매크로– 함수와 유사하지만 실제로

함수는 아님

실행결과 :두 수를 입력하세요 . 2 3MAX(2, 3) = 3

MAX(i, j) 는 전처리기를 거치면(i > j)? i: j로 확장된다 .

실습• 집의 면적을 구하는 프로그램을 작성하여 보자

– 한 프로그램안에 집의 면적을 구하는 함수를 두 개 구현할 것– 첫 번째 것은 매개변수를 이용하여 리턴값으로 구해주는 것– 두 번째 것은 매개변수를 사용하지 않고 정적변수를 사용하는 것

• 시간을 초를 서로 바꾸어 주는 프로그램– 시간을 초로 바꿀 건지 초를 시간으로 바꿀 건지 선택하도록 함– 시간을 초로 바꿀 경우의 예

• 입력하는 예 (3 시간 20분 30 초 ) : 3 20 30• 출력되는 예 : 3 시간 20분 30 초는 12030 초 입니다 .

– 초를 시간으로 바꿀 경우의 예• 입력하는 예 (12030 초 ) : 12030• 출력되는 예 : 12030 초는 3 시간 20분 30 초 입니다 .

– 출력을 마치면 시간을 초로 또는 초를 시간으로 바꾸는 것을 선택하는 메뉴로 돌아간다 .

– 함수를 반드시 쓰되 함수의 역할은 자유롭게 설계하세요 .