#include <Turboc.h>
void main()
{
int arScore[5];
int i;
int sum;
for (i=0;i<sizeof(arScore)/sizeof(arScore[0]);i++) {
printf("%d번 학생의 성적을 입력하세요 : ",i+1);
scanf("%d",&arScore[i]);
}
sum=0;
for (i=0;i<sizeof(arScore)/sizeof(arScore[0]);i++) {
sum+=arScore[i];
}
printf("\n총점은 %d점이고 평균은 %d점입니다.\n",
sum,sum/(sizeof(arScore)/sizeof(arScore[0])));
}
실행해 보자. 성적 다섯 개를 입력하면 입력된 성적의 통계치를 구해 출력한다.
1번 학생의 성적을 입력하세요 : 78
2번 학생의 성적을 입력하세요 : 85
3번 학생의 성적을 입력하세요 : 69
4번 학생의 성적을 입력하세요 : 92
5번 학생의 성적을 입력하세요 : 70
총점은 394점이고 평균은 78점입니다.
학생수가 5명이므로 점수 배열 arScore의 크기도 5로 선언했다. i 제어변수로 0~4까지 루프를 돌며 학생 5명의 점수를 입력받아 arScore 배열에 저장한다. 학생 번호는 배열의 첨자 번호보다 항상 1더 크므로 입력 요구 메시지의 학생 번호는 i+1이어야 한다. 그렇지 않으면 있지도 않은 0번 학생의 성적을 입력하라는 메시지가 출력될 것이다.
5명의 성적을 입력받은 후 다시 루프를 돌면서 arScore 배열 요소의 총합을 구했다. 총합이 구해지면 평균은 총 학생수(=배열 크기)로 나누어 쉽게 구할 수 있다. 물론 이 예제의 경우 합계와 평균만 구하므로 배열을 쓸 필요없이 입력받는 족족 합계에 누적할 수도 있다. 하지만 입력받은 성적을 배열에 일단 저장해 놓으면 총합, 평균 뿐만 아니라 최대값, 최소값, 석차, 분산, 편차 등의 다양한 통계치를 구할 수 있게 된다.
이 예제는 앞에서 말한 sizeof 연산자로 배열 크기를 구해 그 크기만큼 루프를 돌고 총점을 나누고 있는데 그냥 5라고 바로 써도 일단은 상관없다. for (i=0;i<5;i++) 이라고 쓰는 것이 훨씬 더 짧고 간단해 보인다. 만약 이 예제를 확장해서 5명이 아닌 20명의 성적을 입력받도록 하고 싶다고 해 보자. 그러면 arScore의 크기를 20으로 늘리는 것뿐만 아니라 루프에 사용된 배열 크기와 총점을 나누는 제수도 다 20으로 바꿔야 할 것이다.
이 예제는 배열 크기를 세 군데서 참조하고 코드가 짧으니 수작업으로 편집할만 하겠지만 코드가 길어져서 배열 크기를 29군데서 참조하고 있다면 정말 끔직할 것이다. 실수로 하나를 수정하지 않고 5로 남겨 두면 불일치가 발생하여 오동작할 것이다. 그래서 내가 이미 배열 크기를 알고 있지만 sizeof 연산자로 배열 크기를 계산하는 것이다. 이렇게 해 두면 배열 크기가 바뀔 때 배열 선언문만 바꾸고 나머지 뒷처리는 컴파일러에게 맡겨 두면 된다.
from winapi.co.kr
'Other Programming > C C++' 카테고리의 다른 글
[C] void 포인터 / NULL 포인터 (0) | 2009.05.03 |
---|---|
[C] C는 포인터에 대한 증감 연산을 산술 연산과는 달리 아주 특수하게 수행한다. /포인터 연산 (0) | 2009.05.03 |
[C] AlphaNum 문제 (0) | 2009.04.29 |
[C] 배열명이 단독으로 사용되면 배열의 시작번지값을 가지는 포인터 상수이다. /배열명이 그 자체로 포인터이므로 scanf의 인수로 넘길 때 &연산자를 붙이지 않는다 (0) | 2009.04.29 |
[C/C++] ::변수 C#의 this 키워드와 비슷한 개념이라고 보면 될듯 / 지역변수 전역변수 구분 (0) | 2009.04.28 |
[C] Turboc 터보c 터보씨 헤더파일 닷넷 추가 디렉토리 참고 / turboc.h 파일 포함 (0) | 2009.04.28 |
[C] entern (0) | 2009.04.28 |
[C] #define 전처리문 예제 (0) | 2009.04.28 |