PascalABC.NET официальный канал
Open in Telegram
Официальный канал языка и системы программирования PascalABC.NET
Show more1 856
Subscribers
No data24 hours
-147 days
-2330 days
Posts Archive
Интерпретатор языка PAlpha на PascalABC.NET
https://teletype.in/@pascalabcnet/PAlpha
Как получить случайную перестановку чисел?
Записать их в массив - и перемешать!
Еще раз про переполнение - на этот раз вещественное
А что будет если в предыдущей программе использовать вещественное произведение вместо целого? Когда и как переполняются вещественные?
Ответ - никогда! Мы видим, что после значения 10^308 сразу идёт бесконечность. Да да - бесконечность - это одно из значений вещественного типа. Никаких переполнений!
Нужно понимать, что и в Питоне несмотря на всю его высокоуровневость - то же самое. Длинных вещественных там нет. Вещественные везде - одни! И бесконечность тоже - одна 😀
Учить ли школьников переполнению типов
Да, разумеется. Мы учим на таком примере. На 11-й итерации наступает целочисленное переполнение, и вычисления становятся неправильными.
В этот момент можно говорить, что ячейка типа
integer имеет размер 4 байта, и есть максимальное целое, которое можно в неё поместить.
На Питоне такой проблемы нет. С одной стороны, это хорошо - целые бесконечны, с другой - плохо - при переходе на более эффективные языки наступает непонимание ограничений компьютера.Концепт визуализации структур данных для обучения
Начинающие хорошо воспринимают графическое представление того, что происходит в алгоритмах. Моя давняя идея - сделать модуль визуализации стандартных структур данных чтобы иллюстрировать им работу алгоритмов.
В этой заметке показано, как можно выводить массивы с помощью методов расширения
Draw и Drawln. Никаких параметров у этих методов нет - все отступы делаются автоматически. Разумеется, методы расширения и сопутствующие переменные следует поместить в модуль.
`Идеи из numpy - на PascalABC.NET
numpy - замечательный модуль Python, позволяющий легко выполнять векторные действия. На PascalABC.NET оказалось реализовать основную идею таких действий достаточно легко с помощью перегрузки операций. В итоге все операции с лямбдами заменились на более простые выражения. Например, вместо
x.Select(y->Sin(y)).ToArray достаточно написать Sin(x), а для операции x + 2.5*y + 1.5 трудно найти аналог, реализуемый лямбдами и запросамиАНБ призывает IT-компании отказываться от C и C++
https://www.securitylab.ru/news/534754.php
❗️Статистика использования языков программирования на заключительном этапе всероссийской олимпиады по информатике. https://codeforces.com/blog/entry/1917
Вывод типов обобщенной функции при вызове
Компилятор делает огромную работу когда выводит типовые параметры обобщенной функции при её вызове. На скриншоте показана обобщенная функция
Convert с двумя типовыми параметрами T и T1, преобразующая массив элементов одного типа в массив элементов другого типа с помощью указанной функции преобразования.
На скриншоте приведен код функции и основной программы. Каждый вызов Convert генерирует новую версию функции с другими типовыми параметрами T и T1. Типы T и T1 выводятся по типам фактических параметров функции. Например, в вызове Convert(a, x -> x+0.5) компилятор видит, что первый параметр имеет тип array of integer, поэтому он выводит тип T=integer. Далее в лямбде x -> x+0.5 переменная x имеет тип T=integer, поэтому x+0.5 имеет тип T1=real.
Технические сложности реализации такого вывода типов высоки. Именно поэтому в промышленном языке Delphi, прототипом которого когда-то являлся PascalABC.NET, до сих пор не появились ни лямбды ни обобщенные внешние функцииМозаика для дошкольников
https://teletype.in/@pascalabcnet/ph_jNxcpD_f
Операции с процедурами
https://teletype.in/@pascalabcnet/zotFh_bBNzS
Сериализация в PascalABC.NET
Как сохранить в файл сложную структуру данных с множеством связей? А затем восстановить из файла с сохранением этих связей? Проблема в том, что связи - это ссылки на адреса памяти, а адрес памяти сохранить, а потом восстановить невозможно: адреса меняются при повторном запуске программы.
На помощь приходит так называемая сериализация - сохранение в файл данных вместе со структурой в некотором специальном формате. Обратная операция восстановления всей структуры данных из файла называется десериализацией.
В PascalABC.NET есть встроенные функции
Serialize и Deserialize, выполняющие указанную задачу. В данном примере демонстрируется, как сериализовать и потом десериализовать односвязный список. Сериализуемый тип должен быть помечен атрибутом [Serializable]. Кроме этого, функция Deserialize возвращает тип Object, и его надо привести к нужному нам типу перед использованием.
Обратим также внимание на то, что стандартная процедура Print выводит структуру односвязного списка.Обновлённые скриншоты
Уважаемые читатели канала! мы обновляем скриншоты на сайте: http://pascalabc.net/skrinshoti
И объявляем конкурс на лучшие программы, которые будут иллюстрировать на скриншотах выразительность и простоту PascalABC.NET.
Предлагайте в комментариях.
Пишем OneLiner для вывода графического изображения
Вот такая программа в одну строчку выводит красивое графическое изображение:
##
uses GraphWPF;
(0..800).Cartesian(0..600)
.ForEach(\(x,y)->begin
SetPixel(x,y,RGB(x+y,2*x-y,y+3*x))
end);
Основной приём здесь - моделирование двух вложенных циклов методом Cartesian с двумя диапазонами в качестве параметров и последующим применением метода Foreach с распаковкой параметров лямбды для более удобного их использования.Как мы учим школьников языку запросов LINQ
Язык запросов LINQ - это типизированный язык SQL, где на этапе компиляции проверяется соответствие типов. Почему-то считается, что для школьников эта технология сложная, ненужная, не учит алгоритмам, которые наше всё, а учит всего лишь названиям методов, что плохо и недостойно школьного образования.
Мы ломаем стереотипы и говорим - учить школьников языку запросов просто, полезно, нужно обязательно, поскольку запросы и лямбда-выражения - это часть современных языков программирования.
Мы используем стандартную базу данных учеников из модуля
ABCDatabases. Для получения данных вызывается функция ЗаполнитьМассивУчеников, возвращающая массив учеников.
На скриншоте показано решение задачи о фильтрации учеников с ростом выше 160 с последующей сортировкой по классу и фамилии и подготовкой к красивому выводу. Чтобы каждый ученик выводился на отдельной строчке, мы используем метод PrintLines с проекцией ученика на отформатированную строку вывода.Как пояснить алгоритм быстрой сортировки
Алгоритм быстрой сортировки - самый быстрый в среднем на произвольных данных. Чтобы пояснить его суть, мы можем использовать такие средства PascalABC.NET как методы фильтрации массивов, сложение массивов и кортежи.
Суть алгоритма QuickSort проста: в массиве
a выбирается некоторый опорный элемент - обычно первый. После этого оставшиеся элементы массива делятся на две части: те, которые меньше или равны опорному и те, которые больше опорного. К каждой части рекурсивно применяется функция QuickSort и затем полученные части сливаются:
отсортированные элементы <= опорного
опорный
отсортированные элементы > опорного
Всё.
Разумеется, это - иллюстрация алгоритма. Она абсолютно неэффективна из-за создания большого количества отфильтрованных частей массива и их слияния в новый массив. Но для понимания алгоритма быстрой сортировки данный код прекрасно подходит.Sin * Cos или функция на функции сидит и функцией погоняет
https://teletype.in/@pascalabcnet/00BdPEc7EEd
