Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   ПАСКАЛЬ =\ (https://forum.antichat.xyz/showthread.php?t=56717)

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 в аську, буду примерно через два часа:
спсибо


Время: 13:19