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

Вниз

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

 
Дмитрий   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.006 c
1-1219300423
Чих-Пых
2008-08-21 10:33
2009.10.11
Вывод на печать каталога


4-1219228987
POP
2008-08-20 14:43
2009.10.11
Интересный баг с COM портом.


2-1249455497
niel
2009-08-05 10:58
2009.10.11
CharPrev


15-1250105371
Холивар
2009-08-12 23:29
2009.10.11
Образование и денежный поток.


2-1249991354
uno-84
2009-08-11 15:49
2009.10.11
Как поместить приложение в службу





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский