728x90
반응형

< 배열 이해하기 >

 

> 배열 (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]);

    }

}
728x90
반응형

+ Recent posts