SlideShare a Scribd company logo
Введение   Простые паттерны            Паттерн 2          Паттерн 3   References




              Паттерны программирования

                               Информатика
                               10-11 классы


                              24 января 2012 г.




            Информатика 10-11 классы      Паттерны программирования
Введение         Простые паттерны            Паттерн 2          Паттерн 3   References



Паттерны программирования



           Одним из отличительных свойств хорошего программиста
           является умение решать стандартные задачи
           стандартными методами.
           Практически любая задача в своём итоге сводится к
           нескольким проблемам:
            1   Считать исходные данные.
            2   Придумать способ хранения данных внутри программы.
            3   Понять, как проще всего разбить на подзадачи.
            4   Проверить, нет ли готовых решений?
            5   Преобразовать получившийся результат к требуемому.




                  Информатика 10-11 классы      Паттерны программирования
Введение   Простые паттерны            Паттерн 2          Паттерн 3   References




                         Паттерн 1
               Запомнить нужное значение




            Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны            Паттерн 2          Паттерн 3   References



Запомнить нужное значение



           Часто в задаче требуется найти какую-то величину.
           К примеру, задача: найти наибольший элемент массива.
           Конечно, можно и нужно воспользоваться методом max,
           однако попробуем решить эту задачу без читов.
           В данном случае нам нужно найти максимальный элемент.
           Если что-то надо найти, нужна переменная, куда мы будем
           записывать значение найденного.
           В данной задаче назовём её max.




                 Информатика 10-11 классы      Паттерны программирования
Введение            Простые паттерны            Паттерн 2          Паттерн 3   References



Алгоритм для паттерна 1

           1   Пройтись по всему массиву и рассмотрим последовательно
               каждый его элемент.
           2   В переменную max будем записывать максимальный
               элемент на текущий момент.
           3   Если вдруг очередной элемент массива больше текущего
               максимального max, запишем его значение в переменную
               max.
           4   Единственно, возникает вопрос: а какое число изначально
               записать в max?
           5   Если мы сделаем max = 0, то программа будет неверно
               работать для массивов, состоящих из отрицательных
               чисел.


                     Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны            Паттерн 2          Паттерн 3   References




                              Правило 1
           Думайте, всегда ли программа будет работать
            правильно. Из-за “забытых” случаев падают
                      космические корабли.




                 Информатика 10-11 классы      Паттерны программирования
Введение            Простые паттерны              Паттерн 2           Паттерн 3   References



Алгоритм для паттерна 1

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

      Listing 1: Паттерн 1
     d e f max ( a r r a y )
         r e t u r n f a l s e i f a r r a y . empty ?
        max = a r r a y [ 0 ]
         f o r i i n 0 . . a r r a y . s i z e −1
             max = a r r a y [ i ] i f ( a r r a y [ i ] > max )
        end
        max
     end


                      Информатика 10-11 классы        Паттерны программирования
Введение        Простые паттерны             Паттерн 2          Паттерн 3   References



Улучшения паттерна 1

           Заметим, что при каждой итерации цикла нам приходится
           вычислять значение длины массива array.size.
           Конечно, современные языки умеют кэшировать такие
           операции, но лучше не полагаться на это.
           Задача. Как сделать так, чтобы не вычислять длину
           массива на каждом шаге?
           Вычислить её единожды! А результат записать в
           дополнительную переменную!
           Да, кстати: почему array.size-1. Откуда взялась –1?
           Массивы в ruby нумеруются с нуля. Поэтому для массива,
           состоящего из n элементов, ключ последнего будет равен
           n − 1.


                  Информатика 10-11 классы      Паттерны программирования
Введение            Простые паттерны              Паттерн 2           Паттерн 3   References



Улучшения для паттерна 1



      Listing 2: Паттерн 1
     d e f max ( a r r a y )
         r e t u r n f a l s e i f a r r a y . empty ?
        max = a r r a y [ 0 ]
         s i z e = a r r a y . s i z e −1
         for i in 0 . . s i z e
             max = a r r a y [ i ] i f ( a r r a y [ i ] > max )
        end
        max
     end




                      Информатика 10-11 классы        Паттерны программирования
Введение       Простые паттерны            Паттерн 2          Паттерн 3   References




                             Паттерн 2
           Ключ и значение максимального элемента.




                Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны            Паттерн 2          Паттерн 3   References



Ключ и значение максимального элемента


           Усложним чуть-чуть задачу.
           Задача: найти ключ и значение наибольшего элемента
           массива.
           Здесь уже стандартный метод max не поможет, так как он
           находит только значение, а не ключ.
           Конечно, есть и другие стандартные методы, но мы опять
           сделаем вручную.
           Нам нужно найти уже два числа: ключ и значение.
           В данной задаче назовём их max_key и max_value.




                 Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны             Паттерн 2          Паттерн 3   References



Изменения по сравнению с паттерном 1


           Первое изменение: если мы нашли элемент, который
           больше текущего максимального, перезаписать нужно не
           только значение array[i], но и соответствующий значению
           ключ i.
           Второе изменение: функция должна возвращать не только
           максимальное значение, но и ключ.
           Самый простой способ вернуть несколько значений
           через массив.
           Можно, конечно, вернуть и единичный хэш
           “ключ–значение”, в зависимости от общего стиля
           программы.



                  Информатика 10-11 классы      Паттерны программирования
Введение             Простые паттерны                Паттерн 2           Паттерн 3   References



Программа для паттерна 2


      Listing 3: Паттерн 2
     d e f max ( a r r a y )
         r e t u r n f a l s e i f a r r a y . empty ?
        max_key            = 0
        max_value = a r r a y [ 0 ]
         s i z e = a r r a y . s i z e −1
         for i in 0 . . s i z e
              i f ( a r r a y [ i ] > max )
                 max_key = i
                 max_value = a r r a y [ i ]
             end
        end
         [ max_key , max_value ]
     end




                       Информатика 10-11 классы          Паттерны программирования
Введение    Простые паттерны            Паттерн 2          Паттерн 3   References




                          Паттерн 3
           Когда нужны булевские переменные.




             Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны             Паттерн 2               Паттерн 3                References



