[C언어] 배열

yunssup·2023년 5월 14일

C언어

목록 보기
7/13
post-thumbnail

1. 배열이란

1) 배열의 요소가 순서대로 여러 개 모인 것
2) 배열의 요소는 같은 속성을 지님
ex) 계란 한 판, 아파트

즉, 배열이란 "같은 속성을 가진 요소가 순서대로 여러 개 모인 것"

2. 배열의 선언 구조

int array[5]; //정수형 변수 5개 선언

int = 배열의 타입
array = 배열 이름
[5] = 배열 길이

배열 선언 예제

#include<stdio.h>
#include <stdlib.h>
#define SIZE 5

int main(void) {
	int i;
	int scores[SIZE];

	for (i = 0; i < SIZE; i++)
		scores[i] = rand() % 100;

	for (i = 0; i < SIZE; i++)
		printf("scores[%d]=%d\n", i, scores[i]);
	return 0;
}

배열의 속성

  1. 배열의 길이는 상수 선언
  2. 배열의 첫번째 요소는 0부터

    예시
    int array[3]; //배열 선언
    array[0] = 1; //배열의 첫 번째 요소 접근
    array[1] = 2; //배열의 두 번째 요소 접근
    array[2] = 3; //배열의 세 번째 요소 접근

#include<stdio.h>
#define STUDENTS 5

int main(void) {
	int scores[STUDENTS];
	int sum = 0;
	int i, average;

	for (i = 0; i < STUDENTS; i++)
	{
		printf("학생들의 성적을 입력하시오: ");
		scanf_s("%d", &scores[i]);
	}

	for (i = 0; i < STUDENTS; i++)
		sum += scores[i]; 
	
	average = sum / STUDENTS;
	printf("성적 평균 = %d\n", average);

	return 0;
}

4. 배열의 초기화

배열 또한 변수이기 때문에 선언과 동시에 초기화 가능.

4-1. 배열의 길이와 초기값의 개수가 일치하는 경우

/*예시 코드*/

#include<stdio.h>

int main(void) {
	int array[5] = { 1,2,3,4,5 };
    /*배열의 길이=초기값의 개수*/
	int total = 0;

	total = array[0] + array[1] + array[2] + array[3] + array[4]; /*인덱스는 0부터 시작하기때문에 주의!!*/

	printf("배열 요소의 총 합은 %d입니다.", total);

	return 0;
}

4-2. 배열의 길이보다 초기값의 개수가 작은 경우

int array[5] = {1,2};

배열의 길이 = 5, 배열의 초기값은 1,2 두개 값으로 초기화.
첫번째 인덱스부터 1,2로 채우고 나머지 3개의 배열 요소들은 0으로 채우기.

/*예시 코드*/

#include<stdio.h>

int main(void) {
	int array[5] = { 1,2 };
	int total = 0;

	total = array[0] + array[1] + array[2] + array[3] + array[4]; 
    /*인덱스는 0부터 시작하기때문에 주의!!*/

	printf("배열 요소의 총 합은 %d입니다.", total);

	return 0;
}

4-3. 배열의 길이보다 초기값의 개수가 큰 경우

int array[3]={1,2,3,4,5};

배열의 길이 = 3, 초기값 = 1,2,3,4,5
❗이니셜라이저가 너무 많습니다. (컴파일링 오류)

/*예시 코드*/

#include <stdio.h>

int main(void) {
	int array[3] = { 1,2,3,4,5 };
	int total = 0;

	total = array[0] + array[1] + array[2] ; 
    /*인덱스는 0부터 시작하기때문에 주의!!*/

	printf("배열 요소의 총 합은 %d입니다.", total);

	return 0;
}

/*컴파일링 오류!! 이니셜라이저가 너무 많습니다!!*/

4-4. 배열의 길이가 빠져있는 경우

자주 사용되는 방법

int array[]={1,3,5,7,9};

배열의 길이는 생략, 하지만 초기값의 개수를 보고 배열의 길이 자동 계산.
즉, 초기값이 5개이므로 array의 길이는 내부적으로 5로 설정

/*예시 코드*/

#include <stdio.h>

int main(void) {
	int array[] = { 1,3,5,7,9 };
	int total = 0;

	total = array[0] + array[1] + array[2]+ array[3]+ array[4]; 
    /*인덱스는 0부터 시작하기때문에 주의!!*/

	printf("배열 요소의 총 합은 %d입니다.", total);

	return 0;
}

5. 배열 활용

5-1. 배열의 복사

배열을 복사하기 위해서는 각 배열의 요소끼리 대입 연산자를 통해 복사.

/*예시 코드*/
#include<stdio.h>

int main(void) {
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5];
	int i;

	for (i = 0; i < 5; i++)
		arr2[i] = arr1[i]; 
        /*배열 복사*/

	for (i = 0; i < 5; i++)
		printf("배열 arr2[%d] = %d\n", i, arr2[i]);

	return 0;
}
  • 역순으로 복사하기
/*예시 코드*/

#include<stdio.h>

int main(void) {
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5];
	int i;

	for (i = 0; i < 5; i++)
		arr2[i] = arr1[4-i]; 
        /*arr1 배열의 인덱스를 끝에서부터 1씩 감소한 값을 arr2의 배열의 처음 인덱스부터 대입*/

	for (i = 0; i < 5; i++)
		printf("배열 arr2[%d] = %d\n", i, arr2[i]);

	return 0;
}

5-2. 배열 요소의 교환

가운데 배열 인덱스를 중심으로 배열 요소 교환 가능.
고려사항 1) 두 변수의 교환 알고리즘 이해 2) 배열 인덱스의 관계 이해

