![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Jabbson |
![]() ![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Арсений Репутация: ![]() ![]() ![]() |
Добрый день.
Задание следующее: Разработать структуру данных для построения предметного указателя. Осуществить поиск, сортировку, редактирование. Итак, предметный указатель, как я понимаю, - это то, что мы, зачастую, имеем в концах книг и имеет структуру: {СЛОВО} {СТРАНИЦЫ, ГДЕ ЭТО СЛОВО ВСТЕРЧАЕТСЯ} Реализацию я вижу такую: (я знаю, это задание уже можно найти почти готовым, но я хочу написать принципиально свое, потому как очень интересно разобраться в принципах динамических структур данных). Есть объявления типа: type Что я делаю дальше. Заполняю массив за записей с буквами собственно теми самыми буквами: for x:=65 to 90 do После этого он представляет собой следующее: letters: (('A', nil), ('B', nil), ('C', nil)...('Z', nil). После этого я перехожу к непосредственно заполнению и вот тут у меня возникает проблема. Выглядит начало примерно так: clrscr; Подскажите как примерно должна выглядеть процедура Add, чтобы: ( как я это вижу, может все гораздо проще ) * Найти по let_num в массиве lett_mas ячейку с буквой, на которую начинается слово. * Если ячейка^.first = nil, то создать новую ссылку на запись, положить туда значение z и сделать чтобы ячейка^.first теперь сслылалась на это место. * Если же ячейка^.first <> nil, то идти по этому списку до тех пор пока не дойдем до конца и вставить наше z там. Конечное видение примерно как на приложенной картинке. Заранее спасибо. Эскизы прикрепленных изображений ![]() |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Jabbson
К сожалению, твой вариант программы только что вылетел у меня с ошибкой. Как повторить: введи либое слово и несколько страниц, на которых оно встречается, и запусти поиск по страницам. Как только ты попытаешься Цитата (*------------Procedura poiska2--------*) обратиться к L^.Page для незаполненного элемента массива, получишь вылет. За разыменование нулевого указателя... Перед тем, как начинать обработку списка, убедись, что он не пуст... Либо просто перепиши эту процедуру: procedure SearchByPage(L:LinkRec; P:word); , теперь даже если список пуст - ошибки не будет... Внимательней с такими вещами. Аналогичным образом я бы переделал и процедуру Print, там тоже никому не нужное дублирование кода. P.S. Еще одно предупреждение, о котором прямо говорит Free Pascal при компиляции твоего кода - это то, что ты не инициализировал массив empty_pagemas. Не надо так делать... Тебе же будет спокойнее, если он будет инициализирован нулями. Потому что это - потенциальное место для ошибки. Представь себе, ты хочешь добавить еще функционал к данной программе, и все, что у тебя написано сейчас, оформляешь, как отдельную процедуру. Приплыли... Как процедура это работать не будет. Именно потому, что empty_pagemas не был инициализирован нулями (локальные переменные не обнуляются, только глобальные). Как же иногда не хватает возможности сделать так: empty_pagemas: constant page_mas := (others => 0); в Паскале, чтоб не заниматься инициализацией в RunTime, а сделать это еще во время компиляции... |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 22:58 |