PDA

Просмотр полной версии : ПАСКАЛЬ =\


rubik-nerubik
27.12.2007, 16:17
Вообщем есть задача:

program two;
uses crt;
const
MAX=20;

type
line=Array[1..MAX] of real;

var
smin:real;
imin:Integer;
i,j,n,m:Integer;
x:Array[1..MAX] of line;
buf:line;
juf:Array[1..MAX] of Integer;
inp:Text;

begin
Assign(inp,'matrix.txt');
Reset(inp);
Read(inp,n,m);{Є®«ЁзҐбвў® бвp®Є Ё бв®«Ўж®ў}
if (MAX<n) or (MAX<m) then
Write('*Ґ¦Ґ«*о бзЁв*вм! ')
else begin
for i:=1 to n do
for j:=1 to m do
Read(inp,x[i][j]);

for i:=1 to n do begin
buf[i]:=x[i][1];
juf[i]:=1;
for j:=2 to m do
if buf[i]<x[i][j] then begin
buf[i]:=x[i][j];
juf[i]:=j
end
end;
smin:=buf[1];
for i:=2 to n do begin
if smin>buf[i] then begin
smin:=buf[i];
imin:=i
end
end;

Writeln;
Write('‘Ґ¤«®ўaп в®зЄa x=',juf[imin],' y=',imin)
end;
Close(inp)
end.


А вот условие:
Элемент матрицы назовем седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце. Для заданной целой матрицы A(nxm) напечатать индексы всех ее седловых точек


И вот собственно бага:
Она ищет(второе условие):
3 3
3 1 1
2 1 1
3 1 1
И не ищет, т.е. не ищет первое условие(выделенное):
3 3
1 1 1
2 3 3
1 1 1


Помогите исправить! ПЖЛ, мне до завтра , т.е. сегодня до хоть до 00 00 плиз

VERte][
27.12.2007, 16:36
я не уверен на счёт того как у тебя компилятор принимает это, но в стандартном паскале обычно пишут не [i][j], а [i,j]

ps пожелание: делай отступы, так будет легче другим код читать, да и тебе тоже, циклы и условия хорошо отделять от основной проги, парами enter'ов
и комментарии, потому что сейчас сидишь и разбираешь, что ты хотел в каждой строке сделать, комменты помогают алгоритм понять

rubik-nerubik
27.12.2007, 16:40
VERte][ я просил помочь -) это он нормально воспримент, ибо работает =\

