Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

пересечения диапазонов   Найти похожие ветки 

 
Вика   (2004-07-30 15:29) [0]

Подскажите плиз.
Юзер в форме вводит три даипазона номеров (начальный и конечный номер каждого диапазона), как сделать проверку не содержится ли пересечений или не встречаются ли номера (или единичный номер) одного диапазона в каком-либо другом.
Заранее спасибо.


 
Digitman ©   (2004-07-30 15:31) [1]

предельные границы потенциально вводимых диапазонов известны заранее ?


 
Вика   (2004-07-30 15:38) [2]

3123 до 16746 - общий диапазон всех вводимых номеров.


 
Анонимщик ©   (2004-07-30 15:40) [3]

Да какая разница, есть границы или нет. Ну и вопросы.


 
Digitman ©   (2004-07-30 15:43) [4]


> Анонимщик ©   (30.07.04 15:40) [3]


да вот нет уж ! разница есть ..

можно использовать встроенный языковой механизм операций над множествами


 
Rem   (2004-07-30 16:05) [5]

IsCross := ((D1_Beg <= D2_End) and (D1_End >= D2_Beg)) or
          ((D2_Beg <= D3_End) and (D2_End >= D3_Beg)) or
          ((D1_Beg <= D3_End) and (D1_End >= D3_Beg));


 
Юрий Зотов ©   (2004-07-30 16:07) [6]

Стандартный способ - множества:
if множество1 * множество2 = [] then ... // пересечения нет


 
Анонимщик ©   (2004-07-30 16:12) [7]

Сколько в множестве может быть элементов?
Да и потом, медленно будет, [5] - самый быстрый способ.


 
Rem   (2004-07-30 16:15) [8]

2 Digitman
>>можно использовать встроенный языковой механизм операций над множествами

что вы имеете в виду? кто вам про это сказал, или где вы про это прочитали?


 
Анонимщик ©   (2004-07-30 16:19) [9]

Rem

См. справку по set operators
Но это извращение


 
Юрий Зотов ©   (2004-07-30 16:24) [10]

> Анонимщик ©   (30.07.04 16:12) [7]

> Сколько в множестве может быть элементов?
> Да и потом, медленно будет

Если Вы полагаете, что операция пересечения множеств проверяет вхождение каждого элемента, то Вы ОЧЕНЬ сильно заблуждаетесь.

Это примерно то же самое, что и обыкновенное AND. Выполняется почти мгновенно.


 
Sandman25 ©   (2004-07-30 16:28) [11]

ИМХО проблема не с использованием множества, а его построением.
Ну стало известно, что A=[1..8],
причем 1 - это значение Left, а 8 - значение Right.
Теперь писать
for I := Left to Right do
 Include(A, I);
?


 
Rem   (2004-07-30 16:44) [12]

2 Анонимщик
Спасибо за совет, но я уже читал это когда-то.
И, если память мне не изменяет, то во множестве может быть не более 256 элементов. В Вопросе, как мне показалось, фигурируют другие значения.


 
Юрий Зотов ©   (2004-07-30 16:50) [13]

> Sandman25 ©   (30.07.04 16:28) [11]

A := [Left..Right];
:о)


 
Sandman25 ©   (2004-07-30 16:52) [14]

[13] Юрий Зотов ©   (30.07.04 16:50)

procedure TForm1.bt1Click(Sender: TObject);
var
 A: set of byte;
begin
 A := [StrToInt(Edit1.Text)..StrToInt(Edit2.Text)];
 if 3 in A then
   Caption := "12";
end;

Да, я в шоке... Всегда считал, что это даже не откомпилируется,  а оно работает :)


 
Sandman25 ©   (2004-07-30 16:54) [15]

Кстати, почему-то сработало и при Edit2.Text = "12345", что гораздо больше 255 :)
Хотя, наверное, использовало только младший байт, лень разбираться.


 
KSergey ©   (2004-07-30 16:55) [16]

Люди, все интересно
Но что делать с [12] Rem   (30.07.04 16:44)?


 
default ©   (2004-07-30 16:58) [17]

KSergey ©   (30.07.04 16:55) [16]
на счёт ограничения на 256 элементов?
написать свой класс с произвольным числом элементов
это очень просто


 
Sandman25 ©   (2004-07-30 16:58) [18]

Да, берет младший байт.


 
Rem   (2004-07-30 16:59) [19]

[6], [11], [13], [14]...

Классика www.delphimaster.ru: Задан вопрос. Дан неверный ответ. Мастера сидят и в ладоши хлопают. Красота!

"Сам играю. Сам танцую." (с)

P.S. Пора переименовывать сайт в www.narciss.ru


 
Rem   (2004-07-30 17:01) [20]

2 KSergey
 см. [5]


 
Sandman25 ©   (2004-07-30 17:04) [21]

[19] Rem   (30.07.04 16:59)

Знаете, я заметил Ваши ответы во многих других ветках, и мне очень понравился уровень Ваших знаний. Но вот чего я не понимаю, так это:
1) Почему Вы считаете, что я мастер? (посты 11, 13 и 14 мои)
2) Почему Вы считаете, что я пытаюсь ответить на вопрос автора анкеты?
3) Неужели Вам непонятно, что я открыл для себя нечто новое и интересное? То, что это должно было быть в другой ветке, в данном случае неважно.


 
Sandman25 ©   (2004-07-30 17:05) [22]

Вру, [13] не мой :)


 
KSergey ©   (2004-07-30 17:10) [23]

> [17] default ©   (30.07.04 16:58)
> KSergey ©   (30.07.04 16:55) [16]
> на счёт ограничения на 256 элементов?
> написать свой класс с произвольным числом элементов
> это очень просто

