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

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

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

 
 Ответить  Открыть новую тему 
> Последовательный вывод индексов, (это с матрицей)
TBVlad
сообщение 20.01.2006 18:45
Сообщение #1


Новичок
*

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

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


Каким бы образом сделать так, чтобы на вывод шёл не только первый встреченный искомый элемент с его местоположением (ну например максимальный), но и другие равные ему, с их родными индексами?
Слегка не понимаю, как зашить это в цикл, чтобы получилось:

Код
Максимальный член - N найден в позициях:
i:j, i:j, i:j, ...


Если это уже разбиралось, киньте ссылку, plz.

Сообщение отредактировано: TBVlad - 20.01.2006 18:45
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 20.01.2006 18:48
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


То есть если у тебя в матрице несколько максимальных элементов ? ТОгда сначала надо найти максимальный элемент, запомнить его значение , ну а потом проходить по матрице и проверять, if m[i,j] = max then writeln(i,',',j);

Ты об этом ?


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.01.2006 18:53
Сообщение #3


Гость






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

Если надо - говори, покажу как реализовать второй способ...
 К началу страницы 
+ Ответить 
TBVlad
сообщение 20.01.2006 19:05
Сообщение #4


Новичок
*

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

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


Klem4, да, я так именно так и делал.
1. Искал Max. Его индекс сохранён в Imax и Jmax, и первый максимальный член успешно выводится с местоположением.
2. Счётчик есть, с начальным значением 1 (задан до цикла), и равные максимальные члены считает успешно. Прога проверяет элементы на равенство Max, и если они равны, переопределяет их вместе с Imax и Jmax. Задаю Write(Max, ' стоит на ',Imax,':',Jmax,'.')... но индекс выводится неправильно.

volvo, любопытно. Объясни про буфер позиций, plz...

Сообщение отредактировано: TBVlad - 20.01.2006 19:06
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.01.2006 19:22
Сообщение #5


Гость






Вот так примерно:
const
n = 5;
var
arr: array[1 .. n, 1 .. n] of integer;
buffer: array[1 .. n] of record { я предупреждал, что требует доп. память }
x, y: integer;
end;

var
max, i, j: integer;
buf_count: integer;

begin
{ заполнение матрицы Arr }

buf_count := 0;
max := - maxint;

for i := 1 to n do begin
for j := 1 to n do begin

if arr[i, j] > max then begin
max := arr[i, j];
buf_count := 1;
buffer[buf_count].x := i;
buffer[buf_count].y := j;
end
else
if arr[i, j] = max then begin
inc(buf_count);
buffer[buf_count].x := i;
buffer[buf_count].y := j;
end;

end;
end;

{ и распечатываешь все значения X:Y из буфера, от 1 до buf_count }
...

проверено на матрице:
1, 2, 3, 4, 5
1, 7, 3, 4, 5
1, 2, 3, 4, 5
1, 2, 3, 7, 5
7, 2, 3, 4, 5
Результат:
max = 7; positions are:
2:2 4:4 5:1

 К началу страницы 
+ Ответить 
TBVlad
сообщение 20.01.2006 20:17
Сообщение #6


Новичок
*

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

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


Volvo, спасибо.
Цитата
{ и распечатываешь все значения X:Y из буфера, от 1 до buf_count }

Только одна маленькая вещь...
Пишу:
For buffer:=1 to buf_count do
Write(x,':',y);

И мне выдают ошибку 97 (Invalid For control variable).
Цикл For для распечатки буфера не подходит?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 20.01.2006 20:22
Сообщение #7


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


я вот чо насочинял lol.gif
uses crt;
type
TElem = integer;
PArray = ^TArray;
TArray = array [1..1] of TElem;
PMatrix = ^TMatrix;
TMatrix = array [1..1] of PArray;

PBufer = ^ TBufer;
TBufer = record
x,y : word;
next : PBufer;
end;

procedure AddBuf(var buf : PBufer; var first : PBufer; i,j : word);
begin
new(buf);
buf^.next := first;
buf^.x := i;
buf^.y := j;
first := buf;
end;

procedure PrintBUF(buf : PBufer);
var
p : PBufer;
begin
writeln;
p := buf;
while(p <> nil) do begin
writeln(p^.x,' ',p^.y);
p := p^.next;
end;
end;

procedure FreeBUF(var P : Pbufer);
begin
Dispose(p);
p := nil;
end;

procedure InitMX(var mx : PMatrix; size : word);
var
i : word;
begin
GetMem(mx, size * sizeof(PArray));
for i := 1 to size do GetMem(mx^[i], size * sizeof(TElem));
end;

procedure FreeMx(var mx : PMatrix; size : word);
var
i : word;
begin
for i := 1 to size do FreeMem(mx^[i], size * sizeof(TElem));
FreeMem(mx, size * sizeof(PArray));
end;

procedure Input(var mx : Pmatrix; size : word);
var
i,j : word;
begin
for i := 1 to size do
for j := 1 to size do begin
write('mx[',i,',',j,']=');
readln(mx^[i]^[j]);
end;
end;

procedure Print(mx : PMatrix; size : word);
var
i,j : word;
begin
for i := 1 to size do begin
writeln;
for j := 1 to size do write(mx^[i]^[j]:2,' ');
end;
end;

procedure Work(var mx : PMatrix; var buf : PBufer; size : word);
var
i,j,imax,jmax : word;
max : TElem;
f : PBufer;
begin
f := nil;
imax := 1;
jmax := 1;
for i := 1 to size do
for j := 1 to size do
if mx^[i]^[j] >= mx^[imax]^[jmax] then
if mx^[i]^[j] = mx^[imax]^[jmax] then
AddBuf(buf,f,i,j)
else begin
imax := i;
jmax := j;
FreeBuf(buf);
f := nil;
AddBuf(buf,f,imax,jmax);
end;
end;

var
Matrix : PMatrix;
Bufer : PBufer;
n : word = 2;

begin
clrscr;
InitMX(Matrix,n);
Input(Matrix,n);
Print(Matrix,n);
Work(Matrix, Bufer, n);
writeln;
PrintBUF(bufer);
FreeMX(Matrix,n);
FreeBUF(bufer);
readln;
end.



--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.01.2006 20:23
Сообщение #8


Гость






TBVlad, так делай:
  for i := 1 to buf_count do
with buffer[i] do write(x, ':', y);
writeln;


Твоя ошибка - в том, что buffer это массив, и не может быть использован как переменная для For smile.gif
 К началу страницы 
+ Ответить 
TBVlad
сообщение 20.01.2006 20:39
Сообщение #9


Новичок
*

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

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


Ошибки исправлены yes2.gif Thanx всем =)

Klem4
Вот это телега... но тоже работает good.gif
{...А в диске моём учебном такого нету unsure.gif }
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 18.07.2025 17:07
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"