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) 

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


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 ©

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


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

Наверх

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