Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Trivia

7강.배열 본문

C언어/C프로그래밍 기초(1학기)

7강.배열

Vloom 2019. 1. 29. 11:38

7.1 배열의 개념


배열이란? "동일한 타입의 데이터"가 여러 개 저장되어 있는 데이터 저장 장소


배열 안에 들어있는 각각의 데이터들은 정수로 되어 있는 번호(인덱스)에 의하여 접근

배열을 이용하면 여러 개의 값을 하나의 이름으로 처리 가능


▶배열의 필요성


배열을 사용하면 한 번에 여러 개의 값을 저장할 수 있는 공간을 할당받을 수 있음

배열은 하나의 이름을 공유해서 자료의 조작이 편리함


//방법1: 개별 변수 사용 → 변수가 많아지면 번거로워지고 조작하기 어려움


int s0;

int s1;

...

int s9;


//방법2: 배열 사용


int s[10];



7.2 배열의 선언


▶배열의 선언


 자료형  ┏배열의 크기

int grade[10];

        └배열 이름

자료형: 배열 원소들이 int형이라는 것을 의미

배열 이름: 배열을 사용할 때 사용하는 이름이 grade

배열 크기: 배열 원소의 개수가 10개

인덱스(첨자)는 항상 0부터 시작


int score[60];        //60개의 int형 값을 가지는 배열 grade

float cost[12];       //12개의 float형 값을 가지는 배열 cost

char name[50];      //50개의 char형 값을 가지는 배열 name


ex) 예제 프로그램: 배열 선언 예제1

#include <stdio.h>


int main()

{

int i;

int grade[5];


grade[0] = 10;

grade[1] = 20;

grade[2] = 30;

grade[3] = 40;

grade[4] = 50;


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

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


return 0;

}


grade[0] = 10

grade[1] = 20

grade[3] = 30

grade[3] = 40

grade[4] = 50


ex) 예제 프로그램: 배열 선언 예제2

#include <stdio.h>

#include <stdlib.h>

#define SIZE 5


int main()

{

int i;

int grade[SIZE];


printf("5명의 점수를 입력하세요\n");


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

scanf("%d", &grade[i]);


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

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


return 0;

}


5명의 점수를 입력하세요

grade[0] = 39

grade[1] = 48

grade[2] = 73

grade[3] = 91

grade[4] = 93


ex) 예제 프로그램: 배열 선언 예제3

#include <stdio.h>

#define STUDENTS 5


int main()

{

int grade[STUDENTS];

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;

}


학생들의 성적을 입력하세요: 60

학생들의 성적을 입력하세요: 70

학생들의 성적을 입력하세요: 80

학생들의 성적을 입력하세요: 90

학생들의 성적을 입력하세요: 100

성적의 평균 = 80


▶배열 원소 접근


grade[0] 80;                  //0번째 원소에 80을 대입

grade[1] grade[0];         //0번째 원소를 1번째 원소로 복사

grade[i] 100;                  //i는 정수 변수

grade[i + 2] 100;            //수식이 인덱스


▶잘못된 인덱스 문제


인덱스가 배열의 크기를 벗어나게 되면 프로그램에 치명적인 오류 발생

프로그래머는 인덱스가 범위를 벗어나지 않았는지를 확인


int grade[5];

...

grade[5] = 60;    //존재하지 않는 곳에 데이터를 저장하면 안됨 (치명적인 오류)


ex) 예제 프로그램: 잘못된 인덱스 예제

#include <stdio.h>


int main()

{

int grade[5];

int i;


grade[0] = 10;

grade[1] = 20;

grade[2] = 30;

grade[3] = 40;

grade[4] = 50;

grade[5] = 60;        //시스템에 심각한 오류가 발생할 수도 있음


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

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


return 0;

}


※중간 점검※


Q1. n개의 원소를 가지는 배열의 경우, 첫번째 원소의 인덱스는 무엇인가?

A1. 0


Q2. n개의 원소를 가지는 배열의 경우 ,마지막 원소의 인덱스는 무엇인가?

A2. n-1


Q3. 범위를 벗어나는 인덱스를 사용하면 어떻게 되는가?

       즉 int a[10];과 같이 선언된 배열이 있는 경우, a[10]에 6을 대입하면 어떻게 되는가?

