ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ НА С++
05. Процедурное программирование. Массивы.ppt
- Количество слайдов: 39
ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ НА С++ МАССИВЫ
Система типов в С++ Скалярные Производные целые массивы вещественные указатели логический ссылки символьные перечисления пустой Составные структуры объединения классы 2
Зачем нужны массивы? Задачи Написать программу, которая вычисляет значения функции на некотором интервале Написать игру (консольную, а зачем нам окошки? ) ○ крестики-нолики ○ сапер 3
Массивы Переменная 0 x 02001000 int number Массив 0 x 02001010 0 x 0200100 C 0 x 02001008 0 x 02001004 0 x 02001000 int int numbers 4 3 2 1 0 Элемент массива с меньшим индексом располагается в памяти по меньшему адресу! 4
Определение массива тип_массива имя_массива[размер] ; тип_массива – любой из типов С++ имя_массива – любой допустимый идентификатор размер – константное!!! выражение, которое может быть преобразовано к целому Размер массива определяется на этапе компиляции! int my_array[100]; double DOUBLES[10+25]; STUDENT array_of_students[1 << 3]; 5
Размер массива sizeof() возвращает размер массива float my. Arr[40]; . . . printf(“Size of array is”, sizeof(my. Arr)); 6
Массивы нулевой длины int arr[0]; . . . допустимы в С, но не в С++ практического смысла в массивах нулевой длины нет sizeof(arr) == 0 7
Доступ к элементам массива Обращение к элементу имя_массива[индекс] double mas[5]; . . . mas[2] = 42. 0; // mas[2] – l-value Printf(mas[2]); . . . Printf(mas[5]); // ? ? mas[7] = 0; // ? ? 8
Выход за границы массива – одна из самых неприятных ошибок, с которыми может столкнуться программист на С/С++ Стандарт языка не требует осуществлять контроль выхода за границы массивов (ни на этапе компиляции, ни на этапе выполнения) Решение проблемы использование классов-массивов с контролем выхода за границы массива использование сторонних средств проверки (Bounds Checker и т. д. ) 9
Количество элементов в массиве Известны: размер массива: sizeof(array) размер элемента: sizeof(array[0]) Можно подсчитать количество элементов в массиве: int size = sizeof(array)/sizeof(array[0]); 10
Типичные задачи при работе с массивами Инициализация массива случайными числами в определенном диапазоне Вывод значений массива на экран Поиск в массиве некоторого значения Сортировка массива 11
Инициализация массивов Можно инициализировать массивы, если в определении указать список значений массива в фигурных скобках: тип имя[размер] = { список_инициализации }; int arr[3] = { 1, 2, 3}; 12
Инициализация массива int mas 1[5] = { 20, 30, 40, 50, 60 }; int mas 2[5] = { 20 }; double Nums 1[10] = { 0 }; double Nums 2[5] = { }; //то же, что {0} Int err 0[]; //нельзя Int err 2[3] = { 1, 2, 3, 5, 7 , 8 }; //нельзя 13
Инициализация массива в отличие от размера массива, инициализаторы не обязательно должны быть константами: double arr 1[] = { rand(), rand() }; double s; scanf(“%f”, s); double arr 2[] = {s, s*s*s}; 14
Запятые в списке инициализации – это НЕ операция «запятая» (, ) Список инициализации может заканчиваться запятой Пропуски значений в списке не допускаются int good[] = { 1, 2, 3, }; int bad[] = { 1, , 3}; 15
Инициализация массива char letters[] = {‘A’, ‘B’, ‘C’, ‘D’}; char str[] = “ABCD”; Printf(sizeof(letters)); // 4 Printf(sizeof(str)); // 5 16
Передача массивов в функции int get_4 th_element(int arr[5]) { return arr[3]; } int get_last_element_incorrect(int arr[]) { return arr[sizeof(arr)/sizeof(arr[0]) - 1]; } int get_last_element(int arr[], int size) { return arr[size – 1]; } 17
Многомерные массивы тип имя[рзмер1][размер2]. . . [размер. N]; int arr 2 d[3][3]; int arr 3 d[3][3][3]; int easy_to_imagine[3][3][3]; 18
Двумерные массивы Математический аналог двумерного массива – матрица Индексы начинаются с нуля! a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 19
Представление многомерных массивов Встроенные многомерные массивы в С/С++ представляются в виде массивов двумерный массив – это одномерный массив, элементами которого являются одномерные массивы трехмерный массив – это одномерный массив, элементами которого являются одномерные массивы, элементами которых являются одномерные массивы . . . 20
Расположение двумерных массивов в памяти a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 0 x 02001020 0 x 0200101 С 0 x 02001018 0 x 02001014 0 x 02001010 0 x 0200100 С 0 x 02001008 0 x 02001004 0 x 02001000 int int int a 33 a 32 a 31 a 23 a 22 a 21 a 13 a 12 a 11 2 1 0 2 1 0 2 1 0 2 1 0 21
Расположение трехмерных массивов в памяти a 112 a 122 int arr 3 d[2][2][2]; a 111 a 121 a 212 a 222 a 211 a 221 0 x 02001020 0 x 0200101 С 0 x 02001018 0 x 02001014 0 x 02001010 0 x 0200100 С 0 x 02001008 0 x 02001004 int int a 222 a 221 a 212 a 211 a 122 a 121 a 112 a 111 1 0 1 0 1 0 1 0 1 0 22
Трехмерные массивы Можно ли представить кубик Рубика в программе трехмерным массивом целых чисел? 23
Инициализация многомерных массивов при инициализации многомерного массива первый индекс можно опускать double mtx 1[][2] = { {1, 2}, {3, 4}, {5, 6}}; double mtx 2[][2] = {1, 2, 3, 4, 5, 6}; double mtx 3[][2] = { {}, {2}, {3, 4}, {}}; double mtx 4[][2] = {2, 3, 4}; 24
Инициализация многомерных массивов double cube 1[][2][2] = { { {1, 2}, {3, 4} }, { {5, 6}, {7, 8} }, { {9, 10}, {11, 12} } }; double cube 2[][2][2] = { { {}, {} }, {{1, 2}, {} }, { {3, 4} } }; double cube 2[][2][2] = { { }, {{1, 2}, {} }, { {3, 4} } }; 25
Найдите ошибки double mas 1{10}; short s[7] = (0, 1, 2, 3, 4, 5, 6); long chars[3] = {‘a’, ‘b’, ‘c’, ‘d’} int arr 1[][2]; int arr 2[][2] = {3, {4, 5, 6}}; int arr 3[][2] = {0}; 26
Инициализация многомерных массивов int arr 1[][2] = {}; // error int arr 2[][2] = {{}, {}}; int arr 3[][2] = {{}, {}}; 27
Задача Ввести с клавиатуры элементы массива, выполнить сортировку и вывести отсортированный массив на экран 28
Сортировка массивов Сортировка – расположение элементов в соответствии с некоторым критерием исходный массив 105 3 32 220 0 1024 17 отсортированный массив 0 3 10 17 32 105 220 1024 29
Сортировка массивов Существует много различных алгоритмов сортировки пузырьковая отбором быстрая (Хоара) Как оценить эффективность конкретного алгоритма? Дональд Кнут время сортировки ○ количество сравнений ○ количество перестановок 30
Пузырьковый метод сортировки Идея метода – последовательно сравнивать соседние элементы и, если нужно, менять их местами http: //www. youtube. com/watch? v=ly. ZQP j. UT 5 B 4 31
Метод сортировки отбором Идея метода – найти элемент с самым маленьким значением (в зависимости от критерия), поменять его местами с первым, среди оставшихся элементов снова найти самый маленький, поменять местами со вторым и т. д. http: //www. youtube. com/watch? v=Ns 4 T PTC 8 whw 32
Поиск заданного элемента в массиве Поиск элемента – определение номера позиции элемента, отвечающего некоторому критерию массив 10 105 3 32 220 0 1024 17 a) 1024 , позиция 6 б) 3 , позиция 2 в) 220 , позиция 4 33
Поиск в массивах Существует множество различных алгоритмов поиска линейный бинарный Как оценить сложность алгоритма? время работы ○ количество сравнений 34
Просмотр массива Идея метода – последовательно сравнивать элементы массива с искомым значением до тех пор, пока не будет обнаружено совпадение 35
Бинарный поиск Идея метода – в отсортированном массиве проверять, значение серединного элемента, и, в зависимости от результатов сравнения, либо найти элемент, либо продолжить поиск в левой или правой половине массива 36
Ограничения стандартных (встроенных) массивов размер задается на этапе компиляции и не может изменяться в ходе выполнения программы представление строк массивами Проблема может быть решена путем использования динамических массивов. Память для таких массивов выделяется из кучи (heap). Для работы с адресами памяти в С/С++ есть специальный тип – указатель (pointer). 37
Ссылки Сортировка и поиск в массивах Д. Кнут «Искусство программирования. Том 3. Сортировка и поиск» Дж. Макконелл «Основы современных алгоритмов» http: //www. youtube. com/user/Algo. Rythmics 38
Резюме Массив – это упорядоченное множество однотипных элементов, обращение к каждому из которых возможно по номеру Массивы – один из структурированных типов С++ (так называемые «встроенные» массивы) Встроенным массивам присущи некоторые ограничения, которые можно преодолеть с помощью других средств языка 39