언어 자료구조 알고리즘/디딤돌 C언어

57. 전역 변수

언제나휴일 2016. 1. 1. 12:35
반응형

 

아시는 것처럼 C언어에서는 프로그램에서 관리할 데이터를 할당하고 관리하기 위해 변수에 관한 문법을 제공하고 있죠.  

C언어에서는 프로그램의 모든 함수에서 접근할 수 있는 전역 변수와 선언한 블록에서만 접근할 수 있는 지역 변수가 있어요.
그리고 이 외에도 정적 변수와 상수화 변수를 제공하는데 이들에 관해 하나 하나 살펴봅시다.
 
전역 변수
 
C언어에서는 변수 선언을 특정 블록 내부가 아닌 외부에 선언한 변수를 전역 변수라 불러요.
그리고 전역 변수는 프로그램 시작할 때 할당하고 프로그램 끝날 때 해제하며 프로그램 전제 영역에서 접근할 수 있죠.
 
예를 들어 50명의 국어 성적을 관리하는 프로그램이 있다고 가정할게요.
그리고 프로그램에 성적을 추가, 삭제, 조회, 전체 보기 메뉴를 제공합시다.
아마도 이 프로그램에는 각 메뉴를 선택했을 때 수행하는 부분을 각각의 함수로 만드는 것이 효과적일 거예요.
 
이 때 10명의 국어 성적을 기억하는 변수를 어디에 선언하면 좋을까요?
여러가지 방법이 있겠지만 전역 변수로 선언하면 모든 함수에서 접근할 수 있어요.
#define MAX_STUDENT    10
int scores[MAX_STUDENT];
 
 
추가 기능에서는 학생 번호를 입력하여 성적을 추가할 학생을 선택하겠죠.
int num = 0;
printf("성적을 추가할 학생 번호를 입력:");
scanf_s("%d",&num);
 
그리고 학생 성적을 입력받아요.
int score = 0;
printf("성적:");
scanf_s("%d",&score);
 
학생 성적은 scores 배열에 기억할 것이므로 인덱스 연산을 사용할게요.
입력한 학생 번호에 1을 빼면 되겠네요.
그리고 인덱스 연산으로 참조한 원소에 성적을 대입하여 값을 설정해요.
scores[num-1] = score;
 
이렇게 추가 기능을 작성하면 전체 보기 기능을 선택하더라도 그 값은 유지되어 원하는 결과를 얻을 수 있어요.
 
다음은 10 명의 국어 성적을 관리하는 프로그램이예요.
프로그래밍 작성에 관해서는 뒤에서 다시 다루지만 한 번 분석해 보시고 프로그램을 작성해 보세요.
 
10 명의 국어 성적을 관리하는 프로그램
#include <stdio.h>
#pragma warning(disable:4996)
#define MAX_STUDENT        10
int scores[MAX_STUDENT];
void Init();//초기화
void Run(); //사용자와 상호 작용
char SelectMenu(); //메뉴 선택
void InputScore(); //성적 추가
void DeleteScore();//성적 삭제
void SearchScore();//성적 조회
void ListScore();  //전체 성적 보기
void ViewScore(int num);//특정 학생 성적 보기
int main()
{
    Init();
    Run();
    return 0;
}
void Init()
{
    int i = 0;
    for(i=0;i<MAX_STUDENT; i++)
    {
        scores[i] = -1;
    }
}
void Run()
{
    char key=0;
    while( (key = SelectMenu()) != 'e')
   {
        switch(key)
        {
        case 'i': InputScore();break;
        case 'd': DeleteScore();break;
        case 's': SearchScore();break;
        case 'l': ListScore();break;
        default: printf("잘못 선택하였습니다.\n"); break;
        }
    }
}
 
char SelectMenu()
{
    char key = 0;
 
    printf("[i]:성적 추가 [d]:성적 삭제 [s]:성적 조회 [l]: 전체 성적 보기\n");
    key = getchar();
    fflush(stdin);
 
    return key;
}
void InputScore()
{
    int num = 0;
 
    printf("성적을 추가할 학생 번호를 입력:");
    scanf("%d",&num);
    fflush(stdin);
 
    if((num>=1)&&(num<=MAX_STUDENT))
    {
        int score = 0;
        printf("성적:");
        scanf("%d",&score);
        fflush(stdin);
        scores[num-1] = score;
    }
    else
    {
        printf("유효하지 않은 번호입니다.\n");
    }
}
void DeleteScore()
{
    int num = 0;
 
    printf("성적을 삭제할 학생 번호를 입력:");
    scanf("%d",&num);
    fflush(stdin);
    if((num>=1)&&(num<=MAX_STUDENT))
    {
        scores[num-1] = -1;
    }
    else
    {
        printf("유효하지 않은 번호입니다.\n");
    }
}
void SearchScore()
{
    int num = 0;
    printf("성적을 조회할 학생 번호를 입력:");
    scanf("%d",&num);
    fflush(stdin);
    if((num>=1)&&(num<=MAX_STUDENT))
    {
        ViewScore(num);
    }
    else
    {
        printf("유효하지 않은 번호입니다.\n");
    }
}
void ListScore()
{
    int index = 0;
 
    for(index = 0; index < MAX_STUDENT; index++)
    {
        ViewScore(index+1);
    }
}
 
void ViewScore(int num)
{
    if(scores[num-1] != -1)
    {
        printf("[%d ]:[성적: %d]\n", num, scores[num-1]);
    }
    else
    {
        printf("[%d ]:[성적: 입력하지 않음]\n",num);
    }
}

반응형

'언어 자료구조 알고리즘 > 디딤돌 C언어' 카테고리의 다른 글

62. 도메인 분석  (0) 2016.01.01
61. 함수 만들기 실습 시나리오  (0) 2016.01.01
60. 상수화 변수  (0) 2016.01.01
59. 정적 변수  (0) 2016.01.01
58. 지역변수  (0) 2016.01.01
56. 매개변수 전달 원리  (0) 2016.01.01
55. 프로그램 동작 원리  (0) 2016.01.01
54. 프로세스 메모리 구조  (0) 2016.01.01
53. 프로그램 생명 주기  (0) 2016.01.01
52. 함수 개요  (0) 2016.01.01