32
Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование» Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Осенний семестр, 2016

Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Практическое занятие 8Массивы

Пименов Евгений Сергеевич

Курс «Программирование»

Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)

Осенний семестр, 2016

Page 2: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Повторение лекционного материала

• Что такое массив?

2

Page 3: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Повторение лекционного материала

• Что такое массив?

• Как элементы массива расположены в памяти?

3

Page 4: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Повторение лекционного материала

• Что такое массив?

• Как элементы массива расположены в памяти?

• Как осуществляется доступ к элементам массива?

4

Page 5: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Повторение лекционного материала

• Что такое массив?

• Как элементы массива расположены в памяти?

• Как осуществляется доступ к элементам массива?

• Как зависит время доступа к элементу от его индекса?

5

Page 6: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Массивы в языке С: инициализация

int array[] = {1, 2, 3, 4};

6

Page 7: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Массивы в языке С: инициализация

int array[] = {1, 2, 3, 4};

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

7

Page 8: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Массивы в языке С: инициализация

int array[] = {1, 2, 3, 4};

int array[5] = {1, 2, 3, 4}; // 1, 2, 3, 4, 0

8

Page 9: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Массивы в языке С: инициализация

int array[] = {1, 2, 3, 4};

int array[5] = {1, 2, 3, 4}; // 1, 2, 3, 4, 0

Размер массива — константа этапа компиляции (C89).

Размер массива может быть переменной (C99).

9

Page 10: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

void make_leaf()

{

// intentionally empty body

}

 

int main()

{

int array[10000];

// don't ask why I'm here

make_leaf();

return 0;

}

Объявление массива01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

10

Page 11: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

void make_leaf()

{

// intentionally empty body

}

 

int main()

{

int array[10000];

// don't ask why I'm here

make_leaf();

return 0;

}

main:

.LFB1:

.cfi_startproc

pushq %rbp

.cfi_def_cfa_offset 16

.cfi_offset 6, -16

movq %rsp, %rbp

.cfi_def_cfa_register 6

subq $40000, %rsp

movl $0, %eax

call make_leaf

movl $0, %eax

leave

.cfi_def_cfa 7, 8

ret

.cfi_endproc

Объявление массива01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

13.

14.

15.

16.

11

Page 12: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

int array[10000];

subq $40000, %rsp

void make_leaf()

{

// intentionally empty body

}

 

int main()

{

// don't ask why I'm here

make_leaf();

return 0;

}

main:

.LFB1:

.cfi_startproc

pushq %rbp

.cfi_def_cfa_offset 16

.cfi_offset 6, -16

movq %rsp, %rbp

.cfi_def_cfa_register 6

movl $0, %eax

call make_leaf

movl $0, %eax

leave

.cfi_def_cfa 7, 8

ret

.cfi_endproc

Объявление массива01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

13.

14.

15.

16.

12

Page 13: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

#include <stdlib.h> void make_leaf(){ // intentionally empty body} int main(){ size_t n = 10000; int array[n]; // don't ask why I'm here make_leaf(); return 0;}

main:.LFB3: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 pushq %rbx subq $40, %rsp .cfi_offset 3, -24 movq %rsp, %rax movq %rax, %rbx movq $10000, -40(%rbp) movq -40(%rbp), %rax movq %rax, %r8 subq $1, %r8 movq %r8, -32(%rbp) movq %rax, %rsi movl $0, %edi movq %rax, %rdx movl $0, %ecx salq $2, %rax leaq 3(%rax), %rdx movl $16, %eax subq $1, %rax addq %rdx, %rax movl $16, %ecx movl $0, %edx divq %rcx imulq $16, %rax, %rax subq %rax, %rsp movq %rsp, %rax addq $3, %rax shrq $2, %rax salq $2, %rax movq %rax, -24(%rbp) movl $0, %eax call make_leaf

Массивы переменной длины01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.

01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.

13

Page 14: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

int array[n];

movq -40(%rbp), %raxmovq %rax, %r8subq $1, %r8movq %r8, -32(%rbp)movq %rax, %rsimovl $0, %edimovq %rax, %rdxmovl $0, %ecxsalq $2, %raxleaq 3(%rax), %rdxmovl $16, %eaxsubq $1, %raxaddq %rdx, %raxmovl $16, %ecxmovl $0, %edxdivq %rcximulq $16, %rax, %raxsubq %rax, %rspmovq %rsp, %raxaddq $3, %raxshrq $2, %raxsalq $2, %raxmovq %rax, -24(%rbp)movl $0, %eax

#include <stdlib.h> void make_leaf(){ // intentionally empty body} int main(){ size_t n = 10000; // don't ask why I'm here make_leaf(); return 0;}

main:.LFB3: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 pushq %rbx subq $40, %rsp .cfi_offset 3, -24 movq %rsp, %rax movq %rax, %rbx movq $10000, -40(%rbp) call make_leaf

Массивы переменной длины01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.

01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.

14

Page 15: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Строки в языке C

