system software experiment 1 lecture 5 -...

22
System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han ([email protected]) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1

Upload: others

Post on 13-Mar-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

System Software Experiment 1Lecture 5 - ArraySpring 2019

Hwansoo Han ([email protected])Advanced Research on Compilers and Systems, ARCS LAB

Sungkyunkwan Universityhttp://arcs.skku.edu/

1

Page 2: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 (Array)Array))

• 동일한 타입의 데이터가 여러 개 저장되어 있는 저장 장소• 배열의 이름은 그 배열의 시작 주소를 의미

2

int main(Array)){ int i0; int i1; … int i9;}

int main(Array)){ int i[10]; // i[0] ~ i[9]}

Page 3: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 선언• 자료형 이름 [ 크기 ];• 배열 번호 (Array) 인덱스 ) 는 항상 0 부터 시작

3

int main(Array)){ int score[10]; // 10 개의 int 형 값을 가지는 배열 가지는 배열 score float height[10]; // 10 개의 float 형 값을 가지는 배열 가지는 배열 height char name[20]; // 20 개의 char 형 값을 가지는 배열 가지는 배열 name}

Page 4: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 접근

4

int main(Array)){ int score[10]; score[2] = 91;}

91score

score[0]

score[1]

score[2]

score[9]

Page 5: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 초기화• 배열의 크기가 주어지지 않으면 초기값의 개수만큼 설정

5

int main(Array)){ int score[5] = {10, 20, 30};}

score 10 20 30 0 0

score[0]

score[1]

score[2]

int main(Array)){ int score[] = {10, 20, 30};}

score 10 20 30

score[0]

score[1]

score[2]

Page 6: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 크기 계산

6

int main(Array)){ int score[] = {10, 20, 30, 40, 50}; int i, size;

size = sizeof (Array)score) / sizeof (Array)score[0]); // 4 * 5 / 4 = 5 for (Array)i = 0; i < size; i++) { printf(Array)“Score: %d\n”, score[i]); }}

Page 7: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열과 포인터• 배열의 시작 주소를 포인터 변수에 저장 가능

7

int main(Array)){ int array)[3] = {10, 20, 30}; int *pointer = array); printf(Array)“%d %d\n”, array)[0], pointer[0]); printf(Array)“%d %d\n”, array)[1], *(Array)pointer+1)); printf(Array)“%d %d\n”, array)[2], pointer[2]);}

10 1020 2030 30

Page 8: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열과 포인터• 배열의 시작 주소는 상수 형태의 주소 값으로 변경이 불가• 포인터 변수는 저장된 주소 값의 변경이 가능• name2 에 문자열 상수 “ Seokha” 의 시작 주소를 저장• name2 에 문자열 상수 “ Gy)usun” 의 시작 주소를 저장

8

int main(Array)){ char name[6] = “Gy)usun”; name = “Seokha”; // complie error

char *name2 = “Seokha”; name2 = “Gy)usun”;}

Page 9: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

Example - 배열• Array) 에 5 개의 float 형 데이터를 입력받아 평균을 가지는 배열 출력하는 프로그램 생성

9

Page 10: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열과 함수• 배열이 인자인 경우 , 배열 원본을 가지는 배열 전달• 배열 원본의 변경을 가지는 배열 원치 않는 경우 , const 변수 사용

10

int get_average(Array)int[], int);

int main(Array)){ int score[5] = {10, 20, 30, 40, 50}; int average;

average = get_average(Array)score, 5); printf(Array)“Average: %d\n”, average);

return 0;}

int get_average(Array)int score[], int num)// int get_average(Array)const int score[], int num){ int i; int sum = 0;

for (Array)i = 0; i < num; i++) { sum += score[i]; }

return sum / n;}

Page 11: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

다차원 배열• 선 , 면 , 입체 , … → 1 차원 , 2 차원 , 3 차원 , ...• 선언 및 초기화

11

int main(Array)){ int score[5][5]; int array)[2][3] = {{1, 2, 3}, {4, 5, 6}}; score[2][3] = 91;}

91

score

score[0][0]score[1][0]score[2][0]score[3][0]score[4][0]

score[2][3]

Page 12: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

다차원 배열과 함수• 배열 인자의 두 번째 인덱스는 반드시 기입

12

#define CLASS 2#define STUDENTS 5int get_average(Array)int[][STUDENTS], int);int main(Array)){ int score[CLASS][STUDENTS] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int average;

average = get_average(Array)score); printf(Array)“Average: %d\n”, average);

return 0;}

