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

Не помнят - заставьте:

begin
  var l,m,n:integer;
  (l,m,n):=(3,5,2);
  var A:=MatrRandom(l,m,1,50); A.Println(5); Writeln;
  var B:=MatrRandom(m,n,1,50); B.Println(5); Writeln;
  var C:=MatrFill(l,n,0);
  foreach var Ra in A.Rows.Numerate(0) do 
    foreach var Cb in B.Cols.Numerate(0) do
      C[Ra[0],Cb[0]] := Ra[1].Zip(Cb[1],(x,y)->x*y).Sum;
  C.Println(5);    
end.

Могу сделать M1 := Transpose(M) - с этим проблем не будет

1 лайк

Про это забудьте - в программировании матрица - это таблица значений, а не математический объект. Внешний модуль алгебраических операций с матрицами и векторами - если реализуете - будем признательны. Можно поискать подобный реализованный на C#.

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

Жутковато. Школьникам этого монстра не объяснить. Рядом с ним старые добрые циклы выглядят этакими милашками. Скорее, антипример получается.

Но что-то ведь надо сделать все равно. И проверять совместимость длины придется, хотя бы статически. Не будет - народ в массе своей останется на традиционных циклах.

И я не услышал Вашего мнения о сортировках…

Что до реализации подключаемой библиотеки для векторов и матриц - возможно, она жутко хороша для С#, но у меня очень слабая надежда, что я смогу её в исходниках перелопатить под PascalABC.Net. По-моему, это как раз тот случай, когда проще с нуля написать. Тем более, что основа есть: в свое время под редакцией М.Агеева выходила “Библиотека алгоритмов” на языке Алгол-60, который мне изучать не надо - это был один из первых моих алгоязыков и я частенько беру оттуда алгоритмы. Если бы Вы написали пример оформления модуля для такой библиотеки, скажем, для того же умножения матриц, чтобы посмотреть интерфейс, можно было бы на его основе попробовать наполнить библиотеку. Кстати, там алгоритмы превосходные: тогда умели и память машин экономить, и быстродействия добиваться.

Наткнулся на, казалось бы, очевидное. Нет ReadMatrXXX по аналогии с ReadArrXXX. Школьная простая задачка.

Известна успеваемость 13 учеников класса по 10 предметам. Написать программу для 
определения количества хорошистов в классе.

Вводить руками 130 комбинаций оценок 3,4,5 весьма малоприятно. Но… сгенерировать случайным образом матрицу не получается: заполнение от ДСЧ из интервала [3;5] приводит к отсутствию хорошистов, как таковых. Вот и остается работать с традиционными циклами for для ввода.

Предлагаю в новую версию PascalABC.NET добавить возможность разбивать целочисленные литералы на тысячи (а лучше — произвольным образом), чтобы код вроде такого:

var n: BigInteger := 8250400800;

выглядел, например, так:

var n: BigInteger := 8_250_400_800;

Именно литералы? А зачем? Я ни разу не встречал программ, в которых были бы в явном виде (const, var) написаны подобные константы. А когда надо считать (при отладке) позиции символов в строках, я пишу так

