Вводятся две вещественные прямоугольные матрицы размером M*N и K*L (M,N,K,L <=20). Для...

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

Вводятся две вещественные прямоугольные матрицы размером M*N и K*L (M,N,K,L <=20). Для той матрицы, у которой сумма элементов, лежащих до первого отрицательного элемента, больше (искать по строкам), составить одномерный массив из средних арифметических значений элементов нечетных столбцов матрицы и отсортировать его в порядке возрастания элементов. Вывести на печать саму матрицу, найденную сумму элементов и отсортированный одномерный массив. Алгоритм сопровождать соотв. сообщениями. Использовать не менее 3 подпрограмм. PascalABC.NET


Информатика | 39 просмотров
Дано ответов: 2
0 голосов
Правильный ответ
// PascalABC.NET 3.3, сборка 1590 от 03.12.2017
// Внимание! Если программа не работает, обновите версию!

function NewMatrix(c:string):array[,] of real;
// формирует случайную матрицу указанного размера
begin
  var (m,n):=ReadInteger2('Число строк и столбцов в матрице '+c+':');
  Result:=MatrRandomReal(m,n,-99,999);
  Result.Transform(t->Round(t)/10)
end;

procedure ShowMatrix(c:string;a:array[,] of real);
// выводит матрицу на монитор
begin
  Writeln('*** Матрица ',c,' ***');
  a.Println(6,1); Writeln(6*a.ColCount*'=');
end;

function PartSum(a:array[,] of real):=a.ElementsByRow.TakeWhile(t->t>=0).Sum;
// сумма элементов по строкам до первого отрицательного

function GetArray(a:array[,] of real):array of real;
// строит искомый одномерный массив
begin
  var b:=new List;
  var i:=1;
  while i<=a.ColCount-1 do begin<br>    b.Add(a.Col(i).Average);
    i+=2;
    end;
  b.Sort;
  Result:=b.ToArray
end;

begin
  var a:=NewMatrix('A');
  var b:=NewMatrix('B');
  ShowMatrix('A',a);
  var sa:=PartSum(a);
  Writeln('Частичная сумма равна ',sa);
  ShowMatrix('B',b);
  var sb:=PartSum(b);
  Writeln('Частичная сумма равна ',sb);
  var c:=GetArray(sa>sb?a:b); // матрица с большей частичной суммой
  Write('Построенный массив: '); c.Println
end.

Пример
Число строк и столбцов в матрице A: 4 7
Число строк и столбцов в матрице B: 5 6
*** Матрица A ***
   5.5  68.9  30.6  15.6   8.6  58.7  31.1
  51.2  11.1  84.2   4.0  68.0  -4.8  32.7
  28.8  65.3   6.2  33.3  94.5  81.5  34.9
  -6.1  81.0  -8.0  77.7  -2.8  -6.4  81.7
==========================================
Частичная сумма равна 437.5
*** Матрица B ***
  66.3  34.9  52.2  -8.7  57.9   1.9
  81.7  -2.4  80.1   3.8  22.3  64.2
  -5.8  94.4  22.7   5.3  80.4  46.6
  77.1  41.4   7.9  18.6   8.3  32.7
  29.8   2.3  82.6   1.7  87.8  28.6
====================================
Частичная сумма равна 153.4
Построенный массив: 32.25 32.65 56.575
(150k баллов)
0 голосов

// PascalABC.NET 3.3 
 var c:array of real;
begin
  Writeln('1 матрица:');
  var m:=ReadInteger('m =');
  var n:=ReadInteger('n =');
//  var a:=ReadMatrReal(m,n);
  var a:=MatrRandomReal(m,n,-3,7).Println(6);
  Writeln('2 матрица:');
  var k:=ReadInteger('k =');
  var l:=ReadInteger('l =');
//  var b:=ReadMatrReal(k,l);
  var b:=MatrRandomReal(k,l,-3,7).Println(6);
  var s1:=a.ElementsByRow.TakeWhile(x->x>=0).Sum;
  writeln('s1 = ',s1);
  var s2:=b.ElementsByRow.TakeWhile(x->x>=0).Sum;
  writeln('s2 = ',s2);
  if s1>s2
   then begin
    c:=ArrFill(a.GetLength(1) div 2,0.0);
    foreach var j in SeqWhile(1,x->x+2,x->x      c[(j-1) div 2]:=a.Col(j).Average;
   end
   else begin
    c:=ArrFill(b.GetLength(1) div 2,0.0);
    foreach var j in SeqWhile(1,x->x+2,x->x      c[(j-1) div 2]:=b.Col(j).Average;
   end;
   writeln('Полученный массив:'); c.Println;
   Sort(c);
   writeln('Отсортированный массив:'); c.Print;
end.

Пример:
1 матрица:
m = 3
n = 6
  0.38  4.94  1.57 -2.49  6.67  2.50
  2.97 -1.44 -1.44  0.42  4.04 -2.54
  5.18  0.32 -1.90 -0.09  3.79  0.12
2 матрица:
k = 2
l = 7
  4.92  2.57  3.57  3.05  2.62  5.29  6.17
  6.62  2.17  5.80  1.31  2.55 -2.75  4.91
s1 = 6.88926995447337
s2 = 46.640484614596
Полученный массив:
2.37028874986353 2.18293672249789 1.26664565655712
Отсортированный массив:
1.26664565655712 2.18293672249789 2.37028874986353

(194k баллов)
0

Эта часть осталась не выполненной. Хорошо бы и получение нового массива сделать другим способом, но, видимо, не в этот раз.