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

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

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

> Минимальное множество прямых (рекурсия с возвратом)
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 20
Пол: Женский

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


Всем доброго времени суток! Прошу помочь со следующей задачей: найти минимальное множество прямых, проходящих через все заданные точки. То есть заданы координаты точек и ответом должно быть число прямых. Не знаю как организовать перебор всех вариантов, очень прошу написать хотя бы в общем виде сам алгоритм.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Даша @ 20.04.2011 17:28) *
По коду в принципе всё понятно,
Даша, не обижайся, но.. не верится! )) Ответь на пару контрольных вопросов, чтоб меня в этом убедить..
1. Зачем каскадный IF (строки 28-37) в функции Aligned?
2. Зачем "if (i<>j) and not Co[j]" (оба условия) в строке 59?
3. Почему Co[i] вычисляется через OR с самим собой (строка 64)?
4. ...
Если ты можешь ответить - тогда да, понятно )). Если нет - то нет.. ((

Цитата
за исключением
e= 1e-7;

понятно что это константа, но почему она так задается, и вообще про подобное задание констант, если можно, расскажите, а то в университете про такое не рассказывали)
Это ОООЧЕНЬ странно, что вам не рассказывали про константы. Именованные константы - это очень распространенная и полезная концепция программирования. Я объясню на прмере..

Допустим, ты делаешь прогу.. ну, скажем, модель дорожного движения. Там у тебя машинки ездят всякие.. И у них есть такой параметр, как скорость - у каждого своя в каждый момент времени. Эта скорость должна контролироваться на предмет не превышения максимальной допустимой (я правлиьно сказал? короче, speed limit)). Эта проверка осуществляется в разных местах программы. Speed limit в городе - 60 км/ч. Ты можешь в каждой проверке употребить непосредственно это число, типа так:
  if (Speed>60) and CopIsAround  then Cite;

Но завтра Дума (депутаты которой очень любят кататься выпускать законы на эту тему) поднимет этот предел до 70 (или опустит до 50, что более вероятно). И тогда тебе придется отыскивать ВСЕ проверки и заменять в них 60 на 70 (или 50). Причем, нет гарантии, что ты что-то не пропустишь (или автоматом не заменишь название улицы "60 Street" на "70 Street")). Чтобы облегчить себе задачу и избежать таких казусов, существуют те самые константы. Ты объявляешь в разделе констант:
const
TownSpeedLimit = 60;

А потом, если потребуется изменить этот предел, тебе нужно это сделать только в одном месте - причем, оно в начале проги! А если одновремено нужно изменить и предел скорости на автобане - пожалуйта, константа FreewaySpeedLimit на следующей строчке!

Что происходит на самом деле на этапе компиляции (в Pascal)? Реально компилятор НЕ ЗАВОДИТ дополнительную память под константу (как под переменную), а просто подставляет вместо нее ее реальное значение при каждом вхождении. То есть, грубо говоря, скомпилированный код (выполняемый, то есть exe) будет неотличим в вариантах С константами и БЕЗ них.

Я понятно объяснил? По первости может показаться, что это пустая трата времени и тайпинга, но потом увидишь, что константы экономят очень много - как времени, так и всего остального. К тому же, если давать им значащие имена, то это сильно поможет тебе ориентироваться в коде.

В данном случае, константа e - это сокращение от Epsilon. Смысл ее - точность при стравлении действительных чисел. Ты же знаешь, что компьютер производит вычисления с определенной точностью. И в результате вычислений, например, Sqrt(Sqr(3)+Sqr(4)), получится не 5, а типа 5.0000002 или 4.9999997. Эти ответы - правильные. Но если ты будешь проверять их правильность так:
Correct:= Res=5;

- то ты получишь отрицательный ответ (т.е., неправильно). Поэтому нужно сравнивать так:
Correct:= Abs(Res-5)<e;

, где e - это та самая точность.
Именно это я и делаю в функции Aligned при проверке попадания точки на прямую.

Цитата
От роста времени думаю избавиться не удастся, хотя наверное, оптимизировать немного всё же можно, но для меня главное понимание принципа работы подобного алгоритма, а это с успехом достигнуто).
Оч.хор. ))
Попробуешь оптимизировать?

Цитата
И еще небольшой вопросик не совсем в тему: мне необходимо сделать эту задачу на Delphi в визуальной среде, но решила для начала основу отладить в Паскале, а потом перенести всё это в визуальную среду. Не подскажите где можно прочитать про работу с компонентом TImage в Delphi 7? Мне необходимо будет нарисовать все точки, и собственно, сами прямые, которые покрывают все эти точки.
Во первых, компонент TImage тут не совсем при чем.. Для рисования с использованием примитивов (точки, линии..) тебе лучше для начала посмотреть в сторону TCanvas, мне кажется, чтобы прочувствовать все на низком уровне доступа к окну. А где прочитать - думаю, в книжке )). В России книг по Delphi на порядок больше, чем тут, так что конкретнее советовать не буду.

И еще: ты права, это выходит за пределы и темы, и раздела. Создай новую тему в разделе про Delphi, если тебе нужна помощь.

Цитата(-TarasBer- @ 20.04.2011 20:19) *
А разве для быстрого переноса Паскальных программ на Дельфи не придумали модуль, который реализует все процедуры модуля Graph через создание формы нужного размера и рисование на ней?
А зачем? Чтоб растянуть удовольствие? )) Если чел начал изучать Delphi - пусть делает именно это, а не "как в Delphi рисовать _под_TP" ))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Даша   Минимальное множество прямых (рекурсия с возвратом)   17.04.2011 21:13
Lapp   Всем доброго времени суток! Прошу помочь со сл…   18.04.2011 1:36
Даша   Вот это как раз непонятно. Как организовать пере…   18.04.2011 2:10
Lapp   Вот это как раз непонятно. Как организовать перебо…   18.04.2011 10:08
Lapp   Даша, я так понимаю, что у тебя особого прогресса …   19.04.2011 15:41
Даша   Прощу прощения за то что долго не отвечала, не был…   20.04.2011 1:20
Lapp   Прощу прощения за то что долго не отвечала, не был…   20.04.2011 10:03
Lapp   Вот. Выстругал буратинку )). Но снова она мне не …   20.04.2011 12:40
Даша   Еще раз выражаю огромную благодарность :) По коду…   20.04.2011 20:28
-TarasBer-   А разве для быстрого переноса Паскальных программ …   20.04.2011 23:19
Lapp   По коду в принципе всё понятно,Даша, не обижайся, …   21.04.2011 5:47
-TarasBer-   > А зачем? Чтоб растянуть удовольствие? Для бы…   21.04.2011 17:35
Даша   Что же, попробую ответить на ваши вопросы: 1. Что…   21.04.2011 21:13
Lapp   Для быстрого переноса Паскальных программ, и чтобы…   22.04.2011 11:35


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

 





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