Содержание
- 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] ) printf (
- 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]; printf ( "%d\n", sizeof(TBook) );
- 20. Обращение к полям структур B.author // поле author структуры B Точечная нотация: Books[5].count // поле count
- 21. Обращение к полям структур strcpy ( B.author,"Пушкин А.С." ); strcpy ( B.title, "Полтава" ); B.count =
- 22. Запись структур в файлы 'Пушкин А.С.';'Полтава';12 'Лермонтов М.Ю.';'Мцыри';8 Текстовые файлы: символ-разделитель Двоичные файлы: FILE *Fout; Fout
- 23. Чтение структур из файла FILE *Fin; Fin = fopen ( "books.dat", "rb" ); fread ( &B,
- 24. Чтение структур из файла const int N = 100; int M; ... M = fread (
- 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; Выделение памяти: #include ... A = (int*) calloc ( N, sizeof(int)
- 33. Динамические массивы Использование массива: for ( i = 0; i scanf ( "%d", &A[i] ); ...
- 34. Динамические матрицы Указатель на матрицу: typedef int *pInt; pInt *A; Выделение памяти под массив указателей: A
- 35. Динамические матрицы массив указателей for ( i = 1; i A[i] = A[i-1] + M; Расстановка
- 36. Динамические матрицы массив указателей
- 37. Динамические матрицы for ( i = 0; i A[i] =(int*) calloc(M, sizeof(int)); Выделение памяти: for (
- 38. Расширение массива Задача. С клавиатуры вводятся натуральные числа, ввод заканчивается числом 0. Нужно вывести на экран
- 39. Расширение массива Расширение по 10 элементов: N = 0; scanf ( "%d", &x ); while (
- 40. Алгоритмизация и программирование. Язык C § 41. Списки
- 41. Зачем нужны списки? Задача. В файле находится список слов, среди которых есть повторяющиеся. Каждое слово записано
- 42. Алгоритм (псевдокод) пока есть слова в файле { прочитать очередное слово если оно есть в списке
- 43. Хранение данных typedef struct { char word[40]; int count; } TPair; Пара «слово-счётчик»: typedef struct {
- 44. Хранение данных TWordList L; Переменная-список: L.size = 0; L.capacity = 10; L.data = (TPair*) calloc (
- 45. Основной цикл F = fopen ( "input.txt", "r" ); while ( 1 == fscanf(F, "%s", s)
- 46. Поиск слова int Find( TWordList L, char word[] ) { int i; for ( i =
- 47. Поиск места вставки int FindPlace ( TWordList L, char word[] ) { int i; for (
- 48. Вставка слова дерево for ( i = L.size-1; i > k; i-- ) L.data[i] = L.data[i-1];
- 49. Вставка слова void InsertWord ( TWordList *pL, int k, char word[] ) { int i; IncSize
- 50. Расширение списка void IncSize ( TWordList *pL ) { pL->size ++; if ( pL->size > pL->capacity
- 51. Вся программа // объявления типов TPair и TWordList // процедуры и функции void main() { TWordList
- 52. Модули main() { ... } // процедура 1 // процедура 2 // процедура 3 // процедура
- 53. Модули main() { ... } void IncSize (...) { ... } int Find ( ... )
- 54. Заголовочный файл wordlist.h typedef struct { char word[40]; int count; } TPair; typedef struct { TPair
- 55. Проект (Dev-C++, Windows) alphalist.с wordlist.с alphalist.o wordlist.o исходные файлы объектные файлы исполняемый файл
- 56. Связные списки узлы могут размещаться в разных местах в памяти только последовательный доступ Рекурсивное определение: пустой
- 57. Связные списки Head Циклический список: Двусвязный список: Head Tail «хвост» обход в двух направлениях сложнее вставка
- 58. Алгоритмизация и программирование. Язык C § 42. Стек, дек, очередь
- 59. Что такое стек? Стек (англ. stack – стопка) – это линейный список, в котором элементы добавляются
- 60. Реверс массива Задача. В файле записаны целые числа. Нужно вывести их в другой файл в обратном
- 61. Использование динамического массива typedef struct { int *data; int capacity; int size; } TStack; void Push
- 62. Использование динамического массива int Pop ( TStack *pS ) { pS->size --; return pS->data[pS->size]; } указатель
- 63. Использование динамического массива InitStack ( &S, 10 ); while ( 1 == fscanf(Fin, "%d", &x) )
- 64. Вычисление арифметических выражений (5+15)/(4+7-1) инфиксная форма (знак операции между данными) первой стоит последняя операция (вычисляем с
- 65. Вычисление арифметических выражений (5+15)/(4+7-1) 1950-е: постфиксная форма (знак операции после данных) не нужны скобки вычисляем с
- 66. Использование стека 5 15 + 4 7 + 1 - / 5 15 + 4 7
- 67. Скобочные выражения Задача. Вводится символьная строка, в которой записано некоторое (арифметическое) выражение, использующее скобки трёх типов:
- 68. Скобочные выражения (стек) когда встретили закрывающую скобку, на вершине стека лежит соответствующая открывающая в конце работы
- 69. Скобочные выражения (стек) typedef struct { char *data; int capacity; int size; } TStack; Модель стека:
- 70. Скобочные выражения (стек) const char L[] = "([{", // открывающие R[] = ")]}"; // закрывающие char
- 71. Скобочные выражения (стек) for ( i = 0; i p = strchr ( L, str[i] );
- 72. Что такое очередь? Очередь – это линейный список, для которого введены две операции: • добавление элемента
- 73. Заливка области Задача. Рисунок задан в виде матрицы A, в которой элемент A[y][x] определяет цвет пикселя
- 74. Заливка: использование очереди добавить в очередь точку (x0,y0) запомнить цвет начальной точки пока очередь не пуста
- 75. Очередь (динамический массив) typedef struct { int x, y; } TPoint; typedef struct { TPoint *data;
- 76. Очередь (динамический массив) Добавить точку в очередь: void Put ( TQueue *pQ, TPoint P ) {
- 77. Очередь (динамический массив) Получить первую точку в очереди: TPoint Get ( TQueue *pQ ) { TPoint
- 78. Заливка const int XMAX = 5, YMAX = 5, NEW_COLOR = 2; // заполнить матрицу A
- 79. Заливка (основной цикл) while ( ! isEmpty(Q) ) { pt = Get ( &Q ); if
- 80. Очередь: статический массив нужно знать размер не двигаем элементы голова хвост Удаление элемента: Добавление элемента:
- 81. Очередь: статический массив Замыкание в кольцо: Очередь заполнена: Очередь пуста:
- 82. Что такое дек? Дек – это линейный список, в котором можно добавлять и удалять элементы как
- 83. Алгоритмизация и программирование. Язык C § 43. Деревья
- 84. Что такое дерево? «Сыновья» А: B, C. «Родитель» B: A. «Потомки» А: B, C, D, E,
- 85. Рекурсивные определения пустая структура – это дерево дерево – это корень и несколько связанных с ним
- 86. Деревья поиска Ключ – это значение, связанное с узлом дерева, по которому выполняется поиск. слева от
- 87. Обход дерева Обойти дерево ⇔ «посетить» все узлы по одному разу. ⇒ список узлов КЛП –
- 88. Обход дерева ЛПК: КЛП: ЛКП: * + 1 4 – 9 5 1 + 4 *
- 89. Обход КЛП – обход «в глубину» записать в стек корень дерева пока стек не пуст {
- 90. Обход КЛП – обход «в глубину» * + 1 4 – 9 5
- 91. Обход «в ширину» записать в очередь корень дерева пока очередь не пуста { выбрать узел V
- 92. Обход «в ширину» (1+4)*(9-5) * + - 1 4 9 5 голова очереди
- 93. Вычисление арифметических выражений 40–2*3–4*5 В корень дерева нужно поместить последнюю из операций с наименьшим приоритетом.
- 94. Вычисление арифметических выражений найти последнюю выполняемую операцию если операций нет то { создать узел-лист выход }
- 95. Вычисление арифметических выражений n1 = значение левого поддерева n2 = значение правого поддерева результат = операция(n1,
- 96. Использование связанных структур Дерево – нелинейная структура ⇒ динамический массив неудобен! typedef struct TNode *PNode; typedef
- 97. Работа с памятью Выделить память для узла: PNode p; // указатель на узел p = (PNode)
- 98. Основная программа main() { PNode T; char s[80]; // ввести строку s T = MakeTree (
- 99. Построение дерева PNode MakeTree ( char s[] ) { int k; PNode Tree; char sLeft[80] =
- 100. Построение дерева Tree->data[0] = s[k]; Tree->data[1] = '\0'; strncpy ( sLeft, s, k ); Tree->left =
- 101. Вычисление по дереву int Calc ( PNode Tree ) { int n1, n2, res; if (
- 102. Приоритет операции int Priority ( char op ) { switch ( op ) { case '+':
- 103. Последняя выполняемая операция int LastOp ( char s[] ) { int i, minPrt, res; minPrt =
- 104. Двоичное дерево в массиве ? ?
- 105. Алгоритмизация и программирование. Язык C § 44. Графы
- 106. Что такое граф? Граф – это набор вершин и связей между ними (рёбер). петля Матрица смежности:
- 107. Связность графа Связный граф – это граф, между любыми вершинами которого существует путь.
- 108. Дерево – это граф? дерево ABC ABDC BCD CCC… Дерево – это связный граф без циклов
- 109. Взвешенные графы Весовая матрица: вес ребра
- 110. Ориентированные графы (орграфы) Рёбра имеют направление (начало и конец), рёбра называю дугами.
- 111. Жадные алгоритмы Жадный алгоритм – это многошаговый алгоритм, в котором на каждом шаге принимается решение, лучшее
- 112. Жадные алгоритмы Задача. Найти кратчайший маршрут из А в F.
- 113. Задача Прима-Крускала Задача. Между какими городами нужно проложить линии связи, чтобы все города были связаны в
- 114. Раскраска вершин 4 B 2 1 2 9 7 8 1 3 D E F A
- 115. Раскраска вершин const int N = 6; int W[N][N]; // весовая матрица int col[N]; // цвета
- 116. Раскраска вершин for ( k = 0; k // поиск ребра с минимальным весом minDist =
- 117. Кратчайший маршрут Алгоритм Дейкстры (1960): кратчайшее расстояние откуда ехать ближайшая от A невыбранная вершина
- 118. Кратчайший маршрут Алгоритм Дейкстры (1960): кратчайшее расстояние откуда ехать W[x,z] + W[z,y] может быть так, что
- 119. Кратчайший маршрут Алгоритм Дейкстры (1960): кратчайшее расстояние откуда ехать W[x,z] + W[z,y] может быть так, что
- 120. Кратчайший маршрут Алгоритм Дейкстры (1960): кратчайшее расстояние откуда ехать 7 E 8 E
- 121. Кратчайший маршрут длины кратчайших маршрутов из A в другие вершины A → C → E →
- 122. Алгоритм Дейкстры const int N = 6; int W[N][N]; // весовая матрица bool active[N]; // вершина
- 123. Алгоритм Дейкстры for ( i = 0; i minDist = 99999; for ( j = 0;
- 124. Алгоритм Дейкстры i = N-1; while ( i != -1 ) { printf ( "%d ",
- 125. Алгоритм Флойда for ( k = 0; k for ( i = 0; i for (
- 126. Алгоритм Флойда + маршруты for ( i = 0; i for ( j = 0; j
- 127. Задача коммивояжера Коммивояжер (бродячий торговец) должен выйти из города 1 и, посетив по разу в неизвестном
- 128. Некоторые задачи Задача на минимум суммы. Имеется N населенных пунктов, в каждом из которых живет pi
- 129. Алгоритмизация и программирование. Язык C § 44. Динамическое программирование
- 130. Что такое динамическое программирование? Числа Фибоначчи: ; . F1 = F2 = 1 Fn = Fn-1
- 131. Динамическое программирование Объявление массива: const int N = 10; int F[N+1]; // чтобы начать с 1
- 132. Динамическое программирование Динамическое программирование – это способ решения сложных задач путем сведения их к более простым
- 133. Количество вариантов Задача. Найти количество KN цепочек, состоящих из N нулей и единиц, в которых нет
- 134. Количество вариантов Задача. Найти количество KN цепочек, состоящих из N нулей и единиц, в которых нет
- 135. Оптимальное решение Задача. В цистерне N литров молока. Есть бидоны объемом 1, 5 и 6 литров.
- 136. Оптимальное решение Сначала выбрали бидон… KN – минимальное число бидонов для N литров KN = 1
- 137. Оптимальное решение (бидоны) 1 1 2 1 3 1 4 1 1 5 1 6 2
- 138. Задача о куче Задача. Из камней весом pi (i=1, …, N) набрать кучу весом ровно W
- 139. Задача о куче Задача. Из камней весом pi (i=1, …, N) набрать кучу весом ровно W
- 140. Задача о куче Добавляем камень с весом 4: для w 0 2 2 для w ≥
- 141. Задача о куче Добавляем камень с весом 5: для w 0 2 2 4 5 6
- 142. Задача о куче Добавляем камень с весом 7: для w 0 2 2 4 5 6
- 143. Задача о куче Добавляем камень с весом pi: для w Рекуррентная формула:
- 144. Задача о куче Оптимальный вес 7 5 + 2
- 145. Задача о куче Заполнение таблицы: W+1 N псевдополиномиальный
- 146. Количество программ Задача. У исполнителя Утроитель есть команды: 1. прибавь 1 2. умножь на 3 Сколько
- 147. Количество программ Как получить число N: N если делится на 3! последняя команда Рекуррентная формула: KN
- 148. Количество программ Заполнение таблицы: Рекуррентная формула: KN = KN-1 если N не делится на 3 KN
- 149. Количество программ Только точки изменения: 12 20 Программа: K[1] = 1; for ( i = 2;
- 150. Размен монет Задача. Сколькими различными способами можно выдать сдачу размером W рублей, если есть монеты достоинством
- 151. Размен монет Пример: W = 10, монеты 1, 2, 5 и 10 w pi базовые случаи
- 152. Размен монет Пример: W = 10, монеты 1, 2, 5 и 10 Рекуррентная формула (добавили монету
- 153. Конец фильма ПОЛЯКОВ Константин Юрьевич д.т.н., учитель информатики ГБОУ СОШ № 163, г. Санкт-Петербург kpolyakov@mail.ru ЕРЕМИН
- 155. Скачать презентацию