You are on page 1of 25

chapter 09.

배열

-1-
 배열의 선언과 사용

• 같은 형태의 자료형이 많이 필요할 때 배열을 사용하면 효과적이다 .


• 배열의 선언
• 배열의 사용
• 배열과 반복문
• 배열의 초기화
• 유연성 있게 배열 다루기
• 배열의 예제들

-2-
▶ 다섯명의 나이를 입력 받아서 평균 나이를 계산하는 프로그램
#include <stdio.h>

int main()
{
int a,b,c,d,e;
int tot;
double avg;

printf(" 다섯 명의 나이를 입력하세요 : ");


scanf("%d%d%d%d%d", &a,&b,&c,&d,&e);

tot=a+b+c+d+e;
avg=tot/5.0;

printf(" 다섯 명의 평균 나이는 %.1lf 입니다 .\n", avg);

return 0;
} 변수가 많이 필요할 때
많은 변수에 이름 붙이는 것 어려움
☞ 연속된 기억공간을 할당 받고 번호만 붙이면 된다 .
☞ 반복문을 사용하여 배열을 효율적으로 처리할 수 있다 .
-3-
▶ 배열의 선언

• 배열은 배열명과 변수의 개수 , 변수의 자료형으로 선언한다 .

• 배열을 선언하면 변수의 개수만큼 연속된 기억공간을 할당한다


.

-4-
▶ 배열의 사용

• 배열의 기억공간을 사용할 때는 각 기억공간이 배열에서 차지하는 위치


를 사용한다 .

• 배열을 구성하는 기억공간들을 배열의 요소 (element) 라고 하며 각 요


소가 배열에서 차지하는 위치를 첨자 (index) 라고 한다 .

• 배열의 첨자는 0 부터 시작한다 .

-5-
▶ 배열의 사용

• ages 배열의 세 번째 배열요소에 데이터를 저장하고 출력할 때

int ages[5]; // 배열의 선언 , 배열요소의 개수는 5 개


ages[2] = 20; // 세 번째 배열요소에 20 을 저장
printf(“ 세 번째 배열요소에 저장된 값은 : %d\n”, ages[2]); // 저장된 값을
출력

• 배열요소에 값을 입력 받을 때도 일반 변수와 같이 사용한다 .

• 첨자는 0 부터 시작하므로 배열요소의 개수가 5 개이면 5 를 첨


자로 사용할 수 없다 .

-6-
▶ 배열과 반복문

• 배열요소는 첨자로 구분되므로 반복문을 사용하면 모든 배열요소를 간단하게 참조할


수 있다 .

- ages 배열의 모든 요소에 값을 입력 받는 경우

• 반복 횟수를 미리 알 수 있으므로 for 문을 사용하여 처리하면 좋다 .

제어변수를 배열요소의
첨자로 사용한다 .

- 7-
▶ 배열을 사용하여 평균 나이를 계산하는 프로그램

#include <stdio.h>

int main()
{
int ages[5]; // 다섯 명의 나이를 저장할 배열
int tot=0; // 총합을 저장할 변수 , 미리 0 으로 초기화한다 .
double avg; // 평균나이를 저장할 변수
int i; // 반복 제어변수
printf(" 다섯 명의 나이를 입력하세요 : ");
for(i=0; i<5; i++){ // i 가 0 부터 4 까지 변하면서 다섯 번 반복한다 .
scanf("%d", &ages[i]); // 각 배열요소에 나이 입력
}
for(i=0; i<5; i++){
tot+=ages[i]; // 모든 배열요소의 값을 누적시킨다 .
}
avg = tot / 5.0; // 평균 나이 계산
printf(" 입력된 다섯 명의 나이 : ");
for(i=0; i<5; i++){
printf("%d ", ages[i]); // 각 배열요소의 값을 출력
}
printf("\n 다섯 명의 평균 나이는 %.1lf 입니다 .\n", avg);// 평균 나이 출력
return 0;
}

-8-
▶ 배열의 초기화

• 배열을 선언하면 처음에 쓰레기값이 존재한다 .

int nums[5];
int i, tot=0;
for(i=0; i<5; i++){
tot+=nums[i];
}
printf(“total : %d\n”, tot); // 쓰레기값의 합이 출력된다 .

• 배열은 기억공간의 수가 많으므로 중괄호를 사용하여 초기값을 나열한다


.