❗두 변수의 교환 알고리즘

void swap(int x, int y)
{
	int temp =x;
    x=y;
    y=temp;
}

❗배열의 역순 교환 알고리즘

temp = arr1[i];
arr1[i] = arr1[6-i];
arr1[6-i] = temp;
  • 배열을 역순으로 교환한 후 출력하기

5. 배열과 문자열

상수는 변수와 달리 이름이 없고, 내용을 변경할 수 없음.
우리가 printf("hello world") 에서 사용한 "hello world"는 문자열 상수!!
문자열 상수를 변경하고 싶을 때는 배열을 이용하여 문자열 변수로 만들기!

char str[12] = "Hello World"

문자열 변수 생성 방법 :
char형 배열 선언 > 배열의 길이 : 초기화 할 문자의 길이 + 1

+1을 하는 이뉴는 문자열 끝에 null 문자 추가

5-1. null

1) null의 필요성 : 문자열의 마지막을 표시하는 역할
2) null 표시 방법 : \0

6. 다차원 배열

6-1. 2차원 배열 선언

int arr[i][j]

j인 int형 배열을 i개 모아놓은 배열을 생성!

6-1. 2차원 배열 초기화

1) 배열의 모든 요소 초기화

int array[2][3] = {
	{1,2,3}
    {4,5,6}
};

{{ }}는 행과 열을 구분하기 위한 표현

int array [2][3] = {1,2,3,4,5,6};

2) 배열의 길이보다 초기값의 개수가 작은 경우

int array[2][3] = {
	{1,}
    {4,5,6}
};

1행의 경우 1열만 초기화, 2,3열에는 0으로 자동 초기화

3) 배열의 길이보다 초기값의 개수가 큰 경우

int array[2][3] = {
	{1,2,3}
    {4,5,6,7}
};

❗이니셜라이저가 너무 많습니다. (컴파일링 오류)
4) 배열의 길이가 빠져있는 경우

int array[][3] = {
	{1,2,3}
    {4,5,6}
};

첫번째 []가 비어있지만 초기식에서 행이 두 개임을 확인할 수 있기 때문에 첫번째 []의 길이가 2인 것이 확인 가능.
❗단, 배열의 길이는 모두 생략하면 안되고 배열의 첫 번째 첨자만 생략이 가능

7. 정렬

(1) 선택 정렬 : 정렬이 안된 숫자들 중에서 최솟값을 선택하여 배열의 첫번째 요소와 교환

#include<stdio.h>
#define SIZE 10

int main(void)
{
	int list[SIZE] = { 3,2,9,7,1,4,8,0,6,5 };
	int i, j, temp, least;

	printf("원래의 배열\n");
	for (i = 0; i < SIZE; i++)
		printf("%d", list[i]);
	printf("\n");

	for (i = 0; i < SIZE - 1; i++)
	{
		least = i;
		for (j = i + 1; j < SIZE; j++)
			if (list[j] < list[least])
				least = j;

		temp = list[i];
		list[i] = list[least];
		list[least] = temp;
	}
	printf("정렬된 배열\n");
	for (i = 0; i < SIZE; i++)
		printf("%d ", list[i]);
	printf("\n");
	return 0;
}


❗변수값 교환 시 주의사항


score[i]=score[least] //score[i]의 기존값 파괴
score[least]=score[i]

temp = list[i];
list[i]=list[least];
list[least]=temp;
(우유가 든 컵에 주스를, 주스가 든 컵에 우유를 넣으려면 하나의 컵이 더 필요하듯,temp가 필요 !!)

(2) 순차 탐색: 배열의 원소를 순서대로 하나씩 꺼내서 탐색키와 비교하여 원하는 값을 찾아가는 방법

#include<stdio.h>
#define SIZE 10

int main(void) {
	int key, i;
	int list[SIZE] = { 1,2,3,4,5,6,7,8,9 };//배열 초기화

	printf("탐색할 값을 입력하시오 :");
	scanf_s("%d", &key);

	for (i = 0; i < SIZE; i++)
		if (list[i] == key)
			printf("탐색 성공 인덱스 = %d\n", i);
	/*for루프를 이용해서 list[i]와 key를 비교하는 연산을 배열의 크기만큼 반복.
	list[i]와 key가 같으면 탐색 성공, 키값 발견된 배열의 인덱스 출력*/
	printf("탐색 종료\n");

	return 0;
}

(3) 이진 탐색 : 정렬된 배열의 중앙에 위치한 원소와 비교 되풀이

#include<stdio.h>
#define SIZE 16

int binary_search(int list[], int n, int key);

int main(void)
{
	int key;
	int grade[SIZE] = { 2,6,11,13,18,20,22,27,29,30,34,38,41,42,45,47 };//배열 초기화
	printf("탐색할 값을 입력하시오:");
	scanf_s("%d", &key);
	printf("탐색결과=%d\n", binary_search(grade, SIZE, key));

	return 0;
} //최종 모니터 출력

int binary_search(int list[], int n, int key) {
	int low, high, middle;
	low = 0;
	high = n - 1;
	while (low <= high)//아직 숫자들이 남아있으면
	{
		printf("[%d %d]\n", low, high); //하한과 상한을 출력
		middle = (low + high) / 2; // 중간 위치 계산

		if (key == list[middle]) //일치하면 탐색 성공
			return middle;
		else if (key > list[middle]) // 중간 원소보다 크다면
			low = middle + 1; //새로운 값 low 설정
		else
			high = middle - 1; //새로운 값 high 설정
	}
	return -1;
}

0개의 댓글