Как стать автором
Обновить
1
0

Пользователь

Отправить сообщение

Это Вы так о Паскале, потому что Ваши сведения о нем застыли на уровне максимум 2000 года.

Указатели - да, сейчас они не нужны. Совсем.

Списки Вам на C# хочется? LINQ? Итераторы? Сортировку? Ну получите на Паскаль

##
var a := Lst(5, 8, 12, 7, -4);
a.Println; // 5 8 12 7 -4
Println('Размер списка равен ', a.Count); // Размер списка равен 5
a += 9;
a.Println; // 5 8 12 7 -4 9
a.Sort;
a.Println; // -4 5 7 8 9 12
a.RemoveAll(t -> t in 3..8);
a.Println; // -4 9 12
a += Lst(8, 11, 6);
a.Println; // -4 9 12 8 11 6 
var b := SeqGen(5, i -> 2 * i + 1).Where(t -> t < 10).ToList;
b.Println; // 1 3 5 7 9
a.Intersect(b).Print // пересечение списков, результат 9

Во-первых, как я уже заметил, так писать никто не требует, но если хочется - почему нет? Во-вторых, современному стилю программирования нужно учиться и как раз по этой причине PascalАВС.NЕТ удобен: он позволяет писать код в любой парадигме и произвольно их смешивать при желании. Вот что и как проходим сейчас - так и пишем. А потом оставляем в памяти наиболее удобное.

А давайте рассмотрим вот такой код новичка на Питоне:

n = int(input())
m = n / 2
a = []
for i in range(n):
    a.append(int(input()))
a.sort
print(m, a[m])

Допустим, у нас 25 значений. Вводим 25, затем эти 25 значений... и потом Питон нас радует сообщением "List indices must be integers or slices, not float", после чего школьник обычно лезет в телефон за переводом. Да блин же, зачем было 26 чисел тогда вводить!

Аналогичный код на современном Паскале (специально написан максимально близко к питоновскому)

##
var n := ReadInteger;
var m := n / 2;
var a := new List<integer>;
foreach var i in n.Times do
    a.Add(ReadInteger);
a.Sort;
Print(a[m])

При попытке откомпилировать код сразу получим сообщение: "Нельзя преобразовать тип real к integer" с подсветкой места ошибки.

Вот этим Паскаль для школьника лучше Питона. У меня есть и с динамической типизаций примеры... просто они длиннее.

Почему же нельзя?

Указатели умерли вместе с ТурбоПаскаль. В современном Паскале ссылочная модель данных. Лишь для сложных объектов требуется отличать var a := b от var a := Copy(b). Но и только.

Зайдите на сайт питерского DL Club. Там дети в 1-3 классе на современном паскале такие вещи в графике вытворяют...

Так и в PascalАВС.NЕТ автоформатирование (если не отключать) работает автоматически при вводе. А если вставить в окно редактора неформатированный текст, есть опция меню (и кнопка на панели), выполняющая форматирование. Насчет "падений" - хотите верьте, хотите нет, Паскаль последний раз падал у меня года четыре назад. Хотя, по слухам, можно заронить программу, если пытаться работать с указателями - в .NET-среде это смертельный номер из-за сборщика мусора.

А в Питере DL Club учит на PascalАВС.NЕТ детей в 1-3 классе (можете на их сайте убедиться). А с 4 класса они на С++ переходят, ибо там олимпиадников готовят. Но что эта организация, что физ-мат лицей - это не массовое явление в школьной информатике, по ним нельзя равняться.

Про "современное". Школа учит не языку программирования, она должна учить конструировать алгоритмы (хотя и этому она не учит). От того, каким будет первый язык, зависит мышление ученика. Приучат на Пайтоне к динамической типизации - так и будет таращить глаза в вузе, услышав про С/С++ и ныть, что это все "дешманские языки". Я как-то попросил питонщика написать алгоритм обращения матрицы методом Гаусса. Бог мой, что это было... Гаусс бы сто раз перевернулся в могиле, увидев такую реализацию.

Вынужден Вас разочаровать. Во-первых, точечная нотация (в C# она называется fluent-interface) пришла из Unix-конвейеров и ООП. Во-вторых, лямбды пришли из функционального программирования, которому ого-го сколько лет. Так что это взято вовсе не из Питона. А что Вы называете "cтилем Perl" ? Фигурные скобки нельзя, потому что когда-то решили, что в Паскале они обрамляют комментарии. Четыре пробела отступать? Ну так пробелы в Паскале вне строковых литералов незначимы, пишите где и сколько хотите.

Если Вам знаком тот же Питон, то Вы понимаете, что это повторение. Только не константы, а объекта. В данном случае - массива из одного элемента со значением -1. Но Паскаль - это не Питон, где те же "лямбды" ущербны, ибо реализованы не полностью. В Паскале, как и в Хаскель, функция - объект первого класса, т.е. ее имя может встречаться в выражении в качестве операнда. Так что |х| - функция, возвращающая массив из своих аргументов х. Синтаксический сахар для функции Arr(a1, a2, ...), просто тут мне понадобился только один элемент.

По поводу Вашего "|Random|" - да, выведет 5 раз повторенное случайное вещественное число из интервала [0, 1). Забавно, да? Не зная языка, Вы написали на нем работающую конструкцию, да еще и угадали, что она сделает. Что же тут неочевидного? С точки зрения функционального программирования - ничего. Но ведь так никто писать не заставляет, можно писать и иначе, и даже как на ТурбоПаскаль.

Ненавижу Паскаль, потому что он Паскаль. Это как объяснение Портоса: "А я дерусь.... потому что дерусь!"

В современном Паскале мы просто пишем программу:

##
var n := ReadInteger; // введем 13
var a := new integer[n];
a[: n div 3] := |-1| * (n div 3);
a.Print // -1 -1 -1 -1 0 0 0 0 0 0 0 0 0

Все коротко понятно и читаемо (ну или почти все). В С++ на уровне школьника код будет намного менее нагляден. А ведь это примитивный пример.

Я вот тут ниже в комментарии пример кода написал https://habr.com/ru/post/569362/comments/#comment_23307170

Поищите там Ваши претензии на уровне ""слишком много слов ради слов (end, begin и прочее)", переменные в начале или поддержания его (в некоторых версиях) по-факту для школы "

Что ж, вот Вам современный паскаль, пробуйте фишку.

## (1..1000).Where(A -> (1..5000)
   .All(x -> (x and 30 <> 4) or ((x and 35 = 1) <=
   (x and A = 0)))).Last.Print

Это решение пробника для ЕГЭ-2021. В одну строку.
Вот условие задачи: Определите наибольшее натуральное число A, при котором выражение
( x & 30 ≠ 4) ∨ ((x & 35 = 1) → (x & A = 0))
тождественно истинно (то есть принимает значение 1 при любом натуральном значении переменной x)?

Лазарус ("Делфи для бедных") - это идол украинских учителей информатики. И немного - казахских. В России Лазарус совершенно непопулярен, обучающие на нем - они типа сектантов.

Это в какой стране "изучают в среде TP7" ? У Вас есть статистика или это как у М. Жванецкого "Я тоже видел у одного японский транзистор!" ?

Хаскель - язык с функциональной парадигмой, зачем его сравнивать с языками, разработанными для процедурно-ориентированного кода?

И как, кроме C/C++ много современных языков программирования работают с указателями? Практически ни одного. Они работают со ссылками, а это совсем не одно и то же. Все ООП-языки строятся на основе ссылочной модели данных. Кроме крайне неудобной "размерной" модели в С++, за что его кто только не ругал.

Тем временем PascalАВС.NЕТ (полный работающий код):

type
  Фрукты = (Яблоко, Апельсин, Киви);
  X = HashSet<Фрукты>;
begin
  var a := new X;
  a += Киви;
  a.Print
end. 

А зачем? Если продолжать учить в PascalABC.NET, можно работать со статическими массивами (для закостенелых учителей), с динамическими, а также со списками List (если хочется делать частые добавления / удаления). Причем делать это куда проще и понятнее в записи, чем на С++ с STL.

Это именно в Турбопаскаль. В PascalABC.NET можно а качестве множества использовать стандартную обобщенную коллекцию HashSet, причем работать с ней и как с коллекцией, и как с классическим множеством языка Паскаль. Турбопаскаль давно умер, зачем вспоминать, как там все было устроено?

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность