7월 2주차_C Study 1. 배열

2023. 7. 15. 13:47language : p_study/c language

7월 2주차 학습 할 C언어 study 목차는 다음과 같다.

1. 배열
2. 함수

 

1. 배열

현재까지 학습하였던 변수는 오직 하나의 값만을 저장할 수 있었는데, 복잡한 응용 프로그램에서는 더 많은 값을 한꺼번에 저장할 수 있는 저장 장소가 필요하고 그 필요에 의해 만들어진 것이 배열이다.

 

 

int s[10];

 

int는 자료형을 뜻하고 s는 배열의 이름을 뜻하며 10은 배열의 크기를 뜻한다.

변수선언이 단독 주택이라면, 배열은 아파트 단지라고 할 수 잇다.

 

왜 배열이 필요할까?

 

만약 5명의 학생의 평균을 계산하기 위해 5개의 변수가 필요하다고 가정해보자.

우리는 아래와 같이 변수를 선언할 것이다.

 

int s0,s1,s2,s3,s4;

 

하지만 5명의 학생이 아닌 10000명의 학생이라면 이렇게 일일이 변수를 선언하는 것은 매우 비효율적이다.

따라서 보다 손쉽게 대량의 데이터를 저장할 수 있는 공간을 만들 수 있어야하고 이 데이터들을 손쉽게 처리할 수 있는 방법이 필요하다. 그래서 배열이 만들어지게 된것이다.

 

위 코드를 배열로 바꾸면 아래와 같이 간단히 사용할 수 있다.

 

int s[5];

 

  • 배열(array)은 동일한 타입의 데이터가 여러 개 저장되어 있는 데이터 저장 장소이다.
  • 배열 안에 들어있는 각각의 데이터들은 번호에 의해 식별된다.
  • 그 번호를 인덱스(index) 라고 한다.
  • 배열에 저장된 데이터를 배열 요소라고 한다.
  • 우리는 인덱스를 이용하여 배열 요소에 접근할 수 있는데, 예를 들어 첫번째 요소는 s[0]이다.
  • 첫번째요소가 s[1]이아닌 s[0]인 것도 매우 중요한 점이니 꼭 기억하자.
  • 또한 배열을 이용하면 여러개의 값을 하나의 이름으로 처리할 수 있다.

 

배열의 선언은 다음과 같다.

 

  • 배열을 사용하려면 가장 먼저 배열을 선언해야한다.
  • 배열의 선언을 통해 컴파일러에게 배열요소의 개수가 몇 개이고, 각 요소의 자료형이 무엇인지를 알려야한다.
  • 배열을 선언하기 위해 자료형을 먼저 지정하고, 배열의 이름을 쓰고, 대괄호안에 배열의 크기를 적어서 붙이면 된다.

 

int s[10];

 

int 자료형 s 배열이름 [] 대괄호 10 배열크기

 

 

⁜ 참고

배열의 크기를 나타낼 때는 항상 정수 상수를 사용하여야한다. 변수나 음수, 0, 실수를 사용하면 모두 컴파일 오류이다.

 

 

 

배열 요소 접근

배열 요소에 접근하려면 scores[n]와 같은 대괄호 안에 요소의 인덱스를 적어주면 된다.

첫번째 배열의 요소는 scores[0]이고 마지막 배열 요소는 scores[n-1]이다.

 

 

scores[0] = 80; // 0번째 요소에 80을 저장한다.
scores[3] = scores[2]; // 2번째 요소에 3번째 요소로 복사한다.
scores[k] = 100; // k번째 요소에 100을 저장한다.

 

배열의 초기화

 

배열은 초기화를 어떻게 할까? 배열은 여러개의 변수가 모인 것이기때문에 초기값도 하나가 아니고 배열의 요소의 개수만큼이 필요하다.

 

int scores[5]={10,20,30,40,50};

 

