![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
mashka-promakashka |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Мария Репутация: ![]() ![]() ![]() |
Вот как звучит задача:
Ввести числовую прямоугольную матрицу размером 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 |
![]()
Сообщение
#2
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 98 Пол: Мужской Реальное имя: Andriy Репутация: ![]() ![]() ![]() |
Ошибок очень много.
Найдите опечатки, во-первых. В процедуры передавайте значение параметров-переменных. Напишите единую процедуру, ведь оба условия должны выполняться одновремено, так будет проще. Проходьте столбцы, находите максимум, учтите, что таких элементов может быть несколько, и тут же для них проверяйте второе условие и выводите результат. Если непонятно, завтра напишу процедуру. |
Vinchkovsky |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 98 Пол: Мужской Реальное имя: Andriy Репутация: ![]() ![]() ![]() |
Если брать задание "в лоб", то выходит как-то так:
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 |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Мария Репутация: ![]() ![]() ![]() |
Спасибо огромное Vinchkovsky
![]() |
mashka-promakashka |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Мария Репутация: ![]() ![]() ![]() |
Код 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 |
![]()
Сообщение
#6
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 98 Пол: Мужской Реальное имя: Andriy Репутация: ![]() ![]() ![]() |
Ой, я отвечал, но ответ не появился
![]() Если кратко, то главные замечания: вы запутались с индексами (у меня столбцы на первом месте, а не на втором), добавил строку в конце, чтобы вы могли увидеть результат, а также убрал мусор с константами. У меня работает: 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 |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата Если кратко, то главные замечания: вы запутались с индексами (у меня столбцы на первом месте, а не на втором) Кто-кто запутался с индексами? Может, ты сам?Цитата 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 Цитата 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 |
Vinchkovsky |
![]()
Сообщение
#8
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 98 Пол: Мужской Реальное имя: Andriy Репутация: ![]() ![]() ![]() |
Под "запутался" имел ввиду то, что автор темы не обратил внимание, где у меня строки, а где столбцы в процедуре.
По моей логике, если бы автор не "запутался" и внимательно прочитал обьяснение, то переделать процедуру было бы легко, согласны? А вот где я запутался - не понял. Программа работает корректно, да и логика есть - я обьяснил, а еще я отчетливо понимаю каждый ее шаг ![]() Цитата Сорри, но по определению, у матрицы в Паскале ПЕРВЫМ указывается номер строки, а вторым - номер столбца (это не зависит от твоего желания, так устроен язык программирования, и с этим придется мириться, это - НЕ Фортран, это - Паскаль), то есть ввел ты матрицу не так, как я написал выше, а вот так: По определению - это как? В языке программирование Паскаль есть определение "матрицы"? Разве программист, моделируя матрицу с помощью массивов, не может сам выбирать, что и как будет работать? Если я создам программу, работающую "не по определению" (если такое существует), но имеющую верный алгоритм, я сделаю ошибку? А не все-равно ли, как размещать индексы, если все работает верно? Или вам не нравится ввод матрицы "построчно"? ![]() ![]() Сообщение отредактировано: Vinchkovsky - 8.03.2009 1:55 |
Vinchkovsky |
![]()
Сообщение
#9
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 98 Пол: Мужской Реальное имя: Andriy Репутация: ![]() ![]() ![]() |
Об удобности задавать индексы так, как написали вы, трудно не согласиться, если вспомнить математику, но, по-моему, было достаточно дать замечание (за FAQ):
Цитата Принято сначала указывать индекс строки, а затем индекс столбца А гже я запутался ![]() ![]() |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата В языке программирование Паскаль есть определение "матрицы"? Матрица - это двумерный массив. Так? Какой из двух индексов начинает изменяться первым при продвижении по матрице построчно? Первый или второй?Цитата Или вам не нравится ввод матрицы "построчно"? По-моему, такой ввод естественнее Я уже объяснил выше, что хотя я ввожу матрицу построчно, в память данные почему-то заносятся по столбцам. Я этого не просил, кстати.Цитата А не все-равно ли, как размещать индексы, если все работает верно? Ну, это смотря какую цель ты преследуешь... Если написать на одни раз, а потом вообще забыть про программирование, как страшный сон - то пиши хоть с Label-ами и Goto, какая разница? Ну, помучаешься в 3 раза больше при отладке, отладишь однажды, больше к этому возвращаться не будешь...А вот если тебе хочется научиться программировать - то тут уж будь добр не мешать индексы. Во-первых, в матрице обработка строки производится быстрее, чем обработка столбца (вот именно потому, что матрица хранится построчно это и происходит), а следовательно, на больших матрицах у тебя будет провал в быстродействии (а привыкнув работать "шиворот-навыворот" с маленькими матрицами ты БУДЕШЬ так же работать и с большими), которого можно избежать просто работая с индексами НОРМАЛЬНО. Во-вторых, человек, знакомый с любым языком-наследником Алгола, глядя на запись A[1, 2] понимает, что это должна быть первая строка, второй столбец, а тут оказывается у тебя первый столбец, вторая строка - то есть, ему надо лазить по твоей программе, и пытаться понять, что к чему и где, чтобы разобраться в алгоритме работы. Смысл в этом есть? Что дает тебе такой "переворот"? Что, программа заработает быстрее? Нет, она будет работать медленнее. Тогда зачем? Но это все ни к чему не приведет... Ты все равно будешь спорить, делать по-своему, будешь обжигаться, тебя будут наказывать, но ты будешь продолжать, потому что думаешь, что самый умный и находчивый, "вон как выделился из толпы, все работают построчно, а я - по столбцам". Ну что ж, кто-то выделяется, бреясь налысо, кто-то - носит "гребень" на голове, ты нашел свой способ выделиться... Только вот не надо учить ему остальных. Ты хочешь - ты выделяйся. Всех других оставь в покое. Пускай они работают так, как принято, а не наоборот. |
Vinchkovsky |
![]()
Сообщение
#11
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 98 Пол: Мужской Реальное имя: Andriy Репутация: ![]() ![]() ![]() |
Спасибо за обьяснение
![]() Цитата Но это все ни к чему не приведет... Ты все равно будешь спорить, делать по-своему, будешь обжигаться, тебя будут наказывать, но ты будешь продолжать, потому что думаешь, что самый умный и находчивый, "вон как выделился из толпы, все работают построчно, а я - по столбцам". Ну что ж, кто-то выделяется, бреясь налысо, кто-то - носит "гребень" на голове, ты нашел свой способ выделиться... Только вот не надо учить ему остальных. Ты хочешь - ты выделяйся. Всех других оставь в покое. Пускай они работают так, как принято, а не наоборот. Где-то вы мне это уже писали ![]() Советую вам проще относится к чужим ошибкам и быть оптимистом, не делая таких домыслов ![]() |
mashka-promakashka |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Мария Репутация: ![]() ![]() ![]() |
Вот исправленный код программы, может кому пригодится еще))))
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.
|
![]() ![]() |
![]() |
Текстовая версия | 30.07.2025 4:13 |