제8장 배열 1부 8.1 배열 8.2 배열의 초기화 8.3 배열의 응용 8.4 정렬과 탐색 8.5 다차원 배열.

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
C++ Espresso 제3장 배열과 포인터.
배열, 포인터 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
Chapter 7. 조건문.
제 9 장 구조체와 공용체.
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
5장 배열 작성자 : 변재현.
누구나 즐기는 C언어 콘서트 제8장 배열.
C언어 콘서트 제6장 반복문.
5장. 참조 타입.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
포인터 활용 포인터 활용.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express Slide 1 (of 32)
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
6장. printf와 scanf 함수에 대한 고찰
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
C#.
쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express Slide 1 (of 27)
프로그래밍 개요
어서와 C언어는 처음이지 제14장.
어서와 C언어는 처음이지 제15장.
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
CHAP 9: 정렬 순천향대학교 컴퓨터학부 하 상 호.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
제 1 강.
제 3 강.
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
7주차: Functions and Arrays
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
CHAP 9: 정렬 순천향대학교 컴퓨터학부 하 상 호.
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
어서와 C언어는 처음이지 제16장.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제7장 배열 출처: pixabay.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

제8장 배열 1부 8.1 배열 8.2 배열의 초기화 8.3 배열의 응용 8.4 정렬과 탐색 8.5 다차원 배열

이번 장에서 학습할 내용 반복의 개념 이해 배열의 개념 배열의 선언과 초기화 일차원 배열 다차원 배열

배열이란? 배열(array): 같은 타입의 데이터를 여러 개 저장하는 저장 장소 배열을 이용하면 여러 개의 값을 하나의 이름으로 지칭할 수 있다. 배열 안에 있는 각 데이터에는 정수번호(인덱스)를 이용하여 접근 첨자 또는 인덱스

배열의 필요성 학생이 10명이 있고 이들의 평균 성적을 계산한다고 가정하자.

배열의 필요성

배열의 선언 자료형: 배열 원소들이 int형라는 것을 의미 배열 이름: grade 배열 크기: 배열 원소의 개수가 10개 인덱스(첨자)는 항상 0부터 시작한다. int score[60];             // 60개의 int형 값을 가지는 배열 grade float cost[12];           // 12개의 float형 값을 가지는 배열 cost char name[50];             // 50개의 char형 값을 가지는 배열 name

배열의 선언 배열의 크기는 항상 양의 정수인 상수로 표현해야 한다. 변수, 음수, 실수를 사용하면 컴파일 오류 모두 컴파일 오류 배열의 크기는 흔히 기호상수로 표현 int size = 5; int score[size];               float cost[0];  char name[-2]; char name[3.2];  #define SIZE 5 int score[SIZE];      // ok! const int SIZE = 5;

배열의 각 원소에 접근 인덱스 (예) grade[0] = 80; // 0번째 원소에 80을 대입 grade[1] = grade[0]; // 0번째 원소를 1번째 원소로 복사 grade[i] = 100; // 변수 인덱스 가능! grade[i+2] = 100; // 수식 인덱스 가능

배열 활용 예 #include <stdio.h> int main(void) grade[0]=10 { 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++) // <---------------------- 0이상 5 미만! printf("grade[%d]=%d\n",i, grade[i]); return 0; } grade[0]=10 grade[1]=20 grade[2]=30 grade[3]=40 grade[4]=50

배열 활용 예 #include <stdio.h> #include <stdlib.h> #define SIZE 5 int main(void) { int i; int grade[SIZE]; for(i = 0; i < SIZE; i++) grade[i] = rand() % 100; printf("grade[%d]=%d\n", i, grade[i]); return 0; } grade[0]=41 grade[1]=67 grade[2]=34 grade[3]=0 grade[4]=69

배열 활용 예 #include <stdio.h> #include <stdlib.h> #define SIZE 5 int main(void) { int i; int grade[SIZE]; printf("5명의 점수를 입력하시오\n"); for(i = 0; i < SIZE; i++) scanf("%d", &grade[i]); printf("grade[%d]=%d\n", i, grade[i]); return 0; } grade[0]=41 grade[1]=67 grade[2]=34 grade[3]=0 grade[4]=69

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

잘못된 인덱스 문제 인덱스가 배열의 크기를 벗어나게 되면 프로그램에 치명적인 오류를 발생시킨다. C에서는 프로그래머가 인덱스가 범위를 벗어나지 않았는지를 확인하고 책임을 져야 한다. int grade[5]; … grade[5] = 60; // 치명적인 오류!

잘못된 인덱스 예 #include <stdio.h> int main(void) { 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; } 시스템에 심각한 오류가 발생할 수도 있다.

중간 점검 1. n개의 원소를 가지는 배열의 경우, 첫 번째 원소의 인덱스는 무엇인가? 3. 범위를 벗어나는 인덱스를 사용하면 어떻게 되는가? 즉 int a[10];과 같이 선언된 배열이 있는 경우, a[10]에 6을 대입하면 어떻게 되는가?

