Версия PascalABC.NET 3.2

Да, вот в IDE PascalABC.NET отладчик не пооператорный, а построчный. И при “синдроме одной строки” по F8 проделывается такая чертова уйма вещей, что и не отследить. И бьешь строку “по точкам” на отдельные…

Ну мы вот на работе пользуемся JDeveloper для разработки, логгер стандартный, если что-то где-то упало - лезешь в логи, смотришь - ага, вот такая строчка, Nullpointer например. Лезешь в код, а там в этой строчке восьмикилометровый монстр с “точками” в котором помимо пары основных запросов к базе уйма подзапросов и граничных проверок на полсотни переменных почти, и Null может быть где угодно. А на масштабный рефакторинг времени нет, приходится пока переделывать тоько там где оно сейчас упало.

В новой версии появились мягкие срезы вида a?[1:8:2] без контроля выхода за границы. Напоминаю, что срезы работают для массивов, списков и строк

1 лайк

Бог ты мой, майн готт, май год, матка боска… Сбылось!!!

begin
  var s:='1234567890';
  Writeln(s?[-3:20])
end.

Это очень правильное решение. Если пользователь сильно хочет прострелить себе ногу, не надо ему категорически мешать. Пусть ставит знак вопроса… )))) Если без шуток - часто надо бывает, чтобы не контролировалась граница и это означало “пока не закончатся данные”.

А по версии образовалась потребность с матрицами. Есть у школьников целый класс задач на двумерные массивы. В большинстве своем он сводится к “найти” или “найти и заменить”. Найти просят либо значение, либо местоположение (значение в последнем случае при необходимости легко выдается по местоположению). Находить нужно максимумы, минимумы, а также значения, удовлетворяющие некоему предикату. При этом значение может быть одно, может быть и не одно. Ах да, еще бывает ввод элементов матрицы с клавиатуры…

Конечно, традиционные циклы позволяют просто и понятно все эти проблемы решать. Но уж если функциональное программирование - так пусть оно таковым остается до конца. При поиске одного (первого встреченного) значения я сейчас поступаю так:

// PascalABC.NET 3.2, сборка 1374 от 10.01.2017
// Внимание! Если программа не работает, обновите версию!

begin
  var m:=ReadInteger('Количество строк в массиве:');
  var n:=ReadInteger('Количество столбцов в массиве:');
  Writeln('*** Исходный массив [',m,',',n,'] ***');
  var a:=MatrRandom(m,n,-50,50); 
  a.Println(4); Writeln(4*a.ColCount*'-');
  var b:=a.Rows.SelectMany(x->x).ToArray; // в одномерный построчно
  b.  // вот тут у Intellisence "крыша отъезжает"
      // и получить после точки подсказку невозможно.
      // ну да не суть, все же текст приведу ниже полностью
end.

Преодолевая упорное молчание Intellisence, все же набираю текст до конца:

// PascalABC.NET 3.2, сборка 1374 от 10.01.2017
// Внимание! Если программа не работает, обновите версию!

begin
  var m:=ReadInteger('Количество строк в массиве:');
  var n:=ReadInteger('Количество столбцов в массиве:');
  Writeln('*** Исходный массив [',m,',',n,'] ***');
  var a:=MatrRandom(m,n,-50,50); 
  a.Println(4); Writeln(4*a.ColCount*'-');
  var b:=a.Rows.SelectMany(x->x).ToArray; // в одномерный построчно
  var icond:=b.FindIndex(x->x>40); // собственно, условие поиска
  var i:=icond div n; // строка
  var j:=icond mod n; // столбец
  Writeln('a[',i+1,',',j+1,']=',a[i,j])
end.

Количество строк в массиве: 4
Количество столбцов в массиве: 7
*** Исходный массив [4,7] ***
 -33 -30 -13 -48   8 -47 -50
  34  43  -9  -8 -25 -12  28
  38 -36  34  -7 -36 -45  23
   4 -45   1  36 -16  50   4
----------------------------
a[2,2]=43

Хочется иметь функцию преобразования между одномерным и двумерным массивом, хочется уметь “рассыпать” двумерный массив в список <значение><строка><столбец> и наоборот, собирать из такого списка двумерный массив. Клавиатурный ввод хочется, типа MatrReadInteger. Ну и поиски, чтобы потом можно по их результатам замену делать, т.е. поиск должен возвращать опять же кортеж <значение><строка><столбец>

Вот такие хотелки…

11 сообщений перенесены в новую тему: Обсуждение единственности пути. Немного нервно

Олимпиады по информатике в Москве, 2016/17 учебный год (https://olympiads.ru/moscow/2016-17/soft.shtml)

“Оптимальный” перечень сред разработки PascalABC.Net Code::Blocks с компилятором MinGW gcc/g++ Python 3.4 и среда Wing IDE 101 5.1.12

PascalABC.NET Сайт: pascalabc.net Версия: 3.2 Источник для установки: http://pascalabc.net/ssyilki-dlya-skachivaniya

“Процесс пошел” ?

1 лайк

Прочитал ветвь дискуссии до этого места. В начале, как частный преподаватель который готовит учеников к ЕГЭ горячо поддерживал RAlex’а. Аргументы приведенные в вашей презентации рациональны. Среда действительно популярная, красивая, удобная, компактная. Успехи, достигнутые вами в завоевании ниши школьного обучения велики, но могут быть потеряны если среда станет непригодной для подготовки к ЕГЭ. Может быть for var i:= это то чем следует пожертвовать хотя бы на некоторое время ради сохранения совместимости.

Вот тут уже я не понял. Да, я возражал, но лишь против того, чтобы конструкция for var i:= была СИНТАКСИЧЕСКИ ОБЯЗАТЕЛЬНОЙ. Сейчас речи об этом не идет - кто как хочет, тот так и пишет.

И по ЕГЭ. В методических материалах ФИПИ для комиссий в части информатики сказано, что при написании программы ученик может использовать любой язык программирования при условии указания его названия и требуемой версии, а также разрешено оформлять решение на естественном языке. Проблема проверки решения - это проблема комиссии. С учетом приведенного выше я не могу понять, каким образом ДОБАВОЧНЫЕ синтаксические конструкции PascalABC,NET могут даже хоть как-то повлиять на подготовку к ЕГЭ, не говоря о том, чтобы сделать среду “непригодной”. Разве только они добавят работы школьным учителям и репетиторам? “Но это уже совсем другая история…” (с)

Честно сказать, мы ничего особенного не делали - среда стала сильно популярной примерно 2 года назад - я это вижу по существенно возросшему количеству скачиваний. Но мы не ставили задачу обеспечить популярность среды.

А писать for i Вы по-прежнему можете - обратная совместимость со стандартным Паскалем есть.

А вот скажите как специалист по подготовке школьников: что будет, если школьник на ЕГЭ для вычисления суммы квадратов первых n чисел напишет так:

var s := Range(1,10).Sum(x->x*x);

?

Наверное зависит от конкретного проверяющего эксперта. Большинство из них без сомнения люди адекватные и вовсе не звери. К тому же, если стоит версия среды, то на апелляции в любом случае можно будет доказать корректность данной строки. Вот только вопрос, сколько учащихся захотят рисковать и делать сложнее, а потом выходить на апелляцию когда можно сделать проще по проверенной схеме.

Можно понять и проверяющего - он видит знакомое начало намекающее на паскаль, а потом что то для него новое. Не все хотят и не у всех есть силы учиться, особенно если это не приносит дохода. В жизни и так много места для работы и мало для отдыха, поэтому осваивать новые конструкции и возможности и прочее хочется далеко не всем.

По моему мнению в языке наблюдается как будто бы движение в сторону питона. Минус данной стратегии (говорю как человек который так или иначе писал много на чем включая паскаль, си, php, js, python) в том, что думаешь не над решением и оптимизации задачи а над тем как построить языковую конструкцию, что бы выглядело красиво да еще и работало правильно.

Кстати, по статистике за 2016 год число предложений о работе для питона снизилось а вот для “кандового” php существенно выросло (см. тут https://habrahabr.ru/company/hh/blog/318450/) . Так что красота строки и “всё в одном” зачастую усложняет вхождение и не всегда помогают в решении реальных задач. Тем более если говорить о школьниках у которых вхождение с нуля.

.Удобные штуки конечно приятны, например var a := ArrRandom(n);

1 лайк

А по-моему тут явное движение к С#, да и сами авторы этого не скрывают. Из Питона взято не так уж и много, основу все же дала библиотека .NET. Питон - это довольно неудачный язык: пропал один непечатаемый символ табуляции - и ты почти покойник. Чтобы на Питоне что-то реально можно было сделать, его поставили на немного иные рельсы (Ruby on Rails).

Красиво - это перфекционизм. Большое зло для программиста, работающего в коллективной упряжке. Его себе только “прима-балерины” могут позволить. Если, конечно, мы о реальной работе говорим на какого-то дядю, который нас содержит. А что плохого в том. чтобы коротко записать обращение к готовому методу? Да, надо кое к чему привыкнуть, но ведь и программировать в традиционных технологиях Вы тоже не за сутки научились. Что до “все в строку” - ну этого никто делать не заставляет. Позволяет синтаксис - и ладно. Кто может и хочет - пользуется.

Меньше года назад при слове “Паскаль” я начинал “шипеть и плеваться”. Как все поменялось… Надо только было заставить себя сломать стереотип.

Есть явное движение в сторону «Питона с типами». Для школьников это намного более полезно, чем просто Питон или старый Паскаль. Что бы там ни думали проверяющие ЕГЭ.

2 лайка

Спасибо - очень точное объяснение.

Это очень характерно для нашей страны - сломать ребенку судьбу потому что лень учиться самому. Главное - что тебе за это ничего не будет.

Да да да - мы о том же :))

Не вполне согласен. Наш опыт обучения школьников говорит о том, что если ребёнка сразу учить правильно, то он как раз думает над алгоритмом в терминах вот этих новых примитивов и применяет нужный, выбирая из нескольких. А при подготовке к ЕГЭ школьников до сих пор заставляют писать неоптимальную сортировку вручную.

3 лайка

В задачах олимпиад для школьников, на Интернет-ресурсах, предназначенных для самообучения, а также в школьных задачниках часто встречаются формулировки следующего вида:

“На вход программе подаётся последовательность символов, заканчивающаяся точкой (точка – признак конца и в последовательность не входит).”

“Программа получает на вход целые числа, количество введенных чисел неизвестно, последователньость чисел заканчивается числом 0 (0 - признак окончания ввода, не входит в последовательность)”

“Дана последовательность вещественных чисел, заканчивающаяся нулем (ноль - признак окончания ввода).”

Иными словами, предлагается ввод неопределенного количества данных, ограниченных неким терминирующим символом (реже - терминирующим условием по типу “до первого отрицательного числа”). Такой ввод приходится организовывать посредством циклов с условием (while, repeat). Нельзя ли сделать какие-то процедуры ввода по аналогии с Read[ln]Integer, Read[ln]Real, ReadlnString и т.д., в которых задается не количество вводимых элементов, а терминирующее условие, как вариант, в форме предиката (x->x=0) ?

ReadSeqIntegerWhile(x->x>0)

О!!! И как давно? И как насчет символов (char)?

Давно.

Символов и просто с ReadArr нет. Непонятно, чем их разделять - пробелами?

Мне тоже непонятно. Вообще, в паскале вопрос ввода символьных данных изначально криво решен. Это же надо какое воображение иметь, чтобы не заложить в язык строковый тип и при этом отдельные символы вводить, разделяя их признаком смены строки? Фактически “предложение” вводится по одной букве на строке - о чем Вирт с Йенсеном думали? Но поскольку никакого иного разделителя в Паскале при вводе символов нет, можно пойти по такому пути: по умолчанию разделителем сделать код, посылаемый нажатием Enter, и дать опциональную возможность указать свой разделитель, например, тот же пробел или нечто иное, которое можно выбрать, исходя из стоящей задачи.

Немного улыбнуться. Сегодня один школьник выдал (проверка суммы трех натуральных чисел на четность):

begin
write (((readinteger('Введите 3 нат. числа: ')+readinteger+readinteger) mod 2)=0);
end.