▩ 함수(function)


1. 일반적인 프로그램의 구성
   ┌----- 메인 루틴
   │
   ├----- 프로시저(Procedure) : Return 값이 없음
   │
   └----- 함수(Function) : Return 값이 있음
    


2. C언어의 함수 구성 : main() 함수와 일반 함수로 구성됨
   ┌----- 메인 함수 main()
   │
   │
   └----- 함수(Function) : Return 값이 있음, Return 값이 있음


3. 함수의 기본 구성
   return 형 함수명(인수형과 가인수의 나열...){
       함수내 변수 선언;
       실행문;
   }

☞ 함수의 작성 규칙
   1) main() 함수는 기능을 정의 하는 함수가 아니라 다른 함수를 이용하는 통제소의 역활을 한다.
      따라서 처리 로직을 main()안에 두면 안된다.
   2) 가인수와 실인수의 데이터 타입과 갯수는 반드시 일치 시킨다.
   3) 함수안에 선언되는 변수는 모두 지역변수이다. 따라서 메인에서는 사용할 수 없다.
   4) 함수를 처리한 후 함수의 리턴값의 데이터형은 함수의 원형에 선언된 타입과 일치해야한다.
   5) 변수명과 함수명이 같으면 함수의 인식이 안된다.


4. 프로토타입을 선언하는 이유
   - main() 함수로 하여금 어떤 함수가 이 프로그램에 선언되어 있는 지 알려주는 역활을 함
   - 사용자 정의 함수가 main()앞에 있으면 프로토타입이 필요 없고, main()뒤에 선언되면 반드시 프로토타입을 선언해야 한다.


5. 실인수와 가인수의 의미
   - 실인수 : 실제로 값을 가지고 있는 함수를 호출하는 측의 변수
   - 가인수 : 임시로 함수에서 지역 변수로 사용되는 변수


6. 값의 return 유형
   - 상황에 따라 1개이상의 return문이 올 수 있다.
   - return a;
   - return (a);
   - return 1;
   - return a+b;

☞ return을 사용하는 이유
   1) 함수에서 처리 값을 돌려줄 경우  
   2) 함수의 실행을 종료하는 역활을 한다.


7. void 형 함수 : 값을 return 하지 않는 함수, 주로 출력을 하는데 사용
   - void main(){}


8. void 형 인수 : 인수를 받지 않는 함수
   - void kkk(void){ } == void kkk(){ }




▩ 함수응용 예제


1. 함수 원형(Prototype) 정의의 이해
//함수는 한번 재작하면 반복해서 호출할 수 있습니다.
//따라서 소스를 매우 구조적으로 만들어 줍니다.

 #include <stdio.h>
 #include <conio.h>

//함수 선언, 함수 원형 선언, 함수 프로토 타입
 void print_line();

 void main() {
   int x, y;
   char c;

     //1회는 무조건 실행됨으로 do~while()사용
     do {
       print_line();
       printf("\n 첫번째 수를 입력하세요 : "); scanf("%d", &x);
       print_line();
       printf("\n 두번째 수를 입력하세요 : "); scanf("%d", &y);
       print_line();
       printf("\n %d 곱하기 %d는 %d입니다.\n", x, y, x*y);
       print_line();
       printf("\n 계속=>Enter, 종료=>Q");
       c=(getch());
     } while(c!='Q');
     getch();
 }

 //함수 정의
 void print_line() {
   int i;
   for(i=1; i<=30; i++){
      printf("-");
   }
 }




2. 기본적인 함수의 사용

▷ 국어, 영어, 수학 점수를 (1~100점) main()함수에서 입력받아
   총점은 tot(kor, eng, mat) 함수에서, 평균은 ave(kor, eng,mat) 함수에서 구한후 main()함수에서
   출력하는 프로그램을 만들어 보시오.



>>>>> 처리 형태 1


 #include <stdio.h>
 #include <conio.h>

 //              ┌---- 가인수
 //함수 선언  ↓
 int tot(int kor, int eng, int mat);
 float ave(int kor, int eng, int mat);
 //↑
 //└---- return 되는 데이터의 타입

 void main() {
   int kor, eng, mat;
     
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, tot(kor,eng,mat), ave(kor,eng,mat));
   getch(); //                                                                  │
 }//                                                                               │
 //                                                                                │
 //             ┌-------------------------------------------┘
 //함수정의  ↓실인수, 값 복사가 발생함, 실인수 <=== 가인수
 int tot(int kor, int eng, int mat){
    int tot;
    tot = kor+eng+mat;
    return tot; //정수형 합계 리턴
 }

