본문 바로가기
c

5. 함수

by it_jangyee 2020. 2. 12.

함수: 기능 또는 모듈

1. 함수선언: 함수의 프로토타입(틀)을 선언한다. 

함수타입 함수명(파라메터 리스트);

함수타입:함수의 반환값의 타입. 함수가 int값을 반환=>함수타입은 int. 
함수가 문자 하나를 반환=>함수타입은 char.
함수가 float값을 반환=>함수타입은 float.
함수가 아무값도 반환하지 않음=함수타입은 void.

함수명: c의 이름명명규칙을 따른다. 변수이름 만드는 거랑 똑같음.
영어, 숫자, _ 조합. 숫자로 시작안됨. 키워드 쓰면 안됨. 함수의 기능에 맞는 이름으로 만든다.

파라메터: 함수가 호출될때 필요한 값을 받아서 저장할 변수. 없어도 되고, 필요한 타입과 개수만큼 정의

예>
int add(int a, int b); //함수명은 add, 반환값은 int, 파라메터는 int 2개
void test1(char a[]); //함수명은 test1, 반환값은 없다, 파라메터는 char 배열(즉 문자열)
float test2(); //함수명은 test2, 반환값은 float, 파라메터는 없다

2. 함수정의: 함수가 어떻게 동작할지를 구현

예>
void hello();  //함수 선언
void hello(){ //함수정의(구현)
   printf("say hello\n");
}

void add(int a, int b); //함수 선언
void add(int a, int b){ //함수정의(구현)
    int c = a+b;
    printf("%d + %d = %d\n", a, b, c);
}

3. 함수호출
 구현한 함수를 사용하고자 할때 불러서 실행함. 
 호출방법: 이름을 부르고 괄호에 파라메터의 타입과 개수에 맞는 값을 넣어준다. 
 hello();
 add(1,2);

#include <stdio.h>
void gugudan(int dan);
void main(){
    int i;
    for(i=2;i<10;i++){
        gugudan(i);
    }

}
void gugudan(int dan){
    int i;
    printf("%d단\n", dan);
    for(i=1;i<10;i++){
        printf("%d * %d = %d\n", dan, i, dan*i);
    }
    printf("\n");
}

#include <stdio.h>

//함수 선언
void add(int a, int b);
void sub(int a, int b);
void mul(int a, int b);
void dev(int a, int b);

void main(){
//    숫자 2개와 연산자를 입력받아서 계산결과 출력
    int num1, num2;
    char op;//+ - * /
    printf("계산할 수식을 입력하라\n");
    scanf("%d%c%d", &num1, &op, &num2);
    switch(op){
        case '+':
            add(num1, num2);
            break;
        case '-':
            sub(num1, num2);
            break;
        case '*':
            mul(num1, num2);
            break;
        case '/':
            dev(num1, num2);
            break;
        default:
            printf("잘못된 연산자\n");
    }
}

void add(int a, int b){
    int c = a+b;
    printf("%d + %d = %d\n", a, b, c);
}
void sub(int a, int b){
    int c = a-b;
    printf("%d - %d = %d\n", a, b, c);
}
void mul(int a, int b){
    int c = a*b;
    printf("%d * %d = %d\n", a, b, c);
}
void dev(int a, int b){
    int c = 0;
    if(b==0){
        printf("0으로 나눌 수 없다.\n");
        return; //함수 종료
    }
    c = a/b;
    printf("%d / %d = %d\n", a, b, c);
}

#include <stdio.h>
//지역변수는 함수 안에서 선언한 변수
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
float dev(int a, int b);

int flag;//0

void main(){
    char op;
    int num1, num2, res;
    float res2;
    printf("연산자:");
    scanf("%c", &op);
    printf("숫자 2개:");
    scanf("%d%d", &num1, &num2);
    switch(op){
    case '+':
        res = add(num1, num2);
        break;
    case '-':
        res = sub(num1, num2);
        break;
    case '*':
        res = mul(num1, num2);
        break;
    case '/':
        res2 = dev(num1, num2);
        if(flag==0){
            printf("%d %c %d = %f\n", num1, op, num2, res2);
        }
        flag = 1;
        break;
    default:
        printf("잘못된 연산자\n");
        flag = 1;
        break;
    }
    if(flag==0){
        printf("%d %c %d = %d\n", num1, op, num2, res);
    }
}