배열의 초기화 int grade[5] = { 10,20,30,40,50 };

배열의 초기화 배열의 크기가 주어지지 않으면 자동적으로 초기값의 개수만큼이 배열의 크기로 잡힌다.

배열 초기화 예 #include <stdio.h> int main(void) { int grade[5] = { 31, 63, 62, 87, 14 }; int i; for(i = 0; i < 5; i++) printf("grade[%d] = %d\n", i, grade[i]); return 0; } grade[0] = 31 grade[1] = 63 grade[2] = 62 grade[3] = 87 grade[4] = 14

배열 초기화 예 #include <stdio.h> int main(void) { int grade[5] = { 31, 63 }; int i; for(i = 0; i < 5; i++) printf("grade[%d] = %d\n", i, grade[i]); return 0; } grade[0] = 31 grade[1] = 63 grade[2] = 0 grade[3] = 0 grade[4] = 0

배열 초기화 예 #include <stdio.h> int main(void) { int grade[5] ; int i; for(i = 0; i < 5; i++) printf("grade[%d] = %d\n", i, grade[i]); return 0; } grade[0]=4206620 grade[1]=0 grade[2]=4206636 grade[3]=2018779649 grade[4]=1

배열 원소의 갯수 계산 int grade[] = { 1, 2, 3, 4, 5, 6 }; int i, size; size = sizeof(grade) / sizeof(grade[0]); for(i = 0; i < size ; i++)         printf("%d ", grade[i]); 배열 원소 개수 자동 계산

중간 점검 1. 배열 a[6]의 원소를 1, 2, 3, 4, 5, 6으로 초기화하는 문장을 작성하라. 2. 배열의 초기화에서 초기값 갯수가 원소의 갯수보다 작은 경우에는 어떻게 되는가? 3. 배열의 크기를 주지 않고 초기값의 개수로 배열의 크기를 결정할 수 있는가?

예 #include <stdio.h> #define STUDENTS 5 int main(void) {         int grade[STUDENTS] = { 30, 20, 10, 40, 50 };         int i, s;                  for(i = 0; i < STUDENTS; i++)         {                 printf("번호 %d: ", i);                 for(s = 0; s < grade[i]; s++)                         printf("*");                 printf("\n");         }         return 0; } 번호 0: ****************************** 번호 1: ******************** 번호 2: ********** 번호 3: **************************************** 번호 4: **************************************************

최소값 탐색 #include <stdio.h> 성적을 입력하시오: 50 #define SIZE 5 int main(void) {         int grade[SIZE];         int i, min;                  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입니다.\n", min);         return 0; } 성적을 입력하시오: 50 성적을 입력하시오: 40 성적을 입력하시오: 30 성적을 입력하시오: 20 성적을 입력하시오: 10 최소값은 10입니다.

빈도 계산 #include <stdio.h> 숫자를 입력하시오(종료 -1): 0 #define SIZE 101 int main(void) {         int freq[SIZE];         int i, score;                  for(i = 0; i < SIZE; i++)                 freq[i] = 0;         while(1)         {                 printf("숫자를 입력하시오(종료-1): ");                 scanf("%d", &score);                 if (score < 0) break;                 freq[score]++;         }         printf("값   빈도\n");                 printf("%3d     %3d \n", i, freq[i]);         return 0; } 숫자를 입력하시오(종료 -1): 0 숫자를 입력하시오(종료 -1): 1 숫자를 입력하시오(종료 -1): 99 숫자를 입력하시오(종료 -1): 100 숫자를 입력하시오(종료 -1): -1 값     빈도   0       1   1       1   2       0   ...  98       0  99       1 100       2

제8장 배열 2부 8.1 배열 8.2 배열의 초기화 8.3 배열의 응용 8.4 정렬과 탐색 8.5 다차원 배열

이번 장에서 학습할 내용 반복의 개념 이해 배열의 개념 배열의 선언과 초기화 일차원 배열 배열의 응용 정렬과 탐색 다차원 배열

정렬이란? 정렬은 물건을 크기순으로 오름차순이나 내림차순으로 나열하는 것 정렬은 컴퓨터 공학분야에서 가장 기본적이고 중요한 알고리즘중의 하나 정렬은 자료 탐색에 있어서 필수적이다. (예) 만약 사전에서 단어들이 정렬이 안되어 있다면?

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

선택 정렬 1/2 #include <stdio.h> #define SIZE 10 int main(void) { int list[SIZE] = { 3, 2, 9, 7, 1, 4, 8, 0, 6, 5 }; int i, j, temp, least;

