7 1 macro define squaret tt define maxu

  • Slides: 96
Download presentation

예제 7. 1 macro 함수의 정의와 인용 #define square(t) ((t)*(t)) #define max(u, v) ((u)>(v)?

예제 7. 1 macro 함수의 정의와 인용 #define square(t) ((t)*(t)) #define max(u, v) ((u)>(v)? (u): (v)). . y = a + square(x+3) / square(x-3) iput(max(x+3), square(y))); => 매크로 확장 y = a + ((x+3)*(x+3)) / ((x-3)*(x-3)); iput(((x+3)>((y)*(y)) ? (x+3) : ((y)*(y)))); YES C 제 7 장 함수 5

예제 7. 4 표준함수 중 time(), srand()를 사용하여, 난 수를 발생시키는 프로그램. #include <stdio.

예제 7. 4 표준함수 중 time(), srand()를 사용하여, 난 수를 발생시키는 프로그램. #include <stdio. h> #include <time. h> #include <stdlib. h> void main(void) { int i=1; unsigned int seed; seed = time(0); srand(seed); while( i <= 5 ) { printf(" 난수 발생 결과 : %dn", rand()); i++; } } YES C 제 7 장 함수 10

예제 7. 5 표준 수학함수 중 삼각함수 sin(x)를 이용하여 0°부터 360°까지의 sin값을 10°간격으로 구하고,

예제 7. 5 표준 수학함수 중 삼각함수 sin(x)를 이용하여 0°부터 360°까지의 sin값을 10°간격으로 구하고, *를 이용 하여 sin graph를 나타내는 프로그램. 삼각함수(sin, cos, tan 등)에서 사용되는 괄호 안의 인수 는 radian을 사용하며, radian = ( 각도 * π ) / 180 이다. #include <stdio. h> #include <math. h> #include <conio. h> void main(void) { int i, j; double pi=3. 141593, sine; for(i=0; i<=360; i+=10) { sine = sin( (float)i * pi / 180); printf("sin(%3 d)=%5. 2 f ", i, sine); for(j=0; j<= (int)(sine*30+30); j++) printf(" "); printf("*n"); if( (i+10) % 190 == 0) getch(); YES C} 제 7 장 함수 } 11

예제 7. 7 함수를 수식의 일부로 호출하여 사용하는 방법. #include <stdio. h> int max(int[],

예제 7. 7 함수를 수식의 일부로 호출하여 사용하는 방법. #include <stdio. h> int max(int[], int); void main(void) { int j, x[10]={34, 56, 33, 23, 99, 33, 45, 67, 89, 9}; j = max(x, 10); /* 식의 일부로서 함수를 호출 */ printf("최대값 : %dn", j); } int max(int y[], int n) { int i, mx=y[0]; for (i=1; i<n; ++i) if(mx < y[i]) mx = y[i]; return(mx); } YES C 제 7 장 함수 16

예제 7. 10 일반 함수를 이용한 factorial(!)을 계산하는 프로그램. • • #include <stdio. h>

예제 7. 10 일반 함수를 이용한 factorial(!)을 계산하는 프로그램. • • #include <stdio. h> void calc_factorial( int ); /* 함수 원형 */ • • void calc_factorial( int n ) { int i, factorial_number = 1; for( i = 1; i <= n; ++i ) factorial_number *= i; printf("%d 팩토리얼은 %d이다. n", n, factorial_number ); } • • void main(void) { int number = 0; printf("숫자를 입력하시오. : "); scanf("%d", &number ); calc_factorial( number ); } YES C 제 7 장 함수 20