Поиск отрицательного элемента

           Допустим, перед нами стоит задача узнать, есть ли в
           массиве отрицательный элемент.
           Конечно, мы бы могли воспользоваться “магическими”
           методами:
           Решим эту задачу без методов find_all и elem.
           В нашей задаче ответ бинарный: есть или нет. Если в
           задаче или подзадаче нужен такой ответ, значит, нужна
           булевская переменная.
           Её можно назвать has_negative или по старой традиции
           flag (аналог флажка, который либо опущен, лиоб поднят.

           Listing 4: Паттерн 3

                 p u t s "Есть" i f   a r r a y . f i n d _ a l l { | e l e m | elem <0}. any ?


                  Информатика 10-11 классы       Паттерны программирования
Введение            Простые паттерны            Паттерн 2          Паттерн 3   References



Алгоритм решения паттерна 3

           1   Пройдёмся по всему массиву. Изначально has_negative
               присвоим ложь, так как ни одного отрицательного числа
               мы пока не нашли.
           2   Проверим пробегаемый элемент, больше он или меньше
               нуля.
           3   Если он меньше нуля, то “опустим флажок”, сделав
               has_negative равным истине и прервём цикл.
           4   Итого, если в конце цикла has_negative имеет значение
               ИСТИНА, то как минимум один отрицательный элемент
               найден. Иначе нет.
           5   Заметим, что переменная has_negative как раз и будет
               отвечать на вопрос, есть ли в массиве отрицательный
               элемент. Поэтому функцией можно просто возвращать её
               значение.
                     Информатика 10-11 классы      Паттерны программирования
Введение            Простые паттерны               Паттерн 2           Паттерн 3   References



Программа для паттерна 3



      Listing 5: Паттерн 3
     def array_has_negative ( a r r a y )
       r e t u r n f a l s e i f a r r a y . empty ?
       has_negative = f a l s e
       s i z e = a r r a y . s i z e −1
       for i in 0 . . s i z e
            i f ( a r r a y [ i ] < 0)
               has_negative = true
               break
           end
       end
       has_negative
     end




                      Информатика 10-11 классы         Паттерны программирования
Введение        Простые паттерны            Паттерн 2          Паттерн 3   References



Усложним задачу

           Усложним задачу. Допустим, у нас есть массив чисел,
           содержащий элементы от 1 до 100. Сколько неизвестно.
           Повторы также возможны.
           Требуется вывести на экран те натуральные числа от 1 до
           100, которые не встречаются в данном массиве.
           По сути, нам нужно ответить на 100 вопросов: есть ли в
           массиве число 1, есть ли в массиве число 2 и т.п.
           Решение перебором в лоб: пройтись циклом от 1 до 100
           и проверить, есть ли в массиве пробегаемое число.
           Недостаток: ооочень долгое время работы. Нам придётся
           совершить n · 100 (по 100 проходов для каждого из n
           чисел) итераций.
           Можно улучшить метод, заведя булевский массив длиной
           100. И, пробегая всего лишь один раз по всему массиву
                 Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны            Паттерн 2          Паттерн 3   References



Усложним задачу

           Можно улучшить метод, заведя булевский массив длиной
           100. Заполним его изначально ложью.
           Пройдём по начальному массиву.
           Будем помечать истиной элементы с такими ключами,
           которые встречаются в виде значений в массиве.
           Дубликаты нам не страшны, так как двойное присваивание
           ничего не поменяет.
           Кстати, от них можно избавиться с помощью метода
           arr.uniq.
           В конце просто пройдёмся по булевскому массиву и
           выведем на экран ключи тех элементов, которые равны
           лжи.


                 Информатика 10-11 классы      Паттерны программирования
Введение          Простые паттерны             Паттерн 2          Паттерн 3             References



Программа для усложнённого паттерна 3



      Listing 6: Усложнённый паттерн 3
     d e f missen_numbers ( a r r a y )
         r e t u r n ( 1 . . 1 0 0 ) . to_a i f a r r a y . empty ?
         s i z e = a r r a y . s i z e −1
        has_numbers = [ ]
         1 0 0 . t i m e s { | i | has_numbers [ i ] = f a l s e }
         for i in 0 . . s i z e
             has_numbers [ a r r a y [ i ] −1] = t r u e
        end
        numbers = [ ]
         1 0 0 . t i m e s { | i | numbers [ ] = i +1 u n l e s s has_numbers [ i ] }
        numbers
     end




                    Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны            Паттерн 2          Паттерн 3   References




                              Правило 2
           Никогда не забывайте, что элементы массива
                       нумеруются с нуля.




                 Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны            Паттерн 2          Паттерн 3   References




                              Правило 3
           Обязательно инициализируйте пустые массивы
                         нужной длины.




                 Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны            Паттерн 2          Паттерн 3   References



Необходимые пояснения

           Почему мы присваиваем истине has_numbers[array[i]-1].
           Откуда минус единица?
           Известно, что значения массива это числа от 1 до 100.
           У нас массив состоит из 100 элементов.
           То есть, ключи определены от 0 до 99. Вычитая единицу,
           мы “переводим” одно представление в другое.
           По аналогичным соображениям в последнем цикле times
           мы прибавляем к ключу единицу (обратная операция).
           По правилу 3: когда вы пишите конструкцию вида arr[i] =
           arr[i] + 1, предполагается, что i–ый элемент массива
           существует и определён. Если это не так, вы получите
           ошибку.


                 Информатика 10-11 классы      Паттерны программирования
Введение        Простые паттерны             Паттерн 2          Паттерн 3   References



References




           Все презентации доступны на http://school.smirik.ru!
           Вопросы, предложения, д/з: smirik@gmail.com




                  Информатика 10-11 классы      Паттерны программирования

More Related Content

What's hot

Задачи по ООП в ruby
Задачи по ООП в rubyЗадачи по ООП в ruby
Задачи по ООП в rubyEvgeny Smirnov
 
элементы языка и типы данных
элементы языка и типы данныхэлементы языка и типы данных
элементы языка и типы данныхЕлена Ключева
 
Ruby: основы ООП
Ruby: основы ООПRuby: основы ООП
Ruby: основы ООП
Evgeny Smirnov
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
Unguryan Vitaliy
 
Типы данных
Типы данныхТипы данных
Типы данных
MonsterXX
 
Лекция 10 NP-полнота
Лекция 10 NP-полнотаЛекция 10 NP-полнота
Лекция 10 NP-полнота
simple_people
 
Алгоритмы и языки программирования
Алгоритмы и языки программированияАлгоритмы и языки программирования
Алгоритмы и языки программирования
Theoretical mechanics department
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
Olexandra Dmytrenko
 
дистанционка
дистанционкадистанционка
дистанционка
tajnan
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
Unguryan Vitaliy
 
Обработка коллекций наизнанку: как применить много функций к одному аргументу...
Обработка коллекций наизнанку: как применить много функций к одному аргументу...Обработка коллекций наизнанку: как применить много функций к одному аргументу...
Обработка коллекций наизнанку: как применить много функций к одному аргументу...
corehard_by
 
Python: Модули и пакеты
Python: Модули и пакетыPython: Модули и пакеты
Python: Модули и пакеты
Theoretical mechanics department
 
Nikolay Shilov. CSEDays 2
Nikolay Shilov. CSEDays 2Nikolay Shilov. CSEDays 2
Nikolay Shilov. CSEDays 2LiloSEA
 
777
777777
10474
1047410474
10474
nreferat
 

What's hot (18)

Задачи по ООП в ruby
Задачи по ООП в rubyЗадачи по ООП в ruby
Задачи по ООП в ruby
 
элементы языка и типы данных
элементы языка и типы данныхэлементы языка и типы данных
элементы языка и типы данных
 
Ruby: основы ООП
Ruby: основы ООПRuby: основы ООП
Ruby: основы ООП
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
 
Типы данных
Типы данныхТипы данных
Типы данных
 
Лекция 10 NP-полнота
Лекция 10 NP-полнотаЛекция 10 NP-полнота
Лекция 10 NP-полнота
 
Алгоритмы и языки программирования
Алгоритмы и языки программированияАлгоритмы и языки программирования
Алгоритмы и языки программирования
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
дистанционка
дистанционкадистанционка
дистанционка
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
десант презентация
десант презентациядесант презентация
десант презентация
 
алгоритм
алгоритмалгоритм
алгоритм
 
Обработка коллекций наизнанку: как применить много функций к одному аргументу...
Обработка коллекций наизнанку: как применить много функций к одному аргументу...Обработка коллекций наизнанку: как применить много функций к одному аргументу...
Обработка коллекций наизнанку: как применить много функций к одному аргументу...
 
Python: Модули и пакеты
Python: Модули и пакетыPython: Модули и пакеты
Python: Модули и пакеты
 
Nikolay Shilov. CSEDays 2
Nikolay Shilov. CSEDays 2Nikolay Shilov. CSEDays 2
Nikolay Shilov. CSEDays 2
 
777
777777
777
 
10474
1047410474
10474
 

Similar to Ruby — Паттерны программирования

тема множество для загрузки 2013
тема множество для загрузки 2013тема множество для загрузки 2013
тема множество для загрузки 2013AliyaAringazinova
 
практика 5
практика 5практика 5
практика 5student_kai
 
Практикум по выполнению блока с информатика
Практикум по выполнению блока с информатикаПрактикум по выполнению блока с информатика
Практикум по выполнению блока с информатикаЕкатерина Луговова
 
Основы MATLAB. Программирование
Основы MATLAB. ПрограммированиеОсновы MATLAB. Программирование
Основы MATLAB. Программирование
Theoretical mechanics department
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
Mikhail Kurnosov
 
Михаил Александров, Индуктивное моделирование
Михаил Александров, Индуктивное моделированиеМихаил Александров, Индуктивное моделирование
Михаил Александров, Индуктивное моделированиеLidia Pivovarova
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
Алгоритмы поиска
Алгоритмы поискаАлгоритмы поиска
Сегментация и поиск совпадений в бинарном потоке
Сегментация и поиск совпадений в бинарном потокеСегментация и поиск совпадений в бинарном потоке
Сегментация и поиск совпадений в бинарном потоке
Leonid Yuriev
 
Основы языка Питон: типы данных, операторы
Основы языка Питон: типы данных, операторыОсновы языка Питон: типы данных, операторы
Основы языка Питон: типы данных, операторы
Theoretical mechanics department
 
практика 7
практика 7практика 7
практика 7student_kai
 
содержательный подход
содержательный подходсодержательный подход
содержательный подход
Елена Ключева
 
Программирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовПрограммирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмов
Andrey Dolinin
 
Запись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка ПаскальЗапись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка Паскаль
Andrey Dolinin
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
Python Meetup
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
Maxim Kulsha
 

Similar to Ruby — Паттерны программирования (20)

тема множество для загрузки 2013
тема множество для загрузки 2013тема множество для загрузки 2013
тема множество для загрузки 2013
 
практика 5
практика 5практика 5
практика 5
 
Практикум по выполнению блока с информатика
Практикум по выполнению блока с информатикаПрактикум по выполнению блока с информатика
Практикум по выполнению блока с информатика
 
Основы MATLAB. Программирование
Основы MATLAB. ПрограммированиеОсновы MATLAB. Программирование
Основы MATLAB. Программирование
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
Михаил Александров, Индуктивное моделирование
Михаил Александров, Индуктивное моделированиеМихаил Александров, Индуктивное моделирование
Михаил Александров, Индуктивное моделирование
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
Алгоритмы поиска
Алгоритмы поискаАлгоритмы поиска
Алгоритмы поиска
 
Сегментация и поиск совпадений в бинарном потоке
Сегментация и поиск совпадений в бинарном потокеСегментация и поиск совпадений в бинарном потоке
Сегментация и поиск совпадений в бинарном потоке
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Основы языка Питон: типы данных, операторы
Основы языка Питон: типы данных, операторыОсновы языка Питон: типы данных, операторы
Основы языка Питон: типы данных, операторы
 
практика 7
практика 7практика 7
практика 7
 
содержательный подход
содержательный подходсодержательный подход
содержательный подход
 
Программирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовПрограммирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмов
 
Запись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка ПаскальЗапись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка Паскаль
 
лекция 5
лекция 5лекция 5
лекция 5
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
 
Diskretn analiz
Diskretn analizDiskretn analiz
Diskretn analiz
 

More from Evgeny Smirnov

Внедряем MOOC'и на уроке информатики
Внедряем MOOC'и на уроке информатикиВнедряем MOOC'и на уроке информатики
Внедряем MOOC'и на уроке информатики
Evgeny Smirnov
 
Инновации которые не мешают
Инновации которые не мешаютИнновации которые не мешают
Инновации которые не мешают
Evgeny Smirnov
 
Мобильные приложения в школе
Мобильные приложения в школеМобильные приложения в школе
Мобильные приложения в школе
Evgeny Smirnov
 
Порядок и хаос в Солнечной системе
Порядок и хаос в Солнечной системеПорядок и хаос в Солнечной системе
Порядок и хаос в Солнечной системе
Evgeny Smirnov
 
Ruby: инкапсуляция и полиморфизм
Ruby: инкапсуляция и полиморфизмRuby: инкапсуляция и полиморфизм
Ruby: инкапсуляция и полиморфизм
Evgeny Smirnov
 
Объектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в rubyОбъектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в ruby
Evgeny Smirnov
 
Мобильные приложения в образовании
Мобильные приложения в образованииМобильные приложения в образовании
Мобильные приложения в образовании
Evgeny Smirnov
 
NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.
Evgeny Smirnov
 
Мастер-класс: LMS42, ч.2
Мастер-класс: LMS42, ч.2Мастер-класс: LMS42, ч.2
Мастер-класс: LMS42, ч.2Evgeny Smirnov
 
Мастер-класс: Anki карточки
Мастер-класс: Anki карточкиМастер-класс: Anki карточки
Мастер-класс: Anki карточкиEvgeny Smirnov
 
Мастер-класс: Quiz up
Мастер-класс: Quiz upМастер-класс: Quiz up
Мастер-класс: Quiz upEvgeny Smirnov
 
Мастер-класс: Dragonbox Algebra
Мастер-класс: Dragonbox AlgebraМастер-класс: Dragonbox Algebra
Мастер-класс: Dragonbox AlgebraEvgeny Smirnov
 
Мастер-класс: начало
Мастер-класс: началоМастер-класс: начало
Мастер-класс: началоEvgeny Smirnov
 
LMS42: основы (для мастер-класса)
LMS42: основы (для мастер-класса)LMS42: основы (для мастер-класса)
LMS42: основы (для мастер-класса)Evgeny Smirnov
 
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
Evgeny Smirnov
 
Образовательные и игровые платформы в помощь учителю и методисту
Образовательные и игровые платформы в помощь учителю и методистуОбразовательные и игровые платформы в помощь учителю и методисту
Образовательные и игровые платформы в помощь учителю и методисту
Evgeny Smirnov
 
Педагогический клуб 18.10: LMS42
Педагогический клуб 18.10: LMS42Педагогический клуб 18.10: LMS42
Педагогический клуб 18.10: LMS42Evgeny Smirnov
 
Введение в алгоритмы
Введение в алгоритмыВведение в алгоритмы
Введение в алгоритмыEvgeny Smirnov
 

More from Evgeny Smirnov (20)

Внедряем MOOC'и на уроке информатики
Внедряем MOOC'и на уроке информатикиВнедряем MOOC'и на уроке информатики
Внедряем MOOC'и на уроке информатики
 
Инновации которые не мешают
Инновации которые не мешаютИнновации которые не мешают
Инновации которые не мешают
 
Мобильные приложения в школе
Мобильные приложения в школеМобильные приложения в школе
Мобильные приложения в школе
 
Порядок и хаос в Солнечной системе
Порядок и хаос в Солнечной системеПорядок и хаос в Солнечной системе
Порядок и хаос в Солнечной системе
 
Ruby: инкапсуляция и полиморфизм
Ruby: инкапсуляция и полиморфизмRuby: инкапсуляция и полиморфизм
Ruby: инкапсуляция и полиморфизм
 
Объектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в rubyОбъектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в ruby
 
Мобильные приложения в образовании
Мобильные приложения в образованииМобильные приложения в образовании
Мобильные приложения в образовании
 
Newtonew Media
Newtonew MediaNewtonew Media
Newtonew Media
 
NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.
 
Мастер-класс: LMS42, ч.2
Мастер-класс: LMS42, ч.2Мастер-класс: LMS42, ч.2
Мастер-класс: LMS42, ч.2
 
Мастер-класс: Anki карточки
Мастер-класс: Anki карточкиМастер-класс: Anki карточки
Мастер-класс: Anki карточки
 
Мастер-класс: Quiz up
Мастер-класс: Quiz upМастер-класс: Quiz up
Мастер-класс: Quiz up
 
Мастер-класс: Dragonbox Algebra
Мастер-класс: Dragonbox AlgebraМастер-класс: Dragonbox Algebra
Мастер-класс: Dragonbox Algebra
 
Мастер-класс: начало
Мастер-класс: началоМастер-класс: начало
Мастер-класс: начало
 
LMS42: основы (для мастер-класса)
LMS42: основы (для мастер-класса)LMS42: основы (для мастер-класса)
LMS42: основы (для мастер-класса)
 
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...
 
Образовательные и игровые платформы в помощь учителю и методисту
Образовательные и игровые платформы в помощь учителю и методистуОбразовательные и игровые платформы в помощь учителю и методисту
Образовательные и игровые платформы в помощь учителю и методисту
 
Педагогический клуб 18.10: LMS42
Педагогический клуб 18.10: LMS42Педагогический клуб 18.10: LMS42
Педагогический клуб 18.10: LMS42
 
Блок-схемы
Блок-схемыБлок-схемы
Блок-схемы
 
Введение в алгоритмы
Введение в алгоритмыВведение в алгоритмы
Введение в алгоритмы
 

Ruby — Паттерны программирования

  • 1. Введение Простые паттерны Паттерн 2 Паттерн 3 References Паттерны программирования Информатика 10-11 классы 24 января 2012 г. Информатика 10-11 классы Паттерны программирования
  • 2. Введение Простые паттерны Паттерн 2 Паттерн 3 References Паттерны программирования Одним из отличительных свойств хорошего программиста является умение решать стандартные задачи стандартными методами. Практически любая задача в своём итоге сводится к нескольким проблемам: 1 Считать исходные данные. 2 Придумать способ хранения данных внутри программы. 3 Понять, как проще всего разбить на подзадачи. 4 Проверить, нет ли готовых решений? 5 Преобразовать получившийся результат к требуемому. Информатика 10-11 классы Паттерны программирования
  • 3. Введение Простые паттерны Паттерн 2 Паттерн 3 References Паттерн 1 Запомнить нужное значение Информатика 10-11 классы Паттерны программирования
  • 4. Введение Простые паттерны Паттерн 2 Паттерн 3 References Запомнить нужное значение Часто в задаче требуется найти какую-то величину. К примеру, задача: найти наибольший элемент массива. Конечно, можно и нужно воспользоваться методом max, однако попробуем решить эту задачу без читов. В данном случае нам нужно найти максимальный элемент. Если что-то надо найти, нужна переменная, куда мы будем записывать значение найденного. В данной задаче назовём её max. Информатика 10-11 классы Паттерны программирования
  • 5. Введение Простые паттерны Паттерн 2 Паттерн 3 References Алгоритм для паттерна 1 1 Пройтись по всему массиву и рассмотрим последовательно каждый его элемент. 2 В переменную max будем записывать максимальный элемент на текущий момент. 3 Если вдруг очередной элемент массива больше текущего максимального max, запишем его значение в переменную max. 4 Единственно, возникает вопрос: а какое число изначально записать в max? 5 Если мы сделаем max = 0, то программа будет неверно работать для массивов, состоящих из отрицательных чисел. Информатика 10-11 классы Паттерны программирования
  • 6. Введение Простые паттерны Паттерн 2 Паттерн 3 References Правило 1 Думайте, всегда ли программа будет работать правильно. Из-за “забытых” случаев падают космические корабли. Информатика 10-11 классы Паттерны программирования
  • 7. Введение Простые паттерны Паттерн 2 Паттерн 3 References Алгоритм для паттерна 1 Решение: очевидно, что максимальный элемент массива больше либо равен нулевого элемента (так как он максимальный). Поэтому если массив не пуст, то в качестве значения по умолчанию можно взять именно его. Listing 1: Паттерн 1 d e f max ( a r r a y ) r e t u r n f a l s e i f a r r a y . empty ? max = a r r a y [ 0 ] f o r i i n 0 . . a r r a y . s i z e −1 max = a r r a y [ i ] i f ( a r r a y [ i ] > max ) end max end Информатика 10-11 классы Паттерны программирования
  • 8. Введение Простые паттерны Паттерн 2 Паттерн 3 References Улучшения паттерна 1 Заметим, что при каждой итерации цикла нам приходится вычислять значение длины массива array.size. Конечно, современные языки умеют кэшировать такие операции, но лучше не полагаться на это. Задача. Как сделать так, чтобы не вычислять длину массива на каждом шаге? Вычислить её единожды! А результат записать в дополнительную переменную! Да, кстати: почему array.size-1. Откуда взялась –1? Массивы в ruby нумеруются с нуля. Поэтому для массива, состоящего из n элементов, ключ последнего будет равен n − 1. Информатика 10-11 классы Паттерны программирования
  • 9. Введение Простые паттерны Паттерн 2 Паттерн 3 References Улучшения для паттерна 1 Listing 2: Паттерн 1 d e f max ( a r r a y ) r e t u r n f a l s e i f a r r a y . empty ? max = a r r a y [ 0 ] s i z e = a r r a y . s i z e −1 for i in 0 . . s i z e max = a r r a y [ i ] i f ( a r r a y [ i ] > max ) end max end Информатика 10-11 классы Паттерны программирования
  • 10. Введение Простые паттерны Паттерн 2 Паттерн 3 References Паттерн 2 Ключ и значение максимального элемента. Информатика 10-11 классы Паттерны программирования
  • 11. Введение Простые паттерны Паттерн 2 Паттерн 3 References Ключ и значение максимального элемента Усложним чуть-чуть задачу. Задача: найти ключ и значение наибольшего элемента массива. Здесь уже стандартный метод max не поможет, так как он находит только значение, а не ключ. Конечно, есть и другие стандартные методы, но мы опять сделаем вручную. Нам нужно найти уже два числа: ключ и значение. В данной задаче назовём их max_key и max_value. Информатика 10-11 классы Паттерны программирования
  • 12. Введение Простые паттерны Паттерн 2 Паттерн 3 References Изменения по сравнению с паттерном 1 Первое изменение: если мы нашли элемент, который больше текущего максимального, перезаписать нужно не только значение array[i], но и соответствующий значению ключ i. Второе изменение: функция должна возвращать не только максимальное значение, но и ключ. Самый простой способ вернуть несколько значений через массив. Можно, конечно, вернуть и единичный хэш “ключ–значение”, в зависимости от общего стиля программы. Информатика 10-11 классы Паттерны программирования
  • 13. Введение Простые паттерны Паттерн 2 Паттерн 3 References Программа для паттерна 2 Listing 3: Паттерн 2 d e f max ( a r r a y ) r e t u r n f a l s e i f a r r a y . empty ? max_key = 0 max_value = a r r a y [ 0 ] s i z e = a r r a y . s i z e −1 for i in 0 . . s i z e i f ( a r r a y [ i ] > max ) max_key = i max_value = a r r a y [ i ] end end [ max_key , max_value ] end Информатика 10-11 классы Паттерны программирования
  • 14. Введение Простые паттерны Паттерн 2 Паттерн 3 References Паттерн 3 Когда нужны булевские переменные. Информатика 10-11 классы Паттерны программирования
  • 15. Введение Простые паттерны Паттерн 2 Паттерн 3 References Поиск отрицательного элемента Допустим, перед нами стоит задача узнать, есть ли в массиве отрицательный элемент. Конечно, мы бы могли воспользоваться “магическими” методами: Решим эту задачу без методов find_all и elem. В нашей задаче ответ бинарный: есть или нет. Если в задаче или подзадаче нужен такой ответ, значит, нужна булевская переменная. Её можно назвать has_negative или по старой традиции flag (аналог флажка, который либо опущен, лиоб поднят. Listing 4: Паттерн 3 p u t s "Есть" i f a r r a y . f i n d _ a l l { | e l e m | elem <0}. any ? Информатика 10-11 классы Паттерны программирования
  • 16. Введение Простые паттерны Паттерн 2 Паттерн 3 References Алгоритм решения паттерна 3 1 Пройдёмся по всему массиву. Изначально has_negative присвоим ложь, так как ни одного отрицательного числа мы пока не нашли. 2 Проверим пробегаемый элемент, больше он или меньше нуля. 3 Если он меньше нуля, то “опустим флажок”, сделав has_negative равным истине и прервём цикл. 4 Итого, если в конце цикла has_negative имеет значение ИСТИНА, то как минимум один отрицательный элемент найден. Иначе нет. 5 Заметим, что переменная has_negative как раз и будет отвечать на вопрос, есть ли в массиве отрицательный элемент. Поэтому функцией можно просто возвращать её значение. Информатика 10-11 классы Паттерны программирования
  • 17. Введение Простые паттерны Паттерн 2 Паттерн 3 References Программа для паттерна 3 Listing 5: Паттерн 3 def array_has_negative ( a r r a y ) r e t u r n f a l s e i f a r r a y . empty ? has_negative = f a l s e s i z e = a r r a y . s i z e −1 for i in 0 . . s i z e i f ( a r r a y [ i ] < 0) has_negative = true break end end has_negative end Информатика 10-11 классы Паттерны программирования
  • 18. Введение Простые паттерны Паттерн 2 Паттерн 3 References Усложним задачу Усложним задачу. Допустим, у нас есть массив чисел, содержащий элементы от 1 до 100. Сколько неизвестно. Повторы также возможны. Требуется вывести на экран те натуральные числа от 1 до 100, которые не встречаются в данном массиве. По сути, нам нужно ответить на 100 вопросов: есть ли в массиве число 1, есть ли в массиве число 2 и т.п. Решение перебором в лоб: пройтись циклом от 1 до 100 и проверить, есть ли в массиве пробегаемое число. Недостаток: ооочень долгое время работы. Нам придётся совершить n · 100 (по 100 проходов для каждого из n чисел) итераций. Можно улучшить метод, заведя булевский массив длиной 100. И, пробегая всего лишь один раз по всему массиву Информатика 10-11 классы Паттерны программирования
  • 19. Введение Простые паттерны Паттерн 2 Паттерн 3 References Усложним задачу Можно улучшить метод, заведя булевский массив длиной 100. Заполним его изначально ложью. Пройдём по начальному массиву. Будем помечать истиной элементы с такими ключами, которые встречаются в виде значений в массиве. Дубликаты нам не страшны, так как двойное присваивание ничего не поменяет. Кстати, от них можно избавиться с помощью метода arr.uniq. В конце просто пройдёмся по булевскому массиву и выведем на экран ключи тех элементов, которые равны лжи. Информатика 10-11 классы Паттерны программирования
  • 20. Введение Простые паттерны Паттерн 2 Паттерн 3 References Программа для усложнённого паттерна 3 Listing 6: Усложнённый паттерн 3 d e f missen_numbers ( a r r a y ) r e t u r n ( 1 . . 1 0 0 ) . to_a i f a r r a y . empty ? s i z e = a r r a y . s i z e −1 has_numbers = [ ] 1 0 0 . t i m e s { | i | has_numbers [ i ] = f a l s e } for i in 0 . . s i z e has_numbers [ a r r a y [ i ] −1] = t r u e end numbers = [ ] 1 0 0 . t i m e s { | i | numbers [ ] = i +1 u n l e s s has_numbers [ i ] } numbers end Информатика 10-11 классы Паттерны программирования
  • 21. Введение Простые паттерны Паттерн 2 Паттерн 3 References Правило 2 Никогда не забывайте, что элементы массива нумеруются с нуля. Информатика 10-11 классы Паттерны программирования
  • 22. Введение Простые паттерны Паттерн 2 Паттерн 3 References Правило 3 Обязательно инициализируйте пустые массивы нужной длины. Информатика 10-11 классы Паттерны программирования
  • 23. Введение Простые паттерны Паттерн 2 Паттерн 3 References Необходимые пояснения Почему мы присваиваем истине has_numbers[array[i]-1]. Откуда минус единица? Известно, что значения массива это числа от 1 до 100. У нас массив состоит из 100 элементов. То есть, ключи определены от 0 до 99. Вычитая единицу, мы “переводим” одно представление в другое. По аналогичным соображениям в последнем цикле times мы прибавляем к ключу единицу (обратная операция). По правилу 3: когда вы пишите конструкцию вида arr[i] = arr[i] + 1, предполагается, что i–ый элемент массива существует и определён. Если это не так, вы получите ошибку. Информатика 10-11 классы Паттерны программирования
  • 24. Введение Простые паттерны Паттерн 2 Паттерн 3 References References Все презентации доступны на http://school.smirik.ru! Вопросы, предложения, д/з: smirik@gmail.com Информатика 10-11 классы Паттерны программирования