Основы программирования на rubyEvgeny SmirnovРассказывается об основах программирования на ruby: переменные, типы переменных, операции и пр. В конце приводятся блок-схема решения линейного уравнения.
Ruby: основы ООПEvgeny SmirnovОсновы объектно-ориентированного программирования на ruby. Разбор концепции наследования.
Оригинал: http://school.smirik.ru/show/43
Рекурсия. ПоискOlexandra DmytrenkoПрезентация для JuJa вебинара о том, как писать рекурсивные программы с примером о вычислении факториала и чисел Фибоначчи. Также рассказывается о поиске линейном, бинарном, в глубину и в ширину, как работает поисковая система.
Презентация сделана для новичков в деле программистов.
Обработка коллекций наизнанку: как применить много функций к одному аргументу...corehard_byСовременный язык C++ подвергается всё большему влиянию понятий и методов, заимствованных из парадигмы функционального программирования. В этом докладе представлен пример типично функционального решения, пригодного для довольно широкого круга практических задач. В противоположность привычной обработки коллекций (функции fmap, std::transform), где набор значений пропускается через единственную функцию, можно делать наоборот - подать одно значение на коллекцию функций. Есть несколько способов едалать это, один из них подробно описан здесь. Доклад охватывает как математические свойства, так и реализацию на языке C++, выполненную с использованием вариадических шаблонах и метапрограммирования.
Ruby: основы ООПEvgeny SmirnovОсновы объектно-ориентированного программирования на ruby. Разбор концепции наследования.
Оригинал: http://school.smirik.ru/show/43
Рекурсия. ПоискOlexandra DmytrenkoПрезентация для JuJa вебинара о том, как писать рекурсивные программы с примером о вычислении факториала и чисел Фибоначчи. Также рассказывается о поиске линейном, бинарном, в глубину и в ширину, как работает поисковая система.
Презентация сделана для новичков в деле программистов.
Обработка коллекций наизнанку: как применить много функций к одному аргументу...corehard_byСовременный язык C++ подвергается всё большему влиянию понятий и методов, заимствованных из парадигмы функционального программирования. В этом докладе представлен пример типично функционального решения, пригодного для довольно широкого круга практических задач. В противоположность привычной обработки коллекций (функции fmap, std::transform), где набор значений пропускается через единственную функцию, можно делать наоборот - подать одно значение на коллекцию функций. Есть несколько способов едалать это, один из них подробно описан здесь. Доклад охватывает как математические свойства, так и реализацию на языке C++, выполненную с использованием вариадических шаблонах и метапрограммирования.
Сегментация и поиск совпадений в бинарном потокеLeonid YurievДан миллиард файлов неизвестного формата.
Как выявить даже частичные совпадения, если одни файлы могут включать другие полностью или частями?
Как делать это, имея доступ только к потоку байтов без начала и конца?
Рассказ о разработанном подходе (методе) для решения таких задач. Принципиальные отличия в гибкости, в контроле над точностью и достоверностью, независимо от содержания и характера данных. Стоит уточнить:
Речь пойдет о способе сегментирования произвольного потока данных для последующего шинглирования.
При этом основной вопрос в том, как нарезать на вменяемые «шинглы» произвольную последовательность байтов без привязки к каким-либо абсолютным границам.
Внедряем MOOC'и на уроке информатикиEvgeny Smirnov1. Какие бывают MOOC'и?
2. Какие платформы существуют?
3. Какие курсы полезны для учителя информатики?
4. Метрики по результатам эксперимента в 2014-2015 годах.
Инновации которые не мешаютEvgeny SmirnovПрезенетация с выступления на Арене #ИТНШ 2017: зачем нужны инновации, какого типа бывают инновации, как их искать и как их внедрять?
Порядок и хаос в Солнечной системеEvgeny SmirnovПрезентация на фестивале "Пулковский меридиан" (Смирнов Е.А.) об устройстве, порядке и хаосе в Солнечной системе. Рассматриваются представления человечества, начиная с Древних времён и до наших дней. Особое внимание уделено хаотической динамике астероидов.
Мобильные приложения в образованииEvgeny SmirnovПрезентация для семинара о том, как использовать мобильные приложения Plickers & Lumosity в образовании.
NumBuster! Почему связи между данными важнее самих данных.Evgeny SmirnovЧасто считается, что основную ценность в бизнесе представляют данные. Однако же весьма важными, а, возможно, и наиболее важными с нашей точки зрения являются связи между получаемыми данными, которые позволяют персонализировать работу пользователя и узнать его лояльность по отношению к различным вещам: работе, разным компаниям, сервисам и пр.
Доклад NumBuster! на конференции BigData Russia 2014.
Промо-презентация для мастер-класса "Образовательные и игровые платформы в по...Evgeny SmirnovМастер-класса "Образовательные и игровые платформы в помощь учителю и методисту", конференция "Информационные технологии для Новой школы", РЦОКОиИТ, 2014.
Образовательные и игровые платформы в помощь учителю и методистуEvgeny SmirnovСуществующий формат образования, подразумевающий достаточно длительные уроки, большое количество материала для запоминания и стандартную систему контрольных работ, не является оптимальным в XXI веке. Интернет и другие современные технологии, а также наличие игровых и соревновательных элементов, позволяют сделать обучение для детей более интересным, повысить его эффективность и улучшить понимание предмета. Электронные видео-материалы дают возможность повторить и закрепить пройденный в школе материал в привычной для подростка форме. Всё это позволит сделать образование более подходящим по стилю и духу для современных детей.
2. Введение Простые паттерны Паттерн 2 Паттерн 3 References
Паттерны программирования
Одним из отличительных свойств хорошего программиста
является умение решать стандартные задачи
стандартными методами.
Практически любая задача в своём итоге сводится к
нескольким проблемам:
1 Считать исходные данные.
2 Придумать способ хранения данных внутри программы.
3 Понять, как проще всего разбить на подзадачи.
4 Проверить, нет ли готовых решений?
5 Преобразовать получившийся результат к требуемому.
Информатика 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 классы Паттерны программирования
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 классы Паттерны программирования
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 классы Паттерны программирования
23. Введение Простые паттерны Паттерн 2 Паттерн 3 References
Необходимые пояснения
Почему мы присваиваем истине has_numbers[array[i]-1].
Откуда минус единица?
Известно, что значения массива это числа от 1 до 100.
У нас массив состоит из 100 элементов.
То есть, ключи определены от 0 до 99. Вычитая единицу,
мы “переводим” одно представление в другое.
По аналогичным соображениям в последнем цикле times
мы прибавляем к ключу единицу (обратная операция).
По правилу 3: когда вы пишите конструкцию вида arr[i] =
arr[i] + 1, предполагается, что i–ый элемент массива
существует и определён. Если это не так, вы получите
ошибку.
Информатика 10-11 классы Паттерны программирования