s[0]=10, s[1]=20...차례대로 값이 대입된다.

  • 만약 초기값의 개수가 배열 요소의 개수보다 많은 경우에는 컴파일 오류가 된다.
  • 반면, 초기값의 개수가 요소들의 개수보다 적은 경우에는 앞에 있는 요소들만 초기화되고, 나머지 배열 요소는 0으로 초기화된다.
  • 초기화만하고 배열의 크기를 비워놓으면 컴파일러가 자동으로 초기값들의 개수만큼 배열 크기를 잡는다. 

아래와 같은 경우가 그 예시이고, 이런 경우에는 크기가 5인 배열이 만들어지는 것이다.

 

int scores[]={10,20,30,40,50};

 

만약 초기값이 주어지지 않는다면 일반 변수와 마찬가지로 아무 의미없는 쓰레기 값이 들어가게 된다.

 

배열을 이용한 간단한 코딩을 해보자.

→ 가장 싼 물건찾기 

 

아래와 같은 콘솔창이 뜨도록 코딩해볼 것이다.

 

 

[ 12 4 18 3 5 7 19 21 ]
최솟값은 3입니다.

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE8

int main(){
int prices[SIZE}={12, 4, 18, 3, 5, 7, 19, 21};
int i, min;

printf("[");
for(i=0; i<SIZE; i++){
	printf("%d",prices[i]);
}
printf("]");
min=prices[0];

for(i=1; i<SIZE; i++)
{
  if(prices[i]<min){
  	min=prices[i];
    }
    printf("최솟값은 %d입니다.\n,min);
    return 0;
    }

 

 

코드 설명을 덧붙이자면,

  • 우선 정수형 int를 통해 가격인 prices변수를 (주어진 8) SIZE 크기로 선언한다.
  • 반복문을 위해 쓰일 i 와 최솟값을 저장할 min변수도 함께 선언해준다.
  • printf를 통해 대괄호 형태를 만들어주고 열린 대활호 안에 for 을 통해 i=0부터 i가 8크기보다 작을때까지 반복해서 
  • 배열의 요소들을 괄호안에 넣어준다. 
  • 그리고 다시 printf를 통해 대괄호 닫는 모양을 넣어준다.
  • 최솟값을 구하기위해 우선 최솟값을 저장한 min에 prices[0]번째 요소를 최솟값으로 가정한다.
  • 그리고 다시 for을 통해 반복하면서 만약 배열의 0번째요소보다 i번빼 요소의 값이 더 작다면 min(최솟값)이 새롭게 정의되도록해준다.

 

 

만약 최댓값을 구하고 싶다면?

 

변수이름을 max(자유롭게)로 바꾸고, 최솟값을 점검하는 if문에서 <이 표시만 >이렇게 바꿔주면 되겠다.

 

 

 

버블정렬

 

배열과 관련하며 흥미로운 주제 중 하나가 바로 정렬인데, 정렬은 물건을 크기순으로 나열하는 것을 의미한다.

 

 

총 n-1번의 비교가 이루어지게 되는데,

만일 왼쪽이 더 크면 오른쪽이랑 교환하는 시스템이다. 

결국 마지막에는 8이 자리잡을 것이다.

이미 자리가 정해진 8을 제외한 총 n-2번의 비교가이루어지게 된다.

마지막에는 5가 자리 잡을 것이다.

총 n-3번의 비교가 이루어지게 된다.

4가 자리잡게된다.

총 n-4번의 비교가 이루어지게 된다.

3이 자리잡게된다.

총 n-5번의 비교가 이루어지게 된다.

2가 자리잡게된다.

 

이제 더이상 비교할 게 없으므로 정렬이 다 이루어졌다.

 

간단히 말하자면 인접한 블록2개를 비교하여 순서대로 되어있지 않으면 계속해서 위치를 바꾼다고 생각하면 된다.

 

for (k=0; k<SIZE; k++){
	for(i=0; i<SIZE; i++){
    	if(list[i]>list[i+1]){
        int tmp=list[i];
        list[i]=list[i+1];
        list[i+1]=tmp;
        }
      }
   }

 

위 코드가 버블 정렬의 형태를 나타낸 것인데  간단히 살펴보자면,

  • 반복문을 통해 k가 0부터 정해진 SIZE크기보다 작을때까지 반복할 것이다.
  • 또 반복문 i를 통해 SIZE크기보다 (비교대상을 제외) 하나 작은 만큼 박복할 것이다.
  • 만약 list[i]가 list[i+1]보다 크다면 tmp를 통해 교환할 것이다.

 

다차원 배열

 

 

생김새를 알아보자.

int s[10]; //1차원 배열
int s[3][10]; //2차원 배열
int s[5][3][10]; //3차원 배열

 

 

2차원 배열

 

(가로가 열, 세로가 행)

s[0][0] s[0][1] s[0][2] s[0][3]
s[1][0] s[1][1] s[1][2] s[1][3]
s[2][0] s[2][1] s[2][2] s[2][3]

 2차원 배열의 초기화는 다음과 같이 할 수 있다.

 

int s[3][5]={
{0,1,2,3,4},  // 첫번째 행의 요소들의 초기값
{10,11,12,13,14},  // 두번째 행의 요소들의 초기값
{20,21,22,23,24}  // 세번째 행의요소들의 초기값
};

 

 

배열에 대해 간단히 학습했으니 codeup을 통해 문제를 풀어보자.

 

 

 

<1402:거꾸로 출력하기 3>

 

 

 

간단히 코드를 설명해보자면,

  • 위에 정수형 변수들을 선언해주고 데이터를 저장할 index배열을 선언해준다.
  • 처음에 배열을 선언할때 대괄호안에 n을 넣었는데 생각해보니 괄호안에 크기는 정수만 되기 때문에 변수는 되지않고 최대 크기인 100으로 선언해주었다.
  • 그리고 for반복문을 통해 n보다 작을 때까지 값을 n만큼 입력받는다.
  • 반복문을 통해 내림차순으로 정리해줄 것인데 부등호 방향에 주의를 해야한다.
  • 정렬한 후 printf를 통해 값을 출력한다.

 

 

✅ mini project

 

사용자로부터 5개의 정수를 입력받아서 1차원 배열에 저장한다.

1차원 배열에서 최대값과 최소값을 계산하여서 출력해보자..”

 

< 콘솔창 예시 >

예시)

데이터 개수: 5
 
정수를 입력하시오 
: 10 
정수를 입력하시오 
: 20
정수를 입력하시오 
: 30 
정수를 입력하시오 
: 40
정수를 입력하시오 
: 50 
최대값=50 ,최소값=10

 

< 내코드 >

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int index[100]; // 최대 크기로 100으로 선언

    int n, i;
    int min, max;
    printf("데이터 개수: ");
    scanf("%d", &n);


    for (i = 0; i < n; i++) {
        printf("정수를 입력하시오: ");
        scanf("%d", &index[i]);
    }

    max = index[0];
    for (i = 1; i < n; i++) {
        if (index[i] > max) {
            max = index[i];
        }
    }

    min = index[0];
    for (i = 1; i < n; i++) {
        if (index[i] < min) {
            min = index[i];
        }
    }

    printf("최대값 = %d, 최소값 = %d\n", max, min);
    return 0;
}

 

 

< 콘솔창 >

 

 

참고자료: 14. 버블 정렬 (Bubble Sort) : 네이버 블로그 (naver.com)

'language : p_study > c language' 카테고리의 다른 글

7월 3 , 4주차_C Study 계획서  (0) 2023.07.20
7월 2주차_C Study 2. 함수  (0) 2023.07.15
7월 2주차_C Study 계획서  (0) 2023.07.10
7월 1주차_C Study 계획서  (0) 2023.07.10
7월 1주차_C Study 4. 반복문  (0) 2023.07.09