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

PDF
Ruby: работа с массивами
PDF
Алгоритмы на ruby: перебор и рекурсия
PDF
Ruby строки
PDF
Алгоритмы на ruby: жадные алгоритмы
PDF
Основы программирования на ruby
PDF
Управляющие структуры в Ruby: условия
PDF
Инкапсуляция и полиморфизм в ruby
PDF
Динамическое программирование на ruby
Ruby: работа с массивами
Алгоритмы на ruby: перебор и рекурсия
Ruby строки
Алгоритмы на ruby: жадные алгоритмы
Основы программирования на ruby
Управляющие структуры в Ruby: условия
Инкапсуляция и полиморфизм в ruby
Динамическое программирование на ruby

What's hot (18)

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

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

PPT
тема множество для загрузки 2013
PPT
практика 5
PPT
Практикум по выполнению блока с информатика
PDF
Основы MATLAB. Программирование
PDF
Лекция 1. Анализ эффективности алгоритмов
PPT
Михаил Александров, Индуктивное моделирование
PPTX
Алгоритмы и структуры данных весна 2014 лекция 1
PDF
Алгоритмы и структуры данных осень 2013 лекция 1
PDF
Сегментация и поиск совпадений в бинарном потоке
PPT
Rgsu04
PDF
Основы языка Питон: типы данных, операторы
PPT
практика 7
PPT
ФУНКЦИИ и программы на Java. Основы Java
PPTX
содержательный подход
PPT
Программирование разветвляющихся алгоритмов
PPT
Запись вспомогательный алгоритмов на языка Паскаль
PPT
лекция 5
PDF
Беглый обзор "внутренностей" Python
PDF
Беглый обзор "внутренностей" Python
тема множество для загрузки 2013
практика 5
Практикум по выполнению блока с информатика
Основы MATLAB. Программирование
Лекция 1. Анализ эффективности алгоритмов
Михаил Александров, Индуктивное моделирование
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
Сегментация и поиск совпадений в бинарном потоке
Rgsu04
Основы языка Питон: типы данных, операторы
практика 7
ФУНКЦИИ и программы на Java. Основы Java
содержательный подход
Программирование разветвляющихся алгоритмов
Запись вспомогательный алгоритмов на языка Паскаль
лекция 5
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
Ad

More from Evgeny Smirnov (20)

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