배열
- 동일한 종류, 동일한 자료형의 데이터를 메모리에 일련의 구조화된 집단으로 구성한 것
배열을 사용하지 않는다면
- 각각의 값에 따라 모두 변수선언을 해야할 것
배열 선언
자료형 배열명[배열 크기];
int score[10]
int 형 변수 1개의 메모리 크기가 4byte
-> score[10]같은 경우 40바이트
index는 0번 부터 시작
배열 초기화
int a[3]; //선언
a[0] = 10;
a[1] = 15;
a[2] = 20;
int a[3]= {10, 15, 20};
// a[0] = 10
// a[1] = 15
// a[2] = 20
int a[3]= {10, 15, 20};
// a[0] = 10
// a[1] = 15
// a[2] = 0
- 선언한 배열의 원소보다 초기값을 많이 할당한 경우 => 에러
int a[3] = {10, 15, 20, 30}; // 오류
- 원소개수를 표시하지 않고 자동으로 원소가 생성되게 하는 예
int a[] = {5, 25, 18, 6, 8};
그런데 초기값을 따로 할당하는 것은 오류 발생
int a[]; a[0] = 5; a[1] = 25; a[2] = 18; // 오류
- 그림으로 알아보자.
1차원 배열
- 대괄호([]) 1개로 선언하는 배열
- 배열을 반복문과 함께 사용하면 유용
- 반복문의 초기값을 설정할 때, 배열의 원소는 0부터 시작함
Problem 1
#include <stdio.h>
int main() {
int i;
int a[] = {5, 10, 15};
for(i = 0; i<3; i++)
{
printf("a[%d] = %d\n", i, a[i]);
}
return 0;
}
// 프로세스가 시작되었습니다..
> a[0] = 5
a[1] = 10
a[2] = 15
// 프로세스가 종료되었습니다.
Problem 2
#include <stdio.h>
int main() {
int A[5] = {1,2,3,4,5};
int i, sum = 0;
double average;
for(i = 0; i < 5; i++)
sum += A[i];
average = (double)sum / i;
printf("배열 A 원소의 합은 %d다.\n",sum);
printf("배열 A 원소의 평균은 %4.2lf이다.\n",average);
return 0;
}
// 프로세스가 시작되었습니다..
> 배열 A 원소의 합은 15다.
배열 A 원소의 평균은 3.00이다.
// 프로세스가 종료되었습니다.
Problem 3
#include <stdio.h>
int main() {
int ans = 1;
int mult[] = {4, 2, 5, 1, 3};
for (int i = 0; i < 5; i++){
ans = ans*mult[i];
}
printf("제시된 모든 원소의 곱은 %d", ans);
return 0;
}
// 프로세스가 시작되었습니다..
> 제시된 모든 원소의 곱은 120
// 프로세스가 종료되었습니다.
Problem 4
#include <stdio.h>
int main() {
int input[20] = {0};
printf("배열에 저장할 정수 여러 개 입력. 0을 입력하면 입력을 종료\n");
int i = 0;
do{
scanf("%d", &input[i]);
}while(input[i++] != 0);
i = 0;
while(input[i] != 0){
printf("%d ", input[i++]);
}
printf("\n");
return 0;
}
// 프로세스가 시작되었습니다..
> 배열에 저장할 정수 여러 개 입력. 0을 입력하면 입력을 종료
1 3 5 7 9 0
1 3 5 7 9
// 프로세스가 종료되었습니다.
2차원 배열
- 연속적인 저장 공간을 선언하는 배열에서 1차원 뿐만 아니라 2차원 이상도 가능
형태
선언
int a [2][3] = {{10, 20, 30}, {40, 50, 60}};
int a [2][3] = {10, 20, 30, 40, 50, 60};
int a [][3] = {10, 20, 30, 40, 50, 60}; // True
int a [][3] = {10, 20, 30, 40}; // True
int a [2][] = {10, 20, 30, 40, 50, 60}; // False
int a [][] = {10, 20, 30, 40, 50, 60}; // False
Problem 1
#include <stdio.h>
int main() {
int i, j;
int a[2][3] = {{15, 20, 30}, {35, 40, 45}};
for(i = 0; i<2; i++)
{
for(j=0; j<3; j++)
{
printf("a[%d][%d] = %d\n", i, j, a[i][j]);
}
}
return 0;
}
// 프로세스가 시작되었습니다..
> a[0][0] = 15
a[0][1] = 20
a[0][2] = 30
a[1][0] = 35
a[1][1] = 40
a[1][2] = 45
// 프로세스가 종료되었습니다.
Problem 2
#include <stdio.h>
int main() {
int i, j, sum = 0;
int a[2][2] = {5, 20, 12, 7};
for(i = 0; i<2; i++){
for(j = 0; j <2; j++){
sum += a[i][j];
}
}
printf("2차원 배열 a의 합은 %d다.\n", sum);
return 0;
}
// 프로세스가 시작되었습니다..
> 2차원 배열 a의 합은 44다.
// 프로세스가 종료되었습니다.
Problem 3
#include <stdio.h>
int main() {
int i, j, sum = 0;
int a[][3] = {{90,80,90},
{70,100,100},
{80,90,90}};
double aveClass[3];
for(j=0; j<3;j++)
{
for(i=0; i<3; i++)
{
sum += a[i][j];
}
aveClass[j] = (double)sum / i;
if(j==0)
printf("국어 평균은 %.2lf이다.\n", aveClass[j]);
else if(j==1)
printf("영어 평균은 %.2lf이다.\n", aveClass[j]);
else if(j==2)
printf("수학 평균은 %.2lf이다.\n", aveClass[j]);
// 다음 과목의 평균을 구하기 위해서 sum을 초기화한다.
sum = 0;
}
return 0;
}
// 프로세스가 시작되었습니다..
> 국어 평균은 80.00이다.
영어 평균은 90.00이다.
수학 평균은 93.33이다.
// 프로세스가 종료되었습니다.
다차원 배열
int a[2][2][2];
int b[2][2][2][2];
Problem 1
#include <stdio.h>
int main() {
int x[2][2][5] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
int i,j,k;
for(i = 0; i<2; i++){
for(j = 0; j<2; j++){
for(k = 0; k<5; k++){
printf("x[%d][%d][%d] = %d\n",i,j,k,x[i][j][k]);
}
}
}
return 0;
}
// 프로세스가 시작되었습니다..
> x[0][0][0] = 0
x[0][0][1] = 1
x[0][0][2] = 2
x[0][0][3] = 3
x[0][0][4] = 4
x[0][1][0] = 5
x[0][1][1] = 6
x[0][1][2] = 7
x[0][1][3] = 8
x[0][1][4] = 9
x[1][0][0] = 10
x[1][0][1] = 11
x[1][0][2] = 12
x[1][0][3] = 13
x[1][0][4] = 14
x[1][1][0] = 15
x[1][1][1] = 16
x[1][1][2] = 17
x[1][1][3] = 18
x[1][1][4] = 19
// 프로세스가 종료되었습니다.
실습
Problem 1
#include <stdio.h>
int main() {
int nums[5] = {2, 19, 1, 27, 16};
int max;
for (int i = 0; i < 5; i++){
printf("nums[%d] is %d\n",i, nums[i]);
}
printf("\n");
for (int i = 0; i < 4; i++){
max = (nums[i] > nums[i+1])? nums[i]:nums[i+1];
}
printf("최대값은 %d 이다.", max);
return 0;
}
// 프로세스가 시작되었습니다..
> nums[0] is 2
nums[1] is 19
nums[2] is 1
nums[3] is 27
nums[4] is 16
최대값은 27 이다.
// 프로세스가 종료되었습니다.
Problem 2
#include <stdio.h>
int main() {
int Array[3][4] = {{10, 20, 30, 40},
{-50, -60, -70, -80},
{90, 100, 50, 50}};
int colsum[4] = {0};
int rowsum[3] = {0};
for (int i = 0; i < 3; i++){
for (int j = 0; j < 4; j++){
rowsum[i] += Array[i][j];
}
printf("%d행의 합은 %4d, 평균은 %2.3f\n", i+1, rowsum[i], (double)rowsum[i]/4);
}
printf("\n");
for (int k = 0; k < 4; k++){
for (int l = 0; l < 3; l++){
colsum[k] += Array[l][k];
}
printf("%d열의 합은 %4d, 평균은 %2.3f\n", k+1, colsum[k], (double)colsum[k]/3);
}
return 0;
}
// 프로세스가 시작되었습니다..
> 1행의 합은 100, 평균은 25.000
2행의 합은 -260, 평균은 -65.000
3행의 합은 290, 평균은 72.500
1열의 합은 50, 평균은 16.667
2열의 합은 60, 평균은 20.000
3열의 합은 10, 평균은 3.333
4열의 합은 10, 평균은 3.333
// 프로세스가 종료되었습니다.
Problem 3
#include <stdio.h>
int main() {
int x[20] = {0};
int count[10] = {0};
int max = 0;
for (int i = 0; i < 20; i++){
printf("%2d 번째 정수 : ",i+1);
scanf("%d", &x[i]);
}
for (int i = 0; i < 20; i++){
for (int j = 0; j < 10; j++){
if (x[i] == j){
count[j]++;
break;
}
}
}
for (int i = 0; i < 19; i++){
max = (count[i] > count[i+1])? count[i]: count[i+1];
}
for (int i = 0; i < 10; i++){
if (count[i] == max){
printf("정수 : %d, 최대 빈도수 : %d회\n", i+1, max);
}
}
return 0;
}
// 프로세스가 시작되었습니다..
> 1 번째 정수 : 1
2 번째 정수 : 2
3 번째 정수 : 3
4 번째 정수 : 1
5 번째 정수 : 2
6 번째 정수 : 3
7 번째 정수 : 3
8 번째 정수 : 2
9 번째 정수 : 4
10 번째 정수 : 6
11 번째 정수 : 6
12 번째 정수 : 8
13 번째 정수 : 8
14 번째 정수 : 6
15 번째 정수 : 5
16 번째 정수 : 4
17 번째 정수 : 3
18 번째 정수 : 4
19 번째 정수 : 3
20 번째 정수 : 2
정수 : 5, 최대 빈도수 : 3회
정수 : 7, 최대 빈도수 : 3회
// 프로세스가 종료되었습니다.