Содержание
- 2. Алгоритмизация и программирование. Язык C++ § 38. Целочисленные алгоритмы
- 3. Решето Эратосфена Эратосфен Киренский (Eratosthenes, Ερατοσθδνη) (ок. 275-194 до н.э.) Новая версия – решето Аткина. 2
- 4. Решето Эратосфена Задача. Вывести все простые числа от 2 до N. Объявление переменных: const int N
- 5. Решето Эратосфена Вычёркивание непростых: k = 2; while ( k*k if ( A[k] ) { i
- 6. Решето Эратосфена Вывод результата: for ( i = 2; i if ( A[i] ) cout
- 7. «Длинные» числа Ключи для шифрования: ≥ 256 битов. Целочисленные типы данных: ≤ 64 битов. Длинное число
- 8. «Длинные» числа A = 12345678 нужно хранить длину числа неудобно вычислять (с младшего разряда!) неэкономное расходование
- 9. «Длинные» числа Упаковка элементов: 12345678 = 12·10002 + 345·10001 + 678·10000 система счисления с основанием 1000!
- 10. Вычисление факториала Задача 1. Вычислить точно значение факториала 100! = 1·2·3·…·99·100 1·2·3·…·99·100 201 цифра 6 цифр
- 11. Вычисление факториала основание d = 1 000 000 [A] = 12345678901734567 734 567·3 = 2 203
- 12. Вычисление факториала r = 0; for ( i = 0; i s = A[i] * k
- 13. Вывод длинного числа [A] = 1000002000003 найти старший ненулевой разряд вывести этот разряд вывести все следующие
- 14. Вывод длинного числа for ( k = i-1; k >= 0; k-- ) Write6 ( A[k]
- 15. Вывод длинного числа Вывод числа с лидирующими нулями: void Write6 ( long int x ) {
- 16. Алгоритмизация и программирование. Язык C++ § 39. Структуры
- 17. Зачем нужны структуры? Книги в библиотеках: автор название количество экземпляров … символьные строки целое число Задачa:
- 18. Структуры Структура – это тип данных, который может включать в себя несколько полей – элементов разных
- 19. Объявление структур const int N = 100; TBook B; TBook Books[N]; cout cout cout typedef struct
- 20. Обращение к полям структур B.author // поле author структуры B Точечная нотация: Books[5].count // поле count
- 21. Обращение к полям структур B.author = "Пушкин А.С."; B.title = "Полтава"; B.count = 1; B.count --;
- 22. Запись структур в файлы 'Пушкин А.С.';'Полтава';12 'Лермонтов М.Ю.';'Мцыри';8 Текстовые файлы: символ-разделитель Двоичные файлы: ofstream Fout; Fout.open
- 23. Чтение структур из файла ifstream *Fin; Fin.open ( "books.dat", ios::binary ); Fin.read ( (char*) &B, sizeof(B)
- 24. Чтение структур из файла const int N = 100; int M; ... Fin.read ( (char*) Books,
- 25. Сортировка структур Ключ – фамилия автора: for ( i = 0; i for ( j =
- 26. Указатели Указатель – это переменная, в которой можно сохранить адрес любой переменной заданного типа. TBook *p;
- 27. Сортировка по указателям TBook *p[N], *p1; for ( i = 0; i p[i] = &Books[i]; Задача
- 28. Сортировка по указателям for ( i = 0; i for ( j = M-2; j >=
- 29. Алгоритмизация и программирование. Язык C++ § 40. Динамические массивы
- 30. Чем плох обычный массив? const int N = 100; int A[N]; статический массив память выделяется при
- 31. Динамические структуры данных создавать новые объекты в памяти изменять их размер удалять из памяти, когда не
- 32. Динамические массивы Объявление: int *A; Выделение памяти: A = new int[N]; количество элементов
- 33. Динамические массивы Использование массива: for ( i = 0; i cin >> A[i]; ... for (
- 34. Тип vector (библиотека STL) Заголовочный файл: #include Объявление: vector A; пустой массив типа int Размер: cout
- 35. Тип vector (библиотека STL) Обработка : for ( i = 0; i cout
- 36. Динамические матрицы Указатель на матрицу: typedef int *pInt; pInt *A; Выделение памяти под массив указателей: A
- 37. Динамические матрицы массив указателей for ( i = 1; i A[i] = A[i-1] + M; Расстановка
- 38. Динамические матрицы массив указателей
- 39. Динамические матрицы for ( i = 0; i A[i] = new int[M]; Выделение памяти: for (
- 40. Динамические матрицы (vector) typedef vector vint; vector A; Объявление: A.resize ( N ); Изменение размера (число
- 41. Расширение массива Задача. С клавиатуры вводятся натуральные числа, ввод заканчивается числом 0. Нужно вывести на экран
- 42. Алгоритмизация и программирование. Язык C++ § 41. Списки
- 43. Зачем нужны списки? Задача. В файле находится список слов, среди которых есть повторяющиеся. Каждое слово записано
- 44. Алгоритм (псевдокод) пока есть слова в файле { прочитать очередное слово если оно есть в списке
- 45. Использование контейнера map (STL) #include ... map L; Объявление: Map («отображение») – это словарь (ассоциативный массив).
- 46. Использование контейнера map (STL) while ( Fin >> s ) { int p; p = L.count
- 47. Вывод результата map ::iterator it; Объявление: it = L.begin(); На первый элемент: Все элементы: for (
- 48. Связные списки (list) узлы могут размещаться в разных местах в памяти только последовательный доступ Рекурсивное определение:
- 49. Связные списки Head Циклический список: Двусвязный список: Head Tail «хвост» обход в двух направлениях сложнее вставка
- 50. Алгоритмизация и программирование. Язык C++ § 42. Стек, дек, очередь
- 51. Что такое стек? Стек (англ. stack – стопка) – это линейный список, в котором элементы добавляются
- 52. Реверс массива Задача. В файле записаны целые числа. Нужно вывести их в другой файл в обратном
- 53. Использование контейнера stack (STL) #include ... stack S; стек целых чисел Основные операции со стеком: push
- 54. Использование контейнера stack (STL) ifstream Fin; ofstream Fout; stack S; int x; Fin.open ( "input.dat" );
- 55. Использование контейнера stack (STL) Fout.open ( "output.dat" ); while ( ! S.empty() ) { Fout S.pop();
- 56. Вычисление арифметических выражений (5+15)/(4+7-1) инфиксная форма (знак операции между данными) первой стоит последняя операция (вычисляем с
- 57. Вычисление арифметических выражений (5+15)/(4+7-1) 1950-е: постфиксная форма (знак операции после данных) не нужны скобки вычисляем с
- 58. Использование стека 5 15 + 4 7 + 1 - / 5 15 + 4 7
- 59. Скобочные выражения Задача. Вводится символьная строка, в которой записано некоторое (арифметическое) выражение, использующее скобки трёх типов:
- 60. Скобочные выражения (стек) когда встретили закрывающую скобку, на вершине стека лежит соответствующая открывающая в конце работы
- 61. Скобочные выражения (стек) const string L = "([{", // открывающие R = ")]}"; // закрывающие string
- 62. Скобочные выражения (стек) for ( i = 0; i p = L.find ( str[i] ); if
- 63. Что такое очередь? Очередь – это линейный список, для которого введены две операции: • добавление элемента
- 64. Заливка области Задача. Рисунок задан в виде матрицы A, в которой элемент A[y][x] определяет цвет пикселя
- 65. Заливка: использование очереди добавить в очередь точку (x0,y0) запомнить цвет начальной точки пока очередь не пуста
- 66. Очередь queue (STL) typedef struct { int x, y; } TPoint; TPoint Point ( int x,
- 67. Очередь queue (STL) Основные операции: push – добавить элемент в конец очереди pop – удалить первый
- 68. Заливка const int XMAX = 5, YMAX = 5, NEW_COLOR = 2; // заполнить матрицу A
- 69. Заливка (основной цикл) while ( ! Q.empty() ) { pt = Q.front(); Q.pop(); if ( A[pt.y][pt.x]
- 70. Очередь: статический массив нужно знать размер не двигаем элементы голова хвост Удаление элемента: Добавление элемента:
- 71. Очередь: статический массив Замыкание в кольцо: Очередь заполнена: Очередь пуста:
- 72. Что такое дек? Дек – это линейный список, в котором можно добавлять и удалять элементы как
- 73. Алгоритмизация и программирование. Язык C++ § 43. Деревья
- 74. Что такое дерево? «Сыновья» А: B, C. «Родитель» B: A. «Потомки» А: B, C, D, E,
- 75. Рекурсивные определения пустая структура – это дерево дерево – это корень и несколько связанных с ним
- 76. Деревья поиска Ключ – это значение, связанное с узлом дерева, по которому выполняется поиск. слева от
- 77. Обход дерева Обойти дерево ⇔ «посетить» все узлы по одному разу. ⇒ список узлов КЛП –
- 78. Обход дерева ЛПК: КЛП: ЛКП: * + 1 4 – 9 5 1 + 4 *
- 79. Обход КЛП – обход «в глубину» записать в стек корень дерева пока стек не пуст {
- 80. Обход КЛП – обход «в глубину» * + 1 4 – 9 5
- 81. Обход «в ширину» записать в очередь корень дерева пока очередь не пуста { выбрать узел V
- 82. Обход «в ширину» (1+4)*(9-5) * + - 1 4 9 5 голова очереди
- 83. Вычисление арифметических выражений 40–2*3–4*5 В корень дерева нужно поместить последнюю из операций с наименьшим приоритетом.
- 84. Вычисление арифметических выражений найти последнюю выполняемую операцию если операций нет то { создать узел-лист выход }
- 85. Вычисление арифметических выражений n1 = значение левого поддерева n2 = значение правого поддерева результат = операция(n1,
- 86. Использование связанных структур Дерево – нелинейная структура ⇒ динамический массив неудобен! typedef struct TNode *PNode; typedef
- 87. Работа с памятью Выделить память для узла: PNode p; // указатель на узел p = new
- 88. Основная программа main() { PNode T; string s; // ввести строку s T = MakeTree (
- 89. Построение дерева PNode MakeTree ( string s ) { int k; PNode Tree; Tree = new
- 90. Построение дерева Tree->data = s.substr(k,1); Tree->left = MakeTree ( s.substr(0,k) ); Tree->right = MakeTree ( s.substr(k+1)
- 91. Вычисление по дереву int Calc ( PNode Tree ) { int n1, n2, res; if (
- 92. Приоритет операции int Priority ( char op ) { switch ( op ) { case '+':
- 93. Последняя выполняемая операция int LastOp ( string s ) { int i, minPrt, res; minPrt =
- 94. Двоичное дерево в массиве ? ?
- 95. Алгоритмизация и программирование. Язык C++ § 44. Графы
- 96. Что такое граф? Граф – это набор вершин и связей между ними (рёбер). петля Матрица смежности:
- 97. Связность графа Связный граф – это граф, между любыми вершинами которого существует путь.
- 98. Дерево – это граф? дерево ABC ABDC BCD CCC… Дерево – это связный граф без циклов
- 99. Взвешенные графы Весовая матрица: вес ребра
- 100. Ориентированные графы (орграфы) Рёбра имеют направление (начало и конец), рёбра называю дугами.
- 101. Жадные алгоритмы Жадный алгоритм – это многошаговый алгоритм, в котором на каждом шаге принимается решение, лучшее
- 102. Жадные алгоритмы Задача. Найти кратчайший маршрут из А в F.
- 103. Задача Прима-Крускала Задача. Между какими городами нужно проложить линии связи, чтобы все города были связаны в
- 104. Раскраска вершин 4 B 2 1 2 9 7 8 1 3 D E F A
- 105. Раскраска вершин const int N = 6; int W[N][N]; // весовая матрица int col[N]; // цвета
- 106. Раскраска вершин for ( k = 0; k // поиск ребра с минимальным весом minDist =
- 107. Кратчайший маршрут Алгоритм Дейкстры (1960): кратчайшее расстояние откуда ехать ближайшая от A невыбранная вершина
- 108. Кратчайший маршрут Алгоритм Дейкстры (1960): кратчайшее расстояние откуда ехать W[x,z] + W[z,y] может быть так, что
- 109. Кратчайший маршрут Алгоритм Дейкстры (1960): кратчайшее расстояние откуда ехать W[x,z] + W[z,y] может быть так, что
- 110. Кратчайший маршрут Алгоритм Дейкстры (1960): кратчайшее расстояние откуда ехать 7 E 8 E
- 111. Кратчайший маршрут длины кратчайших маршрутов из A в другие вершины A → C → E →
- 112. Алгоритм Дейкстры const int N = 6; int W[N][N]; // весовая матрица bool active[N]; // вершина
- 113. Алгоритм Дейкстры for ( i = 0; i minDist = 99999; for ( j = 0;
- 114. Алгоритм Дейкстры i = N-1; while ( i != -1 ) { cout i = P[i];
- 115. Алгоритм Флойда for ( k = 0; k for ( i = 0; i for (
- 116. Алгоритм Флойда + маршруты for ( i = 0; i for ( j = 0; j
- 117. Задача коммивояжера Коммивояжер (бродячий торговец) должен выйти из города 1 и, посетив по разу в неизвестном
- 118. Некоторые задачи Задача на минимум суммы. Имеется N населенных пунктов, в каждом из которых живет pi
- 119. Алгоритмизация и программирование. Язык C++ § 44. Динамическое программирование
- 120. Что такое динамическое программирование? Числа Фибоначчи: ; . F1 = F2 = 1 Fn = Fn-1
- 121. Динамическое программирование Объявление массива: const int N = 10; int F[N+1]; // чтобы начать с 1
- 122. Динамическое программирование Динамическое программирование – это способ решения сложных задач путем сведения их к более простым
- 123. Количество вариантов Задача. Найти количество KN цепочек, состоящих из N нулей и единиц, в которых нет
- 124. Количество вариантов Задача. Найти количество KN цепочек, состоящих из N нулей и единиц, в которых нет
- 125. Оптимальное решение Задача. В цистерне N литров молока. Есть бидоны объемом 1, 5 и 6 литров.
- 126. Оптимальное решение Сначала выбрали бидон… KN – минимальное число бидонов для N литров KN = 1
- 127. Оптимальное решение (бидоны) 1 1 2 1 3 1 4 1 1 5 1 6 2
- 128. Задача о куче Задача. Из камней весом pi (i=1, …, N) набрать кучу весом ровно W
- 129. Задача о куче Задача. Из камней весом pi (i=1, …, N) набрать кучу весом ровно W
- 130. Задача о куче Добавляем камень с весом 4: для w 0 2 2 для w ≥
- 131. Задача о куче Добавляем камень с весом 5: для w 0 2 2 4 5 6
- 132. Задача о куче Добавляем камень с весом 7: для w 0 2 2 4 5 6
- 133. Задача о куче Добавляем камень с весом pi: для w Рекуррентная формула:
- 134. Задача о куче Оптимальный вес 7 5 + 2
- 135. Задача о куче Заполнение таблицы: W+1 N псевдополиномиальный
- 136. Количество программ Задача. У исполнителя Утроитель есть команды: 1. прибавь 1 2. умножь на 3 Сколько
- 137. Количество программ Как получить число N: N если делится на 3! последняя команда Рекуррентная формула: KN
- 138. Количество программ Заполнение таблицы: Рекуррентная формула: KN = KN-1 если N не делится на 3 KN
- 139. Количество программ Только точки изменения: 12 20 Программа: K[1] = 1; for ( i = 2;
- 140. Размен монет Задача. Сколькими различными способами можно выдать сдачу размером W рублей, если есть монеты достоинством
- 141. Размен монет Пример: W = 10, монеты 1, 2, 5 и 10 w pi базовые случаи
- 142. Размен монет Пример: W = 10, монеты 1, 2, 5 и 10 Рекуррентная формула (добавили монету
- 143. Конец фильма ПОЛЯКОВ Константин Юрьевич д.т.н., учитель информатики ГБОУ СОШ № 163, г. Санкт-Петербург kpolyakov@mail.ru ЕРЕМИН
- 145. Скачать презентацию