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

Вниз

Рандомное слово   Найти похожие ветки 

 
Дмитрий   (2009-08-09 14:15) [0]

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


 
Palladin ©   (2009-08-09 14:20) [1]

Var
 b,e,n:Integer;

n:=Random(Length(s)-1)+1;
b:=n; While (b>=1) and not (s[b] in разделители) Do Dec(b);
e:=n; While (e<=Length(s)) and not (s[e] in разделители) Do Inc(e);
ShowMessage(Copy(s,b,Length(s)-e+1));


 
Palladin ©   (2009-08-09 14:22) [2]

Домашняя работа: Обработать случай попадания в разделитель


 
KilkennyCat ©   (2009-08-10 01:23) [3]


> Palladin ©

эк ты сложно загнул... я б начинающемк посоветовал загнать все в стрингс с делиметром-пробелом и рандомить индекс.


 
Johnnnnn   (2009-08-10 08:22) [4]

procedure TForm1.Button1Click(Sender: TObject);
var
i, i1:integer;
s:string;
a:array of string;
begin
s:=edit1.Text;
setlength(a,length(s));
for i:=0 to length(s) do begin
if pos(" ",s)=0 then break;
a[i]:=copy(s,1,pos(" ",s)-1);
delete(s,1,pos(" ",s));
end;
i1:=random(i);
label1.caption:=a[i1];

end;
initialization
randomize;


 
Johnnnnn   (2009-08-10 08:27) [5]

if pos(" ",s)=0 then begin
a[i]:=s;
break;
end;

ато последнее не будет попадать


 
Palladin ©   (2009-08-10 08:30) [6]


> [4] Johnnnnn   (10.08.09 08:22)

брысь отсюда, советчик фигов...


> [3] KilkennyCat ©   (10.08.09 01:23)

не вижу ничего сложного... ) разбор строки отдельная тема


 
Johnnnnn   (2009-08-10 08:43) [7]

хы прикол а че тебе не понравилось просто интересно?


 
Palladin ©   (2009-08-10 09:03) [8]

а ты сам проанализируй свой бред.. ошибка на ошибке...


 
Johnnnnn   (2009-08-10 09:06) [9]

а че его анализировать, я анализирую просто, работает, не работает... У меня все работает ну или ты хочеш сказать что твой пример с предложением додумать про разделители чемто сильно отличается? Сюда тоже разделители прилепить и все гут будет а так по пробемамслова выделяет. Короче чудак ты на букву м.


 
DrPass ©   (2009-08-10 11:24) [10]


> Johnnnnn   (10.08.09 09:06) [9]
> а че его анализировать, я анализирую просто, работает, не
> работает...

А ты попробуй посложнее проанализировать. То, что он у тебя работает - это везение, которое будет далеко не всегда и не у всех.


 
Johnnnnn   (2009-08-10 11:44) [11]

Уважаемые праграмисты, это форум для новичков я правильно прочитал? Я написал пример мне сказали брысь вместо того чтобы сказать где я ошибся. Я чето непонимаю если уже начал чтото говорить то говори полностью, посложнее проанализировать емае, еще раз там же написано сверху «Начинающим» почему оно может не работать? Чему там неработать?


 
Anatoly Podgoretsky ©   (2009-08-10 11:52) [12]

> Johnnnnn  (10.08.2009 11:44:11)  [11]

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


 
DrPass ©   (2009-08-10 11:53) [13]


> Johnnnnn   (10.08.09 11:44) [11]

1. for i:=0 to length(s) do... Этот цикл сделает на 1 итерацию больше, чем выделено элементов в массиве a. Потенциально - AV
2. delete(s,1,pos(" ",s) - тут ты укорачиваешь строку прямо в цикле. Таким образом, она закончится раньше, чем закончится цикл. Ведь в for i:=0 to length(s) do длина строки считается всего один раз в самом начале
3. Сколько слов найдет твой алгоритм, если скормить ему, например, строку из десятка пробелов?

Этого достаточно?


 
Johnnnnn   (2009-08-10 12:01) [14]

Согласен, для етого скрипта нужны строки с несколькими словами разделенными именно пробелами. Так бы и сразу ато брысь брысь.


 
Anatoly Podgoretsky ©   (2009-08-10 13:26) [15]

Это хорошо что мы успели поймать, а то будущие поколения могут принять это за пример правильного кода и потом матюгаться на delphimaster.ru - что мол за ламеры там сидят.


 
Sha ©   (2009-08-10 14:35) [16]

> Anatoly Podgoretsky ©   (10.08.09 13:26) [15]

ща поправим :)


procedure TForm1.FormCreate(Sender: TObject);
begin;
 Randomize;
 end;

