✔ 학습목표
배열을 정의하고 사용하는 방법을 설명할 수 있다.
배열
아래와 같이 세 개의 점수를 저장하고 평균을 출력하는 프로그램을 예로 들어보자.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// Scores
int score1 = 72;
int score2 = 73;
int score3 = 33;
// Print average
printf("Average: %i\n", (score1 + score2 + score3) / 3);
}
만약 점수의 개수가 더 많아진다면 이 프로그램은 많은 부분을 수정해야 한다(변수 선언, 계산식 등). 이 때 활용할 수 있는 것이 배열이다. 배열은 같은 자료형의 데이터를 메모리상에 연이어서 저장하고 이를 하나의 변수로 관리한다. 위 코드에서 배열을 사용하면 다음과 같다.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// Scores
int scores[3];
scores[0] = 72;
scores[1] = 73;
scores[2] = 33;
// Print average
printf("Average: %i\n", (scores[0] + scores[1] + scores[2]) / 3);
}
int scores[3]; 이라는 코드는 int 자료형을 가지는 크기 3의 배열을 scores라는 이름으로 생성한다는 의미다. 배열의 인덱스는 0부터 시작하기 때문에, scores의 인덱스는 0, 1, 2 세 개가 있다. 이 인덱스를 변수명 뒤 대괄호 [] 사이에 입력하면 원하는 위치에서 값을 저장하고 불러올 수 있다.
하지만 이는 여전히 점수의 개수가 바뀌는 상황에서 제약이 많다. 배열을 보다 동적으로 사용하려면 어떻게 해야할까?
전역변수
전역변수는 코드 전반에 거쳐 바뀌지 않는 값을 지정할 때 사용한다.
#include <cs50.h>
#include <stdio.h>
const int N = 3; //전역변수 선언
int main(void)
{
// 점수 배열 선언 및 값 저장
int scores[N];
scores[0] = 72;
scores[1] = 73;
scores[2] = 33;
// 평균 점수 출력
printf("Average: %i\n", (scores[0] + scores[1] + scores[2]) / N);
}
앞선 코드에서 'const int N = 3'이 추가된 모습이다. N이 고정된 상수값이라면 그 앞에 const를 붙인다. 전역변수의 선언으로 점수 개수가 바뀌었을 때 수정해야하는 코드가 줄어들었다. 하지만 여전히 배열 인덱스마다 점수를 지정해줘야 하는 불편함이 있다.
* 관례적으로 전역변수의 이름은 대문자로 표기한다.
배열의 동적 선언 및 저장
앞선 예시보다 동적인 평균 계산 프로그램을 만들고 싶다면 다음과 같다.
#include <cs50.h>
#include <stdio.h>
float average(int length, int array[]);
int main(void)
{
// 사용자로부터 점수의 갯수 입력
int n = get_int("Scores: ");
// 점수 배열 선언 및 사용자로부터 값 입력
int scores[n];
for (int i = 0; i < n; i++)
{
scores[i] = get_int("Score %i: ", i + 1);
}
// 평균 출력
printf("Average: %.1f\n", average(n, scores));
}
//평균을 계산하는 함수
float average(int length, int array[])
{
int sum = 0;
for (int i = 0; i < length; i++)
{
sum += array[i];
}
return (float) sum / (float) length;
}
이 프로그램은 get_int()와 루프 for를 사용해 사용자에게 직접 배열의 크기와 값을 입력받고, 각 인덱스에 저장한다. 그리고 average라는 사용자 정의 함수를 따로 선언하여 평균을 구한다. 이 때 입력값은 lenth(배열의 크기)와 array[](배열)이고 출력값은 float로 나타낸 평균값이다.
이러한 방법 외에도 다양한 방법을 통해 배열을 활용한 동적인 프로그램을 작성할 수 있다.
이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.
'Programming > C' 카테고리의 다른 글
C 언어 | 문자열의 활용 (0) | 2021.02.02 |
---|---|
C 언어 | 문자열과 배열 (0) | 2021.02.02 |
C 언어 | 사용자 정의 함수와 중첩 루프 (0) | 2021.01.31 |
C 언어 | 자료형, 형식 지정자, 연산자 (0) | 2021.01.30 |
C 언어 | 조건문과 루프 (0) | 2021.01.30 |