C#, Python и др. языки для числовых лотерей.

Программы для анализа и игры в лотереи

Модераторы: nord73, bubumbr

Ответить
Аватара пользователя
иван
Гуру
Гуру
Сообщения: 1293
Зарегистрирован: Пн янв 26, 2009 3:35 pm
Откуда: Краноярск
Благодарил (а): 94 раза
Поблагодарили: 141 раз

Re: C#, Python и др. языки для числовых лотерей.

Сообщение иван » Пт фев 14, 2020 5:35 pm

Slawa Ms писал(а):
Пт фев 14, 2020 4:54 pm
Slawa Ms писал(а):
Пт фев 14, 2020 2:04 pm
1. Галочка стоит - сортируется по возрастанию, галочки нет - сортируется по убыванию.
2. ... но и при изменении чекбокса.
2. При нажатии на чекбокс, сортирует правильно.
1. При нажатии на кнопку, сортирует всегда по возрастанию, а должно в зависимости от чекбокса.
Придется переделывать...
Переделал теперь сортирует по возрастанию и убыванию с кнопки в зависимости от галочки в чекбоксе
Добавил процедуру

Код: Выделить всё

private void ButtonSortReverse() //Процедура для кнопки сортировка и реверс в зависимости от галочки чекбока
        {
            if (checkBox1.Checked == true)//Условие если чекбокс включен
            {
                SortMassiv();//Сортируем массив
            }
            else//Чекбок не включен
            {
                SortMassivReverse();//Реверс массива
            }

        }
На кнопке то же изменил код

Код: Выделить всё

private void button1_Click(object sender, EventArgs e)
        {
            ButtonSortReverse();
        }
Проект
WindowClass 003.rar
(171.43 КБ) 1 скачивание

Аватара пользователя
Slawa Ms
Гуру
Гуру
Сообщения: 371
Зарегистрирован: Чт дек 05, 2013 1:38 pm
Благодарил (а): 6 раз
Поблагодарили: 80 раз
Контактная информация:

Re: C#, Python и др. языки для числовых лотерей.

Сообщение Slawa Ms » Пт фев 14, 2020 6:18 pm

Теперь работает правильно.
Продолжим.

Код: Выделить всё

        public static void SortMassivIntArray(int[] mass) // Функция сортировки массива
        {
            Array.Sort(mass);
        }

        public static void SortMassivReverse (int[] mass) // Функция сортировки и реверса массива
        {
            Array.Sort(mass);
            Array.Reverse(mass);
        }
У тебя две разных функции для сортировки массива по возрастанию и убыванию. Правильнее объединить их в одну. Просто добавить на входе еще одну переменную rev (принимает значения True или False).
Получится примерно так:

Код: Выделить всё

        public static void SortMassivIntArray(int[] mass, bool rev) // Функция сортировки массива; mass - сам массив; rev - признак сортировки
        {
            Array.Sort(mass); //Всегда сортируем по возрастанию (мы же вызвали функцию сортировки!)
            if rev == False then Array.Reverse(mass); //Если =False, то меняем на обратную сортировку
        }
Соответственно перепиши текст, где вызываешь эту функцию.

Аватара пользователя
иван
Гуру
Гуру
Сообщения: 1293
Зарегистрирован: Пн янв 26, 2009 3:35 pm
Откуда: Краноярск
Благодарил (а): 94 раза
Поблагодарили: 141 раз

Re: C#, Python и др. языки для числовых лотерей.

Сообщение иван » Пт фев 14, 2020 7:01 pm

Slawa Ms писал(а):
Пт фев 14, 2020 6:18 pm
Теперь работает правильно.
Продолжим.

Код: Выделить всё

        public static void SortMassivIntArray(int[] mass) // Функция сортировки массива
        {
            Array.Sort(mass);
        }

        public static void SortMassivReverse (int[] mass) // Функция сортировки и реверса массива
        {
            Array.Sort(mass);
            Array.Reverse(mass);
        }
У тебя две разных функции для сортировки массива по возрастанию и убыванию. Правильнее объединить их в одну. Просто добавить на входе еще одну переменную rev (принимает значения True или False).
Получится примерно так:

Код: Выделить всё

        public static void SortMassivIntArray(int[] mass, bool rev) // Функция сортировки массива; mass - сам массив; rev - признак сортировки
        {
            Array.Sort(mass); //Всегда сортируем по возрастанию (мы же вызвали функцию сортировки!)
            if rev == False then Array.Reverse(mass); //Если =False, то меняем на обратную сортировку
        }
Соответственно перепиши текст, где вызываешь эту функцию.
Переписал вызов функции

Код: Выделить всё

  public static void SortMassivIntArray(int[] mass, bool rev) // Функция сортировки массива
        {
            Array.Sort(mass);//Сортируем массив
            if (rev == false) //Если переменная rev false 
            {               
                Array.Reverse(mass);//Реверс массива
            }
        }
и еще переписал для чекбокса

Код: Выделить всё

  private void checkBox1_CheckedChanged(object sender, EventArgs e)//Сортировка и реверс массива
        {           
            ButtonSortReverse();//Процедура для кнопки сортировка и реверс в зависимости от галочки чекбока
        }
        private void ButtonSortReverse() //Процедура для кнопки сортировка и реверс в зависимости от галочки чекбока
        {            
            if (textBox1.Text != "") //Условие если текстбокс не пустой
            {
                if (checkBox1.Checked == true) //Если чекбокс чекнутый
                {
                    SortMassiv(); //Сортируем массив
                }
                else //Чекбокс не включен
                {
                    SortMassivReverse(); //Реверс массива
                }
            }
            else //Текстбокс пустой
            {
                MessageBox.Show("Введите числовой ряд"); //Выводим сообщение
            }
        }
Проект
WindowClass 004.rar
(171.36 КБ) 1 скачивание

Аватара пользователя
Igor-san
Site Admin
Site Admin
Сообщения: 11455
Зарегистрирован: Чт май 08, 2003 4:00 am
Откуда: Moscow
Благодарил (а): 19 раз
Поблагодарили: 266 раз
Контактная информация:

Re: C#, Python и др. языки для числовых лотерей.

Сообщение Igor-san » Пт фев 14, 2020 8:58 pm

Иван, условие можно проверить короче (естественно и твой вариант правильный)

Код: Выделить всё

if (checkBox1.Checked) 
А на false

Код: Выделить всё

if (!rev)

Аватара пользователя
иван
Гуру
Гуру
Сообщения: 1293
Зарегистрирован: Пн янв 26, 2009 3:35 pm
Откуда: Краноярск
Благодарил (а): 94 раза
Поблагодарили: 141 раз

Re: C#, Python и др. языки для числовых лотерей.

Сообщение иван » Сб фев 15, 2020 2:17 pm

Igor-san писал(а):
Пт фев 14, 2020 8:58 pm
Иван, условие можно проверить короче (естественно и твой вариант правильный)

Код: Выделить всё

if (checkBox1.Checked) 
А на false

Код: Выделить всё

if (!rev)
Исправил на предложенный вариант все работает.

Аватара пользователя
Slawa Ms
Гуру
Гуру
Сообщения: 371
Зарегистрирован: Чт дек 05, 2013 1:38 pm
Благодарил (а): 6 раз
Поблагодарили: 80 раз
Контактная информация:

Re: C#, Python и др. языки для числовых лотерей.

Сообщение Slawa Ms » Пн фев 17, 2020 2:44 pm

иван писал(а):
Сб фев 15, 2020 2:17 pm
Исправил на предложенный вариант все работает.
А где окончательный вариант?
Хотел покритиковать "Проект WindowClass 004.rar", но вдруг ты там уже все исправил...

Аватара пользователя
иван
Гуру
Гуру
Сообщения: 1293
Зарегистрирован: Пн янв 26, 2009 3:35 pm
Откуда: Краноярск
Благодарил (а): 94 раза
Поблагодарили: 141 раз

Re: C#, Python и др. языки для числовых лотерей.

Сообщение иван » Пн фев 17, 2020 5:27 pm

Slawa Ms писал(а):
Пн фев 17, 2020 2:44 pm
иван писал(а):
Сб фев 15, 2020 2:17 pm
Исправил на предложенный вариант все работает.
А где окончательный вариант?
Хотел покритиковать "Проект WindowClass 004.rar", но вдруг ты там уже все исправил...
Вот последний вариант с исправлениями
WindowClass 005.rar
(171.78 КБ) 5 скачиваний

Аватара пользователя
Slawa Ms
Гуру
Гуру
Сообщения: 371
Зарегистрирован: Чт дек 05, 2013 1:38 pm
Благодарил (а): 6 раз
Поблагодарили: 80 раз
Контактная информация:

Re: C#, Python и др. языки для числовых лотерей.

