Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 149
от 05.04.2006, 19:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 164, Экспертов: 46
В номере:Вопросов: 1, Ответов: 1


Вопрос № 39071: Здравствуйте Эксперты. Тут возникла такая проблема. Короче задача: Составить программу, которая формирует список L, включив в него по одному разу элементы, которые входят одновременно в оба списка L1 и L2. Я вроде бы сделал формирование списка L,...

Вопрос № 39.071
Здравствуйте Эксперты.
Тут возникла такая проблема. Короче задача: Составить программу, которая формирует список L, включив в него по одному разу элементы, которые входят одновременно в оба списка L1 и L2. Я вроде бы сделал формирование списка L, но когда идет сортировка программа виснет. Помогите решить эту проблему. Если есть идеи как проще можно отсортировать список то опешите, пожалуйста.
P.S. Списки однонаправленные.

Приложение:

Отправлен: 31.03.2006, 18:36
Вопрос задал: Ram (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Артём Шегеда
Здравствуйте, Ram!

Не в моих правилах писать готовые работающие программы, особенно лабораторки, однако я сегодня добрый :)
Для начала об ошибках...
Процедура New выделяет память, но не заполняет её какими-либо значениями. Из-за этого конструкция
  new(l1); beg1:=l1;
  while l1^.p<>nil do
может когда-нибудь отработать не так, как хотелось бы. Ведь l1^.p нигде не инициализируется, а значит, может быть и nil. В результате цикл ввода прервётся не по желанию оператора, а сам по себе.
Второе...
Зачем сортировать результирующий список? В задании этого не требуется. Для того, чтобы удалить дубликаты? - Думаю, что можно создавать список сразу без дубликатов.
Третье...
Указатели не обязательно инициализировать новыми объектами, можно просто сослаться на уже существующие. Тем более, что
  l:=beg; new(x); new(next);
  while l^.p<>nil do
  begin
    next:=l;
    x:=l;
не имеет смысла: были созданы объекты, которые потом потерялись (указатели x и next указывали на некоторые новые области памяти, после чего стали указывать на другие области, при этом ранее выделенная память была потеряна).
Четвёртое...
Конструкция if (x^.i=l^.p^.i)and(l^.p^.p<>nil)and(l^.p<>nil) в используемом контексте не вызовет ошибок, однако, и смысла не имеет. Ведь строкой выше стоит проверка while l^.p<>nil do. В общем случае, нельзя работать с объектом, не проверив указатель на него. Надо было писать так: if (l^.p<>nil)and(x^.i=l^.p^.i)and(l^.p^.p<>nil)
Пятое...
Боюсь, что здесь:
  if x^.i=l^.p^.i then
    dispose(l^.p); l^.p:=nil;
пропущены begin...end. Из-за этого в первой же итерации получается
  l^.p:=nil;
l:=l^.p;
if l^.p=nil then l:=next;
и в последней строке возникает ошибка доступа - обращение к невыделенной или к неправильной области динамической памяти.

Кстати, некоторых ошибок можно было бы избежать, если бы программа была сформирована красиво, в соответствии с блоками - ведь "лесенка" была придумана не просто так, а чтобы упростить чтение и отладку. Дурным тоном считается написание инструкций по нескольку в одной строке.
Вообще, паскаль нужно менять на Delphi - в нём возможностей для отладки больше
Удач!

Приложение:

Ответ отправил: Артём Шегеда (статус: 4-ый класс)
Ответ отправлен: 31.03.2006, 20:38
Оценка за ответ: 5
Комментарий оценки:
Благодарю вас Артём Шегеда. Только Это не лабораторная работа. Я начинающий. Вроде бы во всем разобрался, но указатели тяжело даются. Если у вас есть какой-нибудь материал то прошу вас пришлите на мой адрес (ramilka@samtel.ru). Или укажите ссылку в ине-те.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.21 от 03.04.2006
Яндекс Rambler's Top100

В избранное