Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Где тут ошибка?

Автор: wilin 22.11.2007 18:43

Здравствуйте! Опять с тупыми вопросами, наверно. В общем, есть такая задача, где нужно найти столбец в матрице с повторяющимися элементами. Подумала, что элементы столбцов я сначала отсортирую, потом проверю, есть ли одинаковые.


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

Большое спасибо give_rose.gif