Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
Вика   (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 использовать. Для создания множеств. :о)



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

Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.039 c
3-1090569543
vital
2004-07-23 11:59
2004.08.15
Count and distinct вместе ошибку выдают


3-1090239059
AlexanderSK
2004-07-19 16:10
2004.08.15
dbExpress и InterBase


4-1088622658
DeadMeat
2004-06-30 23:10
2004.08.15
Память и Время


6-1087493000
Said
2004-06-17 21:23
2004.08.15
Отправка файла по сети


14-1090898346
Hooch
2004-07-27 07:19
2004.08.15
delphiplus.org





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский