이문서는나눔글꼴로작성되었습니다. 설치하기 8 차시 : 제어의흐름 함수 ( 계속 ) 프로그래밍및실험 제 8 주 동국대학교조영석
4.10 부울변수 - 생략 4.11 comma 연산자 - 우선순위가가장낮음. comma_expression ::= expr, expr ( 예 ) a = 0, b = 1 /* 문장이아니라 comma expression 임 */ for ( sum = 0, i = 1; i <= n; ++i ) sum += i; for ( sum = 0, i = 1; i <= n; sum += i, ++i ) ; 2
4.12 do 문 do_statement ::= do statement while (expr); do statement while ( expr ) ; next statement 3
( 예 ) 0이입력될때까지입력된정수의합을구하기. i = 0; sum = 0; do { sum = sum + i; scanf("%d", &i); /* prompt 생략 */ } while ( i > 0) ; do { printf("input a positive integer : "); scanf("%d", &n); if ( error = (n <= 0) ) printf("\nerror : Do it again!\n\n"); } while ( error ) ; /* 음수가입력되면계속수행 */ 4
4.13 피보나치수열 (Fibonacci Numbers) - 재귀적정의. f 0 = 0 f 1 = 1 f i+1 = f i + f i-1, for i = 1, 2... (f 0 = 1, f 1 = 1로정의하기도함.) - f 0, f 1 을제외하고모든원소는이전두원소의합. (0,) 1, 1, 2, 3, 5, 8, 13, 21, 34,... 5
/* print Fibonacci numbers and quotients. */ #include <stdio.h> #define LIMIT 46 void main() { long f0 = 0, f1 = 1, n, temp; /* 1st 2#'s */ printf("%7d%19d\n%7d%19d\n", 0, 0, 1, 1); for ( n = 2; n <= LIMIT; ++n) { temp = f1; f1 = f1 + f0; f0 = temp; printf("%7ld%19ld%29.16f\n", /* ld: long int */ n, f1, (double)f1 / f0); } } 6
- output 0 0 Fib(n)/Fib(n-1) 1 1 2 1 1.0000000000000000 3 2 2.0000000000000000 4 3 1.5000000000000000 5 5 1.6666666666666667 6 8 1.6000000000000001 7 13 1.6250000000000000 23 23657 1.6180339901755971 24 46368 1.6180339882053250 25 75025 1.6180339889579021 44 701408733 1.6180339887498949 45 1134903170 1.6180339887498949 46 1836311903 1.6180339887498949 n==41 부터 quotient 가수렴 7
- manual execution n temp f1 f0 quotient (f1/f0) 1 0 2 1 1 1 1.0 3 1 2 1 2.0 4 2 3 2 1.5 5 3 5 3 1.66666666 6 5 8 5 1.6 황금비는 1.6180339887498949 :1 이라고표현하지만, 정확히말하면입니다. 그리고피보나치수열의일반식은, 입니다. 여기서 n=1,2,3,4,5... 를넣으면, 놀랍게도생긴것과다르게 1,1,2,3,5... 가나옵니다. 8
- 자연과피보나치수열 꽃과꽃잎, 식물의잎에서피보나치수열을찾을수있음. 식물뿐아니라고둥이나소라의나선구조에도나타남. 이수열은 신의비율 인황금비를만들어냄. 황금비는피라미드파르테논신전이나다빈치미켈란젤로의작품에서시작해오늘날에는신용카드와담배갑의가로세로비율까지광범위하게쓰임. 황금비는태풍과은하수의형태, 초식동물의뿔, 바다의파도에도있음. 배꼽을기준으로한사람의상체와하체, 목을기준으로머리와상체의비율도황금비 이수열은 12 세기말이탈리아수학자레오나르도피보나치 (1170-1250) 가제안했다. 9
한쌍의토끼가계속새끼를낳을경우몇마리로불어나는가를숫자로나타낸것. 한농장에서갓태어난한쌍의아기토끼가사육되기시작했다고하자. 한쌍의토끼는생후 1 개월뒤짝짓기를하며짝짓기한뒤 1 개월뒤에다시한쌍의토끼를생산한다고하자. 생산된토끼가죽지않고계속산다면일년동안토끼는몇쌍이될까 0 개월 : 1 쌍의토끼 1 개월뒤 : 여전히 1 쌍의토끼 2 개월뒤 : 2 쌍의토끼 (1 쌍의토끼가새로태어나기때문 ) 3 개월뒤 : 3 쌍의토끼 ( 첫번째암토끼가다시 1 쌍의토끼생산 ) 4 개월뒤 : 5 쌍의토끼 (2 마리의암토끼가각각 1 쌍의토끼생산 ). 1 1 2 3 5 8 13 21 34 55 89 144 233 10
거의모든꽃의꽃잎이 3장 5장 8장 13장 21장 34장 임. 백합, 아이리스, 붓꽃 : 3장채송화, 패랭이, 동백, 야생장미, 애기미나리아재비 : 5장모란, 코스모스, 참제비고깔 : 8장금불초, 금잔화, 시네라리아 : 13장애스터, 치코리 : 21장질경이, 데이지 : 34장쑥부쟁이 : 종류에따라 55장, 89장 11
고둥도한변의길이가피보나치수열인정사각형들이만들어낸나선모양을하고있음. 피보나치수열은해바라기나데이지꽃머리의씨앗배치에도존재 최소공간에최대의씨앗을촘촘하게배치하는 최적의수학적해법 으로꽃은피보나치수열을선택 씨앗은꽃머리에서왼쪽과오른쪽두개의방향으로엇갈리게나선모양으로자리잡음. 데이지꽃머리에는서로다른 34 개와 55 개의나선이있고, 해바라기꽃머리에는 55 개와 89 개의나선이있음. 12
식물의잎차례 : 줄기에서잎이나와배열하는방식. 피보나치수열이가장잘나타남. t/n 으로표시 (t 번회전하는동안잎이 n 개나오는비율 ) 참나무, 벚꽃사과 : 2/5 포플러장미배버드나무는 3/8 갯버들과아몬드는 5/13 전체식물의 90% 가피보나치수열의잎차례를따름. 잎이바로위의잎에가리지않고햇빛을최대한받을수있는수학적해법 13
황금비 : 피보나치수열을만들어냄. F i / F i-1 2/1 3/2 5/3 8/5 를계속계산하면황금비에수렴 (2/1 3/2 5/3 8/5 1.6180339887498949 ) 1.618 음악의거장바르톡은피보나치수열에따라음악의마디를나누고황금분할점에클라이막스를두는새로운음악을제창. 전에는식물의 DNA 가피보나치수열을만들어낸다고생각했으나, 요즘에는식물의씨앗이나잎이먼저나온씨나잎을비집고새로자라면서환경에적응해최적의성장방법을찾아가는과정에서자연스럽게피보나치수열에이르는것으로생각하고있다. 특히최근에는생물뿐아니라전하를입힌기름방울을순서대로떨어뜨려도해바라기씨앗처럼퍼진다는사실이밝혀지면서피보나치수열과황금비가생물은물론자연과우주어디에나숨어있다고믿는수학자가더욱늘고있다 ( 서울대김홍종교수 ( 수학 )) 14
4.14 goto 문 - 절대로사용하지말것 - 숙제에서 goto 가발견되면무조건 'F' 15
4.15 break 문과 continue 문 - 정상적인제어의흐름을중단시킴. - break; ( 예 ) loop 의내부나 switch 문에서빠져나오게함. while ( 1 ) { scanf("%lf", &x); if ( x < 0.0) break;... } /* break jumps to here */ 16
- continue: for, while, do loop 내에서만사용 ( 예 ) loop 의현재반복을중단하고즉시다음반복을수행. for ( i = 0; i < TOTAL; ++i) { c = getchar( ); if ( c >= '0' && c <= '9') continue;... /* 숫자에대해서는아래의처리를않음 */ /* continue jumps to here to begin next iteration */ } - break : loop 를종료. continue : 현재반복의끝부분으로제어를전달. 17
4.16 switch 문 - if-else 문을일반화한다중조건문. ( 예 ) scanf("%c", &i); switch ( i ) { case 'a' : ++ a_count; break; case 'b' : ++ b_count; break; case 'c' : case 'C' : ++ c_count; break; default : ++ other_count; } - switch(x) 의 x 는반드시정수적형임. - break; 문이없으면 label 과관계없이다음문장을수행. 18
( 예 ) 장학금 1 등 : 수업료 + 기성회비 + 학생회비 2 등 : 기성회비 + 학생회비 3 등 : 학생회비 switch ( i ) { /* break 문없음 */ case 1 : 장학금 = 장학금 + 수업료 ; case 2 : 장학금 = 장학금 + 기성회비 ; case 3 : 장학금 = 장학금 + 학생회비 ; } switch ( i ) { /* break문사용 */ case 1 : 장학금 = 장학금 + 수업료 + 기성회비 + 학생회비 ; break; case 2 : 장학금 = 장학금 + 기성회비 + 학생회비 ; break; case 3 : 장학금 = 장학금 + 학생회비 ; break; default : ; } 19
4.17 조건부연산자 expr1? expr2 : expr3 ( 예 ) x = ( y < z )? y : z; if ( y < z ) x = y; else x = z; 20
Chapter 5. 함수 (function) - 문제해결의방법 : 큰문제는작은문제들로분해하여해결한후취합하면용이함. - P = P 1 + P 2, where P 는해결해야할문제. P 1, P 2 는 P 의조각들. - E(P) E(P 1 ) + E(P 2 ), - 일반화 P = where E(x) 는 x 를해결하는데드는노력의크기. n i= 1 Pi, E( P) - 유지 보수가용이함. 특히, debugging 시유리. - 재사용성이높음. n i= 1 E( Pi) - S/W 의부품화 21
5.1 함수정의 - 함수가수행할일을기술한 C code. type function_name ( parameter list ) /* header */ { /* body */ declarations statements } ( 예 ) int factorial (int n) /* header */ { /* body */ int i, product = 1; for (i = 2; i <= n; ++i) product = product * i; return product; } 호출방법 : j = factorial( i ); 22
( 예 ) void Hi ( void ) { printf("\nhi!!!\n"); } 호출방법 : Hi( ); - 함수의형 (type) 이기술되지않았을경우 int 를가정함. int factorial(int n) { } == factorial (int n) { } 23
- 지역변수 v.s. 전역변수 (local v.s. global variable) 지역변수 : 함수몸체 (body) 내부에선언된변수. 전역변수 : 함수몸체 (body) 외부에선언된변수. /* 전역변수는절대사용하지말것. 발각시과목성적 = F */ /* 기호상수는전역으로사용가능 ( 예 ) #define PI 3.14159 */ ( 예 ) #include <stdio.h> int Global_var = 33; /* global variable */ int main ( ) { int Local_var = 77; /* local variable */ printf("%d", Global_var); /* global to main */ printf("%d", Local_var); /* local to main */ return 0; } 24
5.2 return 문 return; return expr; return (expr); - 실행이종료되고제어는 return 문에포함된수식의값과함께호출한환경으로넘어감. - 하나의함수내에복수개의 return 문도허용됨. ( 예 ) double abs_value (double x) { if ( x >= 0.0 ) return x; else return -x; } 25
- 그러나 1 개의 return 문을사용하는것을권장함. - 함수에서의출구는하나로작성하는것이원칙임. ( 예 ) double abs_value (double x) { if ( x >= 0.0 ) ; else x = -x; return x; } ( 예 ) int square (int x) { x = x * x; return x; /* 또는 return x * x; */ } 26
5.3 함수원형 (function prototypes) - 함수는사용전반드시선언되어야함. type function_name ( parameter type list ); - 또는 main 함수이전에정의 함수의수가많으면가독성이떨어지고, team 에의한개발시매우불편함. ( 예 ) double sqrt (double); void f (char c, int i); - parameter type list( 매개변수형목록 ) ',' 로분리되는형 (type) 의목록 (list). - 함수원형의식별자는 option( 있어도사실상무시함 ). - void void f (char, int); == void f (char c, int i); 함수가인자를가지지않을경우사용. ( 예 ) int f (void); 함수가 return 하는값이없을경우사용. ( 예 ) void f (int); 27
감사합니다. 이문서는나눔글꼴로작성되었습니다. 설치하기