В языке С нет встроенного типа для хранения строк

15

Page 16: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Строки в языке C

В языке С нет встроенного типа для хранения строк

Строка — массив символов. Признак конца строки — байт со значением 0.

eh ll \0o

16

Page 17: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Ввод строк

char *fgets(char *s, int size, FILE *stream);

fgets() reads in at most one less than size characters from stream and

stores them into the buffer pointed to by s. Reading stops after an EOF or a

newline. If a newline is read, it is stored into the buffer. A terminating null

byte ('\0') is stored after the last character in the buffer.

17

Page 18: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Ввод строк#include <stdio.h> enum { MaxNameLength = 40}; int main(){ char name[MaxNameLength];  printf("Enter name: "); fgets(name, MaxNameLength - 1, stdin);  printf("Hello, %s!\n", name);  return 0;}

01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.

18

Page 19: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Длина строки и размер массива?#include <stdio.h>

#include <string.h>

 

int main()

{

char name[4] = "Mary";

 

printf("sizeof(name) = %zu\n", sizeof(name));

printf("strlen(name) = %zu\n", strlen(name));

 

return 0;

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

19

Page 20: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Длина строки и размер массива?#include <stdio.h>

#include <string.h>

 

int main()

{

char name[4] = "Mary";

 

printf("sizeof(name) = %zu\n", sizeof(name)); // 4

printf("strlen(name) = %zu\n", strlen(name)); // Undefined

 

return 0;

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

20

Page 21: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Длина строки и размер массива?#include <stdio.h>

#include <string.h>

 

int main()

{

char name[] = "Mary";

 

printf("sizeof(name) = %zu\n", sizeof(name));

printf("strlen(name) = %zu\n", strlen(name));

 

return 0;

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

21

Page 22: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Длина строки и размер массива?#include <stdio.h>

#include <string.h>

 

int main()

{

char name[] = "Mary";

 

printf("sizeof(name) = %zu\n", sizeof(name)); // 5

printf("strlen(name) = %zu\n", strlen(name)); // 4

 

return 0;

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

22

Page 23: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Длина строки и размер массива?#include <stdio.h>

#include <string.h>

 

int main()

{

char name[] = {'M', 'a', 'r', 'y'};

 

printf("sizeof(name) = %zu\n", sizeof(name));

printf("strlen(name) = %zu\n", strlen(name));

 

return 0;

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

23

Page 24: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Длина строки и размер массива?#include <stdio.h>

#include <string.h>

 

int main()

{

char name[] = {'M', 'a', 'r', 'y'};

 

printf("sizeof(name) = %zu\n", sizeof(name)); // 4

printf("strlen(name) = %zu\n", strlen(name)); // Undefined

 

return 0;

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

24

Page 25: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Задание 1

Реализовать алгоритм Bubble sort.

Пользователь вводит размер массива и значения элементов или только

значения элементов при использовании массива фиксированного

размера.

Приложение выводит отсортированный массив и количество

выполненных итераций.

https://visualgo.net/sorting

25

Page 26: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Задание 2

Разработать приложение, проверяющее, является ли введенная

пользователем строка палиндромом.

Примеры палиндромов:

• Hannah

• racecar

• I

26

Page 27: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Домашнее задание 1

Реализовать алгоритмы сортировки вставками и подсчетом.

27

Page 28: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Домашнее задание 2

Разработать приложение, проверяющее, является ли введенная

пользователем фраза палиндромом.

Примеры палиндромов:

• Never odd or even

• Madam in Eden, I'm Adam.

Если фраза не содержит ни одной буквы, вывести сообщение об ошибке.

28

Page 29: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Домашнее задание 3*

Дан рельеф:

__

7 _|77|

6 |6 | _

5 | |_ |5|

4 | 4|_ | |

3 | 3|_ | |_

2 | 2|_| 2|

1 |___________1____|

29

Page 30: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Домашнее задание 3*

Представим, что идет дождь:

''''''''''''''''''''

__

7 _|77|

6 |6 | _

5 | |_ |5|

4 | 4|_ | |

3 | 3|_ | |_

2 | 2|_| 2|

1 |___________1____|

30

Page 31: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Домашнее задание 3*

Сколько воды соберется в углублениях?

__

7 _|77|

6 |6 | _

5 | |⋅ ⋅ ⋅ ⋅|5|4 | 4|⋅ ⋅ ⋅| |3 | 3|⋅ ⋅| |_2 | 2|⋅| 2|1 |___________1____|

Ответ: 10

31

Page 32: Массивыeperyshkova/downloads/prog/... · 2016-10-26 · Практическое занятие 8 Массивы Пименов Евгений Сергеевич Курс «Программирование

Домашнее задание 3*

Пользователь вводит значения одномерного массива, определяющие

высоту «стен». Приложение вычисляет объем «воды», собравшейся между

стенами.

• Единица объема воды — одна ячейка

• Слева и справа рельеф не ограничен. В приведенном примере вода с

краев выплескивается.

32