![]() |
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
|
Гость ![]() |
Цитата Заполняю массив за записей с буквами собственно теми самыми буквами: Не надо делать лишнюю работу. Индексом массива может быть не только целое число, а любой перечислимый тип. Итого:Type Что тебе это дает? А очень просто: по первой букве слова ты моментально переходишь к нужному списку. То есть, чтобы закончить твой код, приведенный внизу, достаточно: Procedure Add(var L: LinkRec; R: Rec); Идея понятна? Продолжай. Только внимательно прочти то, что написано здесь: Как не надо писать программы Особенно это касается навешивания рюшечек до окончания разработки алгоритма. Ты потом на разберешься, что и куда. Сначала сделай логику (сколько же раз можно говорить одно и то же. Но ведь не слышите же!!! Или не хотите слышать?), ПОТОМ будешь делать "красивости". Красивая программа, которая глючит - никому не нужна. А вообще, по-хорошему, надо разделить указатель next и данные. Как это делать - я уже неоднократно показывал, читай на форуме. И почему это надо делать - тоже объяснял... |
Jabbson |
![]()
Сообщение
#3
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Арсений Репутация: ![]() ![]() ![]() |
volvo, огромное Вам спасибо. Вы всегда очень быстро и по существу отвечаете.
С "рюшечками" будем бороться, простите Бога ради, первый курс только, все придет со временем. Сообщение отредактировано: Jabbson - 24.05.2010 16:32 |
Jabbson |
![]()
Сообщение
#4
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Арсений Репутация: ![]() ![]() ![]() |
Конечный результат программы у меня выглядит следующим образом:
очень хотел бы услышать Ваши комментарии. uses crt; Прилагаю исходник и исполняемый файл: ![]() Сообщение отредактировано: Jabbson - 24.05.2010 21:23 |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Вот:
Цитата if tmp^.slovo<rab^.slovo then begin Это как раз та причина, по которой я и говорил, что надо отделить данные от дополнительной информации (которой является указатель next)... А насколько все было бы проще, если б ты сделал так: LINKREC = ^REC; ? Тогда сортировка выглядела бы так: var R: TData; Ну, а более подробно, если хочешь, напишу завтра. Чтобы проверять, надо иметь компилятор под рукой, у меня сейчас его нету... |
Jabbson |
![]()
Сообщение
#6
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Арсений Репутация: ![]() ![]() ![]() |
Был бы премногоблагодарен.
![]() Цитата { <--- Проще, правда? } а вот это действительно здОрово. Сообщение отредактировано: Jabbson - 25.05.2010 0:22 |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
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, а сделать это еще во время компиляции... |
Jabbson |
![]()
Сообщение
#8
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Арсений Репутация: ![]() ![]() ![]() |
Большое спасибо за Вашу помощь.
Еще пришло в голову, что отдавая слово в процедуру Add, было бы разумнее отдавать её так: Add(Lists[upcase(z.slovo[1])],z); чтобы можно было обрабатывать и слова, написанные с маленькой буквы. |
![]() ![]() |
![]() |
Текстовая версия | 19.07.2025 18:17 |