문제 1292. -- [함수6] 전역변수와 지역변수를 이용한 함수

1292: [함수6] 전역변수와 지역변수를 이용한 함수

시간제한: 1 Sec  메모리제한: 128 MB
제출: 150  푼문제수: 77
1위 : gshs340112
[제출][채점상황][게시판][문제추가 : admin]

문제설명

 함수라는 것은 보통 자신만의 영역을 가지고 있다.

이게 무슨말이야 하면

함수속에 정의한 변수는 그 함수 영역에서만 사용가능하다는 것이다.

보통 그 영역을 나누는 것은 중괄호{   }를 통해 이루어 지게 된다.

예를 들어

#include<stdio.h>

int main(){

   int n=3;

   printf("%d ", n);

  {

      int n =5;

      printf("%d ",n);

   }

   printf("%d", n);

}

이렇게 실행하면 결과는 3 5 3이 출력된다.

왜 그런가 하면 순차적으로 실행했을 경우 첫번째 출력에서는 당연히 먼저 실행되는 것이 n=3이기 때문에

3을 출력한다.

 두번째 출력에서 보면 int n = 5; 가  중괄호{                } 속에 정의되어 있기 때문에

포함되 영역으로 보면 int n=3; 보다 int n =5를 먼저 확인하게 된다. 그래서 5가 출력된다.

 만약에 int n =5 가 없다면 자신의 영역을 벗어나 더 큰 영역에서 n이 있는지 찾게 된다.

 세번째 출력에서 보면 자신이 포함된 영역은 int n=3;이 보이는 영역이다. 따라서 3이 출력된다.

그림으로 보면 다음과 같다.

결국 변수라는 것은 영역속에서만 참고할 수 있게 된다.

이때 특정영역에 속하지 않는 변수를 만들 수 있게 되는데 이러한 변수를 전역변수(global variable)라고 하고

영역에 속해 있는 변수는 지역변수(local variable)라 한다.

전역변수의 예는 다음과 같다.(전역변수는 초기화 하지 않아도 자동으로 0으로 값이 설정된다.)

#include<stdio.h>

int n;

void fun(){

    printf("%d ",n);

    n = 5;

}

int main(){

     n =3;

    fun();

    printf("%d ", n);

   return 0;

}

출력결과는 : 3 5

이럴경우 실행결과는 int n 변수는 전역변수이기 때문에 어느 함수에서도 참조할 수 있게 된다.

따라서 main()에서 n=3을 실행하면 n이 main()함수에 없기 때문에 더 큰 영역에서 찾아 값을 할당한다.

그리고 fun()함수를 호출하게 되고 fun()함수에서 n을 출력하니 n이 fun()함수에 없기 때문에

더 큰 영역에 있는 n의 값을 출력하고 n을 5로 변경하고 fun()함수는 종료되고 다시 main()함수로 와서

n을 출력하면 fun()함수에서 변경 했기 때문에 출력은 5가 된다.

그림으로 보면 다음과 같다. 

다음 내용은 중요하니 잘 보기 바랍니다.

이러한 변수의 영역으로 인해

함수를 호출할 때 넘겨주는 (실)매개변수는 호출하는 쪽 영역의 변수이기 때문에 

함수의 정의부분에 있는 (형식)매개변수와 이름이 같더라도 두 변수는 전혀 다른 변수이다.

대신 호출하는 쪽에서 변수에 들어 값을 복사하여 값을 넘겨주는 개념으로 생각하면 된다.

예를 들어

void sum(int a){

  printf("%d",a);

  a= 5;

}

int main(){

   int a =3;

   sum(a);

   printf("%d",a);

}

a가 같다고 해서 sum()함수에서 a를 변경해도 main()의 a는 변경되지 않는다.


자 그러면 지금부터 전역변수를 이용하여 주어진 문제를 푸는 함수를 만들어 봅시다.

상황은 다음과 같다.

1. 전역변수 int n; 로 정의되어 있습니다.

2. main() 함수에서 전역변수 n에 값을 입력받습니다. 

3. 그리고 사용자가 만든 함수를 호출합니다. (반환값, 매개변수 없음, 함수이름 globalfun )

4.  호출된 함수는 전역변수를 이용하여 입력된 n을 n번 출력한다.

함수호출
 #include<stdio.h>
int n;
void globalfun();
int main(){
   scanf("%d",&n);
   globalfun();
   return 0;
}

입력

 하나의 정수 n이 입력된다. ( 1<=n<=1000인 양의정수)

출력

 입력된 n을 공백으로 구분하여 n번 출력한다.

입력예시

3

출력예시

3 3 3

도움말

출처

[제출][채점상황][게시판]