IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача про матрицу
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Мария

Репутация: -  0  +


Вот как звучит задача:

Ввести числовую прямоугольную матрицу размером 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.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


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

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

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

Если непонятно, завтра напишу процедуру.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Если брать задание "в лоб", то выходит как-то так:
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Мария

Репутация: -  0  +


Спасибо огромное Vinchkovsky smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Мария

Репутация: -  0  +


Код
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Ой, я отвечал, но ответ не появился 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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
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
. Ну, и что это должно означать? Кто запутался? И какой результат я должен получить после всего этого "преобразования"? А как я должен объяснять логику работы программы, если она ПЕРЕВЕРНУТА с ног на голову?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


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

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

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

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

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

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

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

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

Сообщение отредактировано: Vinchkovsky -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


Об удобности задавать индексы так, как написали вы, трудно не согласиться, если вспомнить математику, но, по-моему, было достаточно дать замечание (за FAQ):
Цитата
Принято сначала указывать индекс строки, а затем индекс столбца

А гже я запутался smile.gif и связь между тем, что написано выше и устройством языка, я так и не заметил smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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

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

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

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

Но это все ни к чему не приведет... Ты все равно будешь спорить, делать по-своему, будешь обжигаться, тебя будут наказывать, но ты будешь продолжать, потому что думаешь, что самый умный и находчивый, "вон как выделился из толпы, все работают построчно, а я - по столбцам". Ну что ж, кто-то выделяется, бреясь налысо, кто-то - носит "гребень" на голове, ты нашел свой способ выделиться... Только вот не надо учить ему остальных. Ты хочешь - ты выделяйся. Всех других оставь в покое. Пускай они работают так, как принято, а не наоборот.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 98
Пол: Мужской
Реальное имя: Andriy

Репутация: -  0  +


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

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

Советую вам проще относится к чужим ошибкам и быть оптимистом, не делая таких домыслов wink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Мария

Репутация: -  0  +


Вот исправленный код программы, может кому пригодится еще))))

 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 14:44
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name