Prosto

[C언어] 배열(Array)의 이해와 예제, 문제 본문

Programing/C Programing

[C언어] 배열(Array)의 이해와 예제, 문제

Prosto 2016. 9. 30. 03:22

 

 

 

'배열 - 변수들을 필요한 만큼, 여러 개를 한번에 만들고, 사용할 수 있는 방법!'

 

프로그래밍을 하다보면 한 종류의 여러 개의 변수가 필요한 경우가 있습니다.

또는 단순 반복 작업을 간단하게 처리하고 싶지만, 변수 이름이 여러 개라면

그렇게 하기 힘들죠. (하나씩 일일이 입력해줘야죠....)

 

이런 때에 사용되는 게 바로 배열입니다.

 

 

 

예를 들어 학생 100명의 테스트 점수를 받고싶은데,

그 점수를 받는 변수들을 배열을 사용하지 않는다면 어떻게 받아야 할까요?

int student1, student2, student3, student4, student5, ... , student99, student100

이렇게 1번 학생부터 100번 학생까지 일일이 만들어줘야겠죠?

 

그러면 입력 받을 때는 어떻게 될까요?

  printf("1번 학생 점수 : ");

  scanf("%d", student1);

  printf("2번 학생 점수 : ");

  scanf("%d", student2);

  printf("3번 학생 점수 : ");

  scanf("%d", student3);

이렇게 또 전부 써서 받아야겠죠?

 

 

우리는 for문이나 while문 같은 반복문을 사용할 수 있는데

이렇게 점수를 각각 다른 변수에 저장시키려면 for문, while문 사용을 못 하죠..

 

하지만, 배열을 쓰면 저렇게 복잡하게 써야했던 게 정말 간단하게 몇 줄만에 끝낼 수 있습니다.

 

 

일단 배우기 전에 예제로 어떠한 점이 좋고 어떻게 사용되는지 확인해볼까요?

 

 

예제1. 학생 100명의 점수를 번호 순서대로 받을 수 있는 프로그램을 만드시오.

 

이렇게 만들면 됩니다!

students[100], students[i] 같은 부분이 눈에 띄네요.

 

 

그렇다면 받는 인원 수를 5명으로 줄이려면 어떻게 바뀌면 될 것 같나요?

 

이렇게 하면 됩니다!

 

여기서 알 수 있는 점은 배열을 선언할 때

 int students[100];

이 부분의 숫자 100이 어느정도 수를 사용할지를 나타내는 부분이라는 점이죠?

그래서 실제로 1005로 바꾸었더니 5개의 공간만 사용할 수 있게 됐죠.

 

 

이번에는 배열에 들어간 값들을 출력해볼까요?

사용할 때는 입력받을 때 for문을 사용한 것처럼 같은 방식으로 해주면 되겠네요.

(주석도 추가해봤습니다.)

 

이게 대표적인 배열을 사용하는 방법이었습니다. (1차원 배열)

 

 

우리는 배열의 기본적인 부분을 조금만 더 알아보도록 하죠.

 

 

배열 변수 선언과 사용은 어떻게 할까요?

 

기존의 변수 선언에서 대괄호가 추가된 형태입니다.

기존의 변수는

 int num;

이렇게 int형 변수 num을 선언했었죠?

 

여기서

 int num[5];

이렇게 바뀐다면 int형 변수로 5칸 짜리 배열 변수 num이 된겁니다.

 

사용할 때의 차이점은

기존에는 num = 10; 같은 식으로 사용되었지만,

배열에서는 여러 칸이 있기때문에 구분하기 위해 방 번호를 붙여씁니다.

 

5칸 짜리 방을 사용하는 int num[5];에서는

 num[0] - 0번 방, num[1] - 1번 방, num[2] - 2번 방, num[3] - 3번 방, num[4] - 4번 방

이렇게 총 5개의 방이 있는거죠.

 

0번 방을 사용한다면 num[0] = 10; 이렇게 사용하고,

2번 방을 사용하려면 num[2] = 10; 이렇게 사용해주면 됩니다.

 

지금은 단순하게 초기화만 시켰지만 실제로 사용할 때도 이렇게 방 번호를 넣어 사용하면 됩니다.

 

 

선언

 

자료형(int, char 등) 변수이름[개수];

int형으로 num이라는 5칸 짜리 배열을 만든다면

  int num[5];

이렇게 선언하면 사용할 수 있습니다. (0번 방부터 4번 방까지 5개)

 

그렇다면 char형으로 ch라는 10칸 짜리 배열을 만든다면

  char ch[10];

이렇게 선언하여 사용할 수 있겠죠? (0번 방부터 9번 방까지 10개)

 

마지막으로 float형으로 f라는 100칸 짜리 배열을 만든다면요?

  float f[100];

마찬가지로, 이렇게 선언하여 사용할 수 있겠죠? (0번 방부터 99번 방까지 100개)

 

 

(이 부분은 우리가 위에서 많은 얘기를 했으니 이정도로 충분하리라 생각됩니다.)

 

 

 

선언과 초기화

 

변수는 선언하면서 초기화가 가능했었죠? (int num = 10; 이렇게요.)

 

그렇다면 배열을 통째로 선언하고 초기화하려면 어떻게해야 할까요?

 

 가장 대표적인 방법은 배열의 수 만큼 한꺼번에 초기화해주면 됩니다.

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

이렇게 하면 선언과 초기화를 할 수 있습니다.

차이점은 배열은 여러 개를 묶어둔 거니 중괄호로 묶어서 초기화해주죠? { 초기화 수 만큼, , , , }

 

 

실제로 배열 선언, 초기화 소스를 실행하고 결과를 볼까요?

 

 

 