var s:='w4iu547me87454ym587trd3894tmd7s3xw4'
//      1234+6789*1234+6789*1234+6789*1234+ =35
```

Ну вот а гитхаб для одного только литерала 1_000_000 находит 92 тысячи употреблений. При этом, там же, существует порядка 13 тысяч вхождений литерала 1000000 в программы на паскале.

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

2 лайка

Я понимаю, когда это разделитель при выводе результатов. Но чтобы внутри программы для записи констант… Впрочем, по большому счету мне все равно. Лишь бы это не поломало форматы ввода-вывода и не внесло сумятицы в идентификаторы, в которые тоже можно вставлять символ подчеркивания.

Разделять было бы удобнее пробелами. Для знака подчёркивания нужно 2 клавиши нажимать______________________! Но \то всё не принципиально…

По-моему еще столько можно всего интересного в язык вводить… вопрос только один: ЗАЧЕМ? Какая у этого языка, кроме научной разработки, цель? Дать в руки обучающимся удобный инструмент с тем, чтобы они могли заниматься, не отвлекаясь на мелочи? Тогда надо продолжать насыщать его часто встречающимися примитивами, такими как циклические сдвиги последовательности на n позиций, добавить ReadMatrInteger и ReadMatrReal, решить вопрос о вставке, удалении и замене строки или столбца матрицы, как мы это делаем для элемента в последовательности или в одномерном динамическом массиве. А то у нас возможность добывать из матрицы строки и столбцы есть, а назад их загонять - увы… А когда все это будет, можно и над разбивкой числа в записи думать, поскольку ну вот как-то не тяготит оно на самом деле… по крайней мере, это всего лишь вопрос эстетики.

Доброго времени. Прошу Вас добавить для функции проверки обновлений также информацию об установленной и доступной на сервере версии.

довольно древняя проблема, если горизонтальный ползунок стоит не на пределе слева и нажать стрелку вверх или вниз - курсор перескакивает ещё и горизонтально вправо

откройте это что скопировать текст в котором можно это потестить
begin
//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
end.

так же тут выше писали про эту штуку, но это было давно и с ней ничего не сделали

P.S. спойлер почему то не пашет, на препросмотре “ааа” в спойлере находится…

P.P.S и ещё неприятно, если отформатировать когда часть кода выделено - программа копирует часть себя 2 раза

Ничего не понял

Про штуку тоже не понял. Тем более что это было давно

Что такое в Вашем понимании спойлер и где в последнем коде aaa? Пишите пожалуйста чётче

Да, увидели

  1. снизу в паскале ползунок если его оттянуть вправо а потом передвигать курсор стрелками - при нажатии кнопок вниз или вверх на клавиатуре курсор прыгает вправо
  2. прога с ааа это то что можно выделить и скопировать в паскаль чтоб потестить пункт 1
  3. спойлером я называю фигню которую можно сворачивать, у вас она под шестерёнкой -> Hide Details и она не сработала, хотя когда я открываю редактировать то сообщение и смотрю в предпросмотр справа - прога с ааа находиться под спойлером(убирается, когда спойлер свёрнут)
  4. про штуку см. скрин, там обведено красным вертикальная серая палка, которая там нафиг не нужна

Можно ли доработать препроцессор, чтобы действие {$OMP ...} распространялось до ближайшего for (или блока вложенных for) не взирая на {$endif}?

Например, чтобы можно было просто написать {$ifdef OpenMP} {$omp parallel for} {$endif} for var i := 0 to 1000 do for var j := 0 to 2000 do for var k := 0 to 3000 do begin //тело цикла end;

без полного дублирования заголовков циклов, как сейчас: {$ifdef OpenMP} {$omp parallel for} for var i := 0 to 1000 do for var j := 0 to 2000 do for var k := 0 to 3000 do {$else} for var i := 0 to 1000 do for var j := 0 to 2000 do for var k := 0 to 3000 do {$endif} begin //тело цикла end;

Обнаружил еще 2 проблемы:

  • автоформатирование в последнем “длинном” примере с {$omp ...} приводит код вот к такому странному виду:
  {$ifdef OpenMP}
  {$omp parallel for}
  for var i := 0 to 1000 do
    for var j := 0 to 2000 do
      for var k := 0 to 3000 do
        {$else}
        for var i := 0 to 1000 do
          for var j := 0 to 2000 do
            for var k := 0 to 3000 do
            {$endif}
            begin
              //тело цикла
            end;
  • Директивы компилятора (любые) невозможно “подавить” с помощью комментариев (да еще родная подсветка синтаксиса при этом вводит нас в заблуждение): //{$define ZZZ} или {{$reference ABC.dll}} или (*{$omp parallel for}*) – продолжают работать как ни в чем не бывало…