А кратенько для мееня можно? Особенно как это соотнести со стандартными множествами. И при чем тут вообще класс?
Я не грублю, я весь в непонятках... Ну не могли же Digitman и ЮЗ на столько заблуждаться... (обманывать? ;)


 
Юрий Зотов ©   (2004-07-30 17:15) [24]

> Rem   (30.07.04 16:59) [19]

Скажите, а Вы в [13]-[15] ничего странного не замечаете? Ведь, по идее, и правда даже откомпилироваться было не должно. А оно не только компилируется, но еще и работает, причем даже и с явно неправильными числами? Что это? Почему? Баг? Или нет?

Разве это не важнее и не интереснее, чем детский вопрос, на который Вами же уже давныи-давно был дан ответ?


 
Romkin ©   (2004-07-30 17:18) [25]

Пересечение диапазонов:
1. Упорядочить диапазоны по возрастанию нижних границ.
2. Если после этого нижняя граница диапазона не больше верхней границы предыдущего диапазона - есть пересечение


 
Sandman25 ©   (2004-07-30 17:21) [26]

var
 B: Word;
begin
 B := 257;
 ShowMessage(IntToStr(Ord(B in [B])));
 ShowMessage(IntToStr(Ord(B-256 in [B])))
end;

выводит 0 и 1. Именно в таком порядке :)


 
Rem   (2004-07-30 17:25) [27]

2 [21]
1. Все мастера. Каждый в своем.
2. Мне так показалось по контексту.
3. Прошу прощения.

2 [22]
 А мне так импонировало число 13! :)


 
Sandman25 ©   (2004-07-30 17:28) [28]

[27] Rem   (30.07.04 17:25)

У меня это вообще любимое число. Наверное, поэтому и присвоил :)
[/Offtop]


 
Rem   (2004-07-30 17:38) [29]

2 [24]

var
 b: byte;
 i: integer;
begin
 b := 100;
 i := 300;
 b := b + i;
end;


Это тоже странно?


 
Анонимщик ©   (2004-07-30 17:41) [30]

Ладно, давайте разберемся.
Первый вопрос - где в памяти и в каком виде хранится переменная типа "множество"?


 
Sandman25 ©   (2004-07-30 17:43) [31]

32 байта. Каждый бит отвечает за 1 элемент.


 
Анонимщик ©   (2004-07-30 17:44) [32]

Что значит "отвечает"?


 
Sandman25 ©   (2004-07-30 17:45) [33]

Байты нумеруются слева направо, биты справа налево. То есть
[11] хранится как $00 08 00 00...


 
Sandman25 ©   (2004-07-30 17:46) [34]

[32] Анонимщик ©   (30.07.04 17:44)

Вы серьезно спрашиваете?


 
Юрий Зотов ©   (2004-07-30 17:50) [35]

> Rem   (30.07.04 17:38) [29]

Нет, это не странно. Компилятор заранее не может знать значений b и i, поэтому такой код он допускает, а ошибки не возникает потому что отключены проверки.

А в [14]-[15] ситуация другая.


 
Sandman25 ©   (2004-07-30 17:52) [36]

[35] Юрий Зотов ©   (30.07.04 17:50)

Кстати, ни range checking, ни overflow checking ошибку не обнаруживают.


 
Sandman25 ©   (2004-07-30 17:54) [37]

Забыл сделать build. range checking все-таки ловит ошибку.


 
Rem   (2004-07-30 18:03) [38]

В [14], [15] та же самая ситуация. Компилятор не знает значений StrToInt(Edit1.Text) и StrToInt(Edit2.Text), поэтому такой код он допускает, а при включенных проверках возникает "Range check error".


 
Юрий Зотов ©   (2004-07-30 18:05) [39]

Что ж, уговорили...
:о)


 
Ega23 ©   (2004-07-30 18:06) [40]

Гы. LISP использовать. Для создания множеств. :о)


 
Rem   (2004-07-30 18:17) [41]

2 [23]

- разработать механизм хранения множеств (например, для integer)
- реализовать его в классе
- реализовать набор методов оперирования и взаимодействия с другими множествами (как этого класса, так и стандартными)
- назвать класс TIntegerSet :)


 
pasha_golub ©   (2004-07-30 18:51) [42]

Rem   (30.07.04 18:17) [41]

- разработать механизм хранения множеств


А чего его реализовывать? По-моему, очевидно. Только расширить для интеджер.

А про класс, абсолютно согласен. Вполне здравая мысль.


 
Rem   (2004-07-30 19:23) [43]

2 [42]
set of integer = [0..4294967295]
Для хранения 1 множества получим 536870912 байта.
Итого, приводя к "удобоваримому" виду, 512 мегабайт.
Не много ли?
Я думаю, проще будет хранить список диапазонов, входящих в множество.


 
default ©   (2004-07-30 22:13) [44]

KSergey ©   (30.07.04 17:10) [23]
ничего особенного я не сказал
ЛИШЬ то что ограничение в 256 элементов можно ликвидировать реализовал ту же работу с множествами какую предоставляют средства Delphi, но самому, в принципе, конечно, это не обязательно должен быть класс, но пользоваться классом чем отдельными подпрограммами будет удобней
вот и всё
ничего из сказанном не противоречит постам указанных авторов



Страницы: 1 2 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.024 c
1-1091030683
Bloody-Wolf
2004-07-28 20:04
2004.08.15
Определение имени диска


1-1091092881
Jakut
2004-07-29 13:21
2004.08.15
TreeView


1-1091373454
Studentik
2004-08-01 19:17
2004.08.15
Как подключить *.chm?


1-1091100666
Slaga
2004-07-29 15:31
2004.08.15
Имя процедуры функции внутри себя ...


4-1089018871
dellax
2004-07-05 13:14
2004.08.15
Эмулирование нажатия клавиш