Форум «Всё о Паскале» _ Задачи _ Задача про матрицу
Автор: mashka-promakashka 7.03.2009 3:27
Вот как звучит задача:
Ввести числовую прямоугольную матрицу размером 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 7.03.2009 5:29
Ошибок очень много.
Найдите опечатки, во-первых.
В процедуры передавайте значение параметров-переменных. Напишите единую процедуру, ведь оба условия должны выполняться одновремено, так будет проще. Проходьте столбцы, находите максимум, учтите, что таких элементов может быть несколько, и тут же для них проверяйте второе условие и выводите результат.
Если непонятно, завтра напишу процедуру.
Автор: Vinchkovsky 8.03.2009 1:02
Если брать задание "в лоб", то выходит как-то так:
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 заданы)",по-моему, говорит о верности второго варианта В основной части создавайте матрицу (генерируя или вводя) и вызывайте процедуру
Автор: mashka-promakashka 8.03.2009 1:49
Спасибо огромное Vinchkovsky
Автор: mashka-promakashka 8.03.2009 3:02
Код
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.
Сделала вроде все как вы сказали, но не работает
Автор: Vinchkovsky 8.03.2009 4:38
Ой, я отвечал, но ответ не появился
Если кратко, то главные замечания: вы запутались с индексами (у меня столбцы на первом месте, а не на втором), добавил строку в конце, чтобы вы могли увидеть результат, а также убрал мусор с константами.
У меня работает:
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
Извиняйте за отсуствие форматирования - а оно нужно! - не сохранилось.
Удачи
Автор: volvo 8.03.2009 5:09
Цитата
Если кратко, то главные замечания: вы запутались с индексами (у меня столбцы на первом месте, а не на втором)
Кто-кто запутался с индексами? Может, ты сам?
Цитата
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 8.03.2009 5:31
Под "запутался" имел ввиду то, что автор темы не обратил внимание, где у меня строки, а где столбцы в процедуре.
По моей логике, если бы автор не "запутался" и внимательно прочитал обьяснение, то переделать процедуру было бы легко, согласны?
А вот где я запутался - не понял.
Программа работает корректно, да и логика есть - я обьяснил, а еще я отчетливо понимаю каждый ее шаг
Цитата
Сорри, но по определению, у матрицы в Паскале ПЕРВЫМ указывается номер строки, а вторым - номер столбца (это не зависит от твоего желания, так устроен язык программирования, и с этим придется мириться, это - НЕ Фортран, это - Паскаль), то есть ввел ты матрицу не так, как я написал выше, а вот так:
По определению - это как? В языке программирование Паскаль есть определение "матрицы"? Разве программист, моделируя матрицу с помощью массивов, не может сам выбирать, что и как будет работать?
Если я создам программу, работающую "не по определению" (если такое существует), но имеющую верный алгоритм, я сделаю ошибку? А не все-равно ли, как размещать индексы, если все работает верно?
Или вам не нравится ввод матрицы "построчно"? По-моему, такой ввод естественнее (хотя, если существует "определение", то мое "имхо" ничего не значит )
Автор: Vinchkovsky 8.03.2009 16:42
Об удобности задавать индексы так, как написали вы, трудно не согласиться, если вспомнить математику, но, по-моему, было достаточно дать замечание (за FAQ):
Цитата
Принято сначала указывать индекс строки, а затем индекс столбца
А гже я запутался и связь между тем, что написано выше и устройством языка, я так и не заметил
Автор: volvo 8.03.2009 17:02
Цитата
В языке программирование Паскаль есть определение "матрицы"?
Матрица - это двумерный массив. Так? Какой из двух индексов начинает изменяться первым при продвижении по матрице построчно? Первый или второй?
Цитата
Или вам не нравится ввод матрицы "построчно"? По-моему, такой ввод естественнее
Я уже объяснил выше, что хотя я ввожу матрицу построчно, в память данные почему-то заносятся по столбцам. Я этого не просил, кстати.
Цитата
А не все-равно ли, как размещать индексы, если все работает верно?
Ну, это смотря какую цель ты преследуешь... Если написать на одни раз, а потом вообще забыть про программирование, как страшный сон - то пиши хоть с Label-ами и Goto, какая разница? Ну, помучаешься в 3 раза больше при отладке, отладишь однажды, больше к этому возвращаться не будешь...
А вот если тебе хочется научиться программировать - то тут уж будь добр не мешать индексы. Во-первых, в матрице обработка строки производится быстрее, чем обработка столбца (вот именно потому, что матрица хранится построчно это и происходит), а следовательно, на больших матрицах у тебя будет провал в быстродействии (а привыкнув работать "шиворот-навыворот" с маленькими матрицами ты БУДЕШЬ так же работать и с большими), которого можно избежать просто работая с индексами НОРМАЛЬНО. Во-вторых, человек, знакомый с любым языком-наследником Алгола, глядя на запись A[1, 2] понимает, что это должна быть первая строка, второй столбец, а тут оказывается у тебя первый столбец, вторая строка - то есть, ему надо лазить по твоей программе, и пытаться понять, что к чему и где, чтобы разобраться в алгоритме работы. Смысл в этом есть? Что дает тебе такой "переворот"? Что, программа заработает быстрее? Нет, она будет работать медленнее. Тогда зачем?
Но это все ни к чему не приведет... Ты все равно будешь спорить, делать по-своему, будешь обжигаться, тебя будут наказывать, но ты будешь продолжать, потому что думаешь, что самый умный и находчивый, "вон как выделился из толпы, все работают построчно, а я - по столбцам". Ну что ж, кто-то выделяется, бреясь налысо, кто-то - носит "гребень" на голове, ты нашел свой способ выделиться... Только вот не надо учить ему остальных. Ты хочешь - ты выделяйся. Всех других оставь в покое. Пускай они работают так, как принято, а не наоборот.
Автор: Vinchkovsky 8.03.2009 17:22
Спасибо за обьяснение
Цитата
Но это все ни к чему не приведет... Ты все равно будешь спорить, делать по-своему, будешь обжигаться, тебя будут наказывать, но ты будешь продолжать, потому что думаешь, что самый умный и находчивый, "вон как выделился из толпы, все работают построчно, а я - по столбцам". Ну что ж, кто-то выделяется, бреясь налысо, кто-то - носит "гребень" на голове, ты нашел свой способ выделиться... Только вот не надо учить ему остальных. Ты хочешь - ты выделяйся. Всех других оставь в покое. Пускай они работают так, как принято, а не наоборот.
Где-то вы мне это уже писали
Советую вам проще относится к чужим ошибкам и быть оптимистом, не делая таких домыслов
Автор: mashka-promakashka 17.03.2009 17:26
Вот исправленный код программы, может кому пригодится еще))))
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;