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

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

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

 
 Ответить  Открыть новую тему 
> ОДнонаправленные линейные списки, удалить из файла 1 слова, встречающиеся в файле 2
сообщение
Сообщение #1


Влюблённый псих
***

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

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


Текст программы приведен ниже. Не могу понять, в чем моя ошибка. Вроде бы первая процедура составляет список1 из первого файла, вторая процедура составляет список2 из второго файла, третья процедура собственно проверяет есть ли в списке 1 слова из списка 2 и если есть, удаляет их. А четвёртая процедура выводит изменённый список 1 в выходной файл.
Если кто заметил ошибку, подскажите пожалуйста где она, может я не правильно передаю параметры при заходе в третью процедуру?


Type
next=^elem;
Elem=RECORD
EL:string;
Sled:next;
END;
VAR
head,head2:next;

Procedure p1(var p:next);
var
m:next;
F1:text;
BEGIN
Assign(f1,'dan.inp');
Reset(f1);
Assign(output,'res.out');
Rewrite(output);
New(m);
New(m^.sled);
p:=m;
Readln(f1, m^.el);
m^.sled:=nil;
while not EOF(f1) do
begin
New(m^.sled);
m:=m^.sled;
Readln(f1, m^.el);
m^.sled:=nil;
End;
Close(f1);
end;

Procedure p2(var p:next);
var
m:next;
F1:text;
BEGIN
Assign(f1,'dan1.inp');
Reset(f1);
New(m);
New(m^.sled);
p:=m;
Readln(f1, m^.el);
m^.sled:=nil;
while not EOF(f1) do
begin
New(m^.sled);
m:=m^.sled;
Readln(f1, m^.el);
m^.sled:=nil;
End;
Close(f1);
end;

procedure p3(var uk,d2:next);
var pp,df,q:next;
Begin
pp:=uk;
While pp^.sled<>NIL do
BEGIN
df:=d2;
While df^.sled<>NIL do
Begin
If pp=df then
Begin
q:=pp^.sled^.sled;
Dispose(pp^.sled);
pp^.sled:=q;
end;
df:=df^.sled;
end;
pp:=pp^.sled;
end;
END;

procedure p4(var dr:next);
var dt:next;
Begin
writeln('=======REZULTAT=======');
dt:=dr;
While dt<>NIL do
Begin
Writeln(dt^.el);
dt:=dt^.sled;
End;
close(output);
end;

BEGIN
p1(head);
p2(head2);
p3(head,head2);
p4(head);
END.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Сразу вопрос на засыпку: в чем, собственно, разница между P1 и P2? Только в имени файла? Тогда передавай его, как параметр, и убирай одну процедуру - ибо в трех процедурах ошибиться сложнее, чем в четырех...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Влюблённый псих
***

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

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


Да, я так для начала и сделал. Но если честно мороки больше вышло, я так решил сделать. По сути, с p1 получаю первый список, с p2 получаю второй список и потом спокойно сравниваю их. Вот, может, я делаю ошибку при передаче параматров в процедуру p3? Я для пробы в первый файл ввел цифры(каждая на отдельной строчке) 12345678, во второй файл я записал 135, то есть в результате в выходном файле должны остаться цифры 24678. Но

If pp=df then...
вообще получается, что это условие ни разу не исполняется, как будто то бы второй список пуст (хотя я его заполнял). (!) Не понимаю!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






If pp=df then... 
Вот кстати об этом условии я и хотел с тобой поговорить... Что оно должно означать? Равенство указателей (согласно синтаксису Паскаля)? Так ведь дело в том, что ДАЖЕ указатели на один и тот же участок памяти могут не быть одинаковыми, тем более не будут одинаковы указатели на разные участки памяти...

Тебе бы делать
If pp^.EL = df^.EL Then ...
(ну, или pp^.sled^.EL = ...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Влюблённый псих
***

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

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


А ведь и правда! Здесь я сглупил!
Теперь в выходном файле 134578. Значит, можно сделать вывод, что моя очередная ошибка вот в
этих операторах:
 
q:=pp^.sled^.sled;
Dispose(pp^.sled);
pp^.sled:=q;



(!)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






yes2.gif
Во-первых, ты не идешь до конца списка, а зачем-то оставляешь один элемент, поэтому одно слово из второго списка ты в первом не найдешь однозначно... Ну, и с самим удалением проблема...

Вот так будет лучше:
procedure p3(var uk,d2:next);
var pp,df,q:next;
Begin

pp:=uk;
While pp<>NIL do BEGIN
df:=d2;
While df<>NIL do Begin

if pp^.el = df^.el then begin

q:=pp^.sled;
pp^.el := q^.el;
pp^.sled := q^.sled;
Dispose(q);

end;
df:=df^.sled;

end;
pp:=pp^.sled;
end;

END;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Влюблённый псих
***

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

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


Цитата
ты не идешь до конца списка

Точняк! Впредь буду более внимателен. Спасибо за подсказку, нашли целых три ошибки! wacko.gif smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Влюблённый псих
***

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

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


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


Гость






"Последний элемент" - это тот, PP, для которого PP^.sled = nil? Так правильно, что ошибка:

        q:=pp^.sled; { q = nil }
pp^.el := q^.el; { Здесь вообще что-то невообразимое - pp^.el := nil^.el ??? }
pp^.sled := q^.sled; { переход по нулевому указателю ... }
Dispose(q); { Вызов Dispose(nil) ... }

Любой из этих операторов по отдельности завершит программу аварийно, а уж все вместе... wacko.gif

Добавляй условие - все это надо делать ТОЛЬКО если q <> nil ... Вот уже четвертая ошибка smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Влюблённый псих
***

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

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


Цитата
Добавляй условие - все это надо делать ТОЛЬКО если q <> nil


Не знаю..не идет.. Может пустить счетчик? И потом отдельно удалять последний элемент если счетчик дошел до последней строки файла 1?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Так тоже не идет?
procedure p3(var uk,d2:next);
var pp,df,q:next;
Begin

pp:=uk;
While pp<>NIL do BEGIN
df:=d2;
While df<>NIL do Begin

if pp^.el = df^.el then begin

q:=pp^.sled;
if q <> nil then begin
pp^.el := q^.el;
pp^.sled := q^.sled;
Dispose(q);
end
else begin
pp := uk;
while pp^.sled^.sled <> nil do pp := pp^.sled;
dispose(pp^.sled);
pp^.sled := nil;
end

end;
df:=df^.sled;

end;
pp:=pp^.sled;
end;

END;

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


Влюблённый псих
***

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

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



Цитата
dispose(pp^.sled);
nea.gif

Ну да. Он все-равно в этом месте выдает ошибку. Не хочет никак последний элемент удалять!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






"Не верю !!!" (С) ...

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


Влюблённый псих
***

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

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


Ну я бы не стал врать! На самом деле не шло! Я вот так сделал:

 
procedure p3(var uk,d2:next);
label g;
var pp,df,q:next;
Begin
pp:=uk;
While pp<>NIL do Begin
df:=d2;
While df<>NIL do Begin

if pp^.el=df^.el then begin

g: If q=nil then BEGIN
pp:=uk;
q:=uk;
While pp^.sled<>NIL DO
Begin
q:=pp;
pp:=pp^.sled;
END;
DISPOSE(pp);
q^.sled:=NIL;
END else

BEGIN

q:=pp^.sled; if q=nil then goto g;
pp^.el:=q^.el;
pp^.sled:=q^.sled;
Dispose(q);
END;

END;

df:=df^.sled;
end;
pp:=pp^.sled;
end;

END;


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

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

 





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