Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2010, 14:12   #1
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию Delphi. Посимвольное раскидывание string'а по кнопкам.

Итак. Раз уж я студентка... Хотя прогу и не для зачета пишу, а для друга... Но в общем к делу.

Возникла задачка:
Раскидать определенную строку по Caption'ам кнопок в случайном порядке. Что-то я тут написала, и вроде бы правильно должно работать. Но, как водится, результат выходит совсем не такой, каким его ожидаешь)))
Вот:
Код:
var
  CurWord: string;
  LoW, c: integer;
begin
CurWord:=AdoTable1.Fields[1].Value;
LoW:=length(CurWord);

for i:=1 to LoW do
begin
  {куча операторов со свойствами создаваемых кнопок}
  c:=random(LoW)+2-i;
  b.Caption:=CurWord[c];
  Delete(CurWord, c, 1);
end;
Предполагается, что:
1) в "с" выпадает случайная позиция символа в строке CurWord.
По скольку рандом включает 0, то прибавляется 1, дабы не было ошибков с индексами в строке.
Также по скольку длина CurWord по идее уменьшается после каждого п. 3, то я вычитаю i из "рандома".
2) b.Caption присваивается этот символ;
3) из CurWord удаляется этот символ. Тут, на сколько я понимаю, CurWord должна стать короче.

В результате работы получаются несколько кнопок с пустыми названиями, иногда со странными символами, и т.п. лаги. Где может быть ошибка?
Риндера вне форума Ответить с цитированием
Старый 08.11.2010, 14:17   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

А зачем уменьшать строку.
Пусть есть определенная строка. Представьте что это массив символов. Вы просто должны читать элемент массива со случайным индексом.
Цитата:
{куча операторов со свойствами создаваемых кнопок}
Вы в данном цикле еще и кнопке создаете? Если нет, то это должно быть вынесено отдельно в процедуру или функцию, дабы не засорять себе мозг при разборе алгоритма со строкой.

Цитата:
Я ваша совесть
Я думал что Вы гораздо мельче .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 08.11.2010, 14:23   #3
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
А зачем уменьшать строку.
Я думаю, что если не уменьшать строку, то могут выпасть повторяющиеся индексы, а этого совсем не нужно.
Риндера вне форума Ответить с цитированием
Старый 08.11.2010, 14:27   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Риндера Посмотреть сообщение
Я думаю, что если не уменьшать строку, то могут выпасть повторяющиеся индексы, а этого совсем не нужно.
Изначально в задании этого не было...
Тогда Ваша ошибка в следующем - Вы занесли в цикл максимальную длину строку, не учитывая, что она каждый раз становится меньше. Для этого нужно использовать цикл while с условием что длина строки больше нуля....
В частности
Цитата:
c:=random(LoW)+2-i;
LoW постоянная величина, но длина строки, каждый раз меньше и меньше....
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 08.11.2010 в 14:30.
Utkin вне форума Ответить с цитированием
Старый 08.11.2010, 14:29   #5
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Изначально в задании этого не было...
Мне показалось, что это разумеется ^_^"
Но вопрос остался - работает не правильно)
Риндера вне форума Ответить с цитированием
Старый 08.11.2010, 14:32   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не проще ли:
Код:
for i:=Length(CurWord) downto 1 do
begin
  {куча операторов со свойствами создаваемых кнопок}
  c:=random(Length(CurWord));
  b.Caption:=CurWord[c];
  Delete(CurWord, c, 1);
end;
I'm learning to live...

Последний раз редактировалось Stilet; 08.11.2010 в 14:35.
Stilet вне форума Ответить с цитированием
Старый 08.11.2010, 14:39   #7
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Хм...) Stilet, мне кажется, или это то же самое, только с downto?)))) Ну сейчас попробую..)

Upd. Ничего не изменилось. В тесте:
слово из 8 букв, на форме получилось - 2 кнопки пустые, 6 подписаны.
слово из 4 букв, на форме - 1 пустая, 3 подписаны.
слово из 11 букв, на форме - 4 пустых, 7 подписаны.

Последний раз редактировалось Риндера; 08.11.2010 в 14:44.
Риндера вне форума Ответить с цитированием
Старый 08.11.2010, 15:11   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Риндера
в коде от Stilet я не вижу косяков.
Ан нет, вижу! строки от единицы нумеруются, а random от нуля возвращает!!

Скажите, а Вы можете код дать целиком?
думаю, что на 99% проблема в том, как Вы получаете i-ю кнопку (я выделил):
Цитата:
Код:
for i:=Length(CurWord) downto 1 do
begin
  {куча операторов со свойствами создаваемых кнопок}
  c:=random(Length(CurWord))+1;
  b.Caption:=CurWord[c];
  Delete(CurWord, c, 1);
end;

Последний раз редактировалось Serge_Bliznykov; 08.11.2010 в 15:17.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.11.2010, 15:19   #9
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Serge_Bliznykov, спасибо за замечание про нолик в рандоме!
Не знаю каким чудом, но с
Код:
c:=random(Length(CurWord))+1;
работает как нужно! Спасибо всем большое!
Риндера вне форума Ответить с цитированием
Старый 08.11.2010, 15:21   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Точно? А может лучше:
Код:
c:=random(Length(CurWord-1))+1;
Ну чисто на всякий случай, или я напутал?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в файле string'а Aries Помощь студентам 1 21.10.2010 20:33
Вопрос по кнопкам... Han_Nik Помощь студентам 4 19.05.2010 20:41
таблица транспартировка раскидывание по листам макрос marc-nikita Microsoft Office Excel 6 12.11.2009 18:15
посимвольное считывание DeFace Общие вопросы C/C++ 4 05.04.2009 23:11
пара вопросов по кнопкам grey Помощь студентам 4 11.11.2007 19:09