배열의 정의

같은 종류의 많은 자료를 하나의 이름으로 저장하는 연속된 기억장소

 

 

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++)으로 수정해야한다. 

'프로그래밍 > C,C++' 카테고리의 다른 글

인수 전달하지 않는 함수  (0) 2024.05.27
자료 배열 2 (9장)  (0) 2024.05.27
C,C++ - 제어문 (while, do~while문)  (0) 2024.04.08
C,C++ - 반복문  (0) 2024.04.03
C,C++ -switch문  (1) 2024.04.03

+ Recent posts