PascalABC.NET официальный канал
前往频道在 Telegram
1 856
订阅者
无数据24 小时
-147 天
-2330 天
帖子存档
Метод ToWords
Метод строки ToWords позволяет разбить строку на массив слов. Самое замечательное, что у метода ToWords можно использовать строковый параметр, хранящий разделители слов. Имеется также константа AllDelimiters, которая хранит все возможные разделители слов в тексте.
На скриншоте - программа, которая в своём тексте выводит все слова
Символы Unicode
В кодировке Unicode - огромное количество интересных символов.
Данная простая программа выводит диапазон символов кодовой таблицы в графическое окно.
Генераторы последовательностей и оператор yield
Генераторы последовательностей - это функции, которые позволяют генерировать последовательность по заданному алгоритму. В теле такой функции такой функции мы пишем обычный алгоритм, а в местах, где надо вернуть значение, используем специальный оператор yield. Каждый раз, когда необходимо вернуть значение, такая функция запоминает значения всех локальных переменных и выполняет оператор yield. Когда требуется следующее значение, функция продолжает работу с сохраненной точки.
Нетрудно видеть, что такая функция не запоминает всю последовательность, а возвращает лишь текущее значение. Таким образом, последовательность вычисляется всякий раз при вызове функции-генератора. Это дольше по времени, но сильно экономит память.
На слайде - генератор арифметической прогрессии и цикл foreach по возвращаемой последовательности.
Linq и распараллеливание
Интегрированный язык запросов хорош тем, что разделяет задачу на части - каждая подзадача решается методом с понятным именем и понятными параметрами.
Но самое интересное - в том, что такое решение можно легко модифицировать, добавив в цепочку методов еще один или несколько.
В данном примере иллюстрируется задача вычисления количества простых чисел, меньших n. Добавление в цепочку методов метода AsParallel позволяет распараллелить решение. На шестиядерном процессоре оно ускоряется примерно в 5.5 раз.
case по строкам
В PascalABC.NET возможен case по строкам. Эта мощная возможность недооценивается. Но: в Питоне вообще нет подобного оператора, а в C++ аналогичный оператор switch не умеет работать со строками.
На скриншоте - программа для школьников: уровень спецагента в зависимости от имени.
Трехмерная модель вращения Солнце-Земля-Луна
Пожалуй, самым эффектным модулем в PascalABC.NET является модуль трёхмерной графики Graph3D. И пожалуй, самым эффектным примером иллюстрации возможностей Graph3D является стандартный пример PlanetsRotate.
В этом примере - все преимущества модуля трёхмерной графики: материалы, текстуры, дочерние элементы, вложенные алгоритмические анимации и их модификаторы, параметрические трёхмерные траектории и анимация на основе кадра, абсолютные и относительные координаты. И всё это - 27 строк кода!
Фигура с дыркой
В GraphWPF можно рисовать сложные фигуры. Для этого используется процедура FastDraw, параметром которой является другая процедура, у которой тоже есть параметр типа DrawingContext.
В контексте рисования dc можно нарисовать сложную геометрию, используя в частности операцию вычитания одной фигуры из другой.
На скриншоте - треугольник, из которого мы вычли три круга.
Декораторы процедур
Декоратор процедуры - это процедура, которая делает то же, что и основная, но добавляет какие-то действия до и после основной процедуры.
Декораторы придают действиям новые свойства (декорируют их).
В PascalABC.NET декоратор можно реализовать как функцию, которая принимает процедуру как параметр, а возвращает отдекорированную процедуру.
Основная строка в данном коде - это декорирование:
p := pdecorated(p)
Вычисление выражения в польской инверсной записи (ПОЛИЗ)
Обратная польская запись
https://ru.wikipedia.org/wiki/Обратная_польская_запись
позволяет записать выражение без скобок. Знак операции записывается после операндов:
5 2 *Вычисление заключается в применении операции к двум предыдущим операндам и замене выражения на результат:
10Для вычисления выражения в ПОЛИЗ используется стек операндов и простой стековый алгоритм.
Комбинаторика и LINQ
Стрим Алексея Богданова сегодня в 16.00.
https://www.youtube.com/watch?v=940ybfJUIo8
Принцип подстановки
Принцип подстановки - важнейший в программировании. В любой алгоритм вместо объекта некоторого типа можно подставить любую разновидность этого объекта - и код будет работать без изменений.
В данном коде мы используем принцип подстановки так: массивы и списки являются разновидностями последовательностей - поэтому в любой алгоритм, где используются последовательности, можно подставить массив или список.
Придумала принцип подстановки Барбара Лисков - американский ученый в области информатики: h ttps://ru.wikipedia.org/wiki/Лисков,_Барбара
Ей сейчас 83 года - она по-прежнему занимается исследованиями и выступает на научных конференциях
Как в одной ячейке памяти совместить значения разных типов
В .NET можно сделать аналог union-типа в C.
Этот тип должен быть записью с атрибутом
StructLayout(LayoutKind.Explicit).
Кроме этого, у каждого поля записи необходимо указать атрибут, задающий сдвиг относительно начала записи.
Для наших целей для каждого поля сдвиг равен 0.
В данном примере r.r и r.i разделяют одну память, а а ячейка типа Rec занимает 8 байт - по размеру максимального поля.Игра Пятнашки
Игра Пятнашки, написанная группой школьников за час
Зачем нужен &
Если необходимо указать явно имя типа обобщенной функции, то надо использовать & перед открывающей угловой скобкой:
Seq&<real>(1)Поему? Да потому что компилятор будет трактовать < как операцию меньше. И будет прав! На изображении вы видите, как компилятор верно! трактует запись
Seq<boolean>(true)Но вовсе не так как вы думали :)
С помощью PlotWPF можно создавать треугольники и другие плоские фигуры. На базе этого можно реализовать хорошую библиотеку для отображения плоских геометрических объектов и их характеристик: медианы, высоты и т.д.
Какие проблемы сразу бросаются в глаза?
1. Передавать два массива для создания треугольника неудобно
2. Массив целых точек хотелось бы преобразовывать в массив вещественных точек как-то просто.
3. Для того чтобы линия была замкнутой приходится первую точку добавлять в конец - как автоматизировать?
4. Нужно ли управление мышью подобъектами на экране?
Пишите в комментариях идеи для такой библиотеки.
Превращение матрицы в массив массивов и наоборот
Матрицу array [,] of T можно превратить в массив массивов array of array of T. Для этого есть два метода:
a.Rows - массив строк и a.Cols - массив столбцов. После этого строки или столбцы можно преобразовать и превратить всё назад в матрицу, используя стандартные процедуры MatrByRow(a) или MatrByCol(a).
На слайде представлен пример, в котором матрица вначале преобразуется в массив строк, после этого каждая строка сортируется по возрастанию и мы полученный массив строк вновь превращаем в матрицу. Для преобразования каждой строки используется метод Select.
Как организовать цикл по строкам текстового файла
В PascalABC.NET текстовые файлы имеют свойство Lines, которое возвращает последовательность строк текстового файла. Поэтому легко пройтись по текстовому файлу с помощью цикла foreach.
Для открытия текстового файла используется функция OpenRead, а для закрытия - метод f.Close.
Русские слова в программах
В PascalABC.NET в качестве идентификаторов можно использовать русские имена. Это затрудняет написание программы, но повышает её читаемость.
В стандартных примерах PascalABC.NET имеется папка Русские исполнители - здесь приводится одна из программ.
Все имена в программе - русские. Даже параметры лямбд. В подсказках также - исключительно русский язык.
На наш взгляд, для примеров это - идеальный способ донести идею до начинающих.
