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']; 코드가 실행된다. (? 이부분 이해가 안된다.)
잘 생각해보라고 한다.
그리고 책에서의 설명
C에서 char 와 int 형이 섞여있는 계산을할때 모든변수는 int형으로 바뀌게된다는것은 앞에서 설명한바와 같다.
그래서c가‘1’이라고 할때 c의 실제값은 1이아니고 문자 1의ascii값이된다.
(물론ascii 외의 다른 문자체계를시용하는컴퓨터의경우는 그 문자체계에 맞는값이 된다).
그래서c에서'0'을빼야 원하는숫자가나오는것이다.
이 숫자(0~9의값이된다)가배열의첨자로사용되고 있다.
생각을 해보고 ascii 코드를 찾아봤다.
왼쪽부터 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 부분은 이전에 배웠던 부분으로 설명이 되니 넘어간다.
실습 후 이론


No comments to display
No comments to display