Здравствуйте! Опять с тупыми вопросами, наверно. В общем, есть такая задача, где нужно найти столбец в матрице с повторяющимися элементами. Подумала, что элементы столбцов я сначала отсортирую, потом проверю, есть ли одинаковые.
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:=1to n dofor j:=1to m do
a[i,j]:=random(k);
for j:=1to m dobeginfor i:=1to n dobeginfor i:=1to n-1dobegin
min:=i;
for d:=i+1to n doif 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:=1to n dobeginfor j:=1to 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:=1to n dofor j:=1to m do
a[i,j]:=random(20);
{ Заполнили матрицу, распечатываем }for i:=1to n dobeginfor j:=1to m do
write(a[i,j]:4);
writeln;
end;
{ для каждого столбца (j - номер столбца) делаем следующее: }for j:=1to m dobegin{
это, насколько я понимаю, сортировка методом поиска минимумов?
обрати внимание, обращаемся к двумерному массиву - используя 2 индекса
}for i:=1to n-1dobegin
min:=i;
for k:=i+1to n dobeginif 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 := 1to n - 1dobeginif a[i, j]=a[i+1, j] thenbegin
writeln ('da',' ',j);
break; { <--- нашли - печатаем и выходим!!! чтобы не было несколько "Да" на столбец }end;
end;
end;
{ это - матрица с отсортированными столбцами }for i:=1to n dobeginfor j:=1to m do
write(a[i,j]:4);
writeln;
end;
readln;
end.
wilin
22.11.2007 20:32
Большое спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.