Skip to main content

1.6 배열(Array)

실습 전 이론

파일을 읽어서 그 파일속에 숫자는 몇번이 나오고 빈칸은 몇개가 있는지, 그 외의 문자들은 몇개인지 세는 프로그램을 작성하려면

하나하나 변수를 지정해야했다. 변수를 하나씩 지정하는 것보다는 배열을 사용하는게 더 좋다고 한다.

확실히 어떤 기능, 문법을 배우려면 그 문법을 배우기 전에 제일 불편하게 일일히 프로그램을 만들어보는게 좋은것 같다.

예제 풀면서도 하 C는 이런거 어떻게 쓰지 하면서 답답해했었다.


실습

아래 코드는 파일을 읽고 문자를 분류해 각각 몇개인지 확인하는 프로그램이다.

#include <stdio.h>


int main(){
    int c, i, nwhite, nother;
    int ndigit[10];
    nwhite = nother = 0;

    /*배열 안에 요소들을 0으로 지정해주나봄; 이거 일일히 해야되는구나; */
    for (i = 0; i < 10; ++i)
        ndigit[i] = 0;

    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9'){
            ++ndigit[c-'0'];
        }
        else if (c == ' ' || c == '\n' || c == '\t'){
            ++nwhite;
        }
        else {
            ++nother;
        }

        printf("digits = ");

        for(i = 0; i < 10; ++i){
            printf(" %d", ndigit[i]);
        }
        printf(", white space = %d, other = %d\n", nwhite, nother);
}
int ndigit[10];

위 선언이 배열변수 선언이다.

ndigit[0] 부터 ndigit[9] 까지 각각 독립된 변수를 사용할 수 있다.

여기서 0~9를 첨자라고 하고, 첨자의 시작은 0이다.

(c >= '0' && c <= '9')

위 코드는 읽어들인 문자가 숫자인지 아닌지를 검사하는 부분이다.

0부터 9안에 포함이 되어있으면 ++ndigit[c-'0']; 코드가 실행된다. (? 이부분 이해가 안된다.)

image.png

잘 생각해보라고 한다.

그리고 책에서의 설명

C에서 char 와 int 형이 섞여있는 계산을할때 모든변수는 int형으로 바뀌게된다는것은 앞에서 설명한바와 같다.
그래서c가‘1’이라고 할때 c의 실제값은 1이아니고 문자 1의ascii값이된다.
(물론ascii 외의 다른 문자체계를시용하는컴퓨터의경우는 그 문자체계에 맞는값이 된다). 
그래서c에서'0'을빼야 원하는숫자가나오는것이다.
이 숫자(0~9의값이된다)가배열의첨자로사용되고 있다.

생각을 해보고 ascii 코드를 찾아봤다.

image.png

왼쪽부터 10진수 16진수 문자 라고 보면되고, 설명의 중점은

우리가 입력값에 "안녕하세요 저는 3을 좋아합니다. 로 넣었을때, 우리는 문장속에서 숫자 값을 인식하고 찾아야 한다.

(c >= '0' && c <= '9') 코드에서 c 에 "3" 이 들어왔을때, 문자열을 캐치하고

ndigit[3] 에 우리는 1을 더해주어야 한다. (++ndigit[c-'0']; 부분)

그치만 ndigit[c] 를 할 경우 c에는 문자열이 3이 들어가있고 해당 문자열은 ascii에서 십진수 51로 표현된다. (위의 표 참고)

그러면 우리는 51을 3으로 바꿔줘야하는데 51 - 48 = 3 , 48은 ascii에서 문자열 0을 뜻한다.

그리고 ascii 문자로써 사용하려면 작은 따옴표를 사용해야하기 때문에

c - '0' = 3이 되고

3이 발견될 때마다

ndigit[3] 의 값에 1씩 추가된다.


후 말이 좀 복잡해졌는데 그래도 너무 재밌네;


다른 nwhite 라던가 nother 부분은 이전에 배웠던 부분으로 설명이 되니 넘어간다.


실습 후 이론