VERte][
27.12.2007, 17:11
не стал разбираться(по приведённым выше причинам), вот код для поиска по первому условию (по второму полный аналог):
размер n*m, обошёлся одним массивом x[i,j]
i,j - индексы; k,ind - доп. переменные индексов; ok-boolean, для проверки условия.

for i:=1 to n do {проход по строкам}
begin
min:=x[i,1]; ok:=true;

for j:=2 to m do {поиск наименьшего в строке}
if x[i,j]<min then begin min:=x[i,j]; ind:=j; end;

for k:=i downto 1 do {проверка на макс в столбце}
if x[k,ind]>min then begin ok:=false; k:=n; end;

if ok then
for k:=i to n do
if x[k,ind]>min then begin ok:=false; k:=n; end;

if ok then write (i,ind);
end;

rubik-nerubik
27.12.2007, 17:27
program two;
uses crt;
const
MAX=20;

type
line=Array[1..MAX] of real;

var
smin,min:real;
imin:Integer;
i,j,n,m,ind,k:Integer;
ok:boolean;
x:Array[1..MAX] of line;
buf:line;
juf:Array[1..MAX] of Integer;
inp:Text;

begin
Assign(inp,'matrix.txt');
Reset(inp);
Read(inp,n,m);{Є®«ЁзҐбвў® бвp®Є Ё бв®«Ўж®ў}
if (MAX<n) or (MAX<m) then
Write('*Ґ¦Ґ«*о бзЁв*вм! ')
else begin
for i:=1 to n do
for j:=1 to m do
Read(inp,x[i][j]);

for i:=1 to n do begin
buf[i]:=x[i][1];
juf[i]:=1;
for j:=2 to m do
if buf[i]<x[i][j] then begin
buf[i]:=x[i][j];
juf[i]:=j
end
end;
smin:=buf[1];
for i:=2 to n do begin
if smin>buf[i] then begin
smin:=buf[i];
imin:=i
end
end;
for i:=1 to n do
begin
min:=x[i,1]; ok:='true';

for j:=2 to m do
if x[i,j]<min then begin min:=x[i,j]; ind:=j; end;

for k:=i downto 1 do
if x[k,ind]>min then begin ok:='false'; k:=n; end;

if ok then
for k:=i to n do
if x[k,ind]>min then begin ok:='false'; k:=n; end;

if ok then write (i,ind);
end;
Writeln;
Write('‘Ґ¤«®ўaп в®зЄa x=',juf[imin],' y=',imin)
end;
Close(inp)
end.

висьнет че-то

rubik-nerubik
27.12.2007, 17:35
бля, когда кароче так виснет:
3 3
1 1 1
3 2 3
1 1 1

или

3 3
1 1 1
3 3 2
1 1 1

тут уже чисто твой код работает

VERte][
27.12.2007, 17:45
попробуй так(тут ток один вариан седловой точки):

program matrix(input, output);
const lim=20;

var i,j,k,ind,min,n,m:integer;
x:array[1..lim,1..lim] of integer;
ok:boolean
inp:Text;

begin

Assign(inp,'matrix.txt');
Reset(inp);
Read(inp,n,m);

if (n>lim) or (m>lim) then
Write('*Ґ¦Ґ«*о бзЁв*вм! ')

else begin
for i:=1 to n do
for j:=1 to m do
Read(inp,x[i][j]);

for i:=1 to n do
begin
min:=x[i,1]; ok:=true;

for j:=2 to m do
if x[i,j]<min then begin min:=x[i,j]; ind:=j; end;

for k:=i downto 1 do
if x[k,ind]>min then begin ok:=false; k:=n; end;

if ok then
for k:=i to n do
if x[k,ind]>min then begin ok:=false; k:=n; end;

if ok then writeln(i,ind);
end;
end

end.

зы. ещё 1 вещь, подумай над тем если у тебя в строке 2 максимальных элемента!!! (тогда придётся все варианты с ними рассматривать)

rubik-nerubik
27.12.2007, 17:52
виснет, ладно возьму #5, подсуну. =\

rubik-nerubik
27.12.2007, 17:57
стой!
смотри, если работать так:
3 3
1 1 1
2 3 3
1 1 1
он в первый символ парвильно выводит, но последний - 0 =\

а если работать так:
3 3
3 1 1
2 1 1
3 1 1

это он праввильно считает
слушай, как чтоб выводило первую и последнюю цифры в отдельные переменные

rubik-nerubik
27.12.2007, 17:58
после отпишись 350-659-776 в аську, буду примерно через два часа:
спсибо

VERte][
27.12.2007, 18:02
Всё проверил и исправил) вот окончательный вариант:

program matrix(input, output,inp);
const lim=20;

var i,j,k,ind,min,max,n,m:integer;
x:array[1..lim,1..lim] of integer;
ok:boolean;
inp:Text;

begin

Assign(inp,'matrix.txt');
Reset(inp);
Read(inp,n,m);

if (n>lim) or (m>lim) then
Write('*Ґ¦Ґ«*о бзЁв*вм! ')

else begin
for i:=1 to n do
for j:=1 to m do
Read(inp,x[i,j]);

for i:=1 to n do
begin
min:=x[i,1]; ok:=true; ind:=1;

for j:=2 to m do
if x[i,j]<min then begin min:=x[i,j]; ind:=j; end;

for k:=i downto 1 do
if x[k,ind]>min then begin ok:=false; k:=1; end;

if ok then
for k:=i to n do
if x[k,ind]>min then begin ok:=false; k:=n; end;

if ok then writeln(i,ind);
end;

for i:=1 to n do
begin
max:=x[i,1]; ok:=true; ind:=1;

for j:=2 to m do
if x[i,j]>max then begin max:=x[i,j]; ind:=j; end;

for k:=i downto 1 do
if x[k,ind]<max then begin ok:=false; k:=1; end;

if ok then
for k:=i to n do
if x[k,ind]<max then begin ok:=false; k:=n; end;

if ok then writeln(i,ind);
end;
end
end.

rubik-nerubik
27.12.2007, 20:07
слушай, она странное выводит -)))
т.е. бред какой-то
22
11
31

Выводить примерно надо: Элемент находиться на 1 строке втором столбце =\ типа того, а там ваще =)

rubik-nerubik
27.12.2007, 20:08
ааааа Ясно!)) выводит все! сПАсибо!