//Дана строка со словами, нужно выбрать из этих слов рандомное...
procedure TForm1.Button1Click(Sender: TObject);
const
 Letters: set of char= ["0".."9","a".."z","A".."Z","а".."я","А".."я"];
var
 s, Res: string;
 Found: array of integer;
 Cur, Len, Count, Rnd: integer;
 Delim: boolean;
begin;
 s:=Edit1.Text;
 Len:=Length(s);
 SetLength(Found, (Len+1) div 2);
 Count:=0;
 Delim:=true;
 for Cur:=1 to Len do begin;
   if not (s[Cur] in Letters) then Delim:=true
   else if Delim then begin;
     Delim:=false;
     Found[Count]:=Cur;
     inc(Count);
     end;
   end;
 if Count>0 then begin;
   Rnd:=Random(Count);
   Cur:=Found[Rnd];
   while (s[Cur] in Letters) and (Cur<=Len) do inc(Cur);
   SetString(Res,pchar(integer(s)+Found[Rnd]-1),Cur-Found[Rnd]);
   end;
 Edit2.Text:=Res;
 end;


 
Sha ©   (2009-08-10 14:39) [17]

Последнее Я должно быть большим

  Letters: set of char= ["0".."9","a".."z","A".."Z","а".."я","А".."Я"];


 
Palladin ©   (2009-08-10 14:44) [18]

а буква Ё, а дефис? ;) и эти люди говорят что у меня зело сложно ;)


 
Kolan ©   (2009-08-10 14:47) [19]

TStringList никак не нельзя, надо обязательно извращаться?


 
Sha ©   (2009-08-10 14:54) [20]

> Palladin ©   (10.08.09 14:44) [18]

Ну это, типа, домашнее задание для самых крутых :)
Кстати, тут придется кое в чем разобраться, чтобы преподу объяснить,
как оно работает. Есть еще небольшой подводный камень, на случай,
если он попросит вынести код в отдельную функцию. Ну, и там мелочи
всякие, вроде финализации.
В общем, на дополнительных вопросах чела реально завалить с этим кодом :)  

> Kolan ©   (10.08.09 14:47) [19]
> TStringList никак не нельзя, надо обязательно извращаться?

Вот это как раз и есть извращение.
Зачем формировать много строк, когда нужна только одна?


 
Kolan ©   (2009-08-10 14:58) [21]

Чтобы коду, Sha, было две строки.


 
Sha ©   (2009-08-10 15:00) [22]

Мне было бы стыдно за такой код.


 
Kolan ©   (2009-08-10 15:08) [23]

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


 
Kolan ©   (2009-08-10 15:09) [24]

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


 
Anatoly Podgoretsky ©   (2009-08-10 15:15) [25]

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

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


 
Sha ©   (2009-08-10 15:16) [26]

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

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

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

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


 
Leonid Troyanovsky ©   (2009-08-10 15:24) [27]


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

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

Надо ExtractStrings function.

--
Regards, LVT.


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


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

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

Моё решения для сабжа было бы простым. Я бы взял модуль 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/


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

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

>Letters: set of char

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


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


> Kolan ©

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

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


 
Sha ©   (2009-08-10 16:02) [31]

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

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

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

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

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

Доработай.

----

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

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

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

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


 
Anatoly Podgoretsky ©   (2009-08-10 16:03) [32]

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

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


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


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

)

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


 
KilkennyCat ©   (2009-08-10 16:06) [34]


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

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


 
KilkennyCat ©   (2009-08-10 16:07) [35]


> байт.

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


 
Anatoly Podgoretsky ©   (2009-08-10 16:13) [36]

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

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


 
Kolan ©   (2009-08-10 16:20) [37]


> Доработай.

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


 
Sha ©   (2009-08-10 16:23) [38]

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


 
KilkennyCat ©   (2009-08-10 16:29) [39]


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

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


 
Anatoly Podgoretsky ©   (2009-08-10 16:31) [40]

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



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

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

Наверх




Память: 0.57 MB
Время: 0.014 c
4-1219219075
ZeBriD
2008-08-20 11:57
2009.10.11
Закрытый ключ шифрования в хранилище Windows XP


15-1246604362
Rule
2009-07-03 10:59
2009.10.11
Пользователи Стрима отзовитесь :-)


15-1249457425
@!!ex
2009-08-05 11:30
2009.10.11
Напишите прокси за денежку.


15-1249638768
desc
2009-08-07 13:52
2009.10.11
Домены net, ru, info...


1-1218792099
Dr.Andrew
2008-08-15 13:21
2009.10.11
Как изменить вид ползунка у компонента таскбара (TTackBar)?