| 
| 
 | Вопрос # 4 897/ вопрос открыт / | 
 |  Здравствуйте!Можете подсказать как лучше реализовать.
 У меня есть программа чтото типа гсч(генератор случайных чисел)
 Есть 2 поля для ввода данных самый слева туда вводить одни данные, и справа туда другие. При нажатии на кнопку(специальную) должно получится такое. В другую Memo должно добавится
 (случайный тип данных из столбца1 '-' Случайный тип данных из столбца 2)
 и так должно всех раскидать, причём ещё нужно сделать проверку что кол-ство строк в 1 столбце равно кол-ву строк во 2
 
|  |   Вопрос задал: Адмирал (статус: Посетитель)Вопрос отправлен: 8 января 2011, 17:16
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 16; последнее сообщение — 10 января 2011, 18:39; участников в обсуждении: 3. 
|   | DNK (статус: Студент), 8 января 2011, 17:39 [#1]: Цитата: Есть 2 поля для ввода данных самый слева туда вводить одни данные, и справа туда другие.Твоя моя не понимай. "Digital Networked Knight" |  
|   | Адмирал (статус: Посетитель), 8 января 2011, 17:54 [#2]:блин ну слева есть Edit1 справа Edit2 |  
|   | mirt.steelwater (статус: Посетитель), 8 января 2011, 18:25 [#3]:как можно вычитать "случайные типы данных"? а если они разные? это из строки вычесть действительное? - нужно делать свое приведение типов и свои операторы вычитания. или же вы ошиблись и имели в виду "случайные данные одного типа".
 если я верно понимаю, то TEdit для хранения набора данных, т.е. в качестве S-BOX лучше не использовать.
 разместите рядом 2 TListBox - в них при инициализации помещаете в цикле по паре значений в каждой итерации - тогда и проверка не нужна. или данные не случайного характера? тогда сделайте так: 2 TEdit, под каждым из них - свой TListBox, где-то кнопка "добавить" - при нажатии будет дополнятся каждый листбокс соответствующим значением из эдита. для извлечения случайной пары нужно просто получить случайный индекс 0..count-1 , где count - кол-во элементов в каждом из s-box-ов
 Ⓐ свобода сопротивление солидарность |  
|   | Адмирал (статус: Посетитель), 8 января 2011, 18:56 [#4]:mirt.steelwater: у меня так и есть вот шаблон программы
 button1 Edit1 Button2 Edit2    Memo3
 Memo1         Memo2
 В мемо1 хванятся одни данные(строка)
 во 2мемо также
 их нужно рандомно раскидать в 3мемо
 |  
|   | Адмирал (статус: Посетитель), 8 января 2011, 18:56 [#5]:блин пробелы не считает |  
|   | mirt.steelwater (статус: Посетитель), 8 января 2011, 19:20 [#6]: +----------+----------+
|   Edit1  |   Edit2  |
+----------+----------+
| ListBox1 | ListBox2 |
+----------+----------+
|        btAdd        |
+---------------------+
|        btCalc       |
+---------------------+
|       edResult      |
+---------------------+ procedure TfmMain.btAddClick (Sender: TObject);
begin
    ListBox1.Items.Add ( Edit1.Text );
    Edit1.Text := '0';
    ListBox2.Items.Add ( Edit2.Text );
    Edit2.Text := '0';
end;
 
procedure TfmMain.btCalcClick (Sender: TObject);
var
    I : Integer;
begin
    I := random ( ListBox1.Count -1 );
    edResult.Text := IntToStr ( StrToInt (ListBox1.Items [I]) - StrToInt (ListBox2.Items [I]) );
end;код примитивен, нет проверок и т.п., но идея должна быть яснаⒶ свобода сопротивление солидарность |  
|   | Адмирал (статус: Посетитель), 8 января 2011, 19:29 [#7]:ладно, будем разбираться, у меня такой вопрос, как в Memo (в коде) указать количество строк, ну для того чтобы random(memo1.количество строк -1) что вместо кол-ства строк? |  
|   | mirt.steelwater (статус: Посетитель), 8 января 2011, 22:12 [#8]:не рекомендую использовать TMemo вообще правильно хранить данные в спец. списке, своего класса, на крайний случай в массиве, но не в компонентах в строковом виде - они нужны только для отображения. но если не передумал, то ответ на твой вопрос: Memo1.Lines.Count-1
 Ⓐ свобода сопротивление солидарность |  
|   | Адмирал (статус: Посетитель), 9 января 2011, 07:46 [#9]:mirt.steelwater: спасибо, с этим разобрался, теперь есть ли такой тип переменной, в которую можно просто заносить числа не скалдывать ничего, а просто чтобы они там все через , были и можно было сделать проверку на одно из чисел? |  
|   | Адмирал (статус: Посетитель), 9 января 2011, 14:58 [#10]:Ну вот смотрите, есть ли такой тип переменных, в который можно занести число, не заменить число, а добавить число, например I:=32
 а дальше например цикл
 for A:=1to Memo1.Lines.Count
 а вот сюда зановить в переменную каждое из значений А от 1 до конца
 Add I to A
 чтобы в переменной было чтото типо такого
 I:= 1,2,3,4,5,6,7,8,...
 |  
|   | mirt.steelwater (статус: Посетитель), 9 января 2011, 15:57 [#11]:формализируй вопрос ничего не понял
 зачем тебе в переменной цикла хранить через запятую числа? или это другая переменная? вообще есть такая весчЪ как массив. var my_int_array: array of Integer;
 ты можешь указать его длину SetLength (my_int_array,count); count - здесь кол-во элементов массива. ты можешь использовать и связанный список на основе TList, но для поставленной задачи он не понадобится. советую еще раз внимательно почитать учебники, посмотреть примеры чего-то похожего.
 Ⓐ свобода сопротивление солидарность |  
|   | Адмирал (статус: Посетитель), 9 января 2011, 16:01 [#12]:ладно по другому сформулирую, у меня есть переменная типа ЧИСЛО Каждую секунду, ей присваивается случайное значение от 1до10, как сделать чтобы эти числа не повторялись
 |  
|   | mirt.steelwater (статус: Посетитель), 9 января 2011, 16:56 [#13]:ок. во-первых давай специфицируем задачу. "переменная типа ЧИСЛО" - о каком именно числе идет речь? задача имеет лишь частные решения в пределах начальных условий, т.е. нужно указать тип числа, указать функцию сравнения чисел данного типа (определить что такое a = b, а затем возможно a < b & a > b ).
 дальше попытаемся проанализировать твой алгоритм:
 "каждую секунду, ей присваивается случайное значение от 1до10"
 условие "как сделать чтобы эти числа не повторялись" будет выполняться лишь в первых 10 итерациях. на 11 итерации мы перебрали все элементы конечного множества и достигли коллизии.
 если мы с этим всем согласны, то только тогда можно написать нечто вроде:
 
 type
    TInt10 = 1..10;
    TInt10Box = array [0..9] of TInt10;
    TPseudoInt10Box = array [0..9] of Integer;
const
    BoxInt10 : TInt10Box = (1,2,3,4,5,6,7,8,9,10);
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function RandomInt10 : TInt10;
begin
    Result := BoxInt10 [ random (10) ];
end;
 
function InArray (const anArray: TPseudoInt10Box; const aValue: TInt10) : Boolean;
var
    I : Integer;
begin
    Result := FALSE;
    for I := 0 to 9 do
    begin
        Result := Result or (anArray [I] = aValue);
        if Result then
            Exit;
    end;
end;
 
var
    box : TPseudoInt10Box = (0,0,0,0,0,0,0,0,0,0);
    I   : Integer = 0;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
    r : TInt10;
begin
    randomize;
    repeat
        r := RandomInt10;
    until (  not ( InArray (box,r) ) or (I >= 9)  );
    if ( I < 9 ) then
    begin
        box [I] := r;
        Memo1.Lines.Add ( IntToStr (box [I]) );
        Inc (I);
    end;
end;для улучшения случайности рекомендую вручную распределить числа в BoxInt10 как можно более случайно.Ⓐ свобода сопротивление солидарность |  
|   | Адмирал (статус: Посетитель), 9 января 2011, 22:21 [#14]:внимательней читать надо, я написал что числа от 1 до числа  СЛУЧАЙНЫЕ тоесть в переменную можно так 1,4,10,3, а в вашем коде, я если честно мало что понял
 |  
|   | mirt.steelwater (статус: Посетитель), 10 января 2011, 11:21 [#15]:товарисчЪ, если тебе не понятен такой простой код, причем непонятен полностью, а не какие-то моменты, то тебе еще рано задавать такие вопросы - читай учебники. Ⓐ свобода сопротивление солидарность |  
|   | Адмирал (статус: Посетитель), 10 января 2011, 18:39 [#16]:ну так ответь на предыдущий пост, про случайные числа, чтобы не повторялись они, и я буду разбирать. Пожалуста |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |