Trivia
7강.배열 본문
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 |