선택 정렬 2/2 for(i = 0; i < SIZE-1; i++) { least = i; // i번째 값을 최소값으로 가정 for(j = i + 1; j < SIZE; j++) // 최소값 탐색 if(list[j] < list[least]) least = j; // i번째 원소와 least 위치의 원소를 교환 temp = list[i]; 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 5 6 7 8 9 계속하려면 아무 키나 누르십시오 . . .

탐색 탐색(search)은 컴퓨터가 가장 많이 하는 작업 (예) 인터넷 탐색

순차 탐색 #include <stdio.h> #define SIZE 10 int main(void) { int key, i; 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 탐색 종료

이번 장에서 학습할 내용 반복의 개념 이해 배열의 개념 배열의 선언과 초기화 일차원 배열 배열의 응용 정렬과 탐색 다차원 배열

2차원 배열 int s[10]; // 1차원 배열 int s[3][10]; // 2차원 배열 행의 개수 열의 개수

2차원 배열의 활용 #include <stdio.h> int main(void) {         int s[3][5];         // 2차원 배열 선언         int i, j;             // 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 s[3][5] = { { 0, 1, 2, 3, 4 }, // 첫 번째 행의 원소들의 초기값   {  0,  1,  2,  3,  4 }, // 첫 번째 행의 원소들의 초기값   { 10, 11, 12, 13, 14 }, // 두 번째 행의 원소들의 초기값   { 20, 21, 22, 23, 24 } // 세 번째 행의 원소들의 초기값 };

2차원 배열의 초기화 int s[ ][5] = { { 0, 1, 2, 3, 4 }, // 첫 번째 행의 원소들의 초기값   {  0,  1,  2,  3,  4 }, // 첫 번째 행의 원소들의 초기값   { 10, 11, 12, 13, 14 }, // 두 번째 행의 원소들의 초기값   { 20, 21, 22, 23, 24 }, // 세 번째 행의 원소들의 초기값 };

2차원 배열의 초기화 int s[ ][5] = { { 0, 1, 2 }, // 첫 번째 행의 원소들의 초기값   {  0,  1,  2 },        // 첫 번째 행의 원소들의 초기값   { 10, 11, 12 },         // 두 번째 행의 원소들의 초기값   { 20, 21, 22 }           // 세 번째 행의 원소들의 초기값 };

배열 초기화 #include <stdio.h> int main(void) { int arr[3][2] = {1, 2, 3, 4, 5}; for (int i = 0; i < 3; i++) for (int j = 0; j < 2; j++) printf("%d ", arr[i][j]); printf("\n"); } return 0;

배열 초기화 #include <stdio.h> int main(void) { int arr[ ][2] = {1, 2, 3, 4, 5}; for (int i = 0; i < 3; i++) for (int j = 0; j < 2; j++) printf("%d ", arr[i][j]); printf("\n"); } return 0;

배열 초기화 #include <stdio.h> int main(void) { int arr[ ][2] = {1, 2, 3, 4, 5}; for (int i = 0; i < 3; i++) for (int j = 0; j < 2; j++) printf("%d ", arr[i][j]); printf("\n"); } return 0;

배열 초기화 #include <stdio.h> int main(void) { int arr[ ][3] = {1, 2, 3, 4, 5}; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) printf("%d ", arr[i][j]); printf("\n"); } return 0;

컴파일 안됨 #include <stdio.h> int main(void) { int arr[ ][] = {1, 2, 3, 4, 5}; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) printf("%d ", arr[i][j]); printf("\n"); } return 0;

컴파일 안됨 #include <stdio.h> int main(void) { int arr[2][ ] = {1, 2, 3, 4, 5}; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) printf("%d ", arr[i][j]); printf("\n"); } return 0;

다차원 배열 예 #include <stdio.h> #define CLASSES 3 #define STUDENTS 5   int main(void) { int s[CLASSES][STUDENTS] = { { 0, 1, 2, 3, 4 }, // 첫번째 행의 원소들의 초기값 { 10, 11, 12, 13, 14 }, // 두번째 행의 원소들의 초기값 { 20, 21, 22, 23, 24 }, // 세번째 행의 원소들의 초기값 }; int clas, student, total, subtotal;

다차원 배열 예 total = 0; for(clas = 0; clas < CLASSES; clas++) { subtotal = 0; for(student = 0; student < STUDENTS; student++) subtotal += s[clas][student]; printf("학급 %d의 평균 성적= %d\n", clas, subtotal / STUDENTS); total += subtotal; }   printf("전체 학생들의 평균 성적= %d\n", total/(CLASSES * STUDENTS)); return 0; 학급 0의 평균 성적 = 2 학급 1의 평균 성적 = 12 학급 2의 평균 성적 = 22 전체 학생들의 평균 성적 = 12

다차원 배열을 이용한 행렬 덧셈 #include <stdio.h> #define ROWS 3 #define COLS 3 int main(void) {         int A[ROWS][COLS] = {       { 2,3,0 },                                         { 8,9,1 },                                         { 7,0,5 } };         int B[ROWS][COLS] = {       { 1,0,0 },                                         { 1,0,0 },                                         { 1,0,0 } };         int C[ROWS][COLS];        

다차원 배열을 이용한 행렬의 표현 int r, c; // 두개의 행렬을 더한다.         // 두개의 행렬을 더한다.         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; } 3 3 0 9 9 1 8 0 5

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

Q & A