float ave(int kor, int eng, int mat){
    float ave;
    ave = (kor+eng+mat)/3.0;
    return ave;
}



>>>> 출력결과:


국어 점수를 입력하세요 : 85
영어 점수를 입력하세요 : 90
수학 점수를 입력하세요 : 90

국어    영어    수학    총점    평균
--------------------------------------
85       90       90       265     88.3



>>>>> 처리 형태 2


 #include <stdio.h>
 #include <conio.h>

 int tot(int kor, int eng, int mat);
 float ave(int kor, int eng, int mat);

 void main() {
   int kor, eng, mat, total;
   float average;
     
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   total = tot(kor, eng, mat);
   average = ave(kor, eng, mat);

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, total, average);
   getch();
 }
 
 int tot(int kor, int eng, int mat){
    int tot;
    tot = kor+eng+mat;
    return tot;
 }

float ave(int kor, int eng, int mat){
    float ave;
    ave = (kor+eng+mat)/3.0;
    return ave;
}



>>>>> 처리형태 3(권장 아님, 전역변수 사용은 최대한 피해야 합니다.)


 #include <stdio.h>
 #include <conio.h>

 void tot();
 void ave();

 int kor, eng, mat, total;
 float average;

 void main() {
   printf("국어 점수를 입력하세요 : ");
   scanf("%d", &kor);
   printf("영어 점수를 입력하세요 : ");
   scanf("%d", &eng);
   printf("수학 점수를 입력하세요 : ");
   scanf("%d", &mat);

   tot();
   ave();

   printf("\n국어\t영어\t수학\t총점\t평균\n");
   printf("--------------------------------------\n");
   printf("%d\t%d\t%d\t%d\t%5.1f\n", kor, eng, mat, total, average);
   getch();
 }
 
 void tot(){
    total = kor+eng+mat;
 }

 void ave(){
    average = (kor+eng+mat)/3.0;
}



▩ 함수의 반복 호출


#include <stdio.h>
 #include <conio.h>

 void print_long(void) {
   int i;
   for(i=0; i<=30; i++){
      printf("*");
   }
   printf("\n");
 }

 void print_short(void) {
   int i;

   printf("*");
   for(i=0; i<=28; i++){
      printf(" ");
   }
   printf("*");
   printf("\n");
 }

 void main() {
   int x;

   print_long();
   for(x=0; x<=5; x++)
      print_short();
   print_long();
   getch();
 }



▩ 함수의 중첩 예제 : main()함수안에서 호출한 함수안에 함수가 있는 경우


 #include <stdio.h>
 #include <conio.h>

 void print_long(void) {
   int i;
   for(i=0; i<=30; i++)
      printf("*");
 }

 void print_short(void) {
   int i;
   for(i=0; i<10; i++)
      printf(" ");

   for(i=0; i<10; i++)
      printf("*");
 }

 void print_one(void) {
   int j;
   for(j=0; j<=5; j++) {
      print_long();
      printf("\n");
   }
 }

 void print_two(void) {
   int k;
   for(k=0; k<=10; k++) {
      print_short();
      printf("\n");
   }
 }

 void main() {
   print_one();
   print_two();
   print_one();
   getch();
 }


☞ 함수원형을 추가한 후의 소스 (권장 유형)

 #include <stdio.h>
 #include <conio.h>

 void print_one(void);   //print_long() 호출
 void print_two(void);   //print_short() 호출
 void print_long(void);  //특수 문자를 30개 출력
 void print_short(void); //공백을 10개 출력, 특수문자 10개 출력
 

 void main() {
   print_one();
   print_two();
   print_one();
   getch();
 }


 void print_one(void) {
   int j;
   for(j=0; j<=5; j++) {
      print_long();
      printf("\n");
   }
 }

 void print_two(void) {
   int k;
   for(k=0; k<=10; k++) {
      print_short();
      printf("\n");
   }
 }

 void print_long(void) {
   int i;
   for(i=0; i<=30; i++)
      printf("*");
 }

 void print_short(void) {
   int i;
   for(i=0; i<10; i++)
      printf(" ");

   for(i=0; i<10; i++)
      printf("*");
 }

Posted by 나비:D
:
BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Total :
Today : Yesterday :