![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Тёмный Эльф |
![]() ![]()
Сообщение
#1
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Текст программы приведен ниже. Не могу понять, в чем моя ошибка. Вроде бы первая процедура составляет список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.
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Сразу вопрос на засыпку: в чем, собственно, разница между P1 и P2? Только в имени файла? Тогда передавай его, как параметр, и убирай одну процедуру - ибо в трех процедурах ошибиться сложнее, чем в четырех...
|
Тёмный Эльф |
![]() ![]()
Сообщение
#3
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Да, я так для начала и сделал. Но если честно мороки больше вышло, я так решил сделать. По сути, с p1 получаю первый список, с p2 получаю второй список и потом спокойно сравниваю их. Вот, может, я делаю ошибку при передаче параматров в процедуру p3? Я для пробы в первый файл ввел цифры(каждая на отдельной строчке) 12345678, во второй файл я записал 135, то есть в результате в выходном файле должны остаться цифры 24678. Но
If pp=df then... вообще получается, что это условие ни разу не исполняется, как будто то бы второй список пуст (хотя я его заполнял). (!) Не понимаю! |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
If pp=df then...
Вот кстати об этом условии я и хотел с тобой поговорить... Что оно должно означать? Равенство указателей (согласно синтаксису Паскаля)? Так ведь дело в том, что ДАЖЕ указатели на один и тот же участок памяти могут не быть одинаковыми, тем более не будут одинаковы указатели на разные участки памяти...Тебе бы делать If pp^.EL = df^.EL Then ...
(ну, или pp^.sled^.EL = ...) |
Тёмный Эльф |
![]()
Сообщение
#5
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
А ведь и правда! Здесь я сглупил!
Теперь в выходном файле 134578. Значит, можно сделать вывод, что моя очередная ошибка вот в этих операторах:
q:=pp^.sled^.sled;
Dispose(pp^.sled);
pp^.sled:=q;
(!) |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
![]() Во-первых, ты не идешь до конца списка, а зачем-то оставляешь один элемент, поэтому одно слово из второго списка ты в первом не найдешь однозначно... Ну, и с самим удалением проблема... Вот так будет лучше: 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 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Цитата ты не идешь до конца списка Точняк! Впредь буду более внимателен. Спасибо за подсказку, нашли целых три ошибки! ![]() ![]() |
Тёмный Эльф |
![]() ![]()
Сообщение
#8
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
А кстати, программа почему-то не хочет удалять последний элемент. Компилятор выдает ошибку 204 !
|
volvo |
![]()
Сообщение
#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) ... }
Любой из этих операторов по отдельности завершит программу аварийно, а уж все вместе... ![]() Добавляй условие - все это надо делать ТОЛЬКО если q <> nil ... Вот уже четвертая ошибка ![]() |
Тёмный Эльф |
![]() ![]()
Сообщение
#10
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Цитата Добавляй условие - все это надо делать ТОЛЬКО если q <> nil Не знаю..не идет.. Может пустить счетчик? И потом отдельно удалять последний элемент если счетчик дошел до последней строки файла 1? |
volvo |
![]()
Сообщение
#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 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Цитата dispose(pp^.sled); ![]() Ну да. Он все-равно в этом месте выдает ошибку. Не хочет никак последний элемент удалять! |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
"Не верю !!!" (С) ...
Только что прогнал программу у себя - все работает... Проверяй, что еще изменял... |
Тёмный Эльф |
![]() ![]()
Сообщение
#14
|
![]() Влюблённый псих ![]() ![]() ![]() Группа: Пользователи Сообщений: 185 Пол: Женский Реальное имя: Лейла Репутация: ![]() ![]() ![]() |
Ну я бы не стал врать! На самом деле не шло! Я вот так сделал:
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;
Теперь работает. Уфф.. |
![]() ![]() |
![]() |
Текстовая версия | 29.07.2025 5:24 |