(решено) Оператор in - вопрос

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

(решено) Оператор in - вопрос

Сообщение vitaly_l » 03.09.2015 23:05:50

Всем хорошего дня.
( в поиске IN найти очень сложно, не ругайтесь пожалуйста )

if ('a' in ['b','c','d']) then ... <== вот так работает.
if ('aq' in ['bq','cq','dq']) then ... <== вот так уже не работает(ругается).
if ('sdfgs' in arraySomeStrings ) then ... <== вот так тоже не работает(ругается).

В оператор in можно ли сверять массив?
В оператор in можно ли сверять строки, как в MySQL или только char?
Или я вообще неправильно его пытаюсь использовать и там сверяется что-то другое?
спасибо.
Последний раз редактировалось vitaly_l 05.09.2015 21:14:42, всего редактировалось 2 раз(а).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Оператор in - вопрос

Сообщение pupsik » 03.09.2015 23:15:49

А что в вашем понимании "сверяется"?
Если сравнение то это описано и в книгах, и на просторах (comparestr)). Если вам необходим поиск то и сие аналогично (pos).
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Оператор in - вопрос

Сообщение vitaly_l » 03.09.2015 23:37:40

pupsik писал(а):А что в вашем понимании "сверяется"?

Ну в первом примере он проверяет есть ли 'a' в массиве ['b','c','d'] (точнее я думал что это массив, но оказалось что массив туда нельзя подгрузить)
Туда что-нить кроме букв (char) можно вносить? Массив?
Вот ещё методом тыка нашел работает с цифрами if (12 in [225,325,452]) then но предупреждает про 325,452...
Паскалевский IN только от 0 - 255 сверяет? Да?

Добавлено спустя 1 минуту 14 секунд:
Что можно класть на "весы", что там может быть справа и слева?

Добавлено спустя 1 минуту 42 секунды:
А ещё вот так можно видел где-то... iN (12 in [0..255]) then
А мне хочется там строки и массивы сравнить или хотя-бы цифры, точнее id .

Добавлено спустя 3 минуты 7 секунд:
Или точнее ЛЮБОЕ что-то, что можно создавать/менять динамически. А то здесь всё задаётся жёстко.
чтобы примерно так получилось:
if id in arrayOfId then ...
А arrayOfId - всегда меняется... и соответственно id тоже (по принципу MySQL)
Последний раз редактировалось vitaly_l 05.09.2015 17:39:10, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Оператор in - вопрос

Сообщение Ichthyander » 04.09.2015 01:01:34

Оператор in проверяет есть элемент A в множестве B, то есть A in B
В первом случае 'a' есть элемент множества char. Во втором и третьем элементы - строки. Во втором посте элемент 12 - элемент целочисленного множества.
Оператор in на массивах не работает

Добавлено спустя 6 минут 39 секунд:
Туда что-нить кроме букв (char) можно вносить? Массив?

То есть туда можно вносить все, что может быть множеством согласно Pascal
А ещё вот так можно видел где-то... if (12 in [0..255]) then

[0..255] означает множество, в котором "включены" все числа от 0 до 255
Или точнее ЛЮБОЕ что-то, что можно создавать/менять динамически. А то здесь всё задаётся жёстко.
чтобы примерно так получилось:
if id in arrayOfId then ...
А arrayOfId - всегда меняется... и соответственно id тоже (по принципу MySQL

Можно задать тип множества
TMySet=set of Byte, set of char или set of TEnum, где TEnum определенное Вами перечислимое. К примеру, TEnum = (enumFirst, enumSecond...)
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Оператор in - вопрос

Сообщение vitaly_l » 04.09.2015 01:09:26

Ichthyander писал(а):Во втором и третьем элементы - строки.


Добавлено спустя 12 минут 24 секунды:
Нет.. всё равно строку он не даёт вставить в множество. Только byte или char или свой набор.
строку он мне не даёт проверять в множестве... Компилятор ругается, F9 не запускает...
Код: Выделить всё

type
TMyEnumStr = set of string;
TMyEnumInt = set of integer;


Я чего-то не так делаю? или ему запрещено больше байта?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Оператор in - вопрос

Сообщение Ichthyander » 04.09.2015 06:11:43

Integer не может быть множеством (слишком диапазон большой для этого).
Наборы строк непосредственно также не могут быть множеством. В своем первом посте, где я написал во втором и третьем случае строки это означало, что во втором и третьем случае именно строки, а не множества. Просто меня не так поняли: для меня строки уже естественным образом не являются множеством, поэтому не уточнил )
Но если Вам просто нужны именованные множества, то можно сделать так, как я описал выше, присвоив элементам множества осмысленные названия, к примеру, перечислимый метод цветов: TMyEnum=(enumRed, enumGreen, enumBrown).
Если же нужны именно строки, то выход также есть. К примеру:
Код: Выделить всё
type
    TMyEnumColor=(enumRed, enumGreen, enumBrown...);
    TColorStringArray=array[TEnumColor] of String;
    TColorSet=set of TMyEnumColor;
