Помощь - Поиск - Пользователи - Календарь
Полная версия: Где тут ошибка?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
wilin
Здравствуйте! Опять с тупыми вопросами, наверно. В общем, есть такая задача, где нужно найти столбец в матрице с повторяющимися элементами. Подумала, что элементы столбцов я сначала отсортирую, потом проверю, есть ли одинаковые.


const
 n=6; { Количество столбцов }
 m=5; { Количество строк массива }
 k=20;

var
 a:array[1..n, 1..m] of integer;
 i,j,min,t,d:integer;

begin
 randomize;
 for i:=1 to n do
   for j:=1 to m do
     a[i,j]:=random(k);

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

   min:=i;
   for d:=i+1 to n do
   if a[d]<a[min] then min:=d;

   t:=a[i];
   a[i]:=a[min];
   a[min]:=t;
   end;
  if a[i]=a[i+1] then writeln ('da',' ',j);
  end;




     for i:=1 to n do begin
     for j:=1 to m do
     write(a[i,j],' ');
     writeln;    end;
           readln;

end.



У меня стоит FPC IDE, при попытке загрузиться выводит ошибку Incompatible types: got array of smallint excepted

Что это значит и как это вылечить?
volvo
Ну, перед этим тебе должна выводиться еще ошибка, "Illegal assignment to for-loop variable", потому как FPC не позволяет менять переменную, по которой идет цикл, а ты хочешь запустить второй цикл по той же переменной (20 строка)

Что касается
Цитата
Incompatible types: got array of smallint excepted
- ты просто не до конца прочитала:
"Incompatible types: got array of longint expected longint" - значит, что нельзя присваивать переменной типа Integer массив (если A - это матрица, то A[ i ] - одномерный массив). Переменная T должна быть тоже типа "массив". Чуть ниже - обратная ошибка, исправишь одну, исправится и другая...
wilin
volvo, я не знаю, как это в один цикл объединить... Такая ошибка наблюдаться будет только в FPC?
volvo
Диагностироваться эта ошибка будет только на новых компиляторах, старые ее просто замалчивают. От этого программа не становится более правильной. В документации по языку программирования Паскаль явно сказано: "нельзя менять управляющую переменную цикла FOR". Все. Точка. Все, кто это делают - делают на свой страх и риск. Пускай не удивляются, что очередная версия компилятора перестала компилировать их программы. Нужен полный контроль над циклом - While/Repeat.

Но в твоем случае это не поможет, поскольку все равно значение переменной i будет безнадежно испорчено.

Вот так я бы решал задачу (если вообще допустимо изменять содержимое матрицы):

const
 n=5;
 m=6;

var
 a:array[1..n, 1..m] of integer;
 i,j,k, min,t:integer;

begin
  randomize;
  for i:=1 to n do
    for j:=1 to m do
      a[i,j]:=random(20);

  { Заполнили матрицу, распечатываем }
  for i:=1 to n do begin
     for j:=1 to m do
       write(a[i,j]:4);
     writeln;
  end;

  { для каждого столбца (j - номер столбца) делаем следующее: }
  for j:=1 to m do begin

    {
      это, насколько я понимаю, сортировка методом поиска минимумов?
      обрати внимание, обращаемся к двумерному массиву - используя 2 индекса
    }
    for i:=1 to n-1 do begin
      min:=i;
      for k:=i+1 to n do begin
        if a[k, j]<a[min, j] then min := k;
        t:=a[i, j];
        a[i, j]:=a[min, j];
        a[min, j]:=t;
      end;
    end;

    { после того, как отсортировали столбец - проверяем его на наличие дубликатов }
    for i := 1 to n - 1 do begin
      if a[i, j]=a[i+1, j] then begin
        writeln ('da',' ',j);
        break; { <--- нашли - печатаем и выходим!!! чтобы не было несколько "Да" на столбец }
      end;
    end;
  end;

  { это - матрица с отсортированными столбцами }
  for i:=1 to n do begin
     for j:=1 to m do
       write(a[i,j]:4);
     writeln;
  end;
  readln;

end.

wilin
Большое спасибо give_rose.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.