Форум: "Начинающим";
Текущий архив: 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","а".."я","А".."я"];
говорит о том, что возможно текст на немецком с диакритическими знаками или текст, записанный по правилам дореволюціонной орѳограф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