ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ НА С++

Скачать презентацию ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ НА С++ Скачать презентацию ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ НА С++

05. Процедурное программирование. Массивы.ppt

  • Количество слайдов: 39

>  ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ НА С++    МАССИВЫ ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ НА С++ МАССИВЫ

>Система типов в С++  Скалярные  Производные целые    массивы вещественные Система типов в С++ Скалярные Производные целые массивы вещественные указатели логический ссылки символьные перечисления пустой Составные структуры объединения классы 2

>Зачем нужны массивы? Задачи  Написать программу, которая вычисляет  значения функции на некотором Зачем нужны массивы? Задачи Написать программу, которая вычисляет значения функции на некотором интервале Написать игру (консольную, а зачем нам окошки? ) ○ крестики-нолики ○ сапер 3

>Массивы Переменная 0 x 02001000  int  number Массив 0 x 02001010 0 Массивы Переменная 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 Размер массива sizeof() возвращает размер массива float my. Arr[40]; . . . printf(“Size of array is”, sizeof(my. Arr)); 6

>Массивы нулевой длины int arr[0]; . . . допустимы в С, но не в Массивы нулевой длины int arr[0]; . . . допустимы в С, но не в С++ практического смысла в массивах нулевой длины нет sizeof(arr) == 0 7

>Доступ к элементам массива Обращение к элементу   имя_массива[индекс] double mas[5]; . . Доступ к элементам массива Обращение к элементу имя_массива[индекс] 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]) Можно Количество элементов в массиве Известны: размер массива: 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 Инициализация массива 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[] = Инициализация массива 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 Передача массивов в функции 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]; Многомерные массивы тип имя[рзмер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 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 Расположение трехмерных массивов в памяти 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] Инициализация многомерных массивов при инициализации многомерного массива первый индекс можно опускать 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} Инициализация многомерных массивов 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, Найдите ошибки 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 Инициализация многомерных массивов 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. Ссылки Сортировка и поиск в массивах Д. Кнут «Искусство программирования. Том 3. Сортировка и поиск» Дж. Макконелл «Основы современных алгоритмов» http: //www. youtube. com/user/Algo. Rythmics 38

> Резюме  Массив – это упорядоченное множество однотипных  элементов, обращение к каждому Резюме Массив – это упорядоченное множество однотипных элементов, обращение к каждому из которых возможно по номеру Массивы – один из структурированных типов С++ (так называемые «встроенные» массивы) Встроенным массивам присущи некоторые ограничения, которые можно преодолеть с помощью других средств языка 39