num[0]은 10, num[1]은 20, num[2]는 30, num[3]은 40, num[4]는 50이 들어가 있는 것을 확인할 수 있습니다.

 

 

근데 여기서

int num[5] = {10, 20};

이렇게 배열 수는 다섯 개인데 두 개만 초기화해주면 어떤 결과가 나올까요?

 

실행시키고 결과를 봅시다.

앞에서부터 두 개가 순서대로 10, 20으로 초기화되고 나머지는 기본 값(int는 0)이 들어갔네요.

 

 

그렇다면 이런식으로 하면 한번에 모두 0으로 초기화해줄 수 있겠네요.

첫 번째 값만 의도적으로 0으로 초기화하라고 하고,

나머지는 자동으로 0으로 초기화되었죠?

 

 

그러면 초기화 한 경우와 안 한 경우의 차이점을 보기위해

초기화 하지 않은 int num[5];만 넣고 실행해볼까요?

 

자 어떤가요?

 

쓰레기 값이 나왔죠?(초기화되지 않은 상태에서 사용하면 나오는 값)

 

 

이렇게 선언, 초기화에 대한 부분까지 함께 확인해봤습니다.

 

 

자, 여기까지 봤으니 간단한 예제 하나만 더 확인하며

제대로 배열을 어떻게 사용하는지 알게됐는지 확인해봅시다.

 

 

예제2. 학생 5명의 점수를 번호 순서대로 0번은 50점, 1번은 40점, 2번은 30점, 3번은 60점, 4번은 70점으로 초기화해주고, 그 점수를 순서대로 출력하여 보여주는 프로그램을 만드시오.

 

(어떻게 만들었을 것이라 생각되나요? 초기화는 어떻게 시키고요? 잠깐만 생각해보고 아래 소스 확인하세요.)

 

 

우리가 아까 본 대로 사용했죠?

선언 및 초기화를 이용하여

 int students[5] = {50, 40, 30, 60, 70};

이렇게 선언 및 초기화했습니다.

이 의미는 students라는 int형 5칸 짜리 배열을 만들고, 각각 50, 40, 30, 60, 70으로 초기화한다는 거죠?

 

그리고 밑에서 for문을 이용하여 0번 방부터 4번 방까지 차례대로 학생의 점수를 보여줬습니다.

(for문에서 i가 1씩 증가할 때마다 students[0], students[1], students[2], students[3], students[4] 이렇게 바뀔테니 맞죠?)

 

 

그렇다면 for문을 사용하지 않고,

2번 학생의 점수를 알기위해 students[2]를 printf로 출력해보면 어떤 값이 나올까요?

자, 그냥 이렇게 방 번호를 넣어주면 원하는 방 번호에 있는 값을 얻어올 수 있다는 것을 확인할 수 있네요.

 

 

지금까지 기본적인 부분을 살펴봤으니

실제로 문제를 한번 풀어봅시다.

(총 5문제가 준비되어 있습니다. 실제로 풀어보시고, 완성 소스엔 주석도 있으니 함께 보세요.)

 

 

문제1. 숫자 여섯 개를 각각 9, 5, 7, 2, 4, 0으로 선언 및 초기화하고 입력된 순서대로 출력하는 프로그램을 만드시오.

 

 (출력 결과 예)

 

 

 

 

문제2. 숫자 다섯 개를 사용자에게 입력받아 입력받은 순서대로 출력하는 프로그램을 만드시오.

 

 (출력 결과 예 : 2, 3, 4, 5, 6 입력)

 

 

 

 

 

문제3. 숫자 다섯 개를 사용자에게 입력받아 입력받은 순서와 반대로 출력하는 프로그램을 만드시오.

 

 (출력 결과 예 : 5, 4, 3, 2, 1 입력)

 

 

 

 

문제4. 숫자 다섯 개를 사용자에게 입력받아 두 번째로 낮은 숫자 출력해주는 프로그램을 만드시오.

 

 (출력 결과 예 : 2, 4, 8, 3, 6 입력)

 

 

 

 

문제4-2. 숫자 다섯 개를 사용자에게 입력받아 두 번째로 낮은 숫자가 위치한 배열 번호와 그 값을 출력해주는 프로그램을 만드시오.

 

 (출력 결과 예 : 2, 4, 6, 8, 3 입력)

 

 

 

 

배열과 관련된 문제들을 풀어봤습니다. 결과는 모두 잘 나왔나요?

 

그럼 이제 제가 작성한 코드와 실행 결과를 올리겠습니다.

본인 소스와 비교해보고 참고하세요.

 

 

-1번 문제-

 

 

-2번 문제-

 

 

-3번 문제-

 

 

-4번 문제-

 

 

-4-2번 문제-

(실행결과와 같이 올리니 잘 안 보일 것 같아 추가합니다.)

(프로그래밍이니 다른 방법도 있겠죠?)

 

 

 

 

지금까지 배열에 대하여 알아봤습니다.

 

배열을 사용하는데 필요한 것들(선언, 초기화, 실제 사용)을 보고

배우며 실제로 문제까지 풀어봤습니다.

 

배열 이해에 도움이 됐다면 좋겠습니다.

(추후 2차원(다차원) 배열과 다양한 문제들도 올리겠습니다.)

 

(메모리 사용 같은 이론적인 부분은 얘기가 너무 길어질 것 같아 다루지 않았습니다.

 실제로 잘 쓸 줄 아는 게 더 중요하죠.

 하지만, 원하시는 분들이 많다면 따로 글 작성하겠습니다. [메일로 말씀해주세요.] )

 

 

질문은 댓글이나 메일로 따로 연락주시면 시간되는 때 답변드리겠습니다. ( 연락 )

 

Comments