-9-
▶ 배열의 초기화의 자동기능

• 배열요소의 수보다 초기화 값이 적으면 남는 기억공간은 0 으로


채워진다 .
int nums[5] = {1, 3};

• 배열을 선언할 때 초기화하면 배열요소의 개수를 생략할 수 있다


.

• 모든 배열요소를 간단히 0 으로 초기화


int nums[500] ={0};

- 10 -
▶ 유연성 있게 배열 다루기

• 배열요소의 개수가 자동으로 계산되도록 프로그램을 작성하면 배열의


크기가 바뀌어도 프로그램을 수정할 필요가 없다 .

• 배열요소의 개수를 계산하여 배열의 합을 계산하는 예

int nums[]={1,2,3,4,5}; // 배열의 초기화


int tot=0, i; // 누적변수와 반복제어변수
int size; // 배열요소의 개수를 저장할 변수
size=sizeof(nums)/sizeof(nums[0]); // 배열요소의 개수 계산
for(i=0; i<size; i++){ // 계산한 배열요소의 개수를 반복문에 사용한다 .
tot+=nums[i];
}

- 11 -
 문자열을 저장하는 문자배열

• 문자배열은 문자열을 저장하는 하나의 변수와 같은 역할을 한다 .


• 문자배열의 선언과 사용
• 문자열은 널문자가 완성한다 !
• scanf 함수를 사용한 문자열의 입력
• 문자배열의 초기화

- 12 -
▶ 문자배열의 선언과 사용

• 문자배열은 기본적으로 여러 개의 문자를 저장하기 위한 char


형 배열이다 .
- 4 개의 문자를 저장할 수 있는 문자배열의 선언

• 배열요소에 문자를 저장하면 문자열이 만들어진다 .

- 13 -
▶ 문자열은 널문자가 완성한다 !

• 문자배열의 마지막에 널문자 (‘\0’) 가 없으면 저장된 문자열의


끝을 알 수 없다 .
- printf 함수로 출력하는 경우 쓰레기 값이 출력된다 .

char word[50]; // 넉넉한 배열 선언


word[0]=‘L’; // 문자를 하나씩 입력하여 문자열 완성
word[1]=‘o’;
word[2]=‘v’;
word[3]=‘e’;
printf(“%s”, word); // 문자열 출력

Love 儆 儆 儆 儆 儆 儆 儆 儆 儆 儆 儆 儆 儆 儆 儆
儆 儆

- 14 -
▶ 문자열은 널문자가 완성한다 !

• 문자배열에 문자열을 저장할 때는 항상 마지막에 끝을 표시하는


널문자 (‘\0’) 를 넣어줘야 한다 .

char word[50];
word[0]=‘L’;
word[1]=‘o’;
word[2]=‘v’;
word[3]=‘e’;
word[4]=‘\0’; // 문자열의 끝을 널문자로 표시해 준다
printf(“%s”, word); .

Love

- 15 -
▶ scanf 함수를 사용한 문자열의 입력

• 문자배열에 문자열을 입력 받을 때는 %s 변환문자열과 배열명을


scanf 함수의 전달인자로 준다 .

• scanf 함수로 문자열을 입력 받으면 널문자를 자동으로 채워준


다.
- word 배열에 vitamin 을 입력 받은 경우
printf(“ 문자열을 입력하세요 : ”);
문자열을 입력하세요 : vitamin ( 엔
scanf(“%s”, word);
터)

- 16 -
▶ scanf 함수로 문자열을 입력할 때 주의할 점

• 배열의 크기보다 입력되는 문자열의 크기가 더 크면 할당되지 않은 기억공간


을 침범하므로 주의해야 한다 .

char word[5]; // 이곳에 “ vitamin” 을 입력 받는다면…

- 17 -
▶ 문자배열의 초기화

• 문자배열은 기본적으로 문자상수들로 초기화 한다 .


char str[10] = {‘d’, ‘r’, ‘e’, a’, ‘m’, ‘\0’};

• 초기화하고 남는 배열요소는 0 으로 채워진다 .


- char 형 배열요소에 0 이 저장되면 널문자가 되므로 결국 남는
배열요소는 널문자로 채워지는 것이다 .

• 문자배열은 문자열상수로 직접 초기화가 가능하다 . 단 , 선언과


