ПАСКАЛЬ =\

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by rubik-nerubik, 27 Dec 2007.

  1. rubik-nerubik

    rubik-nerubik Elder - Старейшина

    Joined:
    4 May 2007
    Messages:
    248
    Likes Received:
    9
    Reputations:
    -2
    Вообщем есть задача:
    Code:
    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 плиз
     
  2. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    я не уверен на счёт того как у тебя компилятор принимает это, но в стандартном паскале обычно пишут не [j], а [i,j]

    ps пожелание: делай отступы, так будет легче другим код читать, да и тебе тоже, циклы и условия хорошо отделять от основной проги, парами enter'ов
    и комментарии, потому что сейчас сидишь и разбираешь, что ты хотел в каждой строке сделать, комменты помогают алгоритм понять
     
    #2 VERte][, 27 Dec 2007
    Last edited: 27 Dec 2007
    2 people like this.
  3. rubik-nerubik

    rubik-nerubik Elder - Старейшина

    Joined:
    4 May 2007
    Messages:
    248
    Likes Received:
    9
    Reputations:
    -2
    VERte][ я просил помочь -) это он нормально воспримент, ибо работает =\
     
  4. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    не стал разбираться(по приведённым выше причинам), вот код для поиска по первому условию (по второму полный аналог):
    размер n*m, обошёлся одним массивом x[i,j]
    i,j - индексы; k,ind - доп. переменные индексов; ok-boolean, для проверки условия.

    Code:
    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;
     
    #4 VERte][, 27 Dec 2007
    Last edited: 27 Dec 2007
  5. rubik-nerubik

    rubik-nerubik Elder - Старейшина

    Joined:
    4 May 2007
    Messages:
    248
    Likes Received:
    9
    Reputations:
    -2
    Code:
    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.
    висьнет че-то
     
  6. rubik-nerubik

    rubik-nerubik Elder - Старейшина

    Joined:
    4 May 2007
    Messages:
    248
    Likes Received:
    9
    Reputations:
    -2
    бля, когда кароче так виснет:
    3 3
    1 1 1
    3 2 3
    1 1 1

    или

    3 3
    1 1 1
    3 3 2
    1 1 1

    тут уже чисто твой код работает
     
  7. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    попробуй так(тут ток один вариан седловой точки):

    Code:
    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 максимальных элемента!!! (тогда придётся все варианты с ними рассматривать)
     
  8. rubik-nerubik

    rubik-nerubik Elder - Старейшина

    Joined:
    4 May 2007
    Messages:
    248
    Likes Received:
    9
    Reputations:
    -2
    виснет, ладно возьму #5, подсуну. =\
     
    1 person likes this.
  9. rubik-nerubik

    rubik-nerubik Elder - Старейшина

    Joined:
    4 May 2007
    Messages:
    248
    Likes Received:
    9
    Reputations:
    -2
    стой!
    смотри, если работать так:
    3 3
    1 1 1
    2 3 3
    1 1 1
    он в первый символ парвильно выводит, но последний - 0 =\

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

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

    rubik-nerubik Elder - Старейшина

    Joined:
    4 May 2007
    Messages:
    248
    Likes Received:
    9
    Reputations:
    -2
    после отпишись 350-659-776 в аську, буду примерно через два часа:
    спсибо
     
  11. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Всё проверил и исправил) вот окончательный вариант:

    Code:
    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.
     
    #11 VERte][, 27 Dec 2007
    Last edited: 27 Dec 2007
  12. rubik-nerubik

    rubik-nerubik Elder - Старейшина

    Joined:
    4 May 2007
    Messages:
    248
    Likes Received:
    9
    Reputations:
    -2
    слушай, она странное выводит -)))
    т.е. бред какой-то
    22
    11
    31

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

    rubik-nerubik Elder - Старейшина

    Joined:
    4 May 2007
    Messages:
    248
    Likes Received:
    9
    Reputations:
    -2
    ааааа Ясно!)) выводит все! сПАсибо!