예제 7. 12 여러 개의 반환문을 사용하는 다른 예 • • • int validate_input(

예제 7. 12 여러 개의 반환문을 사용하는 다른 예 • • • int validate_input( char command ) { switch( command ) { case '+' : case '-' : return 1; case '*' : case '/' : return 2; default : return 0; } } YES C 제 7 장 함수 23

예제 7. 13 두 개의 인수를 전달하여, 그 두 수의 곱의 결 과를 반환하는

예제 7. 13 두 개의 인수를 전달하여, 그 두 수의 곱의 결 과를 반환하는 프로그램 • • #include <stdio. h> int calc_result( int, int ); /* 함수 원형 */ • • • int calc_result( int numb 1, int numb 2 ) { auto int result; result = numb 1 * numb 2; return result; } • • • void main(void) { int digit 1 = 10, digit 2 = 30, answer = 0; answer = calc_result( digit 1, digit 2 ); printf("%d * %d = %dn", digit 1, digit 2, answer ); } YES C 제 7 장 함수 24

예제 7. 14 long 형을 되돌려주는 factorial 함수 • • #include <stdio. h> long

예제 7. 14 long 형을 되돌려주는 factorial 함수 • • #include <stdio. h> long factorial(int); /* 함수 원형 */ • • long factorial(int n) /* long형을 되돌리는 함수 */ { int i; long product = 1 l; for (i = 2; i <= n; i++) product *= i; return product; } • • • void main(void) { int num; long fact; for (num = 1; num <= 10; num++) { fact = factorial(num); /* factorial 함수 호출뒤 fact에 대입 */ printf("%2 d! = %8 ldn", num, fact); } } YES C 제 7 장 함수 25

예제 7. 15 함수의 여러 가지 사용 방법. #include <stdio. h> int sum(int, int);

예제 7. 15 함수의 여러 가지 사용 방법. #include <stdio. h> int sum(int, int); /* 함수 원형 */ void a(); void main(void) { int s; a(); /* a 함수 호출 */ sum(10, 20); /* sum 함수를 호출 */ s = sum(20, 60); /* sum 함수를 호출한 후 반환 값을 s에 저 장 */ printf("sum from 20 to 60 = %dn", s); printf("sum from 10 to 100 = %dn", sum(10, 100)); } YES C 제 7 장 함수 26

예제 7. 15 (계속) void a() { printf("This is function test. n"); printf("Now in

예제 7. 15 (계속) void a() { printf("This is function test. n"); printf("Now in function a()n"); } int sum(int a, int b) /* 정수형 변수 2개를 받아 정수형을 반환하는 함수 */ { int i, s = 0; printf("Now in function b()n"); for (i = a; i <= b; i++) s = s + i; return s; /* s의 값을 호출한 함수에게 반환한다 */ } YES C 제 7 장 함수 27

예제 7. 16 양수면 1, 음수면 -1, 0이면 0을 출력하는 프 로그램. 이 예제는

예제 7. 16 양수면 1, 음수면 -1, 0이면 0을 출력하는 프 로그램. 이 예제는 while문을 사용하여 Ctrl + Z(EOF)를 누를 때까지 무한루프를 도는 프로그램이다. #include <stdio. h> #include <conio. h> int sign(int); /* prototype 선언 */ void main(void) { int a; printf("Ctrl + Z = exitn"); printf("input(a)=>"); while(scanf("%d", &a) != EOF) { printf(" %dn", sign(a)); printf("Ctrl + Z = exitn"); printf("input(a)=>"); } } int sign(int x) { return ( (x>0) ? 1 : ( (x==0) ? 0 : -1) ); } YES C 제 7 장 함수 28

예제 7. 17 여러 개의~ • • • /* 소스파일 add. c */ void

예제 7. 17 여러 개의~ • • • /* 소스파일 add. c */ void add_up( int numbers[20] ) { . . } • • /* 소스파일 mainline. c */ static float values[] = { 10. 2, 32. 1, 0. 006, 31. 08 }; void main(void) { float result; . . . result = add_up( values ); } YES C 제 7 장 함수 30

예제 7. 18 입력된 수를 넘겨받아 원하는 수만큼 "*"를 출 력하는 프로그램 예제 /*

예제 7. 18 입력된 수를 넘겨받아 원하는 수만큼 "*"를 출 력하는 프로그램 예제 /* void형 함수 */ #include <stdio. h> void print_char(char c, int n) { int i; for (i = 1; i <= n; i++) printf(" %c", c); } void main(void) { int i, n; printf("Input N -> "); scanf("%d", &n); for (i = 1; i <= n; i++) { print_char(' ', n - i); print_char('*', 2 * i - 1); putchar('n'); } for (i = 1; i <= n - 1; i++) { print_char(' ', i); print_char('*', 2 * n - 2 * i - 1); putchar('n'); YES }C 제 7 장 함수 } 35

예제 7. 20 함수명을 작명할 때 정확한 의미를 부여하는 것이 좋다. • • •

예제 7. 20 함수명을 작명할 때 정확한 의미를 부여하는 것이 좋다. • • • #include <stdio. h> int *matrix_add(int *, int *); /* prototype 선언*/ int *matrix_product(int *, int *); /* prototype 선언*/ • • • void main(void) { matrix_add(); /* matrix_add()함수 호출 */ matrix_product(); /* matrix_product()함수 호출 */ } • • • • int *matrix_add(int *x, int *y) /* 함수명의 뜻을 정확하게. . . */ { int *z; printf("matrix_add()함수가 호출되었습니다. n"); 중략. . return *z; } int *matrix_product(int *x, int *y) /* 함수명의 뜻을 정확하게. . . */ { int *z; printf("matrix_product() 함수가 호출되었습니다. n"); 중략. . return *z; } YES C 제 7 장 함수 40

예제 7. 23 전역변수 선언을 사용하였을 경우 각각의 함 수에서 전역변수의 사용 예. #include

예제 7. 23 전역변수 선언을 사용하였을 경우 각각의 함 수에서 전역변수의 사용 예. #include <stdio. h> int add_numbers( void ); /* 함수 원형 */ /* 이들 전역변수들은 이 시점 이 후부터 access될 수 있다 */ int value 1, value 2, value 3; int add_numbers( void ) { auto int result; result = value 1 + value 2 + value 3; return result; } void main(void) { auto int result; value 1 = 10; value 2 = 20; value 3 = 30; result = add_numbers(); printf(" %d + %d = %dn", value 1, value 2, value 3, result); } YES C 제 7 장 함수 50

예제 7. 25 extern 데이터 유형 변수 이름 #include <stdio. h> void f 1(void);

예제 7. 25 extern 데이터 유형 변수 이름 #include <stdio. h> void f 1(void); /* 함수 원형 */ void main(void) { extern int count; int i; i = count - 5; ++count; f 1(); printf("i = %d, count = %dn", i , count); } int count = 5; void f 1(void) { ++count; } YES C 제 7 장 함수 52

예제 7. 26 예제 7. 25 프로그램에서 다음과 같이 main 앞에 count를 정의하면 변수

예제 7. 26 예제 7. 25 프로그램에서 다음과 같이 main 앞에 count를 정의하면 변수 선언을 할 필요가 없다. #include <stdio. h> void f 1(void); int count = 5; void main(void) { int i; i = count - 5; ++count; f 1(); printf("i = %d, count = %dn", i, count); } void f 1(void) { ++count; } YES C 제 7 장 함수 53

예제 7. 29 정적변수와 자동변수의 차이점을 보여주는 프로그램. #include <stdio. h> void demo( void

예제 7. 29 정적변수와 자동변수의 차이점을 보여주는 프로그램. #include <stdio. h> void demo( void ); /* 함수 원형 */ void demo( void ) { auto int avar = 0; static int svar = 0; printf("auto = %d, static = %dn", avar, svar); ++avar; ++svar; } void main(void) { int i; i = 0; while( i < 3 ) { demo(); i++; } } YES C 제 7 장 함수 56

예제 7. 30 지역 static 변수와 auto 변수의 사용 예를 보 여주는 프로그램. #include

예제 7. 30 지역 static 변수와 auto 변수의 사용 예를 보 여주는 프로그램. #include <stdio. h> void test() { static int s_count; /*static 메모리 유형은 초기화시키지 않았을 경우*/ int a_count = 0; /* 0의 값을 가진다 */ } s_count++; a_count++; printf("static count = %2 dtauto count = %dn", s_count, a_count); void main(void) { int i; for (i = 0; i < 10; i++) test(); } YES C 제 7 장 함수 57

예제 7. 32 전역 static 변수의 사용 예를 보여주는 프로그램. • #include <stdio. h>

예제 7. 32 전역 static 변수의 사용 예를 보여주는 프로그램. • #include <stdio. h> • • • void proc 1(void); int i = 10; static int j = 3; • • • void main(void) { int k = 1; printf("i = %d, j = %d, k = %dn", i, j, k); proc 1(); } • • • char c = 'A'; static char d = 'B'; • • void proc 1(void) { printf("%c%cn", c, d); } YES C 제 7 장 함수 60

예제 7. 34 구의 부피를 구하는 프로그램을 함수로 작성하라. • • # include <stdio.

예제 7. 34 구의 부피를 구하는 프로그램을 함수로 작성하라. • • # include <stdio. h> float ball_volume(float); /* 함수의 prototype 선언 */ • • void main(void) { float r; printf("구의 반지름을 입력하시오 : “); scanf("%f", &r); printf("반지름 이 %5. 1 f일 때 공의 부피=%7. 2 fn", r, ball_volume(r)); } • • float ball_volume(float h) { return(4. 0/3. 0*3. 14*h*h*h); } YES C 제 7 장 함수 67

예제 7. 36 배열을 함수에 넘겨주는 프로그램을 작성하라. #include <stdio. h> void sub_func 1(int

예제 7. 36 배열을 함수에 넘겨주는 프로그램을 작성하라. #include <stdio. h> void sub_func 1(int *data); void sub_func 2(int data[]); void sub_func 3(int data[], int n); void main(void) { int a[10] = { 10, 20, 30, 40, 50, 60, 70, -1}; /*-1은 데이터의 끝*/ sub_func 1(a); /* 가인수를 포인터로 표현 */ sub_func 2(a); sub_func 3(a, 7); /* 배열의 크기를 인수로 전달 */ } YES C 제 7 장 함수 72

예제 7. 36 (계속) void sub_func 1(data) int *data; { int sum = 0;

예제 7. 36 (계속) void sub_func 1(data) int *data; { int sum = 0; while(*data != -1) { /* 배열의 끝이 -1 */ sum += *data; ++data; } printf("sum = %dn", sum); } void sub_func 2(data) /* 가인수를 배열로 표현 int data[]; { int sum = 0, i ; for (i = 0; data[i] != -1; ++i) sum += data[i]; printf("sum = %dn", sum); } YES C 제 7 장 함수 */ 73

예제 7. 36 (계속) void sub_func 3(data, n) /* 배열 크기의 정보를 인수로 넘겨줌

예제 7. 36 (계속) void sub_func 3(data, n) /* 배열 크기의 정보를 인수로 넘겨줌 */ int data[], n; { int sum = 0, i; for (i=0; i<n; ++i) sum += data[i]; printf("sum = %dn", sum); } YES C 제 7 장 함수 74

예제 7. 37 1차원 배열의 함수전달 프로그램을 작성하라. #include <stdio. h> int maximum( int

예제 7. 37 1차원 배열의 함수전달 프로그램을 작성하라. #include <stdio. h> int maximum( int [] ); int { } /* 함수 원형*/ maximum( int values[5] ) int max_value, i; max_value = values[0]; for( i = 0; i < 5; ++i ) if( values[i] > max_value ) max_value = values[i]; return max_value; void main(void) { int values[5], i, max; printf("5개의 숫자를 입력하시오. n"); for( i = 0; i < 5; ++i ) scanf("%d", &values[i] ); max = maximum( values ); printf("n최대값은 %d이다. n", max ); 76 YES C 제 7 장 함수 }

예제 7. 38 배열의 요소의 크기를 같이 전달하는 프로그 램을 작성하라. #include <stdio. h>

예제 7. 38 배열의 요소의 크기를 같이 전달하는 프로그 램을 작성하라. #include <stdio. h> int findmaximum( int [], int ); /* 함수 원형 */ int { findmaximum( int numbers[], int elements ) int largest_value, i; largest_value = numbers[0]; for( i = 0; i < elements; ++i ) if( numbers[i] > largest_value ) largest_value = numbers[i]; return largest_value; } void main(void) { static int numb 1[] = { 5, 34, 56, -12, 3, 19 }; static int numb 2[] = { 1, -2, 34, 207, 93, -12 }; printf("numb 1[]의 최대값은 %d이다. n", findmaximum(numb 1, 6)); printf("numb 2[]의 최대값은 %d이다. n", findmaximum(numb 2, 6)); 77 YES C 제 7 장 함수 }

예제 7. 40 다차원 배열의 함수 전달 : 2차원 배열의 모든 요소를 더하는 함수를

예제 7. 40 다차원 배열의 함수 전달 : 2차원 배열의 모든 요소를 더하는 함수를 C 프로그램으로 작성하라. #include <stdio. h> int add 2 darray( int [][5], int ); /* 함수 원형 */ int add 2 darray( int array[][5], int rows ) { int total = 0, columns, row; for( row = 0; row < rows; row++ ) for( columns = 0; columns < 5; columns++ ) total = total + array[row][columns]; return total; } void main(void) { int numbers[][5] = {{1, 2, 35, 7, 10}, {6, 7, 4, 1, 0}}; int sum; sum = add 2 darray( numbers, 2 ); printf("전체합은 %d이다. n", sum ); } YES C 제 7 장 함수 78

예제 7. 41 문자열을 함수로의 전달하는 프로그램을 작 성하라. #include <stdio. h> void strdsp

예제 7. 41 문자열을 함수로의 전달하는 프로그램을 작 성하라. #include <stdio. h> void strdsp 1(char *pt); void strdsp 2(char str[]); void main(void) { static char s 1[] = "배열 형태의 문자열"; char *s 2 = "포인터 형태의 문자열"; strdsp 1(s 1); /* s 1[]의 선두 주소를 전달 */ strdsp 1(s 2); /* s 2의 포인터 형태의 주소 */ } void strdsp 1(pt) char *pt; { printf("%sn", pt); } void strdsp 2(str) char str[]; { printf("%sn", str); YES C 제 7 장 함수 } 80

예제 7. 42 재귀함수를 이용하여 팩토리얼(factorial)을 계산하는 프로그램을 작성하라. #include <stdio. h> long factorial(long

예제 7. 42 재귀함수를 이용하여 팩토리얼(factorial)을 계산하는 프로그램을 작성하라. #include <stdio. h> long factorial(long n); void main(void) { long a; a = factorial(7); printf("7! = %1 dn", a); } long factorial(n) long n; { if(n == 0) return(1); else return(n*factorial(n-1)); } YES C 제 7 장 함수 82

예제 7. 43 factorial을 재귀함수를 사용하여 계산하는 변형된 방법. • • #include <stdio. h>

예제 7. 43 factorial을 재귀함수를 사용하여 계산하는 변형된 방법. • • #include <stdio. h> long int factorial( long int ); /* 함수 원형 */ • • • long int factorial( long int n ) { long int result; if( n == 0 l ) result = 1 l; else result = n * factorial( n - 1 l ); return ( result ); } • • void main(void) { int j; for( j = 0; j < 11; ++j ) printf("%2 d! = %ldn", j, factorial( (long) j) ); } YES C 제 7 장 함수 83

예제 7. 45 scanf()를 이용하여 사용자로부터 triangular 수를 입력하여 계산하는 프로그램을 작성하 라. triangular

예제 7. 45 scanf()를 이용하여 사용자로부터 triangular 수를 입력하여 계산하는 프로그램을 작성하 라. triangular 수는 그 숫자 이전의 수를 모두 더하는 것이다. triangular 수가 7이라면 다음과 같다. 7 triangular = 7 + 6 + 5 + 4 + 3 + 2 + 1 • • #include <stdio. h> long int triang_rec( long int ); /* 함수 원형 */ • • long int triang_rec( long int number ) { long int result; if( number == 0 l ) result = 0 l; else result = number + triang_rec( number - 1 ); return( result ); } • • • void main(void) { int request; long int triang_rec(), answer; printf("Enter number to be calculated. : "); scanf( "%d", &request); answer = triang_rec( (long int) request ); printf("The triangular answer is %ldn", answer); } YES C 제 7 장 함수 85

예제 7. 46 피보나치(fibonacci) 수열을 재귀함수를 이용 하여 30항까지 구하는 프로그램을 작성하라. #include <stdio.

예제 7. 46 피보나치(fibonacci) 수열을 재귀함수를 이용 하여 30항까지 구하는 프로그램을 작성하라. #include <stdio. h> int fib(int); void main(void) { int x; for(x=1; x<30; x++) } printf("%dn", fib(x)); int fib(int num) /* Fibonacci 수를 구하는 재귀함수 */ { switch(num) { case 0: return(0); break; case 1: return(1); break; default: return(fib(num - 1) + fib(num - 2)); break; } 86 } YES C 제 7 장 함수

예제 7. 47 누승(累乘)을 계산하는 recursive 함수를 작성하라. • #include <stdio. h> • double

예제 7. 47 누승(累乘)을 계산하는 recursive 함수를 작성하라. • #include <stdio. h> • double power(double, unsigned); • • void main(void) { printf("%lf n", power(13. 7, 5)); } • • double power(double val, unsigned pow) { if(pow == 0) /* pow(x, 0) returns 1 */ return(1. 0); else return(power(val, pow - 1) * val); } YES C 제 7 장 함수 87

예제 7. 48 main 함수에 매개변수를 포함하는 프로그램에서 매개 변수가 어떻게 저장되는지를 보여주는 프로그램을

예제 7. 48 main 함수에 매개변수를 포함하는 프로그램에서 매개 변수가 어떻게 저장되는지를 보여주는 프로그램을 작성하라. #include <stdio. h> void main(argc, argv) int argc; char *argv[]; { int i; printf("argc = %dn", argc); for (i=0; i<argc; ++i) printf("argv[%d] = %sn", i, argv[i]); } 입력(DOS 창을 열고 실행함) C: Documents and SettingsAdministrator바탕 화면 Debug>sr 0748 test 100 200 실행결과 argc = 4 argv[0] = sr 0748 argv[1] = test argv[2] = 100 argv[3] = 200 YES C 제 7 장 함수 89

 • • 예제 7. 50 어떤 수의 약수를 구하는 프로그램을 main() 함수에서 매개변수

• • 예제 7. 50 어떤 수의 약수를 구하는 프로그램을 main() 함수에서 매개변수 로 어떤 수를 받아들여 구하라. #include <stdio. h> #include <stdlib. h> • • • • • • void main(argc, argv) int argc; char *argv[]; { int x, i; if ( argc !=2 ) { printf("사용방법 : nt test 10진수n"); return; } printf("input data : %s n", argv[1]); for(i=0; argv[1][i] != ''; i++) if( argv[1][i] < '0' || argv[1][i] > '9') { printf("사용방법 : t test 10진수n"); return; } x = atoi(argv[1]); for(i=1; i<=x/2; i++) if (x % i== 0) printf("%dn", i); } 실행결과 Sr 0750 123 ab Input data : 123 ab 사용방법 : test 10진수 • • Sr 0750 342 Input data : 342 YES C 제 7 장 함수 91