int get_average(Array)int score[][STUDENTS]){ int I, j; int sum = 0;

for (Array)i = 0; i < CLASS; i++) { for (Array)j = 0; j < STUDENTS; j++) { sum += score[i]; } }

return sum / (Array)CLASS * STUDENTS);}

Page 13: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

포인터 배열

13

int main(Array)){ int num1 = 1, num2 = 2; int *array)[2];

array)[0] = &num1; array)[1] = &num2;

printf(Array)“%d\n”, *array)[0]); printf(Array)“%d\n”, *array)[1]);}

12

Page 14: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

Example – 다차원 배열• 3*3 행렬 2 개를 더한 행렬을 가지는 배열 출력• 행렬 인자 하나당 3 칸씩 출력을 가지는 배열 할당

14

1 2 3

4 5 6

7 8 9

1 2 3

4 5 6

7 8 9+ =

?

Page 15: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 동적할당• malloc(Array)size)• 요청한 메모리 바이트만큼 할당• void * 형 시작 주소를 return

15

int main(Array)){ char *a = (Array)char *)malloc(Array)sizeof (Array)char) * 4);

a[0] = 4; // *a = 4; a[1] = 5; // *(Array)a+1) = 5;}

5

4

RAM

0x0

a[0]

a[1]

a[2]

a[3]

Page 16: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 동적할당• calloc(Array)size a, size b)• b 사이즈만큼 a 개의 메모리 할당• 모든 할당받은 메모리를 0 으로 초기화

• realloc(Array)void *p, size)• 메모리 공간의 확장 또는 축소• 할당된 포인터 p 에 대해 size 로 크기를 변경

16

int main(Array)){ char *a = (Array)char *)calloc(Array)sizeof (Array)char) * 4); a = (Array)char *)realloc(Array)p, sizeof (Array)char) * 6);}

RAM

0x0

Page 17: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 동적할당• calloc(Array)size a, size b)• b 사이즈만큼 a 개의 메모리 할당• 모든 할당받은 메모리를 0 으로 초기화

• realloc(Array)void *p, size)• 메모리 공간의 확장 또는 축소• 할당된 포인터 p 에 대해 size 로 크기를 변경

17

int main(Array)){ char *a = (Array)char *)calloc(Array)sizeof (Array)char) * 4); a = (Array)char *)realloc(Array)p, sizeof (Array)char) * 6);}

0

0

0

0

RAM

0x0

a[0]

a[1]

a[2]

a[3]

Page 18: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 동적할당• calloc(Array)size a, size b)• b 사이즈만큼 a 개의 메모리 할당• 모든 할당받은 메모리를 0 으로 초기화

• realloc(Array)void *p, size)• 메모리 공간의 확장 또는 축소• 할당된 포인터 p 에 대해 size 로 크기를 변경

18

int main(Array)){ char *a = (Array)char *)calloc(Array)sizeof (Array)char) * 4); a = (Array)char *)realloc(Array)p, sizeof (Array)char) * 6);}

?

?

0

0

0

0

RAM

0x0

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

Page 19: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

배열 동적할당 - 다차원

19

int main(Array)){ int i = 0; char **a = (Array)char **)malloc(Array)sizeof (Array)char *) * 2);

for (Array)i = 0; i < 2; i++) { a[i] = (Array)char *)malloc(Array)sizeof (Array)char) * 4); }

a[0][0] = 4; // *a = 4; a[1][2] = 5; // *(Array)a+1) = 5;}

5

4

RAM

0x0

a[0][0]

a[0][1]

a[0][2]

a[0][3]

a[1][0]

a[1][1]

a[1][2]

a[1][3]

Page 20: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

Exercise 1 – 오름차순 , 내림차순• 10 개의 int input 에 대해 오름차순 , 내림차순으로 출력

20

Page 21: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

Exercise 2 - Minesweeper

• 제시되어 있는 지뢰 위치에 따라 지뢰찾기가 완료된 상태를 출력• malloc 으로 배열 할당• char 형으로 출력

• 숫자 0: 48 or ‘0’• 기호 *: 42 or ‘*’

21

* * * *

* *

*

*

* *

* * *

* * *

* * *

*

9 * 9

Page 22: System Software Experiment 1 Lecture 5 - Arrayarcs.skku.edu/pmwiki/uploads/Courses/SysSWPractice1/5... · 2019-04-11 · SSE2032: System Software Experiment 1, Spring 2019 다차원배열과함수

Exercise 2 - Minesweeper

• 제시되어 있는 지뢰 위치에 따라 지뢰찾기가 완료된 상태를 출력• malloc 으로 배열 할당• char 형으로 출력

• 숫자 0: 48 or ‘0’• 기호 *: 42 or ‘*’

22