Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как из массива вытягивать элементы в случайном порядке?  (Прочитано 19497 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ильдар
Участник

kg
Offline Offline

« : 05-05-2009 07:54 » 

подскажите пожалуйста...из С#
у меня есть массив цветов
к примеру белый ,чёрный,оранж,зел,серый.
и есть допустим текст бокс или какая то другая фигура..не важно..
в общем нужно чтобы этот текстбокс менял свой цвет в случайном порядке...
и потом например когда случайно выпадет ..допустим зел. цвет я должен на форме нажать кнопку...
после того как я нажму кнопку, должно подсчитаться время с момента когда выпал зелёный цвет и до нажатия кнопки..
как это сделать?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 05-05-2009 08:20 » 

1. Генерировать случайным образом индекс цвета в массиве.

2. После установки цвета опросить текущее время. По нажатию кнопки опросить текущее время. Вычислить разницу.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ильдар
Участник

kg
Offline Offline

« Ответ #2 : 05-05-2009 08:29 » 

а как это в  коде выразить?
я недавно програмиировать начал..а С# как 2 месяца изучаю..

написал примерно так...
массив состоит из 5 цветов
Код:
        private void button1_Click(object sender, EventArgs e)
        {
            Random rand = new Random();
            Color[] arr = new Color[] { Color.Blue, Color.Brown, Color.DarkGray, Color.Green, Color.MistyRose };

            textBox1.BackColor = rand.Next(arr[0],arr[5]);
        }
при нажатии на кнопку он должен был как я предполагал взять какой то цвет...
а он показал ошибку

System.Drawing.Color does not contain a definition for'arr'

что он хотел этим сказать?
« Последнее редактирование: 08-05-2009 12:25 от Джон » Записан
Ильдар
Участник

kg
Offline Offline

« Ответ #3 : 05-05-2009 08:37 » 

А потом ещё выдал ошибку что..

Argument'1':cannot convert from 'System.Drawing.Color' to 'int'
Argument'2':cannot convert from 'System.Drawing.Color' to 'int'
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 05-05-2009 09:03 » 

Да... тяжёлый случай. Тебе же надо получить ЦВЕТ из МАССИВА arr, поэтому и надо к нему обращаться. А ты что делаешь? Такое ощущение, что просто вбиваешь букаффки в надежде, что заработает. Жаль

Код:
            textBox1.BackColor = arr[rand.Next(0, arr.Length)];
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ильдар
Участник

kg
Offline Offline

« Ответ #5 : 05-05-2009 09:11 » 

Огромное спасибо!!!
Всё работает...просто очень сложно понять что к чему на начальном этапе изучения.
Ещё раз спасибо.
« Последнее редактирование: 07-05-2009 15:22 от Джон » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 05-05-2009 10:23 » 

Как для новичка, прими как добрый совет, программировать значит думать, мыслить, строить алгоритмы, и неважно на каком языке ты эту мысль будешь объяснять компьютеру.

Попробуй сначала просто рассказать своими словами, что ты хочешь сделать. В данном случае это бы выглядело примерно так:

1. Определяем (есть, создаём - изпользуй удобные и понятные тебе самому слова) массив цветов ...

2. Доступ к элементам массива осущетсвляется через целочисленный индекс

2а. Следовательно я могу перебрать все цвета находящиеся в массиве
2б. для получения случайного цвета из массива мне нужен случайный индекс

3. (Справочная информация) Случайное число я могу получить с помощью объекта Random, ф-я Next этого объекта генерирует случайное число находящееся в некотором диапазоне. Границы диапазона передаются в ф-ю в качестве параметров.

Собственно говоря, если бы ты начал постепенно приближаться к цели, а не рубить с плеча, то получил бы примерно такой результат:

Сначала убеждаемся, что мы понимаем как работает доступ к элементам массива
Код:
private void button1_Click(object sender, EventArgs e)
        {
            Color[] arr = new Color[] { Color.Blue, Color.Brown, Color.DarkGray, Color.Green, Color.MistyRose };
            // сначала просто получаем какой-нить элемент, например второй
            int colorIndex = 2;
            textBox1.BackColor = arr[colorIndex];
        }

Потом плавно переходим с случайному выбору

Код:
private void button1_Click(object sender, EventArgs e)
        {
            Color[] arr = new Color[] { Color.Blue, Color.Brown, Color.DarkGray, Color.Green, Color.MistyRose };
           // теперь воспользуемся случайным элементом
            Random rand = new Random();
            int colorIndex = rand.Next(0, arr.Length); // случайное число мне нужно в диапазоне моего массива
            textBox1.BackColor = arr[colorIndex];
        }
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ильдар
Участник

kg
Offline Offline

« Ответ #7 : 07-05-2009 13:02 » 


Вот у меня опять проблемка возникла...
Всё с тем же массивом цветов.
При событии клика на клавишу, цвета меняюются без всяких проблемм.
Попытался сделать чтобы это происходило по событию таймера ,он опять ругаться начал.
При запуске как положено появляется форма с кнопками и текстбокс..
а через 2 секунды вылетает окошко где написано.

Unhandled exception has occured in your application.If you click
Continue, the application will ignore this error and attempt to continue.If you click Quit, the application will close immediately.

Object reference not set to an instance of an object.

И в чём ошибка???
Он ведь даже не показывает в какой строке ошибка...
Вот код..
       
Код:
namespace Для_роголёва
{
    public partial class Form1 : Form
    {
       public Color[] arr;

        public Random rand;


        public Form1()
        {
           
           
            InitializeComponent();
        }
       
       
       
        public void button1_Click(object sender, EventArgs e)
        {
            Random rand = new Random();
            Color[] arr = new Color[] { Color.Blue, Color.Brown, Color.DarkGray, Color.Green, Color.MistyRose };
            timer1.Start();
            textBox1.BackColor = arr[rand.Next(0, arr.Length)];
        }


        public void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }
        public void timer1_Tick(object sender, EventArgs e)
        {
           
            textBox1.BackColor = arr[rand.Next(0, arr.Length)];
        }
       
    }
}
« Последнее редактирование: 07-05-2009 15:24 от Джон » Записан
Ильдар
Участник

kg
Offline Offline

« Ответ #8 : 07-05-2009 13:24 » 

Распиши человеческими словами, что у тебя делает ф-я public void timer1_Tick(object sender, EventArgs e).  С коментариями что означает каждое служебное слово и переменную. Ошибка очевидна.

зы Подсказка:"Object reference not set to an instance of an object." означает попытку обращения к нулевому указателю.

Ну если расписать по порядку эту функцию...то получается
public -это ключевое слово показывающее что доступ к полям этой функции доступен и с других проектов
void- показывает что эта функция не возвращает никакого значения
timer1_Tick-показывает событие таймера
(object sender, EventArgs e)-а это параметры события...
public void timer1_Tick(object sender, EventArgs e)

Если я не ошибаюсь, помоему ошибка в возвращаемом значении функции, может быть надо поставить за место ключевого слова VOID  STATIC?
И выставить RETURN.
« Последнее редактирование: 07-05-2009 15:25 от Джон » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 07-05-2009 15:20 » 

И в чём ошибка???
Он ведь даже не показывает в какой строке ошибка...

А ошибка всё в том же... Жаль И незнание синтаксиса языка здесь не при чём. В  ЛЮБОМ языке это грубейшая недопустимая ошибка.

Распиши человеческими словами, что у тебя делает ф-я public void timer1_Tick(object sender, EventArgs e).  С коментариями что означает каждое служебное слово и переменную. Ошибка очевидна.


зы Подсказка:"Object reference not set to an instance of an object." означает попытку обращения к нулевому указателю.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 07-05-2009 15:31 » 

Примерно восстановил логическую последовательность сообщений.

Итак продолжим.

Эммм ты меня не правильно понял. Я имел ввиду ТЕЛО ф-ции. А именно строчку
Код:
textBox1.BackColor = arr[rand.Next(0, arr.Length)];

Где какая переменная, какое значаение она имеет в момент вызова ф-ции? Подробно насколько сможешь.

Если я не ошибаюсь, помоему ошибка в возвращаемом значении функции, может быть надо поставить за место ключевого слова VOID  STATIC?
И выставить RETURN.

Ошибаешься, причём оооочень. VOID - означает возвращаемый ф-ей тип данных. Если ты его уберёшь, то будет не ясно что именно возвращает ф-я. STATIC означает, что ф-я статическая и с типом возвращаемых данных ничего общего не имеет.

А ф-я просто реагирует на сообщение от таймера. Проще говоря, она просто дождалась очередного тика и должна что-то сделать. Что же ей возвращать? А вот в теле ф-ции там действительно ошибка.

Ещё одна наводка-подсказка. Как у тебя проинициаллизирован таймер? Наверняка он запускается автоматически, без нажатия на кнопку button1.
« Последнее редактирование: 07-05-2009 15:39 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ильдар
Участник

kg
Offline Offline

« Ответ #11 : 08-05-2009 02:24 » 

Нет, таймер у меня запускается по нажатию кнопки...в свойствах я ему указал что при запуске программы у него ENABLED-FALSE
тут причина по моему в другом =)) а именно как ты правильно написал в строчке
textBox1.BackColor = arr[rand.Next(0, arr.Length)];

таймер работает отлично..
я это проверил поставив за место той строчки
вот эту
MessageBox.Show("jhgkyg");
и он пошёл строчить подряд эти месадж боксы...=))
что он по идее и должен был делать с цветами в текстбоксе
но,есть какая то ошибка... Здесь была моя ладья...
если разобрать эту строчку попорядку..textBox1.BackColor = arr[rand.Next(0, arr.Length)];

