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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2013, 07:16   #1
Molodoy hacker
I like Delphi ^_^
Пользователь
 
Аватар для Molodoy hacker
 
Регистрация: 25.09.2010
Сообщений: 46
Вопрос Генератор случайных сочетаний

Привет друзья, вообщем вот такое дело, есть файл содержащий в себе 2 строки. Запись в котором выглядит следующим образом:

Код:
И,Э,О,А,Е,У,ПА,ПЕ,ТЕ,ТИ,ТА,ТО,ТЕ,РЕ,РА,РА,ДЖА,ДЖЕ,ДЖИ,ДЖО,ДЖУ,ДЖАР,ДЖАМ,ДЖЕР,ДЖИЛ,ДЖОР,ДЖ,РО,РЕ,ЖЕ,ЖА,ЖУ,ЖИ,БЕ,БА,БУ,БА,БИ,КА,КА,КУ,КО,КЕ,НО,НУ,НЕ,НА,НУ,НО,МА,МЕ,МИ,МО,МУ,МЮ,ЦЕ,ЦИ,КА

Всё не влезло, встаивл отрывок.
Написал код, код вроди как работает. Но вот выводит не то что нужно.
Нужно что-бы он из файла брал данные так:
Скачало из первой строки берёт случайное сочетание букв, затем со второй строки. После чего их нужно объеденить и сделать переход на новую строку.
Оговорюсь что количество генерируемых комбинаций пользователь записывает в Edit1.

На форме присутствуют такие компаненты:
1 - button (Для старта работы)
1 - Edit (Для определения количества повторений)
1 - Memo (Для вывода результата)

Вот код который у меня под кнопкой:

Код:
procedure TForm1.sButton1Click(Sender: TObject);
var
  s:array[1..2] of string;
  mas1,mas2:array[1..1000] of string;
  st1,st2,str,k,a:string;
  i,l,m_num1,m_num2,z,y,с:integer;
  f: TextFile;
begin
  A:=sEdit1.Text;
  Y:=StrToInt(A);
  for с := 0 to Y do
    begin
  AssignFile(f, ExtractFilePath(Application.ExeName)+'dBase\db_ru.txt');
  Reset(f);
  z:=1;
  while not EOF(f) do
  begin
    readln(f,s[z]);
    z:=z+1;
  end;
  CloseFile(f);

  for l:=1 to 50 do
  begin
    m_num1:=1;
    for i:=1 to length(s[1]) do
      if s[1][i]=',' then
        m_num1:=m_num1+1
    else
      mas1[m_num1]:=mas1[m_num1]+s[1][i];

    m_num2:=1;
    for i:=1 to length(s[2]) do
      if s[2][i]=',' then
        m_num2:=m_num2+1
    else
      mas1[m_num2]:=mas1[m_num2]+s[2][i];

    Randomize;
    st1:=mas1[random(m_num1)+1];
    st2:=mas2[random(m_num2)+1];
    sMemo1.Lines.Add(st1+st2+#10#13);
  end;
 end;
end;
А вот что он выводит:


Код:
ДЖОРАИ


ЛАФРАДЛАФРАД


КИГОТКИГОТКИГОТ


АКАКАКАК


ЗУРЕДЗУРЕДЗУРЕДЗУРЕДЗУРЕД


ОМОМОМОМОМОМ


ДЖООДДЖООДДЖООДДЖООДДЖООДДЖООДДЖООД


ЭЙРИКЭЙРИКЭЙРИКЭЙРИКЭЙРИКЭЙРИКЭЙРИКЭЙРИК


ЛИФРЕДЛИФРЕДЛИФРЕДЛИФРЕДЛИФРЕДЛИФРЕДЛИФРЕДЛИФРЕДЛИФРЕД


РЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТ


ОШОШОШОШОШОШОШОШОШОШОШ


ФУЗИГОФУЗИГОФУЗИГОФУЗИГОФУЗИГОФУЗИГОФУЗИГОФУЗИГОФУЗИГОФУЗИГОФУЗИГОФУЗИГО


УВУВУВУВУВУВУВУВУВУВУВУВУВ


ИЗИЗИЗИЗИЗИЗИЗИЗИЗИЗИЗИЗИЗИЗ


РЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТРЕАТ


КАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАРКАКАР


ЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТЖАИТ


БИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭББИЭБ


ЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАДЛАФРАД


РОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГРОСИГ


ФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДАФАМОНДА


ЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕДЛЭФРЕД


РОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙРОЭЙ


ДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКОДУСКО


ОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГОГ


БЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТБЕЭТ


НЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИНЕГАРИ
А вот это должно быть в идеале:

Код:
АРИАР
ОНГБОР
МИРАРА
ТРУДАОН
ОЭКРО
Ну и т.д.
Помогите пожалуйста! Буду очень благодарен и признателен.
Molodoy hacker вне форума Ответить с цитированием
Старый 30.06.2013, 09:22   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ошибка раз:
Код:
m_num2:=1;
    for i:=1 to length(s[2]) do
      if s[2][i]=',' then
        m_num2:=m_num2+1
    else
      mas1[m_num2]:=mas1[m_num2]+s[2][i];
очевидно, что должно быть:
Код:
m_num2:=1;
    for i:=1 to length(s[2]) do
      if s[2][i]=',' then
        m_num2:=m_num2+1
    else
      mas2[m_num2]:=mas2[m_num2]+s[2][i];
ошибка номер 2 (вытекает, кстати, из ошибки номер 3)
в связи с тем, что Вы МНОГОКРАТНО заполняете одни и те же массивы, Вы добавляете текст к тому, что там уже есть!
Запомните, если Вы используете какую-то переменную/массив, то позаботетсь об ИНИЦИЛИЗАЦИИ (заполнении начальными значениями).
в вашем случае это должно выглядеть так:
Код:
    for i:=1 to length(s[1]) do mas1[i] := '';
    for i:=1 to length(s[2]) do mas2[i] := '';

    m_num1:=1;
    for i:=1 to length(s[1]) do
      if s[1][i]=',' then
        m_num1:=m_num1+1
    else
      mas1[m_num1]:=mas1[m_num1]+s[1][i];

    m_num2:=1;
    for i:=1 to length(s[2]) do
      if s[2][i]=',' then
        m_num2:=m_num2+1
    else
      mas2[m_num2]:=mas2[m_num2]+s[2][i];

ошибка номер 3.
выносите чтение файла и заполнение массивов наружу из процедуры клика. (массивы mas1/ms2 нужно сделать свойствами формы или просто сделать глобальным
Зачем Вам каждый раз при клике читать файл и потом ещё в цикле XX раз заполнять исходные массивы?!?!!

ну и последнее. не добавляйте в Мемо дополнительные переводы строки, тогда пустых строк между вашими строчками не будет.
т.е. напишите так:
Код:
sMemo1.Lines.Add(st1+st2);

Последний раз редактировалось Serge_Bliznykov; 30.06.2013 в 09:44.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.06.2013, 09:34   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Для получения случайного сочетания Вы загоняете все сочетания в массив?

А почему бы не сделать так :
Код:
Randomize;
ReadLn (s);
s := s + ',';

i := Random (Length(s)) + 1;

// пляшем дальше
Poma][a вне форума Ответить с цитированием
Старый 30.06.2013, 09:52   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Poma][a
Для получения случайного сочетания Вы загоняете все сочетания в массив?
А почему бы не сделать так :
не понял.
ну пусть в строке s
ДЖА,ДЖЕ,ДЖИ,
ну получили вы "случайный" i = 3 и что это даёт?
я уже молчу, что "тыкая" в строку, распределение попадания будет явно зависеть от длины сочетания. например, если в строке s ДЖАМШУТ,ЛИ, то вероятность того, что i попадёт в первое слово в несколько раз больше, чем вероятность попадания i во второе слово..
Да и зачем всё это нужно, после исправления ошибоко исходный код TC должен вполне адекватно заработать!

p.s. если я не уловил вашу идею, то приношу свои извинения..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.06.2013, 10:05   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
ну получили вы "случайный" i = 3 и что это даёт?
Идем назад, записывая "букофки". Получаем 'ДЖА'
Цитата:
я уже молчу, что "тыкая" в строку, распределение попадания будет явно зависеть от длины сочетания. например, если в строке s ДЖАМШУТ,ЛИ,
Совершенно верно.
Цитата:
Да и зачем всё это нужно, после исправления ошибоко исходный код TC должен вполне адекватно заработать!
Интерес и ничего более.
Цитата:
p.s. если я не уловил вашу идею, то приношу свои извинения..
Нет-нет. Вы совершенно верно уловили идею.
Poma][a вне форума Ответить с цитированием
Старый 30.06.2013, 10:34   #6
Molodoy hacker
I like Delphi ^_^
Пользователь
 
Аватар для Molodoy hacker
 
Регистрация: 25.09.2010
Сообщений: 46
По умолчанию

Serge_Bliznykov, огромное спасибо! Всё получилось!
Molodoy hacker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
генератор случайных чисел lazunit Помощь студентам 1 20.04.2013 10:05
генератор случайных символов alex(21) C# (си шарп) 7 26.02.2013 22:53
Генератор случайных чисел Creativety Фриланс 10 27.12.2010 12:33
C++ генератор случайных чисел sir.andrey Помощь студентам 4 03.09.2010 12:22
генератор случайных чисел на С++ ANTI Общие вопросы C/C++ 20 12.04.2009 13:02