title: “C언어 함수(function) 2” categories:

  • C

    #C언어 함수(function) 2 : 네이버 블로그

c언어의 함수는 기본적으로

반환 자료형(void, int, double…) 함수이름 인수목록 {함수몸체} 의 구조로 구성된다.

​

함수는 사용자 정의 함수와 라이브러리 함수가 있는데

라이브러리 함수는 printf나 scanf처럼 헤더 파일에 정의되어있는 함수이다.

​

오늘 다루는 함수는 사용자 정의 함수이다.

사용자 정의 함수를 쓰는 이유는

  1. 불필요한 중복 코드를 줄일 수 있다.

  2. 체계적이고 간결하게 할 수 있다.

  3. 함수 내의 변수를 선언해 변수 간의 중복을 피할 수 있다.

​

아래 예제들을 보자

#include
void happy\_birthday(){
 printf("생일축하합니다\n");
}
int main() {
 happy\_birthday(); //void는 함수()형임을 기억하자
 happy\_birthday();
 printf("사랑하는 학생의 ");
 happy\_birthday();
 return 0;
}

void happy_birthday()는 입력(전달인자)가 없고 반환도 없는 함수이다.

여기서 반환은 return 값이다.

​

즉 printf로 인해 출력된다 해도 반환은 없다.

입력과 반환의 의도에 따라 자료형을 적절히 선택하자.

​

#include
int add(int x, int y){
 return x + y;
}
int main() {
 int x, y;
 scanf("%d%d", &x, &y);
 printf("%d", add(x, y));
 return 0;
}

add라는 함수는 add( x ,y )형태로 입력받아

x+y를 반환하는 함수이다.

​

즉 x+y는 add(x,y)와 같다.

​

#include
int fact(int n) {
 int sum = 1;
 for (int i = 1; i <= n; i++)
 {
 sum \*=i;
 }
 return sum;
}

int main() {
 int a;
 scanf("%d", &a);
 printf("%d", fact(a));
 return 0;
}

fact함수는 입력받은 int형 n의 팩토리얼을 int형 sum으로 반환하는 함수이다.

​

함수를 적절히 사용하기 위해서는 함수의 기능이 무엇인지, 무엇을 반환하는지 생각하는 것이 중요하다

​

#include
char op(); //함수 선언만 하고 내용은 아래에 적는다(함수원형)
double ch(char o);
int main() {
 double result;
 printf("%f", ch(op())); //ch 함수의 입력을 op의 출력값으로 놓을 수 있다.
}
char op() {
 puts("'c' 섭씨온도에서 화씨온도 변환");
 puts("'f' 화씨온도에서 섭씨온도 변환");
 puts("'q' 종료");
 char o;
 scanf(" %c", &o);
 return o;
}
double ch(char o) {
 double temp;
 scanf("%lf", &temp);
 switch (o)
 {
 case 'c':
 return 9.0 / 5.0\*temp + 32;
 case 'f':
 return (temp - 32.0)\*5.0 / 9.0;
 default:
 break;
 }
}

위 코드에서는 새로운 것이 2가지 나온다.

​

  1. 함수원형

코드의 위에서는 선언만 하고 아래에 함수 내용을 써놓 수 있다,

2.함수의 입력을 함수의 출력으로 놓을 수 있다.

​

#include
int com(int n, int r);
int fact(int n);
int get(void);
int main(void) {
 int n, r;
 n = get();
 r = get();
 printf("C(%d, %d) =%d \n", n, r, com(n, r));
 return 0;
}
int com(int n, int r) {
 return (fact(n) / (fact(r)\*fact(n - r))); //함수의 반환을 입력으로 쓸 수 있다.
}
int fact(int n) {
 int i;
 int result = 1;
 for (i = 1; i <= n; i++)
 result \*= i;
 return result;
}
int get(void) {
 int n;
 puts("정수를 입력하세요 : ");
 scanf("%d", &n);
 return n;
}

위 코드는 조합(combination)을 구하는 코드입니다.

com,fact,get 함수가 있는데

get함수는 scanf로 받은 값을 반환시키는 역할을 합니다.

fact 함수는 입력된 수의 팩토리얼을 구한 후 반환합니다

com 함수는

을 계산하는 함수입니다.

​

위 코드의 중요한 사실은 함수의 반환값을 새로운 함수의 입력값으로 쓸 수 있는 것입니다.

​

​

#include
int is\_prime(int n);
int get(void);
void result(int a);

int main(void) {
 result(is\_prime(get())); //get실행 후 반환값을 is\_prime에 넣고 그 반환값이 result로 들어간다
}

int is\_prime(int n) {
 for (int i = 2; i < n; i++)
 if (n%i == 0) {
 printf("약수 %d\n", i);
 return 0;

 }
 return 1;
}
int get(void) {
 int a;
 scanf("%d", &a);
 return a;
}
void result(int a) {
 a ? puts("소수입니다") : puts("소수가 아닙니다");
}

위 코드는 입력받은 정수가 소수인지 판별하는 프로그램이다

위 함수는 get,is_prime,result가 있다.

get은 void를 인수로 가지고 int형을 반환한다.

반환하는 값은 scanf한 a이다.

​

is_prime은 int를 인수로 가지고 int헝을 반환한다.

i가 1씩 올라가며

만약(if) 인수 n을 i로 나눴을때 나머지가 0이라면, 즉 약수가 있다면 그n을 출력한다

그리고 0을 반환한다.

나눴을때 나머지가 0이되는 값이 없으면(약수가 없으면) 0을 반환한다.

is_prime에서 반환받은 값은 result의 인수가 되는데 인수에 따라 소수인지 아닌지를 판별한다.

​

함수같은 경우에는 다시 말하지만 어떤 형태를 인수,반환 형태로 갖느냐가 매우 중요한 것 같다.

또 어느 기능적으로 함수를 나눌지에 따라 좋은 코드가 될 수 있고 나쁜 코드가 될 수 있다.

개발자의 센스가 매우 중요한 것 같은 기능이다.

​

​

업데이트: