Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача про матрицу
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
mashka-promakashka
Вот как звучит задача:

Ввести числовую прямоугольную матрицу размером M×N (M и N заданы). Определить элементы, которые, являясь максимальными в столбцах, больше всех своих соседей слева в строке и меньше всех своих соседей справа в строке, указав значения найденных элементов и их индексы, или же сообщить, что таких элементов нет. Крайние столбцы не рассматривать.

Начала делать, но что то не работает толком...помогите пожалуйста


Program Matrix;
const stroka='';
stolb=''; {Ввод констант}
var a:array [1..100,1..100] of integer;
im,jm,i,j,max,n,m,max1:integer;

procedure maxinstolb;{Процедура нахождения максимального элемента в каждом столбце}
begin
for j:=2 to (m-1) do begin
max:=a[1,j];
im:=1; jm:=j;
for i:=1 to n do
if a[i,j]>max then begin
max:=a[i,j];
im:=i;
jm:=j;
end;
end;
end;

procedure maxelement; ;{Процедура проверки условия: максимальный элемент больше всех соседей слева и меньше всех соседей справа }
begin
i:=im;
for j:=1 to (jm-1) do begin
if a[i,j]<max then max1:=max;
end;
for j:=(jm+1) to m do begin
if a[i,j]>max1 then writeln(max,' [',im,';',jm,']')
else writeln('Ne suschestvuet');
end;
end;

begin
writeln(stroka,'Vvedite kol-vo strok matrici');
readln(n);
writeln(stolb,'Vvedite kol-vo stolbcov matrici');
readln(m);
writeln;
writeln('Vvedite ',m*n,' elementa massiva:');
for i:=1 to n do
for j:=1 to m do
read(a[i,j]);

writeln('Ishodnaya matrica');
for i:=1 to n do begin
for j:=1 to m do
write(a[i,j],' ');
writeln;
end;

writeln('Max element boshe vseh sosedey sleva, no menshe vseh sosedey sprava');
maxinstolb;
maxelement;
end.


Vinchkovsky
Ошибок очень много.

Найдите опечатки, во-первых.

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

Если непонятно, завтра напишу процедуру.
Vinchkovsky
Если брать задание "в лоб", то выходит как-то так:
procedure Sort(n,m:integer; A:Matrix); {К-ство строк, столбцов и матрица - параметры процедуры}
var i,k,j,Max:integer;
SecondTerm,Exist:boolean; {Первая переменная отвечает за второе условие, вторая - на наличие элемента, который ищется}
begin
Exist:=false; {Припускаем, что нужного элемента нету}

for i:=2 to m-1 do {Проходим столбцы}
begin
{Первое условие}
Max:=A[i,1]; {Тут ищется максимальный элемент в столбце. Припускаем, что он первый; если находится элемент, который больше него, максимуму присваивается значение этого элемента и т.д.}
for k:=2 to n do
if A[i,k]>Max then
Max:=A[i,k];
{Второе условие}
for k:=1 to n do {Проходим по столбце. Это нужно делать, ведь элементов с макс. значением может быть более одного}
if A[i,k]=Max then {Если элемент максимальный...}
begin
SecondTerm:=true; {... припустим, он удовлетворяет 2-е условие}
for j:=1 to i-1 do {проверяем слева в строке}
if A[j,k]>=A[i,k] then SecondTerm:=false;
for j:=i+1 to m do {и справа}
if A[j,k]<=A[i,k] then SecondTerm:=false;
if SecondTerm then {Если это так, значит выводим его значения и индексы, а делая присваивание Exist:=true подмечаем, что элемент,который ищется, существует }
begin
writeln('st=',i,' r=',k,' ',Max);
Exist:=true;
end;
end;
end;

if not Exist then writeLn('No elements of this kind'); {Если же его не существует, так и пишем}
end;


Тип Matrix вводится так:
type Matrix=array [1..50,1..50] of integer;

или так,если m,n обьявлены как константы:
type Matrix=array [1..n,1..m] of integer;

Тут все зависит от вас: хотите ли вы задавать m,n при выполнении программы или нет.
Фраза "(M и N заданы)",по-моему, говорит о верности второго варианта wink.gif
В основной части создавайте матрицу (генерируя или вводя) и вызывайте процедуру wink.gif
mashka-promakashka
Спасибо огромное Vinchkovsky smile.gif
mashka-promakashka
Код
Program Matrix1;
const stroka='';
      stolb='';

     type Matrix=array[1..50,1..50] of integer;

     var A:Matrix;

     i,j,n,m:integer;



procedure Sort(n,m:integer; A:Matrix);
var i,k,j,Max:integer;
    SecondTerm,Exist:boolean;
begin
Exist:=false;

for i:=2 to m-1 do
  begin
    Max:=A[i,1];
    for k:=2 to n do
     if A[i,k]>Max then
        Max:=A[i,k];

    for k:=1 to n do
      if A[i,k]=Max then
        begin
          SecondTerm:=true;
          for j:=1 to i-1 do
            if A[j,k]>=A[i,k] then SecondTerm:=false;
          for j:=i+1 to n do
            if A[j,k]<=A[i,k] then SecondTerm:=false;
          if SecondTerm then
           begin
            writeln('st=',i,' r=',k,' ',Max);
            Exist:=true;
           end;
        end;
  end;

if not Exist then writeLn('No elements of this kind');
end;



     begin
     writeln(stroka,'Vvedite kol-vo strok matrici');
     readln(m);
     writeln(stolb,'Vvedite kol-vo stolbcov matrici');
     readln(n);
     writeln;
     writeln('Vvedite ',m*n,' elementa massiva:');
     for i:=1 to m do
     for j:=1 to n do
     read(A[i,j]);

     writeln('Ishodnaya matrica');
     for i:=1 to m do begin
     for j:=1 to n do
     write(A[i,j],' ');
     writeln;
     end;

Sort(n,m,A);


         end.


Сделала вроде все как вы сказали, но не работает sad.gif
Vinchkovsky
Ой, я отвечал, но ответ не появился blink.gif

Если кратко, то главные замечания: вы запутались с индексами (у меня столбцы на первом месте, а не на втором), добавил строку в конце, чтобы вы могли увидеть результат, а также убрал мусор с константами.

У меня работает:
Program Matrix1;
uses Crt;
type Matrix=array[1..50,1..50] of integer;
var A:Matrix;
i,j,n,m:integer;

procedure Sort(n,m:integer; A:Matrix);
var i,k,j,Max:integer;
SecondTerm,Exist:boolean;
begin
Exist:=false;

for i:=2 to m-1 do
begin
Max:=A[i,1];
for k:=2 to n do
if A[i,k]>Max then
Max:=A[i,k];

for k:=1 to n do
if A[i,k]=Max then
begin
SecondTerm:=true;
for j:=1 to i-1 do
if A[j,k]>=A[i,k] then SecondTerm:=false;
for j:=i+1 to n do
if A[j,k]<=A[i,k] then SecondTerm:=false;
if SecondTerm then
begin
writeln('st=',i,' r=',k,' ',Max);
Exist:=true;
end;
end;
end;

if not Exist then writeLn('No elements of this kind');
end;



begin
writeln('Vvedite kol-vo strok matrici');
readln(n);
writeln('Vvedite kol-vo stolbcov matrici');
readln(m);
writeln;
writeln('Vvedite ',m*n,' elementa massiva:');
for i:=1 to n do
for j:=1 to m do
read(A[j,i]);

writeln('Ishodnaya matrica');

for i:=1 to n do
begin
for j:=1 to m do
write(A[j,i],' ');
writeln;
end;

Sort(n,m,A);
repeat until Keypressed;

end.

на:
1 2 5 6
1 2 3 4

Извиняйте за отсуствие форматирования - а оно нужно! - не сохранилось.

Удачи wink.gif
volvo
Цитата
Если кратко, то главные замечания: вы запутались с индексами (у меня столбцы на первом месте, а не на втором)
Кто-кто запутался с индексами? Может, ты сам?

Цитата
     writeln('Vvedite kol-vo strok matrici');
readln(n);
writeln('Vvedite kol-vo stolbcov matrici');
readln(m);
writeln;
writeln('Vvedite ',m*n,' elementa massiva:');
for i:=1 to n do
for j:=1 to m do
read(A[j,i]);
И как после этого будет представлена вот такая, например, матрица:
1 2 5 6
1 2 3 4
? Что вводим? Число строк = 2, так? Так... N = 2, запишем. Столбцов - 4, значит, M = 4, тоже запишем.. А теперь:

Цитата
for i := 1 to 2 do
for j := 1 to 4 do
read(a[j, i]);
- данные читаются в таком порядке:
i = 1; j = 1 .. 4 => A[1, 1], A[2, 1], A[3, 1], A[4, 1]
i = 2; j = 1 .. 4 => A[1, 2], A[2, 2], A[3, 2], A[4, 2]
Сорри, но по определению, у матрицы в Паскале ПЕРВЫМ индексом указывается номер строки, а вторым - номер столбца (это не зависит от твоего желания, так устроен язык программирования, и с этим придется мириться, это - НЕ Фортран, это - Паскаль, а за нарушение этого правила без ОЧЕНЬ веских причин у нас программиста просто увольняют без предупреждений, поскольку прежде всего код должен быть понятен интуитивно), то есть ввел ты матрицу не так, как я написал выше, а вот так:
1 1
2 2
5 3
6 4
. Ну, и что это должно означать? Кто запутался? И какой результат я должен получить после всего этого "преобразования"? А как я должен объяснять логику работы программы, если она ПЕРЕВЕРНУТА с ног на голову?
Vinchkovsky
Под "запутался" имел ввиду то, что автор темы не обратил внимание, где у меня строки, а где столбцы в процедуре.

По моей логике, если бы автор не "запутался" и внимательно прочитал обьяснение, то переделать процедуру было бы легко, согласны?

А вот где я запутался - не понял.

Программа работает корректно, да и логика есть - я обьяснил, а еще я отчетливо понимаю каждый ее шаг smile.gif

Цитата
Сорри, но по определению, у матрицы в Паскале ПЕРВЫМ указывается номер строки, а вторым - номер столбца (это не зависит от твоего желания, так устроен язык программирования, и с этим придется мириться, это - НЕ Фортран, это - Паскаль), то есть ввел ты матрицу не так, как я написал выше, а вот так:

По определению - это как? В языке программирование Паскаль есть определение "матрицы"?
Разве программист, моделируя матрицу с помощью массивов, не может сам выбирать, что и как будет работать?

Если я создам программу, работающую "не по определению" (если такое существует), но имеющую верный алгоритм, я сделаю ошибку? А не все-равно ли, как размещать индексы, если все работает верно?

Или вам не нравится ввод матрицы "построчно"? rolleyes.gif По-моему, такой ввод естественнее (хотя, если существует "определение", то мое "имхо" ничего не значит rolleyes.gif )
Vinchkovsky
Об удобности задавать индексы так, как написали вы, трудно не согласиться, если вспомнить математику, но, по-моему, было достаточно дать замечание (за FAQ):
Цитата
Принято сначала указывать индекс строки, а затем индекс столбца

А гже я запутался smile.gif и связь между тем, что написано выше и устройством языка, я так и не заметил smile.gif
volvo
Цитата
В языке программирование Паскаль есть определение "матрицы"?
Матрица - это двумерный массив. Так? Какой из двух индексов начинает изменяться первым при продвижении по матрице построчно? Первый или второй?

Цитата
Или вам не нравится ввод матрицы "построчно"? По-моему, такой ввод естественнее
Я уже объяснил выше, что хотя я ввожу матрицу построчно, в память данные почему-то заносятся по столбцам. Я этого не просил, кстати.

Цитата
А не все-равно ли, как размещать индексы, если все работает верно?
Ну, это смотря какую цель ты преследуешь... Если написать на одни раз, а потом вообще забыть про программирование, как страшный сон - то пиши хоть с Label-ами и Goto, какая разница? Ну, помучаешься в 3 раза больше при отладке, отладишь однажды, больше к этому возвращаться не будешь...

А вот если тебе хочется научиться программировать - то тут уж будь добр не мешать индексы. Во-первых, в матрице обработка строки производится быстрее, чем обработка столбца (вот именно потому, что матрица хранится построчно это и происходит), а следовательно, на больших матрицах у тебя будет провал в быстродействии (а привыкнув работать "шиворот-навыворот" с маленькими матрицами ты БУДЕШЬ так же работать и с большими), которого можно избежать просто работая с индексами НОРМАЛЬНО. Во-вторых, человек, знакомый с любым языком-наследником Алгола, глядя на запись A[1, 2] понимает, что это должна быть первая строка, второй столбец, а тут оказывается у тебя первый столбец, вторая строка - то есть, ему надо лазить по твоей программе, и пытаться понять, что к чему и где, чтобы разобраться в алгоритме работы. Смысл в этом есть? Что дает тебе такой "переворот"? Что, программа заработает быстрее? Нет, она будет работать медленнее. Тогда зачем?

Но это все ни к чему не приведет... Ты все равно будешь спорить, делать по-своему, будешь обжигаться, тебя будут наказывать, но ты будешь продолжать, потому что думаешь, что самый умный и находчивый, "вон как выделился из толпы, все работают построчно, а я - по столбцам". Ну что ж, кто-то выделяется, бреясь налысо, кто-то - носит "гребень" на голове, ты нашел свой способ выделиться... Только вот не надо учить ему остальных. Ты хочешь - ты выделяйся. Всех других оставь в покое. Пускай они работают так, как принято, а не наоборот.
Vinchkovsky
Спасибо за обьяснение wink.gif
Цитата
Но это все ни к чему не приведет... Ты все равно будешь спорить, делать по-своему, будешь обжигаться, тебя будут наказывать, но ты будешь продолжать, потому что думаешь, что самый умный и находчивый, "вон как выделился из толпы, все работают построчно, а я - по столбцам". Ну что ж, кто-то выделяется, бреясь налысо, кто-то - носит "гребень" на голове, ты нашел свой способ выделиться... Только вот не надо учить ему остальных. Ты хочешь - ты выделяйся. Всех других оставь в покое. Пускай они работают так, как принято, а не наоборот.

Где-то вы мне это уже писали smile.gif

Советую вам проще относится к чужим ошибкам и быть оптимистом, не делая таких домыслов wink.gif
mashka-promakashka
Вот исправленный код программы, может кому пригодится еще))))

 Program Matrix1;

uses Crt;
const stroka='';
stolb='';

type Matrix=array[1..50,1..50] of integer;
var A:Matrix;
i,j,n,m:integer;

procedure Sort(m,n:integer; A:Matrix);
var i,j,k,Max:integer;
SecondTerm,Exist:boolean;
begin
Exist:=false;

for j:=2 to n-1 do
begin
Max:=A[1,j];
for i:=2 to m do
if A[i,j]>Max then
Max:=A[i,j];

for i:=2 to m do
if A[i,j]=Max then
begin
SecondTerm:=true;
for k:=1 to j-1 do
if A[i,k]>=A[i,j] then SecondTerm:=false;
for k:=j+1 to m do
if A[i,k]<=A[i,j] then SecondTerm:=false;
if SecondTerm then
begin
writeln('Element udovl. usloviyam=',Max,' [',i,';',j,']');
Exist:=true;
end;
end;
end;

if not Exist then writeLn('Takih elementov net');
end;



begin
writeln(stroka,'Vvedite kol-vo strok matrici');
readln(m);
writeln(stolb,'Vvedite kol-vo stolbcov matrici');
readln(n);
writeln;
writeln('Vvedite ',m*n,' elementa massiva:');
for i:=1 to m do
for j:=1 to n do
read(A[i,j]);

writeln('Ishodnaya matrica');

for i:=1 to m do
begin
for j:=1 to n do
write(A[i,j],' ');
writeln;
end;

Sort(m,n,A);
repeat until Keypressed;

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