Заполнить массив из 12 элементов случайными числами в интервале [-12..12] и выполнить...

0 голосов
167 просмотров

Заполнить массив из 12 элементов случайными числами в интервале [-12..12] и выполнить реверс для каждой трети массива.
Пример:
Исходный массив:
4 -5 3 10 -4 -6 8 -10 1 0 5 7
Результат:
10 3 -5 4 -10 8 -6 -4 7 5 0 1
Есть готовая программа. Объясните пожалуйста что да как.
const n=12;
var a:array[1..n] of integer;
i,k,x:integer;
begin
randomize;
writeln('Исходный массив');
for i:=1 to n do
begin
a[i]:=-12+random(25);
write(a[i]:4);
end;
writeln;
k:=n div 3;
for i:=1 to k div 2 do
begin
x:=a[i];
a[i]:=a[k-i+1];
a[k-i+1]:=x;
x:=a[k+i];
a[k+i]:=a[2*k-i+1];
a[2*k-i+1]:=x;
x:=a[2*k+i];
a[2*k+i]:=a[n-i+1];
a[n-i+1]:=x
end;
writeln('Инверсия третей массива');
for i:=1 to n do
write(a[i]:4);
end.


Информатика (47 баллов) | 167 просмотров
0

Пожалуйста, если хоть что нибудь знаете, то помогите, это мне очень поможет

0

А можно не объяснять это плотнище, а написать свою в несколько строчек?))

0

*полотнище

0

Конечно, спасибо большое, мне очень нужно

Дан 1 ответ
0 голосов
Правильный ответ

// PascalABC.NET 3.1, сборка 1200 от 13.03.2016
begin
  var a:=ArrRandom(12,-12,12); a.Println;
  var b:=a.Batch(a.Length div 3).Select(x->x.Reverse);
  var k:=0;
  foreach var e1 in b do
    foreach var e2 in e1 do begin a[k]:=e2; Inc(k) end;
  a.Println
end.

Тестовое решение:
-7 -9 8 -11 -5 -3 -2 6 11 -7 4 -6
-11 8 -9 -7 6 -2 -3 -5 -6 4 -7 11

(142k баллов)
0

Можно в ArrRandom(12,-12,12); первое 12 заменить на количество элементов в массиве, а -12,12 - на границы для датчика случайных чисел.

0

Хорошо, спасибо огромное!

0

Главное - чтобы версия Паскаля была не ниже указанной: PascalABC.NET 3.1, сборка 1200 от 13.03.2016

0

Её можно с официального сайта взять

0

У меня именно такая версия на компьютере.Спасибо еще раз!

0

А вот еще вопрос.Что такое k?

0

Объясню, но многословно. Эта версия языка постоянно дорабатывается и пока в ней нет средства, чтобы разрезанную на три части части последовательность элементов снова склеить в одномерный массив. Поэтому понадобился двойной цикл, чтобы пройти по каждому элементу результата разрезки и перестановок и "загнать" эементы назад в этот массив. Переменная k - это как раз указатель индекса в массиве. Мы же пишем присваивание a[k]:=e2;

0

Спасибо!

0

Нашлось более короткое и красивое решение. Вместо var k:=0 и трех следующих за ним строк достаточно написать b.SelectMany(x->x).Println

0

Спасибо!