Download presentation
Presentation is loading. Please wait.
1
개정판 누구나 즐기는 C언어 콘서트 제7장 배열 출처: pixabay
2
배열을 사용하면 한 번에 여러 개의 값을 저장할 수 있는 공간을 할당받을 수 있다.
이번 장에서 학습할 내용 배열을 사용하면 한 번에 여러 개의 값을 저장할 수 있는 공간을 할당받을 수 있다. 배열의 개념 배열의 선언과 초기화 일차원 배열 다차원 배열
3
이번 장에서 만들 프로그램
4
배열 많은 값을 한꺼번에 저장할 수 있는 저장 장소
5
배열의 필요성 학생이 10명이 있고 이들의 평균 성적을 계산한다고 가정하자.
6
배열의 선언
7
배열 요소와 인덱스 인덱스(index): 배열 요소의 번호
8
배열 선언의 예 // 60개의 int형 값을 가지는 배열 scores int score[60];
// 12개의 float형 값을 가지는 배열 cost float cost[12]; char name[50]; // 50개의 char형 값을 가지는 배열 name
9
배열 요소 접근 scores[0] = 80; // 0번째 요소에 80을 저장한다.
scores[3] = scores[2]; // 2번째 요소를 3번째 요소로 복사한다. scores[k] = 100; // k번째 요소에 100을 저장한다.
10
배열 선언 예제 #include <stdio.h> int main(void) { int i;
int scores[5]; scores[0] = 10; scores[1] = 20; scores[2] = 30; scores[3] = 40; scores[4] = 50; for(i=0;i < 5; i++) printf("scores[%d]=%d\n",i, scores[i]); return 0; }
11
배열과 반복문 배열의 가장 큰 장점은 반복문을 사용하여서 배열의 원소를 간편하 게 처리할 수 있다는 점
scores[0] = 0; scores[1] = 0; scores[2] = 0; scores[3] = 0; scores[4] = 0; #define SIZE 5 ... for(i=0 ; i<SIZE ; i++) scores[i] = 0;
12
문자형 배열 #include <stdio.h> #define SIZE 26 int main(void) {
int i; char codes[SIZE]; for (i = 0; i < SIZE; i++) codes[i] = 'a' + i; // ‘a'에 1을 더하면 ’b'가 된다. printf("%c ", codes[i]); printf("\n"); return 0; }
13
배열 예제 #3 #include <stdio.h> #define STUDENTS 5 int main(void)
{ int scores[STUDENTS]; int sum = 0; int i, average; for(i = 0; i < STUDENTS; i++) printf("학생들의 성적을 입력하시오: "); scanf("%d", &scores[i]); } sum += scores[i]; average = sum / STUDENTS; printf("성적 평균= %d\n", average); return 0; 학생들의 성적을 입력하시오: 10 학생들의 성적을 입력하시오: 20 학생들의 성적을 입력하시오: 30 학생들의 성적을 입력하시오: 40 학생들의 성적을 입력하시오: 50 성적 평균 = 30
14
잘못된 인덱스 문제 인덱스가 배열의 크기를 벗어나게 되면 프로그램에 치명적인 오류 를 발생시킨다. int scores[10];
… scores[10] = 98; // 치명적인 오류!
15
잘못된 인덱스 예제 #include <stdio.h> int main(void) { int scores[5];
int i; scores[0]=10; scores[1]=20; scores[2]=30; scores[3]=40; scores[4]=50; scores[5]=60; for(i = 0; i <= 5; i++) printf("scores[%d]=%d\n", i, scores[i]); return 0; } 시스템에 심각한 오류가 발생할 수도 있다.
16
중간 점검 1. n개의 원소를 가지는 배열의 경우, 첫 번째 원소의 인덱스는 무엇인 가? 2. n개의 원소를 가지는 배열의 경우, 마지막 원소의 인덱스는 무엇인 가? 3. 범위를 벗어나는 인덱스를 사용하면 어떻게 되는가? 즉 int a[10]; 과 같이 선언된 배열이 있는 경우, a[10]에 6을 대입하면 어떻게 되 는가?
17
배열의 초기화
18
배열의 초기화 배열의 크기가 주어지지 않으면 자동적으로 초기값의 개수만큼이 배열의 크기로 잡힌다.
19
배열의 초기화 초깃값이 주어지지 않는다면 일반 변수와 마찬가지로 아무 의미없 는 쓰레기 값이 들어가게 된다.
20
배열 초기화 예제 #include <stdio.h> int main(void) {
int scores[5] = { 31, 63, 62, 87, 14 }; int i; for(i = 0; i < 5; i++) printf("scores[%d] = %d\n", i, scores[i]); return 0; } scores[0] = 31 scores[1] = 63 scores[2] = 62 scores[3] = 87 scores[4] = 14
21
배열 초기화 예제 #include <stdio.h> int main(void) {
int scores[5] = { 31, 63 }; int i; for(i = 0; i < 5; i++) printf("scores[%d] = %d\n", i, scores[i]); return 0; } scores[0] = 31 scores[1] = 63 scores[2] = 0 scores[3] = 0 scores[4] = 0
22
배열 초기화 예제 #include <stdio.h> int main(void) { int scores[5] ;
int i; for(i = 0; i < 5; i++) printf("scores[%d] = %d\n", i, scores[i]); return 0; } scores[0]= scores[1]=0 scores[2]= scores[3]= scores[4]=1
23
중간 점검 배열 a[6]의 원소를 1, 2, 3, 4, 5, 6으로 초기화하는 문장을 작성 하라.
배열의 초기화에서 초기값이 개수가 배열 원소의 개수보다 적은 경우에는 어떻게 되는가? 또 반대로 많은 경우에는 어떻게 되는가? 배열의 크기를 주지 않고 초기값의 개수로 배열의 크기를 결정할 수 있는가?
24
Lab: 배열에 출석 기록하기 간단한 전자 출석부를 배열을 이용하여 구현해보자
25
Sol: #include <stdio.h> #define SIZE 16 int main(void) {
int att_book[SIZE] = { 0 }; int i, count=0; // 사용자로부터 출석인지 결석인지를 받아서 배열에 저장한다. for (i = 0; i < SIZE; i++) { printf("%d번째 강의에 출석하셨나요(출석은 1, 결석은 0): ", i+1); scanf("%d", &att_book[i]); }
26
Sol: // 배열을 검사하여서 결석한 횟수를 계산한다. for (i = 0; i < SIZE; i++) {
if (att_book[i] == 0) count++; } // 이번 학기 결석률을 계산한다. double ratio = count / 16.0; if (ratio > 0.3) printf("수업 일수 부족입니다(%f%%). \n", ratio*100.0); return 0;
27
Lab: 가장 싼 물건 찾기 우리는 인터넷에서 상품을 살 때, 가격 비교 사이트를 통하여 가장 싼 곳을 검색한다.
우리는 인터넷에서 상품을 살 때, 가격 비교 사이트를 통하여 가장 싼 곳을 검색한다. 일반적으로 배열에 들어 있는 정수 중에서 최소값을 찾는 문제와 같 다.
28
실행 결과
29
알고리즘 배열 prices[]의 원소를 난수로 초기화한다. 일단 첫 번째 원소를 최소값 minium이라고 가정한다.
for(i=1; i<배열의 크기; i++) if ( prices[i] < minimum ) minimum = prices[i] 반복이 종료되면 minimum에 최소값이 저장된다.
30
Sol: #include <stdio.h> #define SIZE 10 int main(void) {
int prices[SIZE] = { 12, 3, 19, 6, 18, 8, 12, 4, 1, 19 }; int i, minimum; printf("[ "); for (i = 0; i < SIZE; i++) { printf("%d ", prices[i]); } printf("]\n"); minimum = prices[0]; for (i = 1; i < SIZE; i++) if (prices[i] < minimum) minimum = prices[i]; printf("최소값은 %d입니다.\n", minimum); return 0; Sol:
31
도전문제 위의 프로그램에서는 최소값을 계산하였다. 이번에는 배열의 원소 중에서 최대값을 찾도록 변경하여 보자. 변수 이름도 적절하게 변경 하라.
32
Lab: 배열에서 특정한 값 탐색하기 여기서는 정수들이 배열에 저장되어 있고 여기에서 사용자가 특정 한 정수를 찾는다고 가정한다.
33
Sol: #include <stdio.h> #define SIZE 10 int main(void) {
int key, i; int list[SIZE] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; printf("[ "); for (i = 0; i < SIZE; i++) { printf("%d ", list[i]); } printf("]\n");
34
Sol: printf("탐색할 값을 입력하시오:"); scanf("%d", &key);
for (i = 0; i < SIZE; i++) { if (list[i] == key) { printf("탐색 성공 인덱스= %d\n", i); break; } return 0;
35
정렬이란? 정렬은 물건을 크기순으로 오름차순이나 내림차순으로 나열하는 것
정렬은 컴퓨터 공학분야에서 가장 기본적이고 중요한 알고리즘중의 하나
36
정렬이란? 정렬은 자료 탐색에 있어서 필수적이다. (예) 만약 사전에서 단어들이 정렬이 안되어 있다면?
37
버블 정렬
38
버블 정렬
39
버블 정렬 #include <stdio.h> #define SIZE 5 int main(void) {
int i, k; int list[SIZE] = { 16, 7, 9, 1, 3 }; // 배열의 요소를 정렬한다. for (k = 0; k < SIZE; k++) { for (i = 0; i < SIZE-1; i++) { if (list[i] > list[i + 1]) { // 크기 순이 아니면 // 서로 교환한다. int tmp = list[i]; list[i] = list[i + 1]; list[i + 1] = tmp; }
40
버블 정렬 // 배열의 요소를 출력한다. for (i = 0; i < SIZE; i++) {
printf("%d ", list[i]); } return 0;
41
변수의 값을 서로 교환할 때 다음과 같이 하면 안됨
list[i] = list[least]; // list[i]의 기존값은 파괴된다! list[least] = list[i]; 올바른 방법 temp = list[i]; list[i] = list[least]; list[least] = temp;
42
Lab: 버블 정렬(그래픽 버전) 다음과 같이 버블 정렬의 과정을 그림으로 보여주는 프로그램을 작 성해보자.
43
Sol. #include <windows.h> #include <stdio.h>
#define SIZE 10 int main(void) { int i, k; int list[SIZE] = { 100, 30, 20, 78, 89, 12, 56, 38, 99, 66 }; HDC hdc = GetWindowDC(GetForegroundWindow()); for (k = 0; k < SIZE; k++) { Rectangle(hdc, 0, 0, 800, 800); // 화면을 지운다. for (i = 0; i < SIZE-1; i++) { // 버블 정렬 if (list[i] > list[i + 1]) { int tmp = list[i]; list[i] = list[i + 1]; list[i + 1] = tmp; }
44
Sol. // 배열의 요소를 하나씩 꺼내서 사각형을 그린다. for (i = 0; i < SIZE; i++) {
Rectangle(hdc, i * 30, 200, i * 30, list[i]); } Sleep(1000); // 1초 동안 기다린다. return 0;
45
2차원 배열 int s[3][5]; // 2차원 배열
46
2차원 배열의 초기화 int s[3][5] = { { 0, 1, 2, 3, 4 }, // 첫 번째 행의 원소들의 초기값
{ 0, 1, 2, 3, 4 }, // 첫 번째 행의 원소들의 초기값 { 10, 11, 12, 13, 14 }, // 두 번째 행의 원소들의 초기값 { 20, 21, 22, 23, 24 } // 세 번째 행의 원소들의 초기값 };
47
기본 예제 #include <stdio.h> int main(void) { int i, j;
// 3행과 5열을 가지는 2차원 배열 선언 int a[3][5] = { { 0, 1, 2, 3, 4 }, { 0, 1, 2, 3, 4 }, { 0, 1, 2, 3, 4 } }; // 각 배열 요소의 값을 출력한다. for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) { printf("a[%d][%d] = %d ", i, j, a[i][j]); } printf("\n"); return 0;
48
실행 결과
49
Lab: 행렬 행렬(matrix)는 자연과학에서 많은 문제를 해결하는데 사용
50
Sol: #include <stdio.h> #define ROWS 3 #define COLS 3
int main(void) { int r, c; int A[ROWS][COLS] = { { 1,0,0 }, { 0,1,0 }, { 0,0,1 } }; int B[ROWS][COLS] = { { 1,0,0 }, { 0,1,0 }, { 0,0,1 } }; int C[ROWS][COLS]; // 두개의 행렬을 더한다. for (r = 0; r < ROWS; r++) { for (c = 0; c < COLS; c++) { C[r][c] = A[r][c] + B[r][c]; printf("%d ", C[r][c]); } printf("\n"); return 0;
51
실습: tic-tac-toe tic-tac-toe 게임은 2명의 경기자가 오른쪽과 같은 보드를 이용하 여서 번갈아가며 O와 X를 놓는 게임이다. 같은 글자가 가로, 세로, 혹은 대각선 상에 놓이면 이기게 된다.
52
실행 결과 (x, y) 좌표(종료 -1, -1): 0 0 ---|---|--- X | | | |
| | (x, y) 좌표(종료 -1, -1): 1 1 | O | ...
53
알고리즘 보드를 초기화한다. while(1) 보드를 화면에 출력한다. 사용자로부터 좌표 x, y를 받는다.
if (board[x][y]가 비어 있으면) if( 현재 경기자가 ‘X’이면 ) board[x][y] = ‘X’ else board[x][y] = ‘O’ 오류 메시지를 출력한다
54
소스 #include <stdio.h> int main(void) { char board[3][3];
int x, y, k, i; // 보드를 초기화한다. for (x = 0; x < 3; x++) for (y = 0; y < 3; y++) board[x][y] = ' '; // 사용자로부터 위치를 받아서 보드에 표시한다. for (k = 0; k < 9; k++) { printf("(x, y) 좌표: "); scanf("%d %d", &x, &y); board[x][y] = (k%2==0)?'X':'O'; // 현재의 순번에 따라 'X', 'O'중 선택
55
소스 // 보드를 화면에 그린다. for (i = 0; i < 3; i++) {
printf("---|---|---\n"); printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); } return 0;
56
도전문제 (1) 한번 놓은 곳에는 놓지 못하게 하라. (2) 컴퓨터와 인간의 게임으로 업그레이드해보자. 컴퓨터가 다음 수를 결정하도록 프로그램을 변경하라. 가장 간단한 알고리즘을 사용한다. 예를 들면 비어 있는 첫 번째 위치에 놓는다.
57
Q & A
Similar presentations