A3. 프로그램에 오류가 발생한다. 

       6이 제대로 출력되지 않으며 시스템에 심각한 오류를 발생시킬 수 있다.


7.3 배열의 초기화


▶배열의 초기화


초기화 예시1: 기본적인 배열의 초기화

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


초기화 예시2: 일부만 초기화하는 경우, 나머지 원소들은 0으로 초기화

int grade[5] = { 10, 20, 30};           


초기화 예시3: 배열의 크기가 주어지지 않은 경우, 자동적으로 초기값의 개수만큼 배열의 크기가 설정

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


ex) 예제 프로그램: 배열 초기화 예제

#include <stdio.h>


int main()

{

int i;

int grade[5] = {39, 48, 73, 91, 93}


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

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


return 0;

}


grade[0] = 39

grade[1] = 48

grade[2] = 73

grade[3] = 91

grade[4] = 93


ex) 예제 프로그램: 기본적인 배열 초기화 예제

#include <stdio.h>


int main()

{

int i;

int grade[5] = {39, 48, 73, 91, 93};


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

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


return 0;

}


grade[0] = 39

grade[1] = 48

grade[2] = 73

grade[3] = 91

grade[4] = 93


ex) 예제 프로그램: 배열의 일부만 초기화한 예제

#include <stdio.h>


int main()

{

int i;

int grade[5] = {39, 48};


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

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


return 0;

}


grade[0] = 39

grade[1] = 48

grade[2] = 0

grade[3] = 0

grade[4] = 0


ex) 예제 프로그램: 배열의 크기만 초기화한 예제

#include <stdio.h>


int main()

{

int i;

int grade[5];


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

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


return 0;

}


grade[0] = -858993460

grade[1] = -858993460

grade[2] = -858993460

grade[3] = -858993460

grade[4] = -858993460


7.4 일차원 배열의 응용


▶배열의 원소의 개수 계산


int i, size;

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


size = sizeof(grade) / sizeof(grade[0]);        //배열 원소 개수 자동 계산


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

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


▶배열의 응용 예제


ex) 예제 프로그램: 배열 안의 초기값만큼 *출력

#include <stdio.h>

#define STUDENTS 5


int main()

{

int n, m;

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


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

{

printf("번호 %d: ", n);


for(m = 0; m < grade[i]; m++)

printf("*");


printf("\n");

}


return 0;

}


번호 0: ****************************** 

번호 1: ******************** 

번호 2: ********** 

번호 3: **************************************** 

번호 4: ************************************************** 


ex) 예제 프로그램: 최솟값 탐색 

#include <stdio.h>

#define SIZE 5


int main()

{

int i, min;

int grade[SIZE];


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

{

printf("성적을 입력하세요:");

scanf("%d", &grade[i]);

}


min = grade[0];


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

{

if(grade[i] < min)

min = grade[i];

}


printf("가장 낮은 성적은 %d입니다.", min);


return 0;

}


성적을 입력하세요: 90

성적을 입력하세요: 30

성적을 입력하세요: 40

성적을 입력하세요: 70

성적을 입력하세요: 50

가장 낮은 성적은 30입니다.


ex) 예제 프로그램: 빈도 계산

#include <stdio.h>

#define SIZE 11


int main()

{

int i, score;

int freq[SIZE];


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

freq[i] = 0;


while(1)

{

printf("숫자를 입력하세요(종료 -1): ");

scanf("%d", &score);


if(score < 0)

break;


freq[score]++;

}


printf("값    빈도\n");


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

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


return 0;

}


숫자를 입력하세요(종료 -1): 0

숫자를 입력하세요(종료 -1): 7

숫자를 입력하세요(종료 -1): 3

숫자를 입력하세요(종료 -1): 9

숫자를 입력하세요(종료 -1): 9

숫자를 입력하세요(종료 -1): 1

숫자를 입력하세요(종료 -1):  -1

값    빈도

0       1

1       0

2       0

3       1 

...

7       1

8       0

9       2

10      0


7.5 정렬과 탐색


▶정렬이란?


물건을 크기 순으로 오름차순이나 내림차순으로 나열하는 것

정렬은 컴퓨터 공학분야에서 가장 기본적이고 중요한 알고리즘 중에 하나

정렬은 자료 탐색에 있어서 필수적 (ex.만약 사전에서 단어들이 정렬이 안되어 있다면?)


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


