함수 (2) 2009 년 9 월 24 일 김경중
공지사항 10 월 1 일목요일수업휴강 숙제 #1 마감 : 10 월 6 일화요일
기초
함수를만들어라! 입력 함수 ( 기능수행 ) 반환
사용자정의함수 정의 : 사용자가자신의목적에따라직접작성한함수 함수의원형 (Function Prototype) + 함수의본체 (Function Body) : 함수의원형은함수에대한기본적정보만을포함 ( 이름, 입력, 반환정보 ), 함수의본체는실제수행할내용도포함 사용방법 방법 1) 함수의원형을 main 함수앞에선언해주고, 함수의본체를 main 뒤에선언해준다. 추천!!!!! 방법 2) 함수의원형을선언하지않고함수의본체를 main 함수앞에선언해준다.
함수의정의방법두가지 // 방법 1 추천!!!!! // 방법 2 func(); // 함수의원형 func(); // 호출!!!! func(){ // 함수의몸체 func(){ // 함수의몸체 func(); // 호출!!!!
기본틀 입력 X, 반환 X 입력 O, 반환 X 입력 X, 반환 O 입력 O, 반환 O func(); func(); func(){ // 내용 func(int); func(3); func(int x){ // 내용 int func(); int result=func(); int func(){ // 내용 return 반환값 ; int func(int); int result=func(3); int func(int x){ // 내용 return 반환값 ; return 문을만나는순간함수는호출되었던곳으로돌아간다. 입력 X, 반환 X 는경우에도 return 문을사용할수있으며, return; 식으로사용한다.
작동순서 func(); // 1 // 2 func(); // 3 7 func(); // 8 12 // 13 func(){ // 4 9 // 내용 // 5 10 // 6 11
실습 ( 입력 X, 반환 X) #include <stdio.h> func(); func(); func(); func(){ printf("hello\n");
실습 ( 입력 O, 반환 X) #include <stdio.h> func(int); // 변수이름을써줄지는선택사항!!! func(3); func(4); func(int x){ // 변수이름은반드시써주어야한다 printf("hello %d\n", x);
실습 ( 입력 O, 반환 X) #include <stdio.h> func(int, int); // 변수이름을써줄지는선택사항!!! func(3, 5); func(4, 6); func(int x, int y){ // 변수이름은반드시써주어야한다. printf("hello %d %d\n",x, y);
실습 ( 입력 X, 반환 O) #include <stdio.h> #include <stdlib.h> #include <time.h> int func(); srand(time(null)); // 매번다른난수가발생하도록해줌 printf("%d\n",func()); printf("%d\n",func()); int func(){ return rand();
실습 ( 입력 O, 반환 O) #include <stdio.h> int func(int, int ); printf("%d\n",func(3,2)); printf("%d\n",func(4,5)); int func(int x, int y){ return x+y;
실습 정수두개를입력받아서큰수를반환하는함수를만드시오. printf( %d,func(3,4)); // 결과는 4 이다. printf( %d,func(7,5)); // 결과는 7 이다.
실습 정수한개를입력받아서, 그수만큼 hello world 를출력하는함수를만들어라. 힌트 : for(i=0 ;i<n ;i++) printf( hello world\n ); func(3); // hello world 를 3 번출력 func(5); // hello world 를 5 번출력
함수내에서함수를호출? #include <stdio.h> int func(int, int); int func2(int); // 8 printf("%d",func(3,4)); // 1 7 int func(int x, int y){ // 2 return func2(x+y); // 3 6 int func2(int z){ // 4 return z*z; // 5
실습 #include <stdio.h> funca(); funcb(); funcc(); funca(); funca(){ funcb(); printf("funca\n"); funcb(){ funcc(); printf("funcb\n"); funcc(){ printf("funcc\n");
실습 #include <stdio.h> funca(); funcb(); funcc(); funca(); funca(){ funcb(); printf("funca\n"); funcb(){ funcc(); printf("funcb\n"); funcc(){ printf("funcc\n");
전역변수 vs. 지역변수 #include <stdio.h> func(); int x=0; // 전역변수 int x=0; // 지역변수 func(); func(){ int x=0; // 지역변수
실습 #include <stdio.h> func(); int x=7; // 전역변수 int x=8; // 지역변수 func(); printf("%d",x); func(){ int x=10; // 지역변수
숙제 - 힌트
만약 사목을다만든후에오목으로변경하고싶다면? #include <stdio.h> int i,j; int ar[4][4]={0; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(ar[i][j]==0) printf("_ "); else printf("%d ",ar[i][j]); printf("\n");
방법 1 #include <stdio.h> int i,j; int ar[5][5]={0; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(ar[i][j]==0) printf("_ "); else printf("%d ",ar[i][j]); printf("\n");
방법 2 #include <stdio.h> #define N 5 // 매크로정의 int i,j; int ar[n][n]={0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(ar[i][j]==0) printf("_ "); else printf("%d ",ar[i][j]); printf("\n");
함수 - 실습
공지사항 수업시간에숙제하지말것!!!! 숙제 1 마감 10 월 6 일화요일밤 12 시 10 월 7 일 50% 감점 moodle.sejong.ac.kr 에제출 숙제관련사항 보고서는꼭제출할것 ( 소스코드에주석형태로작성한것도 OK) 자신의느낌, 문제의난이도, 어려웠던점적을것 완성하지못해도제출할것 문제를어떻게풀지친구와의논하는것은 OK 코딩은직접본인이할것 남이해준부분은표시할것 COPY 0 점및경고 1 개
고급
배열을입력으로하는함수? #include <stdio.h> func(int []); int ar[5]={0,1,2,3,4; func(ar); // ar과 ar2는서로같다!!!! func(int ar2[]){ int i; for(i=0;i<5;i++) printf("%d ",ar2[i]);
실습 #include <stdio.h> func(int []); int i; int ar[5]={0,1,2,3,4; func(ar); for(i=0;i<5;i++) printf("%d ",ar[i]); // 여기에있는 ar2와 main에있는 ar은서로같다. func(int ar2[]){ ar2[0]=7;
이차원배열을입력으로하는함수? #include <stdio.h> func(int [][3]); // 첫번째 [] 만비울수있다!!! int ar[][3]={{0,1,2,{3,4,5; func(ar); // ar과 ar2는서로같다!!!!! func(int ar2[][3]){ int i,j; for(i=0;i<2;i++) for(j=0;j<3;j++) printf("%d ",ar2[i][j]);
만약다른함수에서원래배열값을못바꾸게하려면? #include <stdio.h> func(const int []); int i; int ar[5]={0,1,2,3,4; func(ar); for(i=0;i<5;i++) printf("%d ",ar[i]); // 여기에있는 ar2와 main에있는 ar은서로같다. func(const int ar2[]){ ar2[0]=7; // Error!!!!!
문자열도전달할수있을까? #include <stdio.h> func(char []); char str[]="hello"; func(str); func(str); // func의 str과 main의 str은서로같을까? 다를까? func(char str[]){ printf("func: %s\n",str);
static 변수 #include <stdio.h> funca(); funcb(); int i; for(i=0;i<5;i++) funca(); for(i=0;i<5;i++) funcb(); funca(){static int x=0; printf("%d\n",++x); // 한번초기화후값을유지!!! funcb(){int x=0; printf("%d\n",++x); // 매번초기화!!!!
factorial 함수 #include <stdio.h> double factorial(int); void main(void){ printf("%d! = %f\n",10,factorial(10)); double factorial(int x){ // x는사용자가입력한정수이다. double sum=1.0; int i; if(x==0) return 1.0; // 만약 0! 을호출했으면 1.0을반환한다. for(i=1;i<=x;i++){ sum*=(double)i; // 1부터 x까지의곱을구한다. return sum;
재귀적 (Recursive) 정의 // factorial(n)=factorial(n-1) X n #include <stdio.h> double factorial(int); void main(void){ printf("%d! = %f\n",10,factorial(10)); double factorial(int x){ // x는사용자가입력한정수이다. if(x==0) return 1.0; // 재귀호출을멈추는조건 return factorial(x-1)*x; // 재귀호출
호출과정 void main(void){ printf("%d! = %f\n",3,factorial(3)); double factorial(3){ return factorial(2)*3; 1*1*2*3 double factorial(2){ return factorial(1)*2; double factorial(1){ return factorial(0)*1; 1*1*2 1*1 double factorial(0){ return 1; 1
실습 피보나치수열 f(0) = 0 f(1) = 1 f(n) = f(n-1)+f(n-2) f(10) 은얼마일까? 단계 1) 손으로풀어보세요. 단계 2) 재귀함수를안쓰고프로그램을작성해보세요. 단계 3) 재귀함수를사용하고프로그램을작성해보세요.
실습
지시사항 http://dasan.sejong.ac.kr/~kimkj/cpp_2009/data/ex.zip ex1 ( 예제 ).c 를참고하여 ex2, ex3, ex4, ex5 를해결하세요
CPQ 문제풀이
연습문제
실습 다음 factorial 함수를이용하여 1! + 3! + 5! + 7! 을계산하시오. // 이 factorial 함수의예상되는문제는? int factorial (int x){ int i,sum=1; if(x==0) return 1; if(x==1) return 1; for(i=1;i<=x;i++) sum*=i; return sum;
실습 factorial 함수를이용하여순열을계산하는 permutation 함수를만들어라 np r = n!/(n-r)! 로정의된다. 예를들어, 6 명의계주선수중에서 4 명을뽑아서순서를정하는방법의수는?