Download presentation
Presentation is loading. Please wait.
1
프로그래밍실습 제 11 강
2
강의 내용 함수의 사용 (복습) 여러 개의 인자 사용 함수형과 인자형 함수의 사용에서 중요한 점 부함수와 순환문의 사용
return 문이 없는 함수: void 형 함수 부함수를 이용한 배수 판정 부함수를 이용한 평균 계산 응용프로그램: 각 자릿수 별 정수 출력 사용된 숫자의 개수 return문의 기타 사항
3
함수의 사용 (복습) #include<stdio.h> main() // 주함수 {
double sub(int), a; int num=70; a=sub(num); // 부함수 호출 printf("%.4f\n",a); } double sub(int n) // 부함수 정의 return (double)n/3.; (1) 이 프로그램의 실행 결과는? (2) 부함수의 인자형은? int (3) 부함수의 함수형은? double
4
여러 개의 인자 사용 두 개의 정수를 부함수로 전달하면 그 합를 10으로 나눈 나머지를 반환하는 프로그램을 만들어 보자
#include<stdio.h> main() { int remainder(int,int); //부함수 선언 int a,b,r; scanf("%d%d",&a,&b); r=remainder(a,b); //변수 a와 b의 ‘값’이 부함수로 전달됨 printf("%d\n",r); } int remainder(int num1, int num2) //부함수 정의 int rem; rem=(num1+num2)%10; return rem; // 나머지가 반환됨
5
앞의 예는 다음과 같이 변형 가능하다. #include<stdio.h> int remainder(a,b) //부함수 정의 int a,b; { return (a+b)%10; } main() int a,b; //부함수 선언이 필요 없음 scanf("%d%d",&a,&b); printf("%d\n",remainder(a,b));
6
함수형과 인자형: 다음 C프로그램은 무슨 기능을 하는가?
#include<stdio.h> main() { int a; char grade(int); scanf("%d",&a); printf("%c\n",grade(a)); } char grade(int a) //함수형은 char, 인자형은 int if(a>=80) return 'A'; else if(a>=60) return 'B'; else return 'C';
7
함수의 사용에서 중요한 점 한 함수에서 그 아래에 나오는 다른 함수를 호출하여 사용하기 위해서는 다른 변수 선언과 마찬가지로 함수도 미리 선언되어야 한다.(함수의 선언과 함수의 정의는 다르다.) 함수에서 사용되는 모든 변수는 함수의 인자(parameter)를 통해 그 함수로 전달되거나 함수 내에서 미리 선언되어야 한다. 함수내에서 선언된 변수는 지역변수라 불리며 선언된 함수 내에서만 사용 가능하다. 함수에서 계산된 결과를 다른 함수로 전달 하기 위해서는 return문을 사용하여야 한다. 함수형은 반환(return) 되는 변수나 상수의 형과 일치한다. 함수의 인자가 없는 경우 인자형에 void라는 말을 생략할 수 있다. 반환되는 값이 없는 함수의 형은 void이며 주함수를 제외하고는 void라는 말을 생략할 수 없다.(반환되는 값이 없는 경우 return문을 사용하지 않는다.) 함수의 시작과 끝은 중괄호 { }로 나타낸다. 주의: 함수의 정의가 끝난 중괄호 } 뒤에 세미콜론을 붙이면 안 된다.
8
부함수와 순환문의 사용 이번에는 함수 f 를 사용하여 f(x)값을 27부터 30까지 0.3 간격으로
9
#include<stdio.h>
#include<math.h> main() { double x,f(double); int i; for(i=0;i<=10;i++){ //첨자는 정수형 x= *i; printf("f(%lf)=%f\n",x,f(x)); } double f(double x) return sqrt(x)+3./7.*x+sin(x);
10
출력: f( )= f( )= f( )= f( )= f( )= f( )= f( )= f( )= f( )= f( )= f( )=
11
다음 프로그램의 실행 결과는? #include<stdio.h> main() { int sub(int c); int a=10, b; b=sub(a); printf("main: a=%d b=%d\n",a,b); } int sub(int num) int a,b; // 주함수의 a, b와 무관한 변수임(지역변수) a=123; b=234; printf("sub: a=%d b=%d\n",a,b); return num*2; 출력: sub: a=123 b=234 main: a=10 b=20
12
return 문이 없는 함수: void 형 함수 (1)
#include<stdio.h> main() { void sub(double a); double b=1.2; sub(b); } void sub(double c) printf("%g\n",c*c); //return문 없음 출력: 1.44
13
return 문이 없는 함수: void 형 함수 (2)
#include<stdio.h> main() { void line(void); int i; line(); for(i=1;i<=5;i++){ printf("i=%d\n",i); } void line(void) //함수형과 인자형이 모두 void printf(" \n");
14
출력: i=1 i=2 i=3 i=4 i=5
15
부함수를 이용한 배수 판정 양의 정수 n과 m을 입력하면 n이 m의 배수인지 판정하는 프로그램을 부함수를 이용하여 작성하라.
힌트: 부함수 부분은 다음과 같다: char multiple(int n, int m) { if(n%m==0) return 'Y'; else return 'N'; }
16
#include<stdio.h>
main() { int n,m; char multiple(int,int); printf("양의 정수 n과 m을 입력하십시오.\n"); scanf("%d%d",&n,&m); if(multiple(n,m)=='Y') printf("%d은(는) %d의 배수 입니다.\n",n,m); else printf("%d은(는) %d의 배수가 아닙니다.\n",n,m); } char multiple(int n, int m) if(n%m==0) return 'Y'; return 'N';
17
부함수를 이용한 평균 계산 두 정수 m과 n을 입력하면 두 수의 평균을 부함수에서 구하여 주함수에서 그 결과를 출력하는 프로그램을 작성하라. #include<stdio.h> main() { int m,n; double average(int,int); printf("m, n 입력: "); scanf("%d%d",&m,&n); printf("평균: %g\n",average(m,n)); } double average(int m, int n) return (double)(m+n)/2.;
18
입출력 예: m, n 입력: 80 83 평균: 81.5
19
응용프로그램: 각 자릿수 별 정수 출력 양의 정수 하나를 입력하면 각 자리의 정수를 하나씩 모두 출력하는
프로그램을 작성하여 보자. 입출력 예: 자연수 입력: 386 6 <- 1의 자리 수 8 <- 10의 자리 수 3 <- 100의 자리 수 힌트: 변수 a의 값이 현재 386일 때 현재의 a값을 10으로 나눈 몫은 38( -> a에 저장), 나머지는 6 <- 일의 자리 수 현재의 a값을 10으로 나눈 몫은 3( -> a에 저장), 나머지는 8 <- 십의 자리 수 현재의 a값을 10으로 나눈 몫은 0( -> a에 저장), 나머지는 3 <- 백의 자리 수
20
#include<stdio.h>
main() { int a,r,d; printf("자연수 입력: "); scanf("%d",&a); d=1; do{ r=a%10; a/=10; printf("%d <-%d의 자리 수\n",r,d); d*=10; } while(a!=0); }
21
사용된 숫자의 개수 앞의 예를 활용하여 1부터 1000까지의 정수를 모두 적을 때 사용되는 숫자 0, 1, 2, …, 9의 개수는 각각 몇인지 구하는 프로그램을 작성하여보자.
22
#include<stdio.h>
#define N 1000 main() { int i,j,a,k,r; int num[10]={0}; // 0 ~ 9 각 숫자별 사용 횟수 for(i=1;i<=N;i++){ k=0; a=i; do{ r=a%10; for(j=0;j<=9;j++) if(r==j) num[j]++; a/=10; k++; } while(a!=0); } printf("1부터 %d까지 사용된 숫자의 개수:\n",N); for(i=0;i<=9;i++) printf("%d의 개수: %d\n",i,num[i]);
23
출력: 1부터 1000까지 사용된 숫자의 개수: 0의 개수: 192 1의 개수: 301 2의 개수: 300 3의 개수: 300 4의 개수: 300 5의 개수: 300 6의 개수: 300 7의 개수: 300 8의 개수: 300 9의 개수: 300
24
return문의 기타 사항 return문을 사용하여 값을 되돌리면 호출된 함수의 수행이 종료되고 함수를 호출한 곳으로 돌아간다. 또한 함수 형과 무관하게 return;이 사용될 수 있고, 특히 주함수(main 함수)에서 return;을 사용하면 그 위치에서 프로그램의 실행이 종료된다. 예: (void형 부함수에서 return;의 사용) #include<stdio.h> main() { void sub(void); printf("main 1\n"); sub(); printf("main 2\n"); printf("main 3\n"); printf("main 4\n"); } void sub(void) printf(" sub 1\n"); return; //이 아래 부분은 수행되지 않음 printf(" sub 2\n"); printf(" sub 3\n"); 왼쪽 프로그램의 출력: main 1 sub 1 main 2 main 3 main 4
25
예: (주함수에서 return;을 만나면 그 순간 프로그램의 실행이 종료된다.)
#include<stdio.h> main() { int sub(void), i; printf("main 1\n"); i=sub(); printf("main 2: i=%d\n",i); return; //이 아래 주함수 부분은 더 이상 수행되지 않음.(프로그램 실행 종료) printf("main 3\n"); printf("main 4\n"); } int sub(void) printf("sub 1\n"); return 10; //부함수 호출시 이 아래 부분은 더 이상 수행되지 않음. printf("sub 2\n"); printf("sub 3\n"); 출력: main 1 sub 1 main 2: i=10
26
다음과 예와 같이 return;을 사용하여, 잘못된 입력이 들어올 경우 프로그램의 실행을 멈추게 할 수 있다.
#include<stdio.h> main() { int a; printf("0 아닌 정수 입력: "); scanf("%d",&a); if(a==0){ printf("입력 오류!\n"); return; } printf("123/a=%d\n",123/a); 함수의 호출 끝내기 또는 프로그램의 실행 끝내기 참조
Similar presentations