1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Задание: В основной программе зарезервировать память в куче для размещения 100 вещественных значений.В вектор Х записать указатели на каждое значение. Сформировать случайные вещественные числа и записать их в динамическую память. Считая, что все элементы вектора Х отличны от NIL, описать процедуру uniquex(x), которая в векторе Х все элементы, ссылающиеся на равные числа, заменяет на первый из этих элементов.
Вот программа, но я не могу сделать эту процедуру.Подскажите кто-нибудь как её делать?
Код
Program DP; type preal=^real; vector=array[1..100] of preal; var x:vector; i:integer; procedure unique(x:vector); var i:integer; mx:real; a:array[1..100] of integer begin end;
begin new(x); randomize; for i:=1 to 100 do begin new(x^[i]); x^[i]^:=random(100); write(' ',x^[i]^:5:2); end;
Program DP; const n = 100; type preal=^real; pvector=^vector; vector=array[1 .. n] of preal; var x:pvector; i:integer; procedure unique(x:pvector); var changed: array[1 .. n] of boolean; i, j: integer; begin for i := 1 to n do changed[i] := false;
for i := 1 to n - 1 do for j := i + 1 to n do if (not changed[i]) and (not changed[j]) and (x^[i]^ = x^[j]^) then begin changed[j] := true; dispose(x^[j]); x^[j] := x^[i]; end;
for i := 1 to n do if changed[i] then write(i:3); { <-- Это просто показывает, ЧТО поменяли } writeln; end;
begin new(x); randomize; for i:=1 to 100 do begin new(x^[i]); x^[i]^:=random(100); write(' ',x^[i]^:5:2); end;
unique(x);
writeln; for i := 1 to n do begin write(' ',x^[i]^:5:2); end; { ?? Что будешь делать здесь ?? } dispose(x); end.
Только учти, что теперь у тебя будут проблемы при удалении массива... Перед Dispose надо бы освободить память, на которую указывает КАЖДЫЙ элемент массива X, однако у тебя несколько элементов указывают в одну область памяти... Первый из них - удалится нормально, на втором сразу получишь "неправильное действие с указателем"... Что будешь делать?