동시에 초기화하는 경우만 가능하다 .
char str[80] = “dream”;// 배열 선언과 동시에 초기화 ( ○ )
str = “utopia”; // 배열에 문자열을 바로 대입할 수 없다 . ( ×
)
char str[]="It's up to
you."; // 몇 바이트의 기억공간이 잡힐까요 ?
- 18 -
배열 선언 예제
#include <stdio.h> ====================
int main(void) 인덱스       값
{ ====================
    0        0
        int grade[10];     1        0
        int i;     2        0
    3        0
  for(i = 0; i < 10; i++)     4        0
    5        0
                grade[i] = 0;
    6        0
    7        0
  printf("====================\n");     8        0
        printf(" 인덱스      값 \n");     9        0
        printf("====================\n");

  for(i = 0; i < 10; i++)


                printf("%5d    %5d\n", i, grade[i]);

  return 0;
}

19
배열 초기화 예제
#include <stdio.h>
int main(void)
{
        int grade[10] = { 31, 63, 62, 87, 14, 25, 92, 70, 75, 53 };
        int i;

  printf("====================\n");
        printf(" 인덱스      값 \n");
        printf("====================\n");
====================
인덱스      값
        for(i = 0; i < 10; i++) ====================
                printf("%5d    %5d\n", i, grade[i]);     0       31
    1       63
        return 0;     2       62
}     3       87
    4       14
    5       25
    6       92
    7       70
    8       75
    9       53
20
배열 원소 참조 예제
#include <stdio.h> ==================== 
#include <stdlib.h> 인덱스      값
#define SIZE 10 ==================== 
    0       41 
int main(void)     1       67 
{     2       34 
    3        0 
        int grade[SIZE];
    4       69 
        int i;     5       24 
    6       78 
        for(i = 0; i < SIZE; i++)     7       58 
                grade[i] = rand() % 100;     8       62 
    9       64 
        printf("====================\n");
        printf(" 인덱스     값 \n");
        printf("====================\n");

        for(i = 0; i < SIZE; i++)


                printf("%5d    %5d\n", i, grade[i]);
        return 0;
}
21
배열 원소 사용 예제
#include <stdio.h>
학생들의 성적을 입력하시오 : 10 
#define STUDENTS 5 학생들의 성적을 입력하시오 : 20 
학생들의 성적을 입력하시오 : 30 
int main(void) 학생들의 성적을 입력하시오 : 40 
{ 학생들의 성적을 입력하시오 : 50 
        int grade[STUDENTS]; 성적 평균 = 30
        int sum = 0;
        int i, average;
        
        for(i = 0; i < STUDENTS; i++)
        {
                printf(" 학생들의 성적을 입력하시오 : ");      
                scanf("%d", &grade[i]);
        }

        for(i = 0; i < STUDENTS; i++)


                sum += grade[i];

        average = sum / STUDENTS;


        printf(" 성적 평균 = %d\n", average);
        return 0;
}
22
잘못된 인덱스로 접근하는 경우
#include <stdio.h>
#define SIZE 5

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

for(i = 0; i <= SIZE; i++)


printf("array[%d] %d\n", i, array[i]);

return 0;
}

array[0]        1
array[1]        2
array[2]        3
array[3]        4
array[4]        5
array[5]        1245120

23
배열의 복사
int grade[SIZE];
int score[SIZE];

score = grade;               // 컴파일 오류 !

#include <stdio.h>
#define SIZE 5

int main(void)
{
        int i;
        int a[SIZE] = {1, 2, 3, 4, 5};
        int b[SIZE];

        for(i = 0; i < SIZE; i++)


                b[i] = a[i]; 

        return 0;
}

24
배열의 비교
#include <stdio.h>
#define SIZE 5

int main(void)
{
        int i;
        int a[SIZE] = { 1, 2, 3, 4, 5 };
        int b[SIZE] = { 1, 2, 3, 4, 5 };

        if( a == b )                  // ① 올바르지 않은 배열 비교


                printf(" 잘못된 결과입니다 .\n");
        else
                printf(" 잘못된 결과입니다 .\n");

        for(i = 0; i < SIZE ; i++) // ② 올바른 배열 비교


        {
                if ( a[i] != b[i] )
                {
                        printf("a[] 와 b[] 는 같지 않습니다 .\n");
                        return 0;
                }
        }
        printf("a[] 와 b[] 는 같습니다 .\n");
return 0;
25 }

You might also like