[CS50] 3. 배열

찐새·2022년 2월 24일
0

CS50

목록 보기
4/6
post-thumbnail

(1) 배열(Array)

하나 이상의 값이 있고, 그 값들이 서로 연관 있다면 배열(array)을 사용할 수 있다. 대개 대괄호[ ]를 이용해 표현하며, 자료형이 모두 같은 변수들을 하나의 변수에 담는다. 예를 들어, 성적 평균을 계산하는 코드를 구현했을 때 배열을 사용하지 않으면 각각 성적 변수를 입력해야 한다.

#include <stdio.h>

int main(void)
{
    int korean = 72;
    int math = 73;
    int english = 33;

    printf("Average: %i\n", (korean + math + english) / 3);
}

이 코드는 많은 문제점이 존재한다. 새로운 과목이 추가될 때마다 변수를 일일이 입력해야 하고, 나누는 과목 개수 또한 매번 건드려야 하기 때문이다. 하나씩 고쳐보면, 변수에 배열을 선언하고 과목 개수를 변수로 빼서 숫자 대신 변수를 넣는다. 배열은 인덱스(index)를 가지고 있어 반복문을 사용해 계산할 수 있다.

#include <stdio.h>

int main(void)
{   
	int n = 3; // 과목 개수

    int scores[n];
    scores[0] = 72;
    scores[1] = 73;
    scores[2] = 33;
	
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += scores[i];
    }

    printf("Average: %i\n", (sum) / n);
}

이전보다 수정이 쉬워졌지만, 여전히 과목이 늘면 scores[ ]도 늘려줘야 한다. 실행할 때 입력값을 받는 부분을 추가하면 필요한 만큼 과목과 점수를 늘릴 수 있다.

#include <cs50.h>
#include <stdio.h>

int main(void)
{   
    int n = get_int("Scores: ");

    int scores[n];
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        scores[i] = get_int("Score: ");
        sum += scores[i];
    }
    printf("\n");

    printf("Average: %i\n", (sum) / n);
}

몇 개의 과목과 점수를 입력하든 괜찮지만, 결괏값이 마음에 안 든다. 변수을 모두 정수로 선언한 탓에 소수가 계산되지 않는다. 이때는 더 큰 자료형으로 계산하면 해결된다. 예를 들어, float과 int를 나누면 결괏값은 float이 된다. 둘 다 4바이트지만, float은 소숫점 아래까지 표현할 수 있어 파워가 더 강하기 때문이다. 출력 부분만 printf("Average: %0.1f\n", ((float) sum) / n);으로 바꿔준다. 결괏값이 float이고, 소숫점 아래 한 자리 표현을 위해 %0.1f으로 수정했다.


(2) 문자열

문자열은 문자의 배열로, string이라는 자료형을 사용한다. 단일 문자인 char의 배열이 저장되어 있다. string은 특이하게 문자 맨 끝에 보이지 않지만 \0을 가지고 있는데, 이는 해당 문자열의 종단을 알려준다. 때문에 string의 메모리 크기는 총 길이 + 1Byte가 된다.

#include <cs50.h>
#include <stdio.h>

int main(void)
{   
    string names[4];

    names[0] = "EMMA";
    names[1] = "RODRIGO";
    names[2] = "BRIAN";
    names[3] = "DAVID";

    printf("%s\n", names[0]);
    printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[0][3]);
}

출력한 EMMA는 4글자지만, printf("%i\n", names[0][4]);으로 5번째를 출력하면 위에서 언급한 '0'이 나온다. 여기서 정말 신기했던 것은 printf("%i\n", names[0][400]);도 출력이 된다는 점이었다. 결괏값은 -3이 나온다.

왜 그런고 하니, index는 해당 값의 주소이며, 이를 이용해 다차원 배열을 생성할 수 있다. name[0][400]은 name[0]이라는 x에서 y가 400만큼 떨어진 곳을 가리키는데, 그 메모리에 저장된 값이 -3인 듯했다. 이런 식으로 위치만 정해주면 컴퓨터의 메모리를 탐색할 수 있다고 한다.

profile
프론트엔드 개발자가 되고 싶다

0개의 댓글