Форум: "Основная";
Текущий архив: 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