![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рандомное слово [D7]
Дмитрий © (2009-08-09 14:15:00)Дана строка со словами, нужно выбрать из этих слов рандомное... Как это сделать???
Sha (2009-08-10 15:00:00) [21]Мне было бы стыдно за такой код.
Kolan (2009-08-10 14:58:00) [22]Чтобы коду, Sha, было две строки.
Sha (2009-08-10 14:54:00) [23]> Palladin © (10.08.09 14:44) [18]
Ну это, типа, домашнее задание для самых крутых :)
Кстати, тут придется кое в чем разобраться, чтобы преподу объяснить,
как оно работает. Есть еще небольшой подводный камень, на случай,
если он попросит вынести код в отдельную функцию. Ну, и там мелочи
всякие, вроде финализации.
В общем, на дополнительных вопросах чела реально завалить с этим кодом :)
> Kolan © (10.08.09 14:47) [19]
> TStringList никак не нельзя, надо обязательно извращаться?
Вот это как раз и есть извращение.
Зачем формировать много строк, когда нужна только одна?
Kolan (2009-08-10 14:47:00) [24]
TStringListникак не нельзя, надо обязательно извращаться?
Palladin (2009-08-10 14:44:00) [25]а буква Ё, а дефис? ;) и эти люди говорят что у меня зело сложно ;)
Sha (2009-08-10 14:39:00) [26]Последнее Я должно быть большим
Letters: set of char= ['0'..'9','a'..'z','A'..'Z','а'..'я','А'..'Я'];
Sha (2009-08-10 14:35:00) [27]> 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;
Anatoly Podgoretsky (2009-08-10 13:26:00) [28]Это хорошо что мы успели поймать, а то будущие поколения могут принять это за пример правильного кода и потом матюгаться на delphimaster.ru - что мол за ламеры там сидят.
Johnnnnn (2009-08-10 12:01:00) [29]Согласен, для етого скрипта нужны строки с несколькими словами разделенными именно пробелами. Так бы и сразу ато брысь брысь.
DrPass (2009-08-10 11:53:00) [30]
> 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. Сколько слов найдет твой алгоритм, если скормить ему, например, строку из десятка пробелов?
Этого достаточно?
Anatoly Podgoretsky (2009-08-10 11:52:00) [31]> Johnnnnn (10.08.2009 11:44:11) [11]
Для новичков, но не для менеджеров.
Кроме того выдавая пример ты претендуешь на более высокий статус учителя, на что у тебя знаний не хватает..
Johnnnnn (2009-08-10 11:44:00) [32]Уважаемые праграмисты, это форум для новичков я правильно прочитал? Я написал пример мне сказали брысь вместо того чтобы сказать где я ошибся. Я чето непонимаю если уже начал чтото говорить то говори полностью, посложнее проанализировать емае, еще раз там же написано сверху «Начинающим» почему оно может не работать? Чему там неработать?
DrPass (2009-08-10 11:24:00) [33]
> Johnnnnn (10.08.09 09:06) [9]
> а че его анализировать, я анализирую просто, работает, не
> работает...
А ты попробуй посложнее проанализировать. То, что он у тебя работает - это везение, которое будет далеко не всегда и не у всех.
Johnnnnn (2009-08-10 09:06:00) [34]а че его анализировать, я анализирую просто, работает, не работает... У меня все работает ну или ты хочеш сказать что твой пример с предложением додумать про разделители чемто сильно отличается? Сюда тоже разделители прилепить и все гут будет а так по пробемамслова выделяет. Короче чудак ты на букву м.
Palladin (2009-08-10 09:03:00) [35]а ты сам проанализируй свой бред.. ошибка на ошибке...
Johnnnnn (2009-08-10 08:43:00) [36]хы прикол а че тебе не понравилось просто интересно?
Palladin (2009-08-10 08:30:00) [37]
> [4] Johnnnnn (10.08.09 08:22)
брысь отсюда, советчик фигов...
> [3] KilkennyCat © (10.08.09 01:23)
не вижу ничего сложного... ) разбор строки отдельная тема
Johnnnnn (2009-08-10 08:27:00) [38]if pos(' ',s)=0 then begin
a[i]:=s;
break;
end;
ато последнее не будет попадать
Johnnnnn (2009-08-10 08:22:00) [39]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;
KilkennyCat (2009-08-10 01:23:00) [40]
> Palladin ©
эк ты сложно загнул... я б начинающемк посоветовал загнать все в стрингс с делиметром-пробелом и рандомить индекс.