배열의 정의
같은 종류의 많은 자료를 하나의 이름으로 저장하는 연속된 기억장소
1차원 배열 예시
//선언//
double avg[1000];
int age[5];
//선언과 동시에 초기화//
int d[6] = { 31, 28, 31, 30, 31, 30 };
int sum[100] = { 0 }; // 첫 원소에는 0으로, 부족한 초깃값은 무조건 0으로 초기화//
int a[] = {1, 2, 3, 4, 5}
여기서 주의해야할 점이 있다.
int sum[100] = {1}
만약 위와 같이 입력이 된다면 어떻게 될까? {1}이라면 첫 원소는 1로, 부족한 값은 0으로 초기화한다.
또, int a[ ] 만 입력해도 오류가 뜨기에 조심해야한다.
반드시 int a[] = {숫자, 숫자, 숫자, 숫자 ...} 의 형식으로 써야한다.
//원소 참소(사용)//
printf("%d, %d, %d, %d, %d, %d \n", d[0], d[1], d[2], d[3], d[4], d[5]);
scanf("%d", &d[4]);
위와 같이 원소를 참조할 때 사용하는 [ ] 안의 첨자는 해당 원소가 배열 시작 위치로부터 몇 개 뒤의 원소인지를 의미함.
반복문을 이용한 배열처리
다음과 같이 코드를 만들어서 배열 안에 들어있는 값을 출력할 수 있으나,
int mid[4] = { 45, 37, 48, 26 };
printf("%d점 \n", mid[0]);
printf("%d점 \n", mid[1]);
printf("%d점 \n", mid[2]);
printf("%d점 \n", mid[3]);
자료의 개수가 100, 1000개 넘어가는 대량의 경우에는 굉장히 비효율적인 코드가 되기에
앞으로 반복문을 사용하여 배열을 처리하고자 한다.
그리하여 위의 코드를 반복문을 사용하여 표현하면 다음과 같다.
for (i = 0; i < 4; i++)
{
printf("%d점 \n", mid[i]);
}
매크로 상수 정의를 통한 효율적인 배열 처리
지금까지 사용한 #include<stdio.h>는 전처리기 지시자로 이는 프로그램에서 사용하는 라이브러리 함수에 필요한 헤더파일을 전처리기 지시자 자리에 포함하기 위한 것이다.
이와 비슷하게 앞으로 배열을 다루는 코딩에서는 #define 전처리기 지시자를 사용하여 배열의 크기(원소 개수)를 매크로 상수로 정의해서 사용하는 것이 필수적이다.
다음의 예시를 보자.
#include <stdio.h>
#define N 4
int main()
{
int mid[N] = { 45, 37, 48, 26 }, i;
for (i = 0; i < N; i++)
{
printf("%d점 \n", mid[i]);
}
return 0;
}
여기서 stdio.h 밑에 define N 4로 코드가 적혀있는데 이것이 의미하는 것이 밑에 int main() 안에 있는 코드에서 사용되는 N은 무조건 4로 입력된다는 얘기이다. 그 말은 만약 배열의 크기가 4에서 10으로 바뀐다면 그저 #define N 4를 #define N 10으로 고쳐주면 된다는 얘기이다.
매크로 상수 이름은 모두 대문자를 사용하는 것이 관습이다.
# 주의! 매크로 상수는 C명령문이 아니므로 끝에 ;을 넣지 않는다!!!
예시를 통해서 학습하기
1월 ~ 12월 열두 달 중 31일까지 있는 달만 출력하기 (조건에 맞는 원소만 출력하기)
#include <stdio.h>
#pragma warning (disable: 4996)
#pragma warning (disable: 6031)
#define N 12
int main()
{
int days[N] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, i;
printf("31일까지 있는 달은");
for (i = 0; i < N; i++)
{
if (days[i] == 31)
printf(" %d월", i + 1);
}
printf("입니다.");
return 0;
}
수강생 20명의 학년별 인원수 구하기(조건에 맞는 원소 개수 구하기)
#include <stdio.h>
#pragma warning (disable: 4996)
#pragma warning (disable: 6031)
#define N 20
int main()
{
int year[N] = { 1, 2, 2, 3, 4, 2, 3, 1, 3, 4, 2, 3, 3, 2, 3, 4, 3, 2, 2, 3 };
int cnt1, cnt2, cnt3, cnt4, i;
cnt1 = cnt2 = cnt3 = cnt4 = 0;
for (i = 0; i < N; i++)
{
switch (year[i])
{
case 1: ++cnt1; break;
case 2: ++cnt2; break;
case 3: ++cnt3; break;
case 4: ++cnt4; break;
}
}
printf("%d학년: %d명\n", 1, cnt1);
printf("%d학년: %d명\n", 2, cnt2);
printf("%d학년: %d명\n", 3, cnt3);
printf("%d학년: %d명\n", 4, cnt4);
return 0;
}
배열의 평균과 중앙값 구하기 (직장인 11명의 평균 급여와 중앙값 구하기)
#include <stdio.h>
#pragma warning (disable: 4996)
#pragma warning (disable: 6031)
#define N 11
int main()
{
int pay[N] = { 1500, 675, 400, 375, 320, 315, 270, 235, 200, 170, 150 };
int sum, mid, i;
double median, avg_pay;
sum = 0;
for (i = 0; i < N; i++)
{
sum += pay[i];
}
avg_pay = (double) sum / 11;
mid = N / 2;
if (N % 2 == 0)
{
median = (pay[mid - 1] + pay[mid]) / 2.0;
}
else
{
median = pay[mid];
}
printf("평균 급여: %.1lf만원\n", avg_pay);
printf("중앙값 급여: %.1lf만원", median);
return 0;
}
판매가 5개 중 최저가 구하기
#include <stdio.h>
#pragma warning(disable: 4996)
#pragma warning(disable: 6031)
#define N 5
int main()
{
int i, min, cost[N] = { 9500, 9350, 9450, 9100, 9300 };
printf("5곳의 판매가: ");
min = cost[0];
for (i = 1; i < N; ++i)
{
printf("%d ", cost[i]);
if (cost[i] < min)
{
min = cost[i];
}
}
printf("최저가: %d", min);
return 0;
}
수험번호를 입력하여 합격 여부 확인하기
int main()
{
int i, input_no;
int pass_no[N] = { 3011, 2011, 4012, 2014, 3017, 4004, 3004, 2007, 4026, 3019 };
printf("확인할 수험번호 입력 : ");
scanf("%d", &input_no);
for (i = 0; i < N; i++)
{
if (pass_no[i] == input_no)
{
break;
}
}
if (i < N)
{
printf("%d번은 합격입니다.", input_no);
}
else
{
printf("%d번은 불합격입니다.", input_no);
}
return 0;
}
배열에서 많이 하는 실수
잘못된 예 |
이유와 해결 |
int mid[5]; mid = {94, 53, 31, 56, 97}; |
int mid[5] = {94, 53, 31, 56, 97}; 선언과 동시에 초기화!
for 문을 이용하여 각 원소의 값을 입력받거나 대입문 5개를 사용해 해결 가능하다. |
printf("%d점 \n", mid); |
반복문을 사용하여 mid[0] ~ mid[4]까지 각 원소 출력을 반복해야한다.
for (i = 0; i < 5; i++) { printf("%d점 \n", mid[i])'; } |
int i, a[ ] = {92, 89, 73};
for (i = 1; i <= 3; i++) printf("%d점 ", a[i]); |
결과가 이상하게 나온다. 배열 원소 첨자는 항상 0부터 시작!! 그렇기에 for(i = 0; i < 3; i++)으로 수정해야한다. |