В
Все
М
Математика
О
ОБЖ
У
Українська мова
Д
Другие предметы
Х
Химия
М
Музыка
Н
Немецкий язык
Б
Беларуская мова
Э
Экономика
Ф
Физика
Б
Биология
О
Окружающий мир
Р
Русский язык
У
Українська література
Ф
Французский язык
П
Психология
А
Алгебра
О
Обществознание
М
МХК
В
Видео-ответы
Г
География
П
Право
Г
Геометрия
А
Английский язык
И
Информатика
Қ
Қазақ тiлi
Л
Литература
И
История

Написать программу сдвига в двумерном массиве строк/столбцов по выбору пользователя. Пользователь указывает – что и куда сдвигать, а также шаг сдвига на с++

Показать ответ
Ответ:
5454540
5454540
11.01.2023 08:07
// PascalABC.NET 3.2, сборка 1439 от 09.05.2017
// Внимание! Если программа не работает, обновите версию!

begin
  Writeln('*** Исходный массив [10x10] ***');
  var q:=MatrRandom(10,10,-30,30);
  q.Println(4); Writeln(4*q.ColCount*'-');
  // #1
  Writeln('S=',q.Rows.SelectMany(x->x).Where(x->(x>1) and (x<18)).Sum);
  // #2, #3
  var s:=q.ElementsWithIndexes;
  // #2
  Writeln('Ненулевые элементы');
  s.Where(x->x[2]<>0).Foreach(x->Write('[',x[0]+1,',',x[1]+1,'] '));
  Writeln;
  // #3
  Write('Первый максимальный отрицательный элемент: ');
  var m:=s.MaxBy(x->x[2]);
  Writeln('q[',m[0]+1,',',m[1]+1,']=',m[2])
end.

Пример
*** Исходный массив [10x10] ***
  29  29   4 -12  10 -25   0 -27  17 -17
 -27   5 -11 -21  26   1 -29 -10 -12   5
  18 -18   0 -11 -16   0  10  -1 -10  23
  -5 -20 -14  13  14 -27   0 -26   4 -11
 -20  13   0 -24   4  -4  -3  12 -13  -4
 -24  27 -21  -8 -13  17  -2 -15 -26 -21
  -5 -29  13  25  18  24 -12   7  -4  23
 -30  27  17  29  -6 -25  12  -6  15  18
 -27  28 -19  25  17  -1 -30  25  -5  28
   5 -15 -30  -6  25 -21  30   6 -11  10

S=230
Ненулевые элементы
[1,1] [1,2] [1,3] [1,4] [1,5] [1,6] [1,8] [1,9] [1,10] [2,1] [2,2] [2,3] [2,4] [2,5] [2,6] [2,7] [2,8] [2,9] [2,10] [3,1] [3,2] [3,4] [3,5] [3,7] [3,8] [3,9] [3,10] [4,1] [4,2] [4,3] [4,4] [4,5] [4,6] [4,8] [4,9] [4,10] [5,1] [5,2] [5,4] [5,5] [5,6] [5,7] [5,8] [5,9] [5,10] [6,1] [6,2] [6,3] [6,4] [6,5] [6,6] [6,7] [6,8] [6,9] [6,10] [7,1] [7,2] [7,3] [7,4] [7,5] [7,6] [7,7] [7,8] [7,9] [7,10] [8,1] [8,2] [8,3] [8,4] [8,5] [8,6] [8,7] [8,8] [8,9] [8,10] [9,1] [9,2] [9,3] [9,4] [9,5] [9,6] [9,7] [9,8] [9,9] [9,10] [10,1] [10,2] [10,3] [10,4] [10,5] [10,6] [10,7] [10,8] [10,9] [10,10]
Первый максимальный отрицательный элемент: q[10,7]=30
0,0(0 оценок)
Ответ:
mintgirl
mintgirl
07.03.2023 02:09
Средствами PascalABC.NET 3.2 эта задача решается очень просто.

1. Короткое решение, оставляющее в недоумении: а для чего тут было использовать двусвязный список? ответ: потому что таково задание!

// PascalABC.NET 3.2, сборка 1439 от 09.05.2017
// Внимание! Если программа не работает, обновите версию!

function IsFib(n:integer):boolean;
begin
  if (n=1) or (n=2) then Result:=true
  else begin
    Result:=false;
    (var n1, var n2):=(1,2);
    var Fib:integer;
    repeat
      Fib:=n1+n2;
      if Fib=n then begin Result:=true; break end;
      (n2,n1):=(Fib,n2)
    until Fib>n
    end;
end;

begin
  var L:=ReadSeqInteger('->',ReadInteger('n=')).ToLinkedList;
  L:=L.Where(x->not IsFib(x)).ToLinkedList;
  L.Println
end.

Пример
n= 9
-> 3 17 13 10 12 4 11 0 5
17 10 12 4 11 0

2. Несколько более длинное решение для желающих немного порулить удалением узлов.

Функция остается той же, а изменения делаются в главной программе.

begin
  var L:=ReadSeqInteger('->',ReadInteger('n=')).ToLinkedList;
  var a:=L.Where(x->IsFib(x)).ToArray; // список значений для удаления
  foreach var t in a do L.Remove(t); // собственно удаление узлов
  L.Println
end.

3. Бонус. Как это сделать без двусвязного списка (опять же, основная программа).

begin
  var a:=ReadSeqInteger('->',ReadInteger('n='))
      .Where(x->not IsFib(x)).ToArray;
  a.Println
end.
0,0(0 оценок)
Популярные вопросы: Информатика
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота