< 배열 이해하기 >
> 배열 (array) 의 개념
1) 배열이란?
(1) 동일한 자료형 여러 개를 묶어서 처리하는 자료구조
(2) 변수이름과 인덱스 (index) 를 이용하여 데이터를 표현
2) 배열의 필요성
- 동일한 자료형 여러 개를 선언하는 경우 변수가 여러 개 필요
- 배열을 이용하면 하나의 변수만 필요하여 효율적인 프로그래밍 가능
> 배열 사용하기
1) 배열 선언 방법
(1) 배열 선언과 동시에 배열의 값들을 저장하는 방법
int a[5] = {1, 2, 3, 4, 5};
***
int : 배열의 자료형
a : 배열 이름 (배열의 변수 이름)
[5] : 배열의 크기 / [ ] 배열의 크기 생략 가능
{1, 2, 3, 4, 5} : 배열의 값들 / 배열 크기 생략시 배열에 저장될 값들의 개수로 배열 크기가 결정됨
(2) 배열 선언과 별도로 배열의 값들을 저장하는 방법
int a[5];
* 우선 배열만 선언된 상태에서는 배열 요소에 쓰레기 값들이 들어 있음.
쓰레기(garbage) 값 : 변수나 배열을 선언하면 메모리에 공간을 확보만 한 상태로 초기값이 저장되지 않아 기존에 메모리에 남아있는 알 수 없는 값
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
a[4] = 5;
* 각각의 배열 요소에 초기값을 지정
2) 배열의 크기
(1) 배열의 크기 지정
- 정수(양수) 값을 가지는 변수 또는 상수값으로 지정
- #define 문의 상수를 이용하여 지정
- 한번 만들어진 배열의 크기는 변경할 수 없음
#include <stdio.h>
int main(void)
{
// 정수형 상수 이용
int a[5];
// 정수형 변수 이용
int size = 5;
int a[size];
// #define 상수 이용
#define SIZE 5
int a[SIZE];
return 0;
}
(2) 배열의 크기를 초과하여 사용하지 않기
int a[5] = {1, 2, 3, 4}; // 4개의 값만 지정 a[4] = 0
int a[5] = {1, 2, 3, 4, 5}; // a[5]는 존재하지 않아 오류발생
< 배열 활용하기 >
> 배열과 반복문 사용하기
1) 배열과 반복문의 관계
(1) 배열의 인덱스 값은 0부터 순차적으로 증가함
(2) 반복문을 이용하면 인덱스 값을 순차적으로 증가할 수 있음
#include <stdio.h>
int main(void)
{
// 배열의 값을 화면에 출력
int a[5] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < 5; i++)
{
printf("%d\n", a[i]);
}
return 0;
}
2) 배열과 반복문의 예
(1) 배열의 요소값 저장하기
int a[5];
for (int i = 0; i < 5; i++)
{
a[i] = (i + 1) * 10;
}
(2) 배열의 합계와 평균 구하기
#include <stdio.h>
int main(void)
{
int a[5] = { 34, 10, 25, 71, 80 };
int sum = 0;
for (int i = 0; i < 5; i++)
{
sum += a[i];
}
printf("합계 : %d, 평균 : %d", sum, sum / 5);
return 0;
}
> 배열과 반복문 실습
#include <stdio.h>
#define SIZE 5
int main(void)
{
// 배열 선언 및 초기화
int a[5] = { 1, 2, 3, 4, 5 }; // 정수형 상수 이용
int b[SIZE] = { 1, 2, 3, 4, 5 }; // #define 상수 이용
int c[] = { 1, 2, 3, 4, 5 }; // 배열크기 미지정
int d[5]; // 배열선언과 값지정을 별도로 하기
d[0] = 1;
d[1] = 2;
d[2] = 3;
d[3] = 4;
d[4] = 5;
int e[5] = { 1, 2, 3, 4 }; // 배열의 크기보다 작게 배정 e[4]는 0임.
// int f[5] = { 1, 2, 3, 4, 5, 6 }; // 배열의 크기보다 크게 값을 배정 오류
// 배열의 값 출력하기
for (int i = 0; i < 5; i++)
{
printf("a[%d] = %d\n", i, a[i]);
}
// 배열의 값 지정하기
for (int i = 0; i < SIZE; i++)
{
b[i] = (i + 1) * 10;
}
for (int i = 0; i < SIZE; i++)
{
printf("b[%d] = %d\n", i, b[i]);
}
// 배열의 합계와 평균 구하기
int arr[SIZE] = { 34, 10, 25, 71, 80 };
int sum = 0;
for (int i = 0; i < SIZE; i++)
{
sum += arr[i];
}
printf("합계 = %d, 평균 = %d\n", sum, sum / SIZE);
// 2개 배열의 합계 배열 만들기
int arr1[SIZE] = { 12, 32, 76, 51, 49 };
int arr2[SIZE] = { 34, 56, 29, 54, 21 };
int arr3[SIZE];
for (int i = 0; i < SIZE; i++)
{
arr3[i] = arr1[i] + arr2[i];
}
for (int i = 0; i < SIZE; i++)
{
printf("%d + %d = %d\n", arr1[i], arr2[i], arr3[i]);
}
// 입력받은 값의 짝수와 홀수의 합계 계산하기, 0 입력 종료
int total[2] = { 0, 0 };
int input;
do
{
printf("숫자입력 = ");
scanf_s("%d", &input);
total[input % 2] += input;
} while (input != 0);
printf("짝수의 합 = %d, 홀수의 합 = %d\n", total[0], total[1]);
return 0;
}
> 배열과 문자열 사용하기
1) 배열과 문자열의 관계
(1) 배열은 문자열을 저장할 수 있음
(2) 문자열 마지막에 널 (NULL) 문자 ('\0') 가 자동을 대입됨
- 문자열의 크기 = 문자의 개수 + 1
- 널문자는 문자열의 마지막을 표시함
char a[5] = "good";
'g' | 'o' | 'o' | 'd' | '\0' |
a[0] | a[1] | a[2] | a[3] | a[4] |
2) 문자열 배열 선언하기
(1) 문자형 배열 선언과 동시에 문자열을 지정하는 방법
char a[5] = "good"; // 문자열 지정
char a[5] = {'g', 'o', 'o', 'd', '\0'}; // 배열 요소에 각각 지정
(2) 문자형 배열 선언과 문자열 지정을 별도로 지정하는 방법
char a[5]; // 문자형 배열 변수 a 선언 이후
a[0] = 'g'; // 각각의 배열요소에 문자를 지정하는 방법
a[1] = 'o';
a[2] = 'o';
a[3] = 'd';
a[4] = '\0';
char a[5];
a = good; // 별도로 한번에 문자를 지정하는 방식은 오류
3) 문자형 배열 출력하기
(1) 문자형 배열 이름을 대표로 사용함 (인덱스 사용 안 함)
(2) 형식문자 %s 사용
(3) 배열의 크기보다 큰 문자열은 깨짐
char a[5] = "good";
printf("%s\n", a); // good
char b[5] = "good~";
printf("%s\n", b); // good~儆儆儆儆儆儆儆儆儆儆儆?峯?r
4) 문자형 배열에 문자열 입력 받기
(1) 문자형 배열 이름을 대표로 사용함 (인덱스 사용 안 함)
(2) 문자형 배열 이름 앞에 & 기호를 사용하지 않음
(3) 형식문자 %s 사용
char a[10];
scanf_s("%s", a, sizeof(a));
***
a[10] : 입력문자수는 9개까지 허용
a : 문자형 배열 이름만 사용, & 기호 사용하지 않음
sizeof(a) : 전체 배열 크기 지정
5) 문자형 배열에 입력받은 문자의 개수 구하기
- 문자열의 마지막에 널문자 ('\0') 를 이용
char a[10];
scanf_s("%s", a, sizeof(a));
int cnt = 0;
while (a[cnt] != '\0')
{
cnt++;
}
printf("count = %d", cnt);
* 문자열 입력받은 이후, 배열의 인덱스로 사용할 변수 초기값 0 지정
문자형 배열 값이 널(NULL) 값이 아니면 참, 거짓이면 문자열의 끝을 찾은 것임
배열의 인덱스 1 증가, 문자의 개수 출력
> 배열과 문자열 실습
#include <stdio.h>
int main(void)
{
char a[5] = "good";
char b[5] = { 'g', 'o', 'o', 'd', '\0' };
char c[5];
c[0] = 'g';
c[1] = 'o';
c[2] = 'o';
c[3] = 'd';
c[4] = '\0';
//char d[5] = "good~"; // 쓰레기값
// 입력받은 문자열의 문자 개수 출력
char input[10];
printf("문자열 입력 = ");
scanf_s("%s", input, sizeof(input));
printf("입력된 문자 = %s\n", input);
int cnt = 0;
while (input[cnt] != '\0')
{
cnt++;
}
printf("입력받은 문자의 개수 = %d\n", cnt);
// 입력받은 문자열을 거꾸로 출력하기
int length = cnt; // 입력받은 문자의 개수
char rev[10];
rev[length] = input[length];
for (int i = 0; i < length; i++)
{
rev[i] = input[length - i - 1];
}
printf("거꾸로 출력 = %s\n", rev);
return 0;
}
< 다차원 배열 이해하기 >
> 다차원 배열의 개요
- 다차원 배열이란?
(1) 2차원 배열 이상
(2) 종류 : 2차원 배열, 3차원 배열, 4차원 배열, N차원 배열
- 1차원 배열 : 행 1개, 열 N개 (배열이름 [열])
- 2차원 배열 : 행 N개, 열 N개 (배열이름 [행] [열])
- 3차원 배열 : 층 N개, 행 N개, 열 N개 (배열이름 [층] [행] [열])
> 2차원 배열
1) 2차원 배열의 선언과 초기값
- 행과 열의 크기 지정, 행과 열의 인덱스를 이용하여 초기값 지정
int a [3][4];
- 2 차원 배열 선언과 초기값 지정을 별도로 하는 법
a[0][0] = 1;
a[0][1] = 2;
...
a[2][3] = 12;
- 2 차원 배열 선언과 초기값 지정을 동시에 하는 법
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
};
[0] [0] | [0] [1] | [0] [2] | [0] [3] |
[1] [0] | [1] [1] | [1] [2] | [1] [3] |
[2] [0] | [2] [1] | [2] [2] | [2] [3] |
2) 2 차원 배열 출력하기
#include <stdio.h>
int main(void)
{
int a[3][4] =
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
for (int row = 0; row < 3; row++) // 행 반복 row 변수 0 ~ 2까지 반복
{
for (int col = 0; col < 4; col++) // 열 반복 col 변수 0 ~ 3까지 반복
{
printf("[%d][%d]=%d\n", row, col, a[row][col]);
}
}
/*
[0][0]=1
[0][1]=2
[0][2]=3
[0][3]=4
[1][0]=5
[1][1]=6
[1][2]=7
[1][3]=8
[2][0]=9
[2][1]=10
[2][2]=11
[2][3]=12
*/
return 0;
}
> 2차원 배열 실습
#include <stdio.h>
int main(void)
{
// 2차원 배열 선언
int arr1[3][4];
arr1[0][0] = 1;
arr1[0][1] = 2;
arr1[0][2] = 3;
arr1[0][3] = 4;
arr1[1][0] = 5;
arr1[1][1] = 6;
arr1[1][2] = 7;
arr1[1][3] = 8;
arr1[2][0] = 9;
arr1[2][1] = 10;
arr1[2][2] = 11;
arr1[2][3] = 12;
int arr2[3][4] =
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 배열 출력하기
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 4; col++)
{
printf("[%d][%d] = %d\n", row, col, arr1[row][col]);
}
}
printf("\n");
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
printf("%3d", arr2[row][col]);
}
printf("\n"); // 한 행을 출력후 줄바꿈
}
return 0;
}
< 프로그램 작성 >
다음 요구 내용을 비주얼 스튜디오에서 작성하고 실행하시오.
1) 4행 * 3열의 2차원 배열을 선언하기
2) 2차원 배열의 값을 키보드로 입력받기
3) 행과 열의 개수만큼의 1차원 배열을 만들어 행과 열의 합계를 계산
4) 2차원 배열과 행과 열의 합계 배열을 출력
#include <stdio.h>
#define ROW 4
#define COL 3
int main()
{
int arr[ROW][COL];
int rowSum[ROW] = { 0,0,0,0 };
int colSum[COL] = { 0,0,0 };
// 배열 입력받기
for (int row = 0; row < ROW; row++) {
for (int col = 0; col < COL; col++) {
printf("[%d][%d] = ", row, col);
scanf_s("%d", &arr[row][col]);
}
}
// 행과 열 합계 구하기
for (int row = 0; row < ROW; row++) {
for (int col = 0; col < COL; col++) {
rowSum[row] += arr[row][col]; // 행 합계
colSum[col] += arr[row][col]; // 열 합계
}
}
// 출력하기
for (int row = 0; row < ROW; row++) {
for (int col = 0; col < COL; col++) {
printf("%4d", arr[row][col]);
}
printf(" = %4d\n", rowSum[row]);
}
// 열 합계 출력
for (int col = 0; col < COL; col++) {
printf("%4d", colSum[col]);
}
}
'Language > C & C++' 카테고리의 다른 글
C_09. Basic Grammar of Function (0) | 2022.08.12 |
---|---|
C_08. Basic Grammar of Pointer (0) | 2022.08.11 |
C_06. Basic Grammar of Iteration Statement (0) | 2022.08.10 |
C_05. Basic Grammar of Conditional Statement (0) | 2022.08.10 |
C_04. Basic Grammar of Logical and Conditional Operator (0) | 2022.08.09 |