получается так..
textBox1.BackColor = цвет текстбокса должен быть равен
arr[rand.Next(0, arr.Length)];-случайному элементу из массива arr

Вроди бы всё написано доходчиво...
При чём этот код он спокойно выполняет при нажатии кнопки..просто без таймера...а при событии таймера отказывается
В чём же причина?


Записан
Ильдар
Участник

kg
Offline Offline

« Ответ #12 : 08-05-2009 02:41 » 

Ура!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Заработало!!!
Добавил в тело события таймера..эти строки и он начал работать

Код:
        public void timer1_Tick(object sender, EventArgs e)
        {
            Random rand = new Random();
            Color[] arr = new Color[] { Color.Blue, Color.Brown, Color.DarkGray, Color.Green, Color.MistyRose };
            textBox1.BackColor = arr[rand.Next(0, arr.Length)];
        }


Но почему так?...ведь при нажатии на кнопку он ведь всё равно прочитывает этот код
в теле события button1_click, но пока я не занёс эти строки в событие таймера он не работал..??
« Последнее редактирование: 08-05-2009 08:58 от Джон » Записан
Ильдар
Участник

kg
Offline Offline

« Ответ #13 : 08-05-2009 02:58 » 

Хотя наверное понятно Внимание! Говорит и показывает...
Событие кнопки это событие кнопки..
А событие таймера это событие таймера..
Две разные вещи...
Записан
Ильдар
Участник

kg
Offline Offline

« Ответ #14 : 08-05-2009 03:05 » 

Ну теперь осталось сделать последнее Улыбаюсь...чтобы он опрашивал текущее время при выпадании зелёного цвета-->запомнил его как мне кажется в какой нибудь переменной-->затем опросил текущее время при нажатии кнопки и запомнил его в другой переменной...а потом просто вычислить разницу между второй и первой переменной..
А как сделать чтобы он запоминал время, вот этого я совсем не знаю Не надо
Записан
Ильдар
Участник

kg
Offline Offline

« Ответ #15 : 08-05-2009 05:01 » 

 Улыбаюсь)
Всё, сделал чтобы он запоминал..
Код:
        public void timer1_Tick(object sender, EventArgs e)
        {
            Random rand = new Random();
            Color[] arr = new Color[] { Color.Blue, Color.Brown, Color.DarkGray, Color.Green, Color.MistyRose };
           

            textBox1.BackColor = arr[rand.Next(0, arr.Length)];
            if (textBox1.BackColor == Color.Green)
            {
                DateTime dt = DateTime.Now;
               label1.Text = dt.Hour + ":" + dt.Minute + ":" + dt.Second + ":" + dt.Millisecond;
             
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            DateTime dt = DateTime.Now;
           label2.Text = dt.Hour + ":" + dt.Minute + ":" + dt.Second + ":" + dt.Millisecond;
        }
А вот как вычислить разницу между временем появления зелёного цвета и событием нажатия кнопки не получается...
Может есть какая то функция?
« Последнее редактирование: 08-05-2009 08:58 от Джон » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 08-05-2009 08:50 » 

Флуд подчистил. Последнее сообщение удалил тк есть уже новая тема. И так лучше.

Ильдар, ещё одно замечание по ходу дела. Бери свой код в тег [ code ] ... [ /code ](без пробелов в скобках, это я так написал чтобы было понятно, иначе транслятор сынтрепретирует его), режиме редактирования есть специальная кнопка.

Я потом это сообщение тоже удалю.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 08-05-2009 08:57 » 

Итак продолжаем.

Сразу скажу твоё решение не совсем правильное. Это 1. метод тыка. 2. ты так и не понял в чём был косяк
Так ты не научишься программировать. Вымучивать компилируемый код - да, но это не есть программирование.

Ты кстати где учишься? Насколько глубоко тебе это надо? Или для "зачёт сдал - забыл"?

arr[rand.Next(0, arr.Length)];-случайному элементу из массива arr

Вроди бы всё написано доходчиво...
При чём этот код он спокойно выполняет при нажатии кнопки..просто без таймера...а при событии таймера отказывается
В чём же причина?

В чём? Ты так и не расписал подробно, что у тебя где. Поэтому ответь на след. вопросы:

что есть arr, где создано и какое значение имеет в момент использования?
что есть rand, где создано и какое значение имеет в момент использования?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 08-05-2009 09:01 » new

Нет, таймер у меня запускается по нажатию кнопки...в свойствах я ему указал что при запуске программы у него ENABLED-FALSE

Значит ты вот тут неправильно выразился:

При запуске как положено появляется форма с кнопками и текстбокс..
а через 2 секунды вылетает окошко где написано.

Получается что после запуска через 2 секунды приходит сообщение от таймера, поэтому я и решил что таймер стоит на автозапуске.

Ладно это не есть причина. Проблема возникает после прихода первого тика таймера.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines