Версия PascalABC.NET 3.2

а что он делает? можно пример использования?

loop 5 do
  Print(1)
2 лайка

расскажите предысторию. почему loop do? очень интересно откуда пришло

Не знаю никакой предыстории. Нужен был цикл для начинающих - когда никаких переменных. Ну и просто для использования. loop - цикл, do - по аналогии с еще двумя циклами. Русский перевод - повторить n раз. Скажем, вот пример:

var p := 1.0;
loop 10 do
begin
  Print(p);
  p += 0.1;
end;

Если делать с for, то переменная цикла for - лишняя

Хороший сахарок, теперь бы в PABCSystem.pas во всех методах типа operator*<T>() заменить циклы for var i:=1 to n do на loop n do в качестве наглядного пособия :wink: Я насчитал 10 таких мест.

Да, неплохая идея. Для того и делалось

Даже если loop появится, то в ОГЭ по информатике он явно не скоро войдёт :laughing:

Это нас не заботит.

Нас заботит основная причина введения. Есть циклы с заранее известным количеством повторений где переменная цикла не нужна.

1 лайк

А туда вообще наверно процентов 80-85 PascalABC.NET не входит. Но это вовсе не означает, что их в ответе использовать нельзя (см. методические указания ФИПИ)

Попалась на глаза вот такая задачка:

Создать матрицу с нулями внутри, и единицами на границах.

Увидел реализацию на Питоне и почувствовал, что ко мне вплотную подкралось известное земноводное в готовности приобнять за шею…

import numpy as np Z = np.ones((10,10)) Z[1:-1,1:-1] = 0

Что до первых двух строк, мы так тоже можем, и даже изящнее: var Z:=MatrFill(10,10,1); а вот последняя строка… срезы в двумерном массиве, да еще и в левой части!

Какие будут мысли кроме предложений нагромоздить кучу кода?

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

Конечно, не так коротко:

begin
  var (m,n) := (10,10);
  var a := MatrGen(m,n,(i,j)->(i=0)or(j=0)or(i=m-1)or(j=m-1)?1:0);
  a.Print(1)
end.
1 лайк

Я думал, будет существенно хуже. Сейчас это решение кажется “простым и естественным”. Значит, скорее всего, оно - лучшее. Спасибо еще раз. Наверно, Вы хотели написать

begin
  var (m,n) := (10,10);
  var a := MatrGen(m,n,(i,j)->(i=0)or(j=0)or(i=m-1)or(j=m-1)?1:0);
  a.Print
end.

Иначе можно без var (m,n) := (10,10); обойтись.

Ну, мне это наверное больше нравится:

begin
  var (m,n) := (10,10);
  var a := MatrGen(m,n,(i,j)->i.Between(1,m-2) and j.Between(1,n-2) ? 0 : 1);
  a.Print(1)
end.

Не такое пёстрое

1 лайк

Или так :)))

begin
  var a := MatrGen(10,10,(i,j)->1-Min((i mod 9)*(j mod 9),1));
  a.Print(1)
end.

Это слишком замудренное.

Сегодня обратил внимание, что Паскаль начал писать PascalABC.NET 3.3, сборка 1531 от 30.08.2017 Когда и почему версия стала 3.3? В ней что-то радикальное поменялось?

  (new System.Threading.Thread(()->begin
  
  while true do
    try
      //*какой то оператор*
      //пока ошибка не пропадёт - повторять
      break;
    except
    end;
  
  end)).Start;

На строчке с break ошибка:

В данной версии компилятора не поддерживается замыкание данного типа символов

А в как скоро будет поддерживаться? Я не знаю красивой замены этой конструкции, а вложенная(или как там её, которая до begin внутри другой описывается) процедура выдаёт ошибку, мол ожидалась функция.

зачем должно что-то радикально меняться. просто по накоплению фич ежегодно выпускается новая версия.

Пора делать ветку для 3.3.

А вот пример того, что идиотизм у нас в системе обучения неистребим…

Оригинал с полным текстом задания