Замечания и предложения

Огромный минус. Получается мусорная свалка из переменных, где уже непонятно, кто за что отвечает. И мотаешься туда-сюда по коду.

Наши опыты со школьниками показали, что не надо говорить о явных типах сразу. Можно лишь упоминать типы и не вводить их явно. Запись

var a := 1;

означает, что переменная a вводится первый раз и инициализируется целым. И потом целой будет всегда.

Ещё раз повторюсь - эта технология обкатывается нами каждый год на 200-300 школьниках. И никаких проблем.

Проблемы у нас наступали тогда, когда у нас появлялся такой извиняющийся преподаватель и говорил семиклассникам, что вот - в старом Паскале было так, и переменные описывались с типами, и нельзя было сразу значение присвоить, а в PascalABC.NET по-другому, вот так. Бедные школьники смотрели на него как на ненормального. Зачем объяснять - говорили они - когда и так всё понятно:

var a := 1;

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

Наше общение именно с молодыми учителями было очень положительным и понимание было или с полуслова или высокое.

эта технология обкатывается нами каждый год на 200-300 школьниках

А этот опыт где-нибудь фиксируется? Журналы, статьи, конференции, видео, сайты? Интересно было бы изучить.

Старую собаку не научишь новым штукам. (народное)

Так @Admin - директор воскресной компьютерной школы))

Не надо усложнять. Я пишу этот код так:

begin
  var (n, k) := ReadInteger2;
  var ma := ReadArrInteger(n);
  var (max1, max2) := (0, 0);
  foreach var i in 1..n-k do
  begin
    var x := ReadInteger;
    var r := i mod k;
    if ma[r] + x > max1 +max2 then
      (max1, max2) := (ma[r], x);
    if x > ma[r] then
      ma[r] := x
  end;
  Print(max1, max2)
end.

Что здесь сложного по сравнению с Питоном - ума не приложу. Единственное отличие - map в Питоне рассматривается как заклинание. Потому что в Питоне нет достойного ввода по одному числу из строки - только всю строку целиком надо считывать.

Ну и как преподаватель я не могу с этим смириться - когда map появляется уже на первом занятии при вводе двух целых.

Я намеренно написал как можно ближе к питоновскому коду. Поскольку почему-то показалось, что @Danov сделал упор, что список лучше (?) динамического массива. И потом уже писал, что список тут ни разу не нужен.

Часть есть здесь: http://pascalabc.net/dokladi

Но там осколки.

Ещё выложу если интересно. Но там не то, что вы ожидаете. Мы не педагоги в первую очередь, где будет описано про дидактику и проведён статистический анализ на детях, изучающих PascalABC.NET и детях из контрольной группы.

Мы массово в течение более 20 лет готовим школьников с 6 класса к поступлению в ВУЗ на ИТ-шные профессии. Много школьников. Конечно, зовём на мехмат ЮФУ. Но жизнь - она многогранная - поступают в кучу мест. А потом выясняется, что в Компьютерной школе их учили лучше и современнее.

Вот давайте сразу сброшу вот это:

ЭРНО PABC 2016 основная.pdf (1,0 МБ)

Или это: Михалкович2017.pdf (463,9 КБ)

Михалкович2018.pdf (223,3 КБ)

Давайте еще вот это приведу ради хохмы: СИТО 2019 сопоставление с образцом.pdf (729,2 КБ)

Хотя мне лично больше нравится вот это: SitoPABC2015-2016.pdf (1,6 МБ)

1 лайк

Приветствую всех, у меня есть предложение, сделать темы для паскаля: “Темная” и “Стандарт” (к примеру) . Будет ли такая задумка когда нибудь реализована?

Эти игрища в кастомизацию с 2015 года идут Почему бы просто не воспользоваться поиском, прежде чем писать идеи?

спасибо. Но почему эту функцию не добавить в сами настройки ?

Проект открытый. Возьмите и добавьте. Разработчиков на данным момент - два человека. Поверьте, у них сейчас есть задачи куда поважнее раскрашивания интерфейсов.

