О статических и динамических массивах

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

1 лайк

Ну - как хотите - это ваша привычка - не более. Если бы Вы сразу написали на динамических массивах - то при переходе на статические Вы бы ругались.

Должен заметить, что при обращении матрицы методом гаусса-Жордана Вы задаёте предельный размер матрицы - скажем, 100 на 100 - и постоянно думаете о двух проблемах: память расходуется неэффективно и не понадобится ли мне в будущем матрица размера 101.

1 лайк

Тогда уж так:

const n=15;
type Arr=array[1..n] of integer;
procedure Print(a:Arr);

А никакого “огромного количества” нет. Все это количество - заслуга LINQ, который немедленно массив превращает в последовательность и снова сделать её массивом помогает волшебное слово ToArray. Но если у нас есть возможность преобразования статического массива в динамический посредством этого же волшебного слова, разница нивелируется.

Еще раз - я “всеми лапками” за динамические массивы. Однозначно, будущее программирования за ними. Поэтому на том ресурсе, о котором я упомянул (не хочу повторяться, чтобы не выглядело рекламой), если я выкладываю решение, я пишу его на последней версии PascalABC.NET и практически всегда на динамических массивах+LINQ. Пусть привыкают и видят, как это коротко и красиво. Но пока наши учебные программы для начинающих к этому не готовы, нам нужны и статические массивы. И не на правах бедных родственников. Жаль, что они не аналоги математических векторов, матриц и т.д. но раз так - значит так. Хотя, конечно, MatrixRandom(), который создает отнюдь не матрицу в обычном её понимании - семантически не самое удачное имя.

А я заметил. Программа со статическими массивами работает дольше. Но это уже особенность реализации.

Возможно, Вы не обратили внимания, что было написано: алгоритм ПЕРЕВОДИЛСЯ с Алгол-60. В те времена еще не было массовых привычек индексировать от нуля. Поэтому небольшие проблемы были именно с переходом на такую индексацию. Что до размера - для этого в Паскале давно уже научились объявлять его в const и там менять, если надо.

Кстати, заодно. Может, это я такой невезучий, но на двухмерных массивах Swap(a[i,j],a[j,i]) существенно проигрывает прямому обмену через промежуточную переменную. Проверьте, если время будет.

Да-да, конечно строка динамическая. И как “дань предкам”, обращение s[0] ведет к ошибке, потому что в динамической строке элементы нумеруются … от единицы. Подгадили предки, которые раньше в s[0] длину строки хранили…

Проверил на таком алгоритме.

procedure Transpose(a: array [,] of real);
begin
  var m := a.GetLength(0);
  for var i:=0 to m-1 do
  for var j:=0 to i-1 do
  begin
    var t := a[i,j];
    a[i,j] := a[j,i];
    a[j,i] := t;
  end;
  //Swap(a[i,j],a[j,i]);
end;

begin
  var a := MatrixRandomReal(10000,10000);
  Transpose(a);
  Print(Milliseconds);
end.

Не проигрывает. Приведите свой.

Да, в каком-то смысле дань. Это поведение нельзя было переделывать. Но в Delphi и динамические строки индексируются с 1, а кошмар с s[0] все давно забыли, а новые школьники растут уже под чистым небом.

А почему не в обычном понимании? Матрица - это двумерный массив.

Спасибо.

1 лайк

Мой - длинный, он как раз в том обращении матрицы. Сравнивал время работы со статическими и динамическими массивами. Не хотелось бы постить длинный код, а как тут файлы прицеплять (и можно ли) я не знаю. Если дадите альтернативный канал - перешлю, конечно.

Не вполне так. Динамический массив не превращается в последовательность - он и есть последовательность. То есть, преобразования внутреннего представления не происходит.

А преобразование статического в динамический потребует как раз такого преобразования.

Кроме того, кроме методов LINQ в динамических массивах есть еще куча своих методов.

Вы сами не так давно писали, что одномерный массив - это не вектор, а двухмерный не матрица в их математическом понимании. Напомню: речь шла о векторных и матричных операциях, как они в Фортране, например, реализованы.

Я имел в виду, что тип данных меняется и динамический массив уже не array of < T >, а совсем не внутреннюю кухню.

Попробуйте для начала снять флаг “Сохранять отладочную информацию” и запустить по Ctrl-F9. Это режим Release - в нём всё должно быть идентично - в нём простые подпрограммы инлайнятся JIT-компилятором.

Ну да - наверное, Вы правы - это мы просто так привыкли

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

    const n=15;
    type Arr=array[1..n] of integer;
    procedure Print(a:Arr);

И это вместо

procedure Print(a: array of integer);

Увы, да! А разве я где-то говорил, что это хорошо? Вы смешиваете изначальное понятие о массиве и работу с ним при передаче в другие программные единицы. Это темы разного времени изучения и между ними никто не мешает и динамические массивы рассмотреть, тем более, что там уже и записи пройдены.

Да, коряво в Паскале сделана работа со статикой. А давайте я вспомню, что сделали с циклами авторы PL/1 и поглумлюсь над Н.Виртом с его оператором цикла:

DO I=1 ТО 5 BY 2, 6 ТО 8 BY 1 WHILE(S < 0), N - l, N;
    S =  S*A(I);
END;

Какой есть у нас Паскаль, такой и есть…

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

1 лайк

И я об этом же писал. Еще, если помните, тогда высказывал мнение, что нужно добиваться включения PacalABC.NET в набор средств для тестирования решений на различных олимпиадах.

Жаль только, что по LINQ есть лишь неполный материал в работе М.Э.Абрамяна.

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

По LINQ - юмор состоит в том, что мы дополнили LINQ своим набором расширений :slight_smile:

И это я заметил, поскольку “расковыривать” реализацию приходится, как классический черный ящик. Документирование катастрофически запаздывает, но поскольку сам всегда ненавидел делать документацию к проектам, отношусь к ситуации с должным пониманием. Наверно и Вы заметили, что от меня поступает достаточное количество сообщений об ошибках - это как раз результат такого “ковыряния”. И у меня большая надежда в этом плане уж хотя бы на Intellisence.

Кстати, на LINQ у меня есть парочка хотелок, о них еще писали в morelinq, но давайте повременим с этим. Я только намекну: когда мы получаем a.Where(…).Max, хотелось бы знать, где он находится в исходной последовательности… Не далее как сегодня, задача была: отсортировать по убыванию элементы массива, находящиеся между минимальным и максимальным значениями. LINQ тут оказался полностью бесполезной фичей.

Действительно, на Яндекс контест в списке компиляторов указывается PascalABC 2.10.8.1 с запуском "mono pabcnetcclear файл". Но это же еще 2.1, даже не 3.0…