/* 배열 — 범위를 넘어가도 C 는 막지 않습니다
   컴파일:  gcc c-array.c -o arr -Wall
   범위 검사까지:  gcc c-array.c -o arr -Wall -fsanitize=address   */

#include <stdio.h>

/* 배열은 크기를 스스로 기억하지 못합니다. 크기를 같이 넘겨야 합니다. */
double 평균(const int 값[], int 개수)
{
    if (개수 <= 0) {
        return 0.0;
    }
    int 합 = 0;
    for (int i = 0; i < 개수; i++) {
        합 += 값[i];
    }
    return (double)합 / 개수;      /* 정수끼리 나누면 잘립니다 */
}

int main(void)
{
    int 점수[5] = {90, 85, 77, 68, 94};

    /* 선언된 함수 안에서는 이렇게 개수를 구할 수 있습니다 */
    int 개수 = (int)(sizeof(점수) / sizeof(점수[0]));
    printf("원소 개수: %d\n", 개수);

    for (int i = 0; i < 개수; i++) {
        printf("점수[%d] = %d\n", i, 점수[i]);
    }

    printf("평균: %.2f\n", 평균(점수, 개수));

    /* 최대 · 최소 찾기 — 첫 원소를 기준으로 두고 훑습니다 */
    int 최고 = 점수[0], 최저 = 점수[0];
    for (int i = 1; i < 개수; i++) {
        if (점수[i] > 최고) { 최고 = 점수[i]; }
        if (점수[i] < 최저) { 최저 = 점수[i]; }
    }
    printf("최고 %d / 최저 %d\n", 최고, 최저);

    /* 전부 0 으로 채우기 */
    int 빈배열[5] = {0};
    printf("빈배열[3] = %d\n", 빈배열[3]);

    /* 2차원 배열 — 표[행][열] */
    int 표[2][3] = { {1, 2, 3}, {4, 5, 6} };
    for (int 행 = 0; 행 < 2; 행++) {
        for (int 열 = 0; 열 < 3; 열++) {
            printf("%d ", 표[행][열]);
        }
        printf("\n");
    }

    /* ── 이 줄의 주석을 풀면 무슨 일이 일어나는지 보세요 ──
       컴파일도 되고 실행도 됩니다. 남의 메모리를 읽습니다.
       -fsanitize=address 로 컴파일하면 그 자리를 잡아 줍니다.

    printf("점수[10] = %d\n", 점수[10]);
    */

    return 0;
}