Прошу добавить для decimal (возможно, ещё для BigInteger, но я не проверял, все ли есть у BigInteger) во встроенные все подпрограммы, что есть у других типов и подходят для decimal. Поскольку, скорее всего, у разработчиков

я прошу добавить, когда будет время.

1 лайк

Хотя, по моему, в PABCSystem это не так уж и нужно. Случаи где decimal придётся вводить с клавиатуры - это в довольно специфичных проектах, где лучше описать такую подпрограмму самостоятельно.

Мне кажется, забыли добавить ReadBigInteger(prompt: string): BigInteger.

кто скажет, как мне настроить/включить альфа канал, для процедуры DrawImage? [модуль GraphWPF]

Поидее он всегда включён. Но, конечно, для этого исходное изображение должно иметь прозрачные пиксели.

Вы недавно удалили 2 файла, когда @ibond и @Admin одновременно сделали по коммиту в мастер, которые изменяли эти файлы.

  • Parsers\PascalABCParserNewSaushkin\ABCPascalYacc.cs
  • Parsers\PascalABCParserNewSaushkin\ABCPascal.cs

У вас может есть локальная версия этих файлов и пока вы сидите в мастере - вам не важно.
А у меня эти файлы удаляет при каждом прыжке между ветками. И без них проект не собирается.

Пожалуйста, или добавьте их назад, или сделайте так чтоб при сборке проекта вызывался этот .bat:

  • Parsers\PascalABCParserNewSaushkin\generateParserScanner.bat.

Да и ещё…

type
  t1<T> = class
    
    //Ошибка: Возвращаемое значение или параметр должны иметь тип t1<T>
//    static function operator implicit(a: t1<byte>): t1<word> := new t1<word>;
    
  end;
  
//Ошибка: extension-операторы преобразования типов допустимы только для классов из других сборок .NET
//function operator implicit(a: t1<byte>): t1<word>; extensionmethod := new t1<word>;

begin end.

То есть сейчас определить неявное преобразование между t1<byte> и t1<word> невозможно.
Может разрешите внутри класса?

В OpenCL в кернел можно передавать как буфер, так и значение из оперативки. Вот в OpenCLABC второе раньше было невозможно.
Сейчас решил сделать возможным, ввёл тип KernelArg, к которому можно преобразовать указатель, запись или буфер. А определить преобразование CommandQueue<Buffer> в CommandQueue<KernelArg> оказывается нельзя.

Сергей, а почему распаковки кортежей нет? В чем тут идея?

begin
  readarrinteger(readinteger)
    .Combinations(2)
    .Select(x->(x[0],x[1])) // ниже строчка не работает
    .Where((a,b)->((a+b)mod 80 =0)and((a>50)or(b>50)))
    .Print();
end.

А еще с Питона можно скопировать преобразования:

x,y = (3,5)
print(x,y)

x,y = [3,5]
print(x,y)

(x,y) = [3,5]
print(x,y)

x,y = [3,5,7][:2]
print(x,y)

Что мешает так писать?

begin
  ReadArrInteger(ReadInteger)
    .Combinations(2)
    .Select(x -> (x[0], x[1]))
    .Where(t -> ((t[0] + t[1]) mod 80 = 0) and ((t[0] > 50) or (t[1] > 50)))
  .Print;
end.

Что до Питона - зачем его копировать? Оттуда и так взято все полезное))) Например, кортежное присваивание есть var (a,b,c) := (5,8,13); в все написанные Вами примеры легко моделируются (если они вообще в Паскале смысл имеют).

Мы на форуме общаемся не первый год по добавлению новшеств в язык, позиция разработчика была прежде такой: “Если Вам надо все, как в С++, просто пишите на С++)”. То же и о Питоне.

Вот идея именованных элементов кортежей уже давно витает в воздухе.

Я кажется понял в чем проблема именно в том случае. Where есть метод, где на вход лямбды подается элемент последовательности и его индекс

.Where(((x,y),i) -> (x+y) mod 80 = 0))
// или
.Where(((x,y)) -> (x+y) mod 80 = 0))

Скорее так нужно будет… Но даже C# этого не понимает