Здравствуйте! Опять с тупыми вопросами, наверно. В общем, есть такая задача, где нужно найти столбец в матрице с повторяющимися элементами. Подумала, что элементы столбцов я сначала отсортирую, потом проверю, есть ли одинаковые.
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
22.11.2007 18:55
Ну, перед этим тебе должна выводиться еще ошибка, "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
22.11.2007 19:34
volvo, я не знаю, как это в один цикл объединить... Такая ошибка наблюдаться будет только в FPC?
volvo
22.11.2007 20:00
Диагностироваться эта ошибка будет только на новых компиляторах, старые ее просто замалчивают. От этого программа не становится более правильной. В документации по языку программирования Паскаль явно сказано: "нельзя менять управляющую переменную цикла 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
22.11.2007 20:32
Большое спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.