Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рандомное слово [D7]


Страницы:   1 2 3

Дмитрий ©   (2009-08-09 14:15:00) 

Дана строка со словами, нужно выбрать из этих слов рандомное... Как это сделать???


KilkennyCat   (2009-08-10 18:50:00) [1]


> Palladin © (10.08.09 17:04) [41]

дык это ты так видишь :)
а я вижу - алфавит.


Palladin   (2009-08-10 17:04:00) [2]


> [34] KilkennyCat ©   (10.08.09 16:06)

дык... диапазоносочетание 'a'..'я' это всего лишь вид записи диапазона 34..76 к примеру...


Anatoly Podgoretsky   (2009-08-10 16:31:00) [3]

Влом или в западло.


KilkennyCat   (2009-08-10 16:29:00) [4]


> Anatoly Podgoretsky © (10.08.09 16:13) [36]

а чем это мешает? Вот где-то они лишнее додумывают, а вот алфавит весь сообразить им влом...


Sha   (2009-08-10 16:23:00) [5]

И ошибку исправь


Kolan   (2009-08-10 16:20:00) [6]


> Доработай.

SplitRegExpr('\s+', Edit1.Text, Strings);
Так? :)


Anatoly Podgoretsky   (2009-08-10 16:13:00) [7]

> KilkennyCat  (10.08.2009 16:06:34)  [34]

Для ординалов то?


KilkennyCat   (2009-08-10 16:07:00) [8]


> байт.

Точнее, элемент. Раз уж теперь все юникодное...


KilkennyCat   (2009-08-10 16:06:00) [9]


> Palladin © (10.08.09 16:04) [33]

Это я знаю, я просто думал, что компилятор соптимизирует и включит непоследовательный байт.


Palladin   (2009-08-10 16:04:00) [10]


> [30] KilkennyCat ©   (10.08.09 16:00)

)

ShowMessage('Это а:'+IntToStr(Byte('а'))+#13#10'Это я:'+IntToStr(Byte('я'))+#13#10+'А это ё:'+IntToStr(Byte('ё'))+#13#10#227#251);


Anatoly Podgoretsky   (2009-08-10 16:03:00) [11]

> Kolan  (10.08.2009 15:26:28)  [28]

Ну было же сказано, что для Юникод другие решения.


Sha   (2009-08-10 16:02:00) [12]

> Kolan ©   (10.08.09 15:26) [28]
> Расширьте для китайского языка для примера, пожалуйста.

Прочти [26] еще раз.

> Моё решения для сабжа было бы простым...

В твоем решении предусмотрен только один разделитель - пробел.

> Регулярное выражение можно доработать как угодно.

Доработай.

----

Я понимаю, конечно, что это учебный пример.

На практике подобных задачах для меня часто были важны две вещи:
1. Удобство в понимании того, что есть слово. С этой точки зрения, если только речь не идет о юникоде, проще задать символы слов, а не разделители, хотя, конечно это вещи эквивалентные для компьютера, но не для человека.
2. Скорость работы с большими текстами.

Именно на этими вещами я хотел поделиться.
Думаю, чем скорее наши студенты отучатся всюду совать TStringList и TMemo, тем лучше.

P.S. Moe решение, конечно, намного быстрее решения, основанного на TSringList, но не претендует на звание самого быстрого.


KilkennyCat   (2009-08-10 16:00:00) [13]


> Kolan ©

ну я изначально такое предложил :)

А разве буква Ё не попадает в a..Я ?


Дмитрий Белькевич   (2009-08-10 15:39:00) [14]

1. Сделать, или взять готовую (rx, jedi) функции GetWordCount, GetWordByIndex (называются, вероятно, по-другому, что-то с 'word' связанное будет).
2. В GetWordByIndex передать рандомное число от 1 до GetWordCount.
3. Profit.

>Letters: set of char

ИМХО разумнее задавать не литеры, которых много (особенно в юникоде), а разделители, которые более однообразны.


Kolan   (2009-08-10 15:26:00) [15]


> Ничто не мешает расширить набор символов, которые мы считаем
> буквами.

Расширьте для китайского языка для примера, пожалуйста.

Моё решения для сабжа было бы простым. Я бы взял модуль TRegExp и использовал бы метод Split.

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 Strings: TStrings;
begin
 Strings := TStringList.Create;
 try
   SplitRegExpr(' ', Edit1.Text, Strings);
   Edit2.Text := Strings[Random(Strings.Count)];
 finally
   Strings.Free;
 end;
end;


Регулярное выражение можно доработать как угодно.

http://regexpstudio.com/


Leonid Troyanovsky   (2009-08-10 15:24:00) [16]


> Kolan ©   (10.08.09 14:47) [19]

> TStringList никак не нельзя

Надо ExtractStrings function.

--
Regards, LVT.


Sha   (2009-08-10 15:16:00) [17]

> Kolan ©   (10.08.09 15:08) [23]

Именно эта строка позволяет легко сопровождать код.
Ничто не мешает расширить набор символов, которые мы считаем буквами.
Если это не устраивает, можно использовать набор разделителей - изменения в коде тривиальны.

> Вам бы было стыдно за простой код?

Он только с виду простой. На самом деле тормознутый и не сопровождаемый.


Anatoly Podgoretsky   (2009-08-10 15:15:00) [18]

> Kolan  (10.08.2009 15:08:23)  [23]

Это будет работать правильно с соответствии со множеством, дл Юникода нужны другие решения. Другое дело с дефисом, если в качестве него будет использоваться одинаковый с тире код.
Соств множества может быть и более расширеным.


Kolan   (2009-08-10 15:09:00) [19]

Вам бы было стыдно за простой код?


Kolan   (2009-08-10 15:08:00) [20]

Я, Sha, ваш код не изучал, для того, чтобы его понять мне надо его запустить, но строка Letters: set of char= ['0'..'9','a'..'z','A'..'Z','а'..'я','А'..'я'];говорит о том, что возможнотекст на немецком с диакритическими знаками или текст, записанный по правилам дореволюціонной орѳографiи будет обрабатываться не корректно. Я прав?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо