IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Где тут ошибка?, плохо дело :(
wilin
сообщение 22.11.2007 14:43
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


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


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

Что это значит и как это вылечить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.11.2007 14:55
Сообщение #2


Гость






Ну, перед этим тебе должна выводиться еще ошибка, "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 должна быть тоже типа "массив". Чуть ниже - обратная ошибка, исправишь одну, исправится и другая...

Сообщение отредактировано: volvo - 22.11.2007 14:56
 К началу страницы 
+ Ответить 
wilin
сообщение 22.11.2007 15:34
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


volvo, я не знаю, как это в один цикл объединить... Такая ошибка наблюдаться будет только в FPC?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.11.2007 16:00
Сообщение #4


Гость






Диагностироваться эта ошибка будет только на новых компиляторах, старые ее просто замалчивают. От этого программа не становится более правильной. В документации по языку программирования Паскаль явно сказано: "нельзя менять управляющую переменную цикла 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 16:32
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


Большое спасибо give_rose.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 6:12
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"