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

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

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

 
 Ответить  Открыть новую тему 
> Файлы удаление элементов, удаление повторяющихся элементов
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: Марина

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


Уже не один день мучаю свой мозг.. wacko.gif Ну не могу я предумать такую процедуру... Помогите, а?

Дан файл f = file of integer. Удалить из файла все повторяющееся элементы, БЕЗ создания дополнительного файла, матриц и т.п. unsure.gif Вот такая разминка для мозгов.

Заранее огромное спасибо! rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата(mapblwka @ 10.05.2006 22:16)
Уже не один день мучаю свой мозг.

Значит, должны быть наброски, какие-то попытки, идеи в конце-концов... Вот и покажи, КАК пыталась это сделать.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: Марина

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


volvo, вся проблема в удаление элементов из файла, остальное я уже придумала в 5 вариантах, но функция удаления... я даже идийного алгоритма построить не могу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

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

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


Смущает вот что: ну хорошо, мы удалили повторяющиеся элементы, то есть было в файле 122333456, стало
123456. Значит ли это, что длина файла должна была уменьшиться? И если да, то как ее корректировать? Если дополнительные файлы запрещены, это значит, что все изменения надо производить на месте. Надо ли при этом менять длину файла? Удалить-то не проблема...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

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

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


Цитата(Бродяжник @ 11.05.2006 11:24) *

Значит ли это, что длина файла должна была уменьшиться? И если да, то как ее корректировать? Если дополнительные файлы запрещены, это значит, что все изменения надо производить на месте.

Для этого есть процедура Truncate(f)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

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

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


mapbwlka
Нужно открыть файл для чтения/записи.
Потом прочесть первое число и запомнить его.
Потом надо читать все последующие и сравнивать их с первым. Пока они разные, все нормально. Как только мы наткнулись на совпадение, начинаем развлекаться. Запоминаем позицию совпавшего числа. Читаем следующее за ним. Если оно отличается, перезаписываем его в запомненную позицию. Начиная с этого момента, у нас возникает две позиции в файле - очередная позиция чтения и очередная позиция записи. По мере выявления совпадений эти две позиции будут все больше расходиться. Когда мы дочитаем до конца файла, нужно урезать длину файла с учетом найденных повторений. Теперь мы смещаемся ко второму числу, читаем его и повторяем ту же процедуру. И так до упора. Весело будет...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






mapbwlka, появилась у меня одна интересная идея... Только для того, чтобы браться за ее реализацию, я должен знать - ограничен ли размер файла, и есть ли какие-то временнЫе рамки (критична ли скорость выполнения программы)?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

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

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


Цитата(volvo @ 11.05.2006 11:50) *

mapbwlka, появилась у меня одна интересная идея... Только для того, чтобы браться за ее реализацию, я должен знать - ограничен ли размер файла, и есть ли какие-то временнЫе рамки (критична ли скорость выполнения программы)?

Увеличить его придется максимум на 8Kb, я думаю это не критично. А по времени-если решать в лоб, без увеличения размера и использования другий файлов/массивов, полюбому дольше будет, причем гораздо..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Malice, я кому задал вопрос? Тебе? Будь добр НЕ отвечать на те вопросы, которые заданы НЕ ТЕБЕ (вместо спрашиваемого), ОК? Ты что, знаешь, какой алгоритм я хочу предложить? Нет.

А догадываться будешь на форуме телепатов. Я понятно излагаю?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

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


А вариант с открытым хэшированием не пройдёт?
Мы ползём по файлу, если следующего элемента нету в хэш-таблице, то добавляем его и дописываем в результирующий файл. Если элемент оказался в хэше, то переходим к следующему.
В конце работы программа просто заменяет входной файл результирующим.

--добавил чуток позднее

ой! описание задачи недочитал! пардон.
Тогда чего-то я не понимаю, как хранить промежуточную инфу? Если в файле - то это очень долго. Ну, например ты умудрилась всётаки грохнуть элементы - на их месте можно нули писать. Тогда потом можно просто уплотнить файл: переписать элементы с конца файла в "дырки" в середине файла.

Сообщение отредактировано: hardcase -


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Вариант с рекурсией ОПЯТЬ не рассматривается? В стеке храниться все элементы и будут. Я для чего про размер файла спрашивал?

Вот, например, так:
type
int_f = file of integer;

procedure create(var f: int_f);
const
n = 24;
a: array[1 .. n] of integer =
( 1, 1, 3, 8, 5, 3, 8, 2, 4, 5, 6, 10,
11, 14, 13, 18, 15, 16, 18, 12, 14, 15, 16, 20);
var i: integer;
begin
rewrite(f);
for i := 1 to n do write(f, a[i]);
close(f);
end;

procedure print(var f: int_f);
var X: integer;
begin
reset(f);
while not eof(f) do begin
read(f, X); write(X:4);
end;
writeln;
end;

var
f_pos: longint;

procedure compress(var f: int_f);
var
X, V: integer;
found: boolean;
begin
if f_pos < 0 then begin
rewrite(f); exit
end

else begin
seek(f, f_pos);
read(f, X); dec(f_pos);
compress(f);
end;

reset(f);
found := false;
while not eof(f) and not found do begin
read(f, V);
found := (X = V);
end;
seek(f, filesize(f));
if not found then write(f, X);
end;

var
f: int_f;

begin
assign(f, 'f.int');
create(f);
print(f);

reset(f);
f_pos := pred(filesize(f));
compress(f);
close(f);

print(f);

end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

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


Рекурсия - хорошая идея. только долго всё это будет: для каждого элемента бегать по файлу...


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






smile.gif И это я пытался у автора выяснить smile.gif
Цитата(Self)
(критична ли скорость выполнения программы)?


Ответа почему-то не последовало ... Будем надеяться, что пока ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: Марина

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


ой! ребята! Вы такие умные тут! Все намного оказалось проще... Дошла до инута спросила "умных": "че делать???", ответ был до боли простой! truncate(var F) и все дела.

Переписывать письменный вариант решенной задачки честно лень, устала очень, позже выложу. Но вся фишка в том что: берем элемент файла, проверяем его на повторяемость, если повторяется, то каждый повторный элемент методом сдвига перегоняем в конец файла и truncate. Complete! smile.gif почувствовала себя умной.

Так вот в следующий раз СНАЧАЛА спроси у них "Че делать", а потом иди на форум. Понятно?
Блин, мало того, что помоги человеку, так он еще и фыркает в ответ... dry.gif


Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Цитата(hardcase @ 11.05.2006 23:26) *

Рекурсия - хорошая идея. только долго всё это будет: для каждого элемента бегать по файлу...

Рекурсия жрет дохрена ресурсов компухтера, лучше будет если мы все элементы файла вобьем в множество. С учетом, конечно, если порядок элементов в файле нам не важен. Такие сложные конструкции придумываете, что в космос запускай mega_chok.gif
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 29.03.2024 16:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name