ex) 예제 프로그램: 선택 정렬 예제

#include <stdio.h>

#define SIZE 5


int main()

{

int i, j, temp, least;

int list[SIZE] = { 3, 2, 1, 4, 0 };


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

      {

least = i;           // i번째 값을 최소값으로 가정


for(j = i + 1; j < SIZE; j++)        // 최소값 탐색

if(list[j] < list[least])

                      least = j;


            temp = list[i];         // i번째 원소와 least 위치의 원소를 교환

            list[i] = list[least];

            list[least] = temp;

    }


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

        printf("%d ", list[i]);

    printf("\n");


    return 0;

}


0 1 2 3 4


▶탐색: 컴퓨터가 가장 많이 하는 작업 (ex.인터넷 탐색)


ex) 예제 프로그램: 순차 탐색 예제

#include <stdio.h>

#define SIZE 10


int main()

{

int key, n;

int list[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };


printf("탐색할 값을 입력하세요: ");

scanf("%d", &key);


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

{

if(list[i] == key)

printf("탐색 성공 인덱스 = %d\n", i);

}


printf("탐색 종료\n");


return 0;

}


탐색할 값을 입력하세요: 7

탐색 성공 인덱스 = 6

탐색 종료


7.6 다차원 배열


▶2차원 배열


int arr[x][y];        //x는 행(↓)의 개수, y는 열(→)의 개수


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

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

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


ex) 예제 프로그램: 2차원 배열의 활용

#include <stdio.h>


int main()

{

int i, j;                   //2개의 인덱스 변수

int arr[3][5];         //2차원 배열 선언

int value = 0;      


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

{

for(j = 0; j < 5; j++)

{

s[i][j] = value++;

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

}

}


return 0;

}


▶2차원 배열의 초기화


int arr[3][5] = {

{0, 1, 2, 3, 4},             //첫번째 행의 원소들의 초기값

{4, 5, 6, 7, 8},             //첫번째 행의 원소들의 초기값

{9, 10, 11, 12, 13}         //첫번째 행의 원소들의 초기값

};


int arr[][5] = {

{0, 1, 2, 3, 4},             //첫번째 행의 원소들의 초기값

{4, 5, 6, 7, 8},             //첫번째 행의 원소들의 초기값

{9, 10, 11, 12, 13}         //첫번째 행의 원소들의 초기값

};


int arr[][5] = {

{0, 1, 2},             //첫번째 행의 원소들의 초기값

{4, 5, 6},             //첫번째 행의 원소들의 초기값

{9, 10, 11}           //첫번째 행의 원소들의 초기값

};


ex) 예제 프로그램: 다차원 배열 예제

#include <stdio.h>

#define CLASSES 3

#define STUDENTS 5


int main()

{

int class, student            //class는 학급

int sub, total=0 ;             //sub는 각 학급의 성적의 합, total은 전체 학생들의 성적의 합

int s[CLASSES][STUDENTS] = {

{0, 1, 2, 3, 4},                    //학급 0의 학생들의 성적

{10, 11, 12, 13, 14},             //학급 1의 학생들의 성적

{20, 21, 22, 23, 24}           //학급 2의 학생들의 성적

};


for(class = 1; class <= CLASSES; class++)

{

sub = 0;


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

sub += s[class-1][student];


printf("학급 %d의 평균 성적 = %d\n", class, sub / STUDENTS);


total += sub;

}


printf("전체 학생들의 평균 성적 = %d\n", total / (CLASSES * STUDENTS));


return 0;

}


학급 0의 평균 성적 = 2

학급 1의 평균 성적 = 12

학급 2의 평균 성적 = 22

전체 학생들의 평균 성적 = 12


※중간 점검※


Q1. 다차원 배열 int a[3][2][10]에는 몇 개의 원소가 존재하는가?

A1. 60개 (240byte)


Q2. 다차원 배열 int a[3][2][10]의 모든 요소를 0으로 초기화하는 문장을 작성하시오.

A2. int a[3][2][10] = {0};


'C언어 > C프로그래밍 기초(1학기)' 카테고리의 다른 글

6강.반복문  (0) 2019.01.25
5강.조건문  (0) 2019.01.23
4강.수식과 연산자  (0) 2019.01.15
3강.변수와 자료형  (0) 2019.01.14
2강.C언어 기초(2)  (0) 2019.01.14