int add(int a, int b){
    return a+b;
}

int sub(int a, int b){
    return a-b;
}

int mul(int a, int b){
    return a*b;
}
float dev(int a, int b){
    if(b==0){
        flag = 1;
        printf("0으로 나눌 수 없다\n");
        return 0;
    }
    return (float)a/b;

4. 다양한 형태의 리턴 값

#include  <stdio.h>
int a(int x, int y);
char b(char ch);
float c(int x, int y, int z);
int big(int x, int y);

void main(){
    int res;
    char ch = 'b', ch2;
    float z;
    res = a(4,5);
    printf("res=%d\n", res);
    ch2 = b(ch);
    printf("ch=%c, ch2=%c\n", ch, ch2);
    z = c(3,4,5);
    printf("z:%f\n", z);
    res = big(5,7);
    printf("big:%d\n", res);
}
int big(int x, int y){
    if(x>=y){
        return x;
    }else{
        return y;
    }
}
int a(int x, int y){
    return x+y;
}

char b(char ch){
    char r;
    if(ch>'z' || ch<'a'){
        printf("소문자 알파벳이 아니다.\n");
        return '\0';
    }
    r=ch-32;//대문자로 변환
    return r;
}
float c(int x, int y, int z){
    return (float)(x+y+z)/3;
}



5. 다양한 형태의 파라메터

#include <stdio.h>
int add1(int a, int b);
float add2(float a, float b);
void add3(char a, char b, char c);
void main(){
    printf("add1(3,4)=%d\n", add1(3,4));
    printf("add2(3.45f, 4.56f)=%f\n",
           add2(3.45f, 4.56f));
    add3('a', 'b', 'c');
}
int add1(int a, int b){
    return a+b;
}

float add2(float a, float b){
    return a+b;
}
void add3(char a, char b, char c){
    printf("%c%c%c\n", a, b, c);
}


배열 파라메터
#include <stdio.h>

void printArr(int a[], int size);
void inputArr(int a[], int size);

void main(){
    int a[]={4,2,6,5,8,7,3,1};
    printArr(a, 8);
    inputArr(a, 8);
    printf("입력 후 배열요소\n");
    printArr(a, 8);
}
void inputArr(int a[], int size){
    int i;
    printf("숫자 %d개를 입력하라\n", size);
    for(i=0;i<size;i++){
        scanf("%d", &a[i]);
    }
}
void printArr(int b[], int size){
    int i;
    for(i=0;i<size;i++){
        printf("%d\t", b[i]);
    }
    printf("\n");
}
배열의 합, 최대값, 최소값, 정렬 함수

#include <stdio.h>

void printArr(int a[], int size);
int sum(int a[], int size); //배열 요소 합
int max(int a[], int size); //배열 요소 최대값 반환
int min(int a[], int size); //배열 요소 최소값 반환
void sort(int a[], int size); //배열 요소 정렬(버블소트)


void main(){
    int a[]={4,2,6,5,8,7,3,1};
    int x;
    printArr(a, 8);
    x = sum(a, 8);
    printf("sum:%d\n", x);
    printf("max:%d\n", max(a, 8));
    printf("min:%d\n", min(a, 8));
    sort(a, 8);
    printArr(a, 8);
}
void inputArr(int a[], int size){
    int i;
    printf("숫자 %d개를 입력하라\n", size);
    for(i=0;i<size;i++){
        scanf("%d", &a[i]);
    }
}
void printArr(int b[], int size){
    int i;
    for(i=0;i<size;i++){
        printf("%d\t", b[i]);
    }
    printf("\n");
}
int sum(int a[], int size){
    int i, s=0;
    for(i=0;i<size;i++){
        s+=a[i];
    }
    return s;
}
int max(int a[], int size){
    int m = a[0];
    int i;
    for(i=1;i<size;i++){
        if(m<a[i]){
            m = a[i];
        }
    }
    return m;
}
int min(int a[], int size){
    int m = a[0];
    int i;
    for(i=1;i<size;i++){
        if(m>a[i]){
            m = a[i];
        }
    }
    return m;
}
void sort(int a[], int size){
    int i, j, tmp;
    for(i=0;i<size-1;i++){
        for(j=0;j<size-1-i;j++){
            if(a[j]>a[j+1]){
                tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp;
            }
        }
    }
}

 

문자열 파라메터
#include <stdio.h>
#include <string.h>

void printName(char name[]);
void mystrcpy(char des[], char src[]);//문자열 src를 des에 복사
int len(char str[]);//문자열의 길이를 계산하여 반환

void main(){
    char x[]="이름";//nanana
    char y[10];
    printName(x);
    strcpy(y, x);
    printf("y=%s\n", y);
    mystrcpy(x, "abcde");
    printf("x=%s\n", x);
    strcpy(y, "abcde");//배열에 문자열을 실행문에서 할당하는 방법
    printf("y=%s\n", y);
    printf("len:%d\n", len(y));
    //strcmp(x, y): x, y 같으면 0반환. 다르면 두 문자열 길이의 차 반환
    if(strcmp(x, y)==0){
        printf("x,y가 동일하다\n");
    }else{
        printf("x,y가 다르다\n");
    }
}
int len(char str[]){
    int i=0;
    while(str[i++]!='\0');
    return i-1;
}
void printName(char name[]){
    printf("name=%s\n", name);
}

void mystrcpy(char des[], char src[]){
    int i=0;
    while(src[i]!='\0'){
        des[i] = src[i];
        i++;
    }
    des[i]='\0';
}
main 파라메터 받기
#include <stdio.h>

void main(int argc, char*argv[]){
    int i;
    for(i=0;i<argc;i++){
        printf("%s\n", argv[i]);
    }
}

6. 재귀함수

#include <stdio.h>


int f(int num);
int f2(int num);


void main(){
    printf("f(4)=%d\n", f(4));
    printf("f2(4)=%d\n", f2(4));
}
int f(int num){
    if(num==1){
        return 1;
    }else{
        return num*f(num-1);
    }
}
int f2(int num){
    int res = 1, i;
    for(i=1;i<=num;i++){
        res*=i;
    }
    return res;
}

피보나치 수열 구현

재귀함수로 구현

#include <stdio.h>

int fibo_recur(int x);
void main(){
    int i;
    for(i=0;i<50;i++){
        printf("%d\t", fibo_recur(i));
    }
}
int fibo_recur(int x){
    if(x<2){
        return 1;
    }else{
        return fibo_recur(x-1)+fibo_recur(x-2);
    }
}

루프로 구현

#include <stdio.h>

void fibo_loop(int num); 

void main(){
    fibo_loop(50);
} 

void fibo_loop(int num){ 
    int x=1, y=1, z=0, i; 
    for(i=0;i<num;i++){ 
        if(i<2){ 
            z = 1; 
        }else{ 
            z = x+y; 
            x = y; 
            y = z; 
        } 
        printf("%d\t", z); 
    } 
}

배열로 구현

#include <stdio.h>

void fibo_arr(int a[], int size); 

void main(){ 
    int b[50]; 
    fibo_arr(b, 50); 
    int i; 
    for(i=0;i<50;i++){ 
        printf("%d\t", b[i]); 
    }
} 

void fibo_arr(int a[], int size){ 
    int i; 
    for(i=0;i<50;i++){ 
        if(i<2){ 
            a[i]=1; 
        }else{ 
            a[i]=a[i-1]+a[i-2]; 
        } 
    } 
} 

 

7. 지역변수와 전역변수

1) 전역변수: 함수 밖에 선언한 변수. 값을 안주면 0. 
                그 파일 안의 모든 함수가 사용가능
2) 지역변수: 함수 안에 선언한 변수. 값을 안주면 쓰레기 값.
                선언한 그 함수안에서 사용가능. 함수가 끝나면 지역변수는 사라진다.

#include <stdio.h>
int a;//전역변수. 0을 갖는다.
void test(int a);//파라메터도 지역변수
void main(){
    int a = 10;
    test(300);
 //   printf("a=%d, b=%d\n", a, b);
}
int c=100;//test()에서는 보이지만 main()에서는 안보임
void test(int a){
    int b=20;
    printf("a=%d, b=%d, c=%d\n", a, b, c);
}

'c' 카테고리의 다른 글

7. 입출력  (0) 2020.02.19
6. 포인터  (0) 2020.02.17
4. 배열  (0) 2020.01.22
3. 제어문  (3) 2020.01.08
2. 변수와 연산자  (0) 2020.01.05

댓글