Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Практическое занятие 8Массивы
Пименов Евгений Сергеевич
Курс «Программирование»
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)
Осенний семестр, 2016
Повторение лекционного материала
• Что такое массив?
2
Повторение лекционного материала
• Что такое массив?
• Как элементы массива расположены в памяти?
3
Повторение лекционного материала
• Что такое массив?
• Как элементы массива расположены в памяти?
• Как осуществляется доступ к элементам массива?
4
Повторение лекционного материала
• Что такое массив?
• Как элементы массива расположены в памяти?
• Как осуществляется доступ к элементам массива?
• Как зависит время доступа к элементу от его индекса?
5
Массивы в языке С: инициализация
int array[] = {1, 2, 3, 4};
6
Массивы в языке С: инициализация
int array[] = {1, 2, 3, 4};
int array[5] = {1, 2, 3, 4};
7
Массивы в языке С: инициализация
int array[] = {1, 2, 3, 4};
int array[5] = {1, 2, 3, 4}; // 1, 2, 3, 4, 0
8
Массивы в языке С: инициализация
int array[] = {1, 2, 3, 4};
int array[5] = {1, 2, 3, 4}; // 1, 2, 3, 4, 0
Размер массива — константа этапа компиляции (C89).
Размер массива может быть переменной (C99).
9
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
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
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
#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
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
Строки в языке C
В языке С нет встроенного типа для хранения строк
15
Строки в языке C
В языке С нет встроенного типа для хранения строк
Строка — массив символов. Признак конца строки — байт со значением 0.
eh ll \0o
16
Ввод строк
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
Ввод строк#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
Длина строки и размер массива?#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
Длина строки и размер массива?#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
Длина строки и размер массива?#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
Длина строки и размер массива?#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
Длина строки и размер массива?#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
Длина строки и размер массива?#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
Задание 1
Реализовать алгоритм Bubble sort.
Пользователь вводит размер массива и значения элементов или только
значения элементов при использовании массива фиксированного
размера.
Приложение выводит отсортированный массив и количество
выполненных итераций.
https://visualgo.net/sorting
25
Задание 2
Разработать приложение, проверяющее, является ли введенная
пользователем строка палиндромом.
Примеры палиндромов:
• Hannah
• racecar
• I
26
Домашнее задание 1
Реализовать алгоритмы сортировки вставками и подсчетом.
27
Домашнее задание 2
Разработать приложение, проверяющее, является ли введенная
пользователем фраза палиндромом.
Примеры палиндромов:
• Never odd or even
• Madam in Eden, I'm Adam.
Если фраза не содержит ни одной буквы, вывести сообщение об ошибке.
28
Домашнее задание 3*
Дан рельеф:
__
7 _|77|
6 |6 | _
5 | |_ |5|
4 | 4|_ | |
3 | 3|_ | |_
2 | 2|_| 2|
1 |___________1____|
29
Домашнее задание 3*
Представим, что идет дождь:
''''''''''''''''''''
__
7 _|77|
6 |6 | _
5 | |_ |5|
4 | 4|_ | |
3 | 3|_ | |_
2 | 2|_| 2|
1 |___________1____|
30
Домашнее задание 3*
Сколько воды соберется в углублениях?
__
7 _|77|
6 |6 | _
5 | |⋅ ⋅ ⋅ ⋅|5|4 | 4|⋅ ⋅ ⋅| |3 | 3|⋅ ⋅| |_2 | 2|⋅| 2|1 |___________1____|
Ответ: 10
31
Домашнее задание 3*
Пользователь вводит значения одномерного массива, определяющие
высоту «стен». Приложение вычисляет объем «воды», собравшейся между
стенами.
• Единица объема воды — одна ячейка
• Слева и справа рельеф не ограничен. В приведенном примере вода с
краев выплескивается.
32