const
    AColors:TColorStringArray = ['Red', 'Green', 'Brown'...]


Добавлено спустя 16 минут 46 секунд:
vitaly_l писал(а):Я чего-то не так делаю? или ему запрещено больше байта?.

Да, если не ошибаюсь, 255 элементов являются ограничением множества. Но как правило для множество больше и не надо
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Оператор in - вопрос

Сообщение Снег Север » 04.09.2015 08:05:37

Как верно написали выше - во всех версиях Паскаля множества ограничены перечисляемыми типами (читать руководство, что это такое) т.е. 0..255. Строки не могут быть перечисляемыми типами. Символы могут быть - только только в однобайтовой кодировке.

ЗЫ. Если необходимо работать с набором объектов аналогично множеству (включение, объединение, пересечение), то используют дополнительные библиотеки, например, широко известную DeCAL.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2994
Зарегистрирован: 27.11.2007 16:14:47

Re: Оператор in - вопрос

Сообщение vitaly_l » 04.09.2015 13:28:46

Ichthyander писал(а):255 элементов являются ограничением множества. Но как правило для множество больше и не надо

Снег Север писал(а):во всех версиях Паскаля множества ограничены перечисляемыми типами (читать руководство, что это такое) т.е. 0..255.

Снег Север писал(а):используют дополнительные библиотеки, например, широко известную DeCAL.

Я просто подумал что в Паскале IN равнозначен IN в MySQL. Но я ошибся. Там можно динамически набрать много ID и потом при помощи IN выявить и загрузить нужные. Подключать библиотеку - это на мой взгляд здесь лишнее, т.к. можно другими стандартными способами решить задачу.
Большое всем спасибо! Вопрос решён.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) Оператор in - вопрос

Сообщение Снег Север » 05.09.2015 10:54:03

Снег Север писал(а):во всех версиях Паскаля множества ограничены перечисляемыми типами

Оказывается, я неправ - в новой среде разработки PascalABC.NET множества расширили до любого типа, включая строки и классы.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2994
Зарегистрирован: 27.11.2007 16:14:47

Re: (решено) Оператор in - вопрос

Сообщение vitaly_l » 05.09.2015 12:44:02

Снег Север писал(а): в новой среде разработки PascalABC.NET множества расширили до любого типа, включая строки и классы.

Это в Лазарусе есть? Если нет, то нужно ждать, рано или поздно, эту фишечку подключат. Хотя можно попробовать написать разработчикам.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) Оператор in - вопрос

Сообщение Снег Север » 05.09.2015 16:33:29

vitaly_l писал(а):Это в Лазарусе есть?
Нету. PascalABC.NET использует возможности dotnet, там такое реализуется очень просто.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2994
Зарегистрирован: 27.11.2007 16:14:47

Re: (решено) Оператор in - вопрос

Сообщение vitaly_l » 05.09.2015 21:11:16

Вот в другой ветке нарыл, если кому понадобится, вот так с IN работают: и string, и array (может кому понадобится):
Код: Выделить всё

var
  test:string;
  current:char;
  arr: array [0..5] of string;
begin
  test:='Test string?';

  arr[0] := 'edtfg1';
  arr[1] := 'edtfg2';
  arr[2] := 'edtfg3';
  arr[3] := 'edtfg4';
  arr[4] := 'edtfg5';
  arr[5] := 'edtfg6';

  for current in test do SynEdit.lines.Add(current);
  for test in arr do SynEdit.lines.Add(test);
end;                                             



оказалось что для if и для for: in - работает по разному...


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) Оператор in - вопрос

Сообщение Снег Север » 06.09.2015 08:26:29

Какая неожиданность! :lol:
А ничего, что во втором случае нет никакого оператора "in", есть оператор for ... in ... do ? Что принципиально меняет дело? Вас не удивляет, что в числах 130 и 103 0 и 3 имеют совершенно разное значение?
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2994
Зарегистрирован: 27.11.2007 16:14:47


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 3

Рейтинг@Mail.ru