Сообщение Slawa Ms » Вт фев 18, 2020 2:10 pm

иван писал(а):
Пн фев 17, 2020 5:27 pm
Вот последний вариант с исправлениями "WindowClass 005.rar"
Начинаем разбор.
Вот зачем тебе вот эти две функции

Код: Выделить всё

        private void SortMassiv() // Процедура сортировки чисел
        {
            string strMassiv = textBox1.Text;
            int[] RowNumbers = Method.StringInArrayInt(strMassiv);
            Method.SortMassivIntArray(RowNumbers, true);
            PrintMassiv(RowNumbers);
        }
        private void SortMassivReverse() //Процедура сортировки и реверса массива
        {
            string strMassiv = textBox1.Text;
            int[] RowNumbers = Method.StringInArrayInt(strMassiv);
            Method.SortMassivIntArray(RowNumbers, false);
            PrintMassiv(RowNumbers);
        }
если ты написал универсальную Method.SortMassivIntArray(RowNumbers, false);
Чтобы освоить алгоритмы на "автомате", попробуй записывать свои действия на листке бумаги (раньше учили рисовать блок-схемы).
Задача: При нажатии кнопки "Сортировать", нам требуется сортировать числа из TextBox1 в возрастающем/убывающем порядке, в зависимости от CheckBox1
Разберем подробно каждый шаг:
1. Нажимаем кнопку "Сортировать", у нас срабатывает функция private void button1_Click(object sender, EventArgs e).
Какая реакция? Правильно, мы вызываем нашу функцию ButtonSortReverse();
2. Далее, что мы делаем при вызове функции ButtonSortReverse();?
3. Вначале идет проверка

Код: Выделить всё

if (textBox1.Text != "") //Условие если текстбокс не пустой
Задумано правильно, но реализовано не до конца, попробуй ввести "абвгд" :-):
Надо, или убрать совсем, или оставить, но потом доработать.

Аватара пользователя
Slawa Ms
Гуру
Гуру
Сообщения: 371
Зарегистрирован: Чт дек 05, 2013 1:38 pm
Благодарил (а): 6 раз
Поблагодарили: 80 раз
Контактная информация:

Re: C#, Python и др. языки для числовых лотерей.

Сообщение Slawa Ms » Вт фев 18, 2020 2:36 pm

4. Далее, мы должны прочитать содержимое TextBox1

Код: Выделить всё

string strMassiv = textBox1.Text;
5. Переводим строку в числа. Для этого вызываем написанную нами функцию

Код: Выделить всё

int[] RowNumbers = Method.StringInArrayInt(strMassiv);
6. Ряд чисел получили. Теперь надо решить, как сортировать. У нас есть функция сортировки

Код: Выделить всё

public static void SortMassivIntArray(int[] mass, bool rev) // Функция сортировки массива
Туда мы отправляем ряд чисел (RowNumbers) и признак сортировки (True/False). В этом месте надо понимать, что свойство чекбокса checkBox1.Checked уже возвращает значение True или False. И можно кучу строчек заменить одной

Код: Выделить всё

Method.SortMassivIntArray(RowNumbers, checkBox1.Checked);
7. Ряд RowNumbers отсортировали, можно печатать

Код: Выделить всё

PrintMassiv(RowNumbers);
Жду исправленный вариант.

Аватара пользователя
иван
Гуру
Гуру
Сообщения: 1293
Зарегистрирован: Пн янв 26, 2009 3:35 pm
Откуда: Краноярск
Благодарил (а): 94 раза
Поблагодарили: 141 раз

Re: C#, Python и др. языки для числовых лотерей.

Сообщение иван » Вт фев 18, 2020 4:36 pm

Slawa Ms писал(а):
Вт фев 18, 2020 2:36 pm

Жду исправленный вариант.
Да почти все что написал для реверса строки пришлось удалить оказалось не нужным в коде.
Проверку на пустую строку то же убрал.
Исправленный вариант
WindowClass 006.rar
(170.33 КБ) 2 скачивания

Аватара пользователя
Slawa Ms
Гуру
Гуру
Сообщения: 371
Зарегистрирован: Чт дек 05, 2013 1:38 pm
Благодарил (а): 6 раз
Поблагодарили: 80 раз
Контактная информация:

Re: C#, Python и др. языки для числовых лотерей.

Сообщение Slawa Ms » Вт фев 18, 2020 6:23 pm

иван писал(а):
Вт фев 18, 2020 4:36 pm
Исправленный вариант WindowClass 006.rar
Получилось компактно и понятно. И через полгода вспомнишь, что этот код делает.
Теперь изучи вопрос, как правильнее

Код: Выделить всё

Method.SortMassivIntArray(RowNumbers, checkBox1.Checked);
или

Код: Выделить всё

b1 = checkBox1.Checked
Method.SortMassivIntArray(RowNumbers, b1);
Сразу подскажу - оба варианта рабочие. Но если будут большие циклы, а они будут, ведь мы программируем лотошки, то в циклах правильно применять второй вариант. Ведь CheckBox1 - это объект на экране и обращение к нему занимает много времени, что будет заметно при работе в цикле.
Чтобы оценить затраты времени, выполни след. задание:
Создай кнопку "Цикл" и при нажатии процедуру TestCircle

Код: Выделить всё

private void TestCircle() // Процедура Тест
        {
        k = 1000; //Число циклов. = 10 000, = 100 000, = 1 млн, = 10 млн
            //Цикл для второго варианта
            b1 = checkBox1.Checked; //Чекбокс должен быть отмечен
            myTime = функция(Now); //Засекаем текущее время
            for i = 0 to k   //Цикл от 0 до k
            {
              if b1 == True 
                  {
                  //Здесь просто некоторые вычисления
                  x = 5
                  y = 8
                  z = 5*x = 25*(y-3)
                  }
           }
           //Цикл закончился, выводим время расчетов
           ShowMessage('Время выполнения варианта 2= ' + format(Now - MyTime))
           //Здесь 
           //Now - засекаем текущее время
           //(Now - MyTime) - вычисляем время работы цикла
           //format() - преобразуем к виду hh.mm.ss (часы.минуты.секунды)
           //Смотри в Интернете функции C# для работы со временем

                    //Цикл для первого варианта
                   myTime = функция(Now); //Засекаем текущее время
                   for i = 0 to k   //Цикл от 0 до k
                   {
                   if checkBox1.Checked == True 
                      {
                      //Здесь те же вычисления
                      x = 5
                      y = 8
                      z = 5*x = 25*(y-3)
                      }
                   }
                  //Цикл закончился, выводим время расчетов
                  ShowMessage('Время выполнения варианта 1= ' + format(Now - MyTime))
       }
Попробуй при разных значениях k, 10 млн. это не предел. Лото "7 из 49" = 85.900.584 комбинаций.
Замеры времени опубликуй здесь.

Аватара пользователя
иван
Гуру
Гуру
Сообщения: 1293
Зарегистрирован: Пн янв 26, 2009 3:35 pm
Откуда: Краноярск
Благодарил (а): 94 раза
Поблагодарили: 141 раз

Re: C#, Python и др. языки для числовых лотерей.

Сообщение иван » Вт фев 18, 2020 8:21 pm

Slawa Ms писал(а):
Вт фев 18, 2020 6:23 pm

Попробуй при разных значениях k, 10 млн. это не предел. Лото "7 из 49" = 85.900.584 комбинаций.
Замеры времени опубликуй здесь.
Второй вариант работает гораздо быстрее.
2020-02-18_23-06-34.png
2020-02-18_23-06-34.png (29.88 КБ) 97 просмотров
Программа добавил третью кнопку для работы двух процедур
Test_Circle.rar
(162.43 КБ) 2 скачивания
2020-02-18_23-18-07.png
2020-02-18_23-18-07.png (17.52 КБ) 97 просмотров

Аватара пользователя
Slawa Ms
Гуру
Гуру
Сообщения: 371
Зарегистрирован: Чт дек 05, 2013 1:38 pm
Благодарил (а): 6 раз
Поблагодарили: 80 раз
Контактная информация:

Re: C#, Python и др. языки для числовых лотерей.

Сообщение Slawa Ms » Ср фев 19, 2020 1:16 pm

иван писал(а):
Вт фев 18, 2020 8:21 pm
Второй вариант работает гораздо быстрее.
Разница в два раза и заметна при > 100 млн. циклов. Я ожидал, что разница будет больше и заметна будет уже при 1 млн. циклов.
Похоже, можно особо не заморачиваться, и делать как удобнее/понятнее. Приёмчик с замером времени пригодится, когда возникнет задача оптимизировать/ускорить какой нибудь алгоритм.
P.S. Надо будет попробовать такое же на Delphi (для сравнения).

Ответить

Вернуться в «Программы для лотереи»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей