Помощь - Поиск - Пользователи - Календарь
Полная версия: Двумерные массивы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DaryllDixonn
Дана матрица A[5,4] масс грузов P-отправителей, Q-получателя; P=5;Q=4 при распечатке:
1) Ввести матрицу по строкам и получить распечатку матрицы.
2) Определить сумму элементов каждой строки.
3) Определить строку с максимальной суммой и разместить её первой (поменяв при необходимости местами).
4) Реализовать выбор всех элементов матрицы > больше 10 т. и вывод их значений и индексов.
Федосеев Павел
Покажи, что ты уже успел реализовать.
DaryllDixonn
Цитата(Федосеев Павел @ 21.12.2014 20:44) *

Покажи, что ты уже успел реализовать.

К сожаление нечего, ибо я в этом вообще не разбираюсь.
Федосеев Павел
Попробуй научиться читать.

Кроме методичек и учебников, подобные темы "пережёвывались" поколениями учащихся.
Здесь есть FAQ - ссылка выделенная красным цветом в верху этой страницы. В FAQ должна быть статья с примерами и пояснениями.

Начни с чего-нибудь.

Лично мне не интересно делать целиком задачку за тебя. Помочь - да, помогу.
DaryllDixonn
Цитата(Федосеев Павел @ 21.12.2014 21:04) *

Попробуй научиться читать.

Кроме методичек и учебников, подобные темы "пережёвывались" поколениями учащихся.
Здесь есть FAQ - ссылка выделенная красным цветом в верху этой страницы. В FAQ должна быть статья с примерами и пояснениями.

Начни с чего-нибудь.

Лично мне не интересно делать целиком задачку за тебя. Помочь - да, помогу.


Код
uses crt;

  const P = 5;
        Q = 4;

  var i,j, IndexMaxSum:Integer;
      PQ:array[1..Q,1..P] of real;
      Sum, MaxSum, Mem:real;
      QSummes:array[1..Q] of real;

procedure ShowTablePQ;
begin
clrscr;

  for i := 1 to P do
      write('     P',i);
  writeln;
  writeln('---------------------------------------');

  for i := 1 to Q do
  BEGIN
   writeln('Q',i);
    for j := 1 to P do
      begin
        write('':6,PQ[i,j]);
        Sum:=Sum + PQ[i,j];
      end;

   if Sum > 0 then
     begin
       writeln(' ':5,'Sum=',Sum);
       if Sum > MaxSum then
          begin
            MaxSum:=Sum;
            IndexMaxSum:=i;
          end;
     end;
    
   Sum:=0;
  END;
  
end;

begin
  for i := 1 to P do
    for j := 1 to Q do
    begin
      write('  P',i,' --> Q',j,' =');
      read(PQ[j,i]);
    end;

  ShowTablePQ;
  writeln('');
  writeln('Выносим строку с максимальной суммой на первую позицию');
  readln;
  for i:=1 to P do
    begin
      Mem:=PQ[1,i];
      PQ[1,i]:=PQ[IndexMaxSum,i];
      PQ[IndexMaxSum,i]:=Mem;
    end;
    
  ShowTablePQ;
  writeln('');
  writeln('Выводим все элементы c грузом > 10');
  readln;
  writeln('-START-------------------');
  for i := 1 to P do
    for j := 1 to Q do
      if PQ[j,i] > 10 then
        writeln('  P',i,' --> Q',j,' =',PQ[j,i]);
  writeln('---------------------END-');
end.
Федосеев Павел
Круто!

Возможно, ты был невнимателен, но в условии говорится о матрице А[5,4], а ты определяешь A[4,5]. И в дальнейшем используешь обращения PQ[j, i] вместо привычных глазу PQ[i, j].

В процедуре вывода матрицы я бы ограничился только выводом, без подсчёта суммы. А сам подсчёт выполнял бы в другом месте.

При вычислении суммы, ты обнуляешь переменную где-то в конце, а не перед вычислением суммы строки.


В итоге, сделал бы так:
uses
crt;

const
P = 5;
Q = 4;

var
i, j, IndexMaxSum: integer;
PQ: array[1..P, 1..Q] of real;
Sum, MaxSum, Mem: real;
QSummes: array[1..Q] of real;

procedure ShowTablePQ;
begin
clrscr;

for j := 1 to Q do
Write(' Q', j);
writeln;
writeln('---------------------------------------');

for i := 1 to P do
begin
Write('P', i);
for j := 1 to Q do
begin
Write(PQ[i, j]: 7: 2);
end;
writeln;
end;

end;

begin

for i := 1 to P do
for j := 1 to Q do
begin
Write(' P', i, ' --> Q', j, ' =');
Read(PQ[i, j]);
end;

ShowTablePQ;

Writeln('Суммы строк матрицы:');
for i := 1 to P do
begin
Sum := 0;
for j := 1 to Q do
Sum := Sum + PQ[i, j];
if (i = 1) or (Sum > MaxSum) then
begin
MaxSum := Sum;
IndexMaxSum := i;
end;
writeln(' Строка ', i, ' Sum=', Sum: 0: 2);
end;
writeln('Максимальная сумма (', MaxSum: 0: 2, ') в строке ', IndexMaxSum, '.');

writeln;
writeln('Выносим строку с максимальной суммой на первую позицию');
readln;
for j := 1 to Q do
begin
Mem := PQ[1, j];
PQ[1, j] := PQ[IndexMaxSum, j];
PQ[IndexMaxSum, j] := Mem;
end;

ShowTablePQ;

writeln;

writeln('Выводим все элементы c грузом > 10');
readln;
writeln('-START-------------------');
for i := 1 to P do
for j := 1 to Q do
if PQ[i, j] > 10 then
writeln(' P', i, ' --> Q', j, ' =', PQ[i, j]);
writeln('---------------------END-');
end.

Гость
Цитата(Федосеев Павел @ 23.12.2014 3:24) *

Круто!

Возможно, ты был невнимателен, но в условии говорится о матрице А[5,4], а ты определяешь A[4,5]. И в дальнейшем используешь обращения PQ[j, i] вместо привычных глазу PQ[i, j].

В процедуре вывода матрицы я бы ограничился только выводом, без подсчёта суммы. А сам подсчёт выполнял бы в другом месте.

При вычислении суммы, ты обнуляешь переменную где-то в конце, а не перед вычислением суммы строки.
В итоге, сделал бы так:
uses
crt;

const
P = 5;
Q = 4;

var
i, j, IndexMaxSum: integer;
PQ: array[1..P, 1..Q] of real;
Sum, MaxSum, Mem: real;
QSummes: array[1..Q] of real;

procedure ShowTablePQ;
begin
clrscr;

for j := 1 to Q do
Write(' Q', j);
writeln;
writeln('---------------------------------------');

for i := 1 to P do
begin
Write('P', i);
for j := 1 to Q do
begin
Write(PQ[i, j]: 7: 2);
end;
writeln;
end;

end;

begin

for i := 1 to P do
for j := 1 to Q do
begin
Write(' P', i, ' --> Q', j, ' =');
Read(PQ[i, j]);
end;

ShowTablePQ;

Writeln('Суммы строк матрицы:');
for i := 1 to P do
begin
Sum := 0;
for j := 1 to Q do
Sum := Sum + PQ[i, j];
if (i = 1) or (Sum > MaxSum) then
begin
MaxSum := Sum;
IndexMaxSum := i;
end;
writeln(' Строка ', i, ' Sum=', Sum: 0: 2);
end;
writeln('Максимальная сумма (', MaxSum: 0: 2, ') в строке ', IndexMaxSum, '.');

writeln;
writeln('Выносим строку с максимальной суммой на первую позицию');
readln;
for j := 1 to Q do
begin
Mem := PQ[1, j];
PQ[1, j] := PQ[IndexMaxSum, j];
PQ[IndexMaxSum, j] := Mem;
end;

ShowTablePQ;

writeln;

writeln('Выводим все элементы c грузом > 10');
readln;
writeln('-START-------------------');
for i := 1 to P do
for j := 1 to Q do
if PQ[i, j] > 10 then
writeln(' P', i, ' --> Q', j, ' =', PQ[i, j]);
writeln('---------------------END-');
end.



Program1.pas(18) : Переменная цикла for должна описываться в том же блоке, что и цикл for
Гость
Цитата(Гость @ 23.12.2014 17:55) *

Program1.pas(18) : Переменная цикла for должна описываться в том же блоке, что и цикл for

А почему не выводится сумма строк ? В коде же есть...
Федосеев Павел
Цитата
Переменная цикла for должна описываться в том же блоке, что и цикл for


Да, согласен. Нужно описать локальные переменные i и j в процедуре, а не пользоваться глобальными. Ошибся при копировании. wub.gif

Цитата
А почему не выводится сумма строк ? В коде же есть...


Сумма элементов строки выводится, просто не в том же блоке где и сама матрица.

Этого нет в условии задания. вот я и не стал выполнять, вернее - даже удалил. Основная причина - автор неправильно вычислял сумму. Сначала должно прийти понимание, а потом можно усложнять.

Поэтому не понятен вопрос - в каком коде есть? В моём - нет, в коде топикстартера - есть, но что там вычисляется?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.