사자자리

[C언어] 4주차 함수 본문

C언어/C언어 이론

[C언어] 4주차 함수

renne 2022. 5. 14. 12:56

함수

 - 프로그램에서 자주 사용되는 코드 블록을 따로 만들어 두고 필요할 때마다 불러서 사용하는 기능

 - 코드가 중복되지 않고 간결해진다.

 - 코드의 재사용성이 증가된다.

 - 코드를 수정하기 쉽다.

 - 기능별로 함수를 작성해서 사용하므로 프로그램의 모듈화가 증대된다.

#include <stdio.h>
//세 자리 숫자의 각 자릿수를 더하는 함수
int digit_sum(int num){
    int n1 = num%10;
    int n2 = (num/10)%10;
    int n3 = num/100;
    return (n1 + n2 + n3);
}

int main(){
    int num;
    for (int i = 0; i < 3; i++){
    	printf("세 자리 숫자를 입력하세요: ");
    	scanf("%d", &num);
    	printf("%d\n", digit_sum(num));
	}
    return 0;
}

 

int digit_sum(int num){
    int n1 = num%10;
    int n2 = (num/10)%10;
    int n3 = num/100;
    return (n1 + n2 + n3);
}

 리턴형 int

 - 함수가 처리 결과로 돌려주는 값의 데이터형

 - 함수는 반드시 하나의 값만 리턴할 수 있다.

 - void: 리턴값이 없는 함수

 - 생략: int형으로 간주된다.

 

함수명 digit_sum

 - 식별자를 만드는 규칙에 따라서 만들어야 한다. (숫자로 시작하지 못한다, 띄어쓰기를 사용하지 못한다 등)

 - 이름이 같은 함수를 여러 번 정의할 수 없다.

 

매개변수의 데이터형 int

 

매개변수명(parameter) num

 - 개수에 제한이 없다.

 - 매개변수를 갖지 않을 때는 (void)로 표기한다.

 

 - 리턴값이 없는 함수는 return문을 쓰지 않아도 함수의 끝을 만나면 자동으로 리턴한다.

 - 함수를 호출할 때는 함수의 이름을 쓰고 ( ) 안에 함수의 인수(argument)를 쓴다.

 - 인수가 여러 개일 때는 " , "로 구분해서 나열한다.

 - 인수의 개수는 매개변수의 개수와 일치해야 한다.

 - 함수를 호출할 때는 함수 호출보다 앞 쪽에 함수를 정의해야 한다.

 

함수의 선언

 - 함수의 리턴형, 이름, 매개변수의 데이터형에 대한 정보만 미리 알려주는 것. 매개변수명은 생략 가능.

#include <stdio.h>
int digit_sum(int);	//함수의 선언

int main(){
    int num;
    for (int i = 0; i < 3; i++){
    	printf("세 자리 숫자를 입력하세요: ");
    	scanf("%d", &num);
    	printf("%d\n", digit_sum(num));
	}
    return 0;
}

int digit_sum(int num){
    int n1 = num%10;
    int n2 = (num/10)%10;
    int n3 = num/100;
    return (n1 + n2 + n3);
}

 

변수(variable)

 - 서로 다른 함수에서 같은 이름의 지역 변수를 선언하면, 이름만 같고 서로 다른 변수가 된다.

 - 비지역 변수의 선언문 다음에 정의된 함수에서만 비지역 변수를 사용할 수 있다. 따라서 소스 파일의 시작 부분에 선언하는 것이 좋다.

 

  지역 변수
(local)
비지역 변수
(non-local)
  지역 동적 변수 지역 정적 변수 파일범위 정적 변수 전역 정적 변수
소스 파일에서 선언 함수 내부에 그냥 함수 내부에 static 함수 외부에 static 함수 외부에 그냥
메모리 생성 시점 함수 중괄호 내부 함수 중괄호 내부 프로그램 시작 프로그램 시작
메모리 소멸 시점 함수 중괄호 내부 프로그램 종료 프로그램 종료 프로그램 종료
디폴트 초깃값
(초기화 하지 않을 시)
쓰레기값 0 0 0
사용 범위 함수 중괄호 내부 함수 중괄호 내부 선언된 소스 파일 선언된 소스 파일
외부 파일(extern 선언)

 

#include <stdio.h>
void test(void){
    int x = 0;		//지역 동적 변수
    static int y;	//지역 정적 변수
    x += 1;
    y += 1;
    printf("x값은 %d, y값은 %d\n", x, y);
}

int main(void){
    test();		// x = 1, y = 1(저장됨)
    test();		// x = 1, y = 2(저장됨)
    test();		// x = 1, y = 3(저장됨)
    return 0;
}

 - 지역 동적 변수 x: test 함수가 호출될 때마다 0으로 초기화된 후 1이 더해져서, 계속 1이 출력된다.

 - 지역 정적 변수 y: 이전 호출 종료 시의 값이 저장되어 있어, 1씩 더해진다.

 

 

https://dojang.io/mod/page/view.php?id=802

 

함수의 인자(argument) 전달 방법

값에 의한 전달(call by value)

 - 함수를 호출할 때 넘겨주는 인수의 값을 매개변수로 복사해서 전달하는 방식

#include <stdio.h>
void swap(int x, int y){
    int temp = x;
    x = y;
    y = temp;
}

int main(){
    int a = 11;
    int b = 22;
    
    printf("swap 전의 a = %d, b = %d\n", a, b);
    swap(a, b);
    printf("swap 후의 a = %d, b = %d\n", a, b);
    return 0;
}

 - a와 b의 값이 교환되지 않았다.

 - 인자 a, b의 값을 복사해서 swap 함수의 매개변수로 전달하기 때문에, swap 함수 내에서 매개변수의 값을 변경해도 인자 a, b의 값은 바뀌지 않았다. (swap 함수 내에서는 복사된 값들만 변경되고, 원본인 인자 a, b는 그대로)

 

포인터에 의한 전달(call by pointer)

 - 변수의 메모리 주소를 전달하는 방식

#include <stdio.h>
int main(){
    int *pointer_num;		//포인터 변수 선언
    int num = 10;
    pointer_num = &num;		//num의 메모리 주소를 포인터 변수에 저장

    printf("포인터 변수: %d\n", pointer_num);
    printf("num의 메모리 주소: %d\n", &num);
    return 0;
}

 

#include <stdio.h>
void swap(int *x, int *y){
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main(){
    int a = 11;
    int b = 22;
   
    printf("swap 전의 a = %d, b = %d\n", a, b);
    swap(&a, &b);
    printf("swap 후의 a = %d, b = %d\n", a, b);
    return 0;
}

 - 변수의 메모리 주소를 함수에 전달하여, 함수가 메모리 주소에 접근하여 값을 변경할 수 있다.

 


 

[백준] 1598번 꼬리를 무는 숫자 나열

 

 

#include <stdio.h>
int x(int);
int y(int);
int abs(int, int);

int main(){
    int n1, n2, result;
    scanf("%d %d", &n1, &n2);
    result = abs(x(n1), x(n2)) + abs(y(n1), y(n2));
    printf("%d", result);
    return 0;
}

int x(int num){
    int result;
    if (num%4 == 0) result = num/4;
    else result = num/4 + 1;
    return result;
}

int y(int num){
    int result = num%4;
    if (result == 0) result = 4;
    return result;
}

int abs(int n1, int n2){
    int max, min;
    max = n1>n2 ? n1:n2;
    min = n1<n2 ? n1:n2;
    return (max-min);
}

 

'C언어 > C언어 이론' 카테고리의 다른 글

[C언어] 5주차 포인터  (0) 2022.05.20
[C언어] 5주차 배열과 문자열  (0) 2022.05.20
[C언어] 4주차 제어문  (0) 2022.05.14
[C언어] 3주차 연산자  (0) 2022.05.06
[C언어] 2주차  (0) 2022.04.29
Comments