PascalABC.NET официальный канал
رفتن به کانال در Telegram
Официальный канал языка и системы программирования PascalABC.NET
نمایش بیشتر1 857
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-147 روز
-2330 روز
آرشیو پست ها
Метод Unfold и выделение цифр из целого числа. 6 способов - один сложнее другого!
https://teletype.in/@pascalabcnet/Unfold
Модификатор With... для шрифта
В модуле GraphWPF текст выводится текущими настройками шрифта Font. Можно однако передать настройки шрифта последним параметром функции TextOut. За основу при этом можно выбрать текущий шрифт Font, сконструировав из него новый шрифт при помощи модификатора With...
На скриншоте показано применение нескольких таких модификаторов: WithSize, WithStyle и WithColor.
Метод Combinations и моделирование вложенных циклов
Программа
uses GraphWPF;
begin
var (n,r) := (9,250);
var a := new Point[n];
for var i:=0 to n-1 do
a[i] := Window.Center + r * Vect(cos(i*2*Pi/n), sin(i*2*Pi/n));
for var i:=0 to n-1 do
for var j:=0 to n-1 do
Line(a[i], a[j])
end.
рисует изображение, представленное на скриншоте.
Можно переписать это решение в функциональном стиле:
uses GraphWPF; begin var (n,r) := (9,250); var a := ArrGen(n, i -> Window.Center + r * Vect(cos(i*2*Pi/n),sin(i*2*Pi/n))); a.Combinations(2).ForEach(p -> Line(p[0], p[1])); end.Особый интерес здесь представляет моделирование двух вложенных циклов методом Combinations(2). Сложение точки и вектора и умножение вектора на число - также интересная возможность.
PascalABC.NET как язык функционального программирования
Функции в PascalABC.NET можно передавать как параметры и возвращать как результат другой функции.
Проиллюстрируем это на примере создания функции bind, которая есть в стандартной библиотеке C++. Она принимает функцию двух параметров и возвращает функцию с одним параметром, связывая второй некоторым значением.
На скриншоте - код. Для примера мы реализуем функцию less - аналог операции <. Функция bind связывает у нее второй аргумент. По существу bind(less,2) возвращает функцию вида
x -> x < 2. Применим таким образом сконструированную функцию как параметр метода FindIndex. Видно, что индекс первого значения, меньшего 2, равен 3.
Исследование слов русского языка
В поставке PascalABC.NET имеется файл freqs.txt, содержащий 32000 наиболее распространенных слов русского языка с частотами их появления в тексте.
Можно придумать много задач, связанных с исследованием таких слов.
Каждое решение начинается с парсинга файла и получения последовательности слов с их частотой и частью речи.
Далее идет собственно решение задачи.
Здесь представлена задача о поиске 15 слов с не менее чем четырьмя буквами 'о'.
Мы учим этому школьников в системе дополнительного образования на втором году обучения.
Периодическая десятичная дробь
Дана дробь, заданная своими числителем и знаменателем. Перевести ее в десятичную дробь. Если десятичная дробь - периодическая, то период взять в скобки.
На скриншоте приводится решение со 100 знаками после десятичной точки.
pascal
begin
var n := 291;
var m := 35;
Write(n div m,'.');
loop 100 do
begin
if n = 0 then
break;
n := n mod m * 10;
Write(n div m);
end;
end.
Ждём решений, в которых период заключался в скобки, например: 0.(3)Перевод конструкций PascalABC.NET на C#
Публикуем таблицу соответствия языковых конструкций PascalABC.NET и C# (автор Андрей Николаев).
В таблице хорошо видно, что некоторые языковые конструкции (модули, foreach с индексом, срезы с шагом) в C# отсутствуют вообще, другие (сокращения в операторе выбора) появились в C# сравнительно недавно.
Кроме того, отсутствуют многие полезные функции и методы расширения стандартной библиотеки, позволяющие значительно упростить код в каждодневных задачах.
Graph3D - сохранение сцены в stl-файл
Всю 3D-сцену, построенную в программе, можно сохранить в stl-файле.
Вот секретная команда:
Invoke(()->hvp.Export('a.stl'));
Например, для замка из стандартных примеров эта команда даёт stl-файл, который при открытии программой Paint3D выглядит как на скриншоте. Ниже приведено изображение, генерируемое программой.Графика GraphWPF состоит из объектов
GraphWPF - простой модуль растровой графики, использующий технологию WPF. Однако, в WPF все рисуемые элементы являются визуальными объектами. Управлять свойствами таких объектов нельзя, но можно полностью перерисовать такой объект, используя DrawingContext.
На скриншоте - программа, иллюстрирующая эту технику: на визуальном объекте рисуется линия и 100 раз в секунду она перерисовывается, заменяясь на более длинную линию.
Пост про goto
Простая игра со спичками. Школьники. Контроль ввода.
Необходимо брать от 1 до 3 спичек, но не более чем на столе.
Если неправильный ввод, то возвращаемся и вводим повторно.
Оператор goto замечательно подходит в этой ситуации.
Оператор goto есть в таких языках как C++, C#, Pascal.
Все виды описания функций
Андрей Николаев составил для студентов документ, как может описываться функция в PascalABC.NET.
Документ - в виде вложения. А здесь приводим лишь заголовки:
// 1.1. Функция без параметров. function EmptyFunc : integer; // 1.2. Функция с несколькими параметрами разных типов. function RegularFunc(x : real; n : integer): real; // 1.3. Функция, возвращающая кортеж. function TupleFunc(x, y: integer): (integer, integer); // 2.1. Короткая форма записи обычной функции (с автовыводом типов). function ShortRegularFuncAuto(a, b: real) := a + b; // 2.2. Короткая форма записи обычной функции (без автовывода типов). function ShortRegularFuncNoAuto(a, b: real) : real := a + b; // 2.3. Короткая форма записи функции, возвращающей кортеж (с автовыводом типов). function ShortTupleFuncAuto(x, y: integer) := (x + y, x - y); // 2.4. Короткая форма записи функции, возвращающей кортеж (без автовывода типов). function ShortTupleFuncNoAuto(x, y: integer) : (integer, integer) := (x + y, x - y);
Все виды описания функций
Андрей Николаев составил для студентов документ, как может описываться функция в PascalABC.NET.
Говорят, что для всего должен быть ровно один способ. Но это не так. Жизнь показывает, что многообразие лучше. А каждый выберет, что ему нравится.
Шаблоны кода в PascalABC.NET
В интегрированной среде PascalABC.NET имеется множество шаблонов кода, вызываемых после набора короткого имени нажатием комбинации Shift-пробел.
Например, после набора
bи нажатия Shift-пробел мы получаем в редакторе
begin endВсе шаблоны кода можно увидеть в файле template.pct. Вот его начало:
[b] begin | end; [be] begin | end. [i] integer [s] string [f] for var i:=1 to 10 do | [fb] for var i:=1 to 10 do begin | end;Это позволяет за минимальное число нажатий набрать программу. Программа на скриншоте набрана за 22 нажатия клавиш на клавиатуре и щелчков мыши
OneLiner для множества Мандельброта
https://teletype.in/@pascalabcnet/Mandelbrot
Repost from PascalABC.NET официальный канал
Какой код лучше?
Каждый год я задаю студентам один и тот же вопрос: что самое важное при сравнении программ?
Прошлые годы я неизменно получал ответ: та, которая работает быстрее. И лишь в этом году получил другой ответ: та, которая короче. Так обычно отвечают школьники.
Затем мы обсуждаем, и я привожу другие критерии сравнения. Они - на скрине. Становится понятно, что не всё просто, и в разных ситуациях надо выбирать разное, а программы, хорошей во всех отношениях, не существует.
Для школьного программирования в основном скорость не важна. И на первую роль выходят простота написания кода и читаемость.
Вот плохой пример:
##
Seq(false,true).Cartesian(4).
Where(\(x,y,z,w)->not (x and y or w or not z)).
PrintLines(\(x,y,z,w)->$'{ord(x)}{ord(y)}{ord(z)}{ord(w)}');
Вот эквивалентный хороший код:
begin
var comb := |false,true|.Cartesian(4);
foreach var (x,y,z,w) in comb do
if not (x and y or w or not z) then
Println(Ord(x),Ord(y),Ord(z),Ord(w));
end.
Пишите просто и понятно!Какой код лучше?
Каждый год на первой лекции я задаю студентам один и тот же вопрос: какая программа лучше? что самое важное при сравнении программ?
Прошлые годы я неизменно получал ответ: та, которая работает быстрее. Сказывалось видимо олимпиадное прошлое :) И лишь в этом году получил другой ответ: та, которая короче. Так обычно отвечают школьники.
Затем мы обсуждаем, и я привожу другие критерии сравнения. Они - на скрине. Становится понятно, что не всё просто, и в разных ситуациях надо выбирать разное, а программы, хорошей во всех отношениях, не существует.
Для школьного программирования в основном скорость не важна. И на первую роль выходят простота написания кода и читаемость.
Вот плохой пример:
Вот эквивалентный хороший код:
begin
foreach var (x,y,z,w) in |false,true|.Cartesian(4) do
if not (x and y or w or not z) then
Println(Ord(x),Ord(y),Ord(z),Ord(w));
end.