ݺߣ

ݺߣShare a Scribd company logo
Задание 1                         Задание 2             References




                         Задачи по ООП

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


                            6 марта 2012 г.




            Информатика 10-11 классы    Задачи по ООП
Задание 1                                Задание 2                     References



Задание

            Создать следующие классы: человек, ученик,
            ученик–раздолбай, учитель, директор.
            Каждый человек имеет: фамилию, имя, отчество, год
            рождения. Наследование определено в соответствии со
            здравым смыслом (ученик–раздолбай — наследник
            ученика). Все сущности имеют методы:
             1   Посчитать возраст (getAges).
             2   обратиться по имени (getName) по правилу: учитель и
                 директор — имя + отчество, ученик — имя,
                 ученик-раздолбай — “Бяка” + имя.
             3   булевский метод главный (head?): для директора
                 возвращается истина, для остальных — ложь.
            ФИО и год рождения должно задаваться в конструкторе.
            После реализации создать экземпляры каждого класса и
            вызвать для них методы getName, getAges, head?.
                   Информатика 10-11 классы    Задачи по ООП
Задание 1                                      Задание 2                          References



Шаг 1



            Прежде всего, создадим класс Person.
            В классе есть четыре свойства: first_name, last_name,
            middle_name, birthday

      Listing 1: Основа Person

            c l a s s Person
                a t t r _ a c c e s s o r : f i r s t _ n a m e , : last_name ,
                                          : middle_name , : b i r t h d a y
            end




                      Информатика 10-11 классы        Задачи по ООП
Задание 1                                 Задание 2                              References



Шаг 2




            В условии задачи требуется, чтобы основные свойства
            класса задавались сразу.
            То есть, мы хотим, чтобы работал следующий код:

      Listing 2: Пример объекта

            p = P e r s o n . new ( "Иванов" , "Иван" , "Иванович" , 1 9 7 5 )




                    Информатика 10-11 классы    Задачи по ООП
Задание 1                                      Задание 2                                References



Шаг 3

              Для того, чтобы при создании можно было сразу задать
              какие-либо параметры, нам нужно определить конструктор.
              Конструктор на вход (в соответствии с кодом предыдущего
              слайда) будет принимать 4 аргумента.

      Listing 3: Конструктор

            c l a s s Person
                a t t r _ a c c e s s o r : f i r s t _ n a m e , : last_name ,
                                          : middle_name , : b i r t h d a y
                d e f i n i t i a l i z e ( fname , lname , mname , b i r t h d a y )
                    @ f i r s t _ n a m e = fname
                    @last_name             = lname
                    @middle_name = mname
                    @birthday              = birthday
                end
            end

                        Информатика 10-11 классы      Задачи по ООП
Задание 1                                      Задание 2             References



Шаг 4

            Возраст у экземпляров класса Person и у его наследников
            будет считаться всегда одинаково.
            Поэтому определим соответствующий метод в самом
            классе Person.
            Через механизм наследования метод автоматически будет
            доступен всем наследникам.

      Listing 4: Метод age

            c l a s s Person
                ...
                d e f age
                    2012 − @ b i r t h d a y
                end
            end

                      Информатика 10-11 классы       Задачи по ООП
Задание 1                                 Задание 2               References



Шаг 5

            В большинстве случаев метод head? будет возвращать
            ложь (за исключением объекта класса Директор).
            Поэтому создадим базовый метод в классе Person, а в
            классе Headmaster используем полиморфизм
            (переопределение метода) для изменения результата.

      Listing 5: Метод head

            c l a s s Person
                ...
                d e f head ?
                    false
                end
            end


                    Информатика 10-11 классы    Задачи по ООП
Задание 1                                 Задание 2              References



Шаг 6


            Стандартное обращение к человеку — по имени–отчеству.
            Раз стандартное — значит, определяем в классе–родителе.
            При необходимости используем полиморфизм.

      Listing 6: Метод name

            c l a s s Person
                ...
                d e f name
                    @ f i r s t _ n a m e + "␣" + @middle_name
                end
            end




                    Информатика 10-11 классы    Задачи по ООП
Задание 1                                 Задание 2                              References



Шаг 7



            Проверим класс Person, вызвав последовательно все
            методы.

      Listing 7: Person

            p = P e r s o n . new ( "Иванов" , "Иван" , "Иванович" , 1 9 7 5 )
            p u t s p . name
            p u t s p . age
            p u t s p . head ?




                    Информатика 10-11 классы    Задачи по ООП
Задание 1                                Задание 2             References



Шаг 8



            Класс Teacher имеет абсолютно стандартную реализацию.
            Все методы в нём совпадают с методами Person.
            Поэтому достаточно просто его определить.

      Listing 8: Teacher

            c l a s s Teacher < Person
            end




                   Информатика 10-11 классы    Задачи по ООП
Задание 1                                Задание 2              References



Шаг 9


            У ученика другое обращение.
            Используем полиморфизм для переопределения метода
            name.

      Listing 9: Student

            c l a s s Student < Person
                d e f name
                    @first_name
                end
            end




                   Информатика 10-11 классы    Задачи по ООП
Задание 1                                    Задание 2               References



Шаг 10



            Класс BadStudent также имеет отличное ото всех
            обращение с приставкой «Бяка».

      Listing 10: BadStudent

            c l a s s Ba dS tud ent < S t u d e n t
                d e f name
                    " Byaka ␣" + @ f i r s t _ n a m e
                end
            end




                      Информатика 10-11 классы       Задачи по ООП
Задание 1                                 Задание 2              References



Шаг 11


            Класс Headmaster имеет стандартное обращение по
            имени–отчеству.
            Значит, метод name переопределять не надо.
            А вот метод head? должен возвращать истину.

      Listing 11: Headmaster

            c l a s s Headmaster < P e r s o n
                d e f head ?
                    true
                end
            end




                    Информатика 10-11 классы     Задачи по ООП
Задание 1                                 Задание 2                 References



Сложное задание



            Реализовать класс Двумерный Вектор.
            Класс имеет два свойства: x-компонента, y-компонента.
            Методы класса:
              1   посчитать длину (модуль)
              2   прибавить к текущему вектору другой
              3   отнять от текущего вектора другой
              4   изменить знак вектора (-вектор)
              5   умножить вектор на скаляр (вещественное число)
              6   скалярно умножить на другой вектор




                    Информатика 10-11 классы    Задачи по ООП
Задание 1                                 Задание 2             References



Шаг 1


            Прежде всего, определимся, что есть у вектора.
            Двумерный вектор — это два числа (x,y) (аналог
            радиус–вектора в геометрии).
            Других свойств у вектора нет. Но как хранить эти?
            Два варианта:
              1   В свойствах :x, :y.
              2   В едином свойстве :coords
            Второй вариант универсальнее, поэтому будем
            использовать его.
            NB. Кстати, мы сделаем программу для векторов любой
            размерности.


                    Информатика 10-11 классы    Задачи по ООП
Задание 1                                    Задание 2             References



Шаг 2


            В конструкторе по умолчанию зададим значение
            координат в виде пустого массива.

      Listing 12: Vector

            c l a s s Vector
                attr_accessor : coords

              def i n i t i a l i z e ( coords = [ ] )
                @coords = coords
              end
            end

            v = V e c t o r . new ( [ 1 , 2 ] )



                      Информатика 10-11 классы     Задачи по ООП
Задание 1                                       Задание 2                                         References



Шаг 3

            Определим метод подсчёта модуля.
            Модуль вычисляется по теореме Пифагора:

                                                      coords[i]2
                                                  i



      Listing 13: Вычисление модуля

            c l a s s Vector
                ..
                d e f module
                    ( @ c o o r d s . i n j e c t ( 0 ) { | r e s , elem | r e s+elem ∗ ∗ 2 } ) ∗ ∗ 0 . 5
                end
            end


                      Информатика 10-11 классы          Задачи по ООП
Задание 1                               Задание 2                References



Шаг 4



            Заметим, что модуль будет вычисляться не только для
            двумерного вектора, но и для вектора любой размерности.
            Теперь определим операцию сложения.
            При сложении компоненты векторов также складываются.
            Важно: операция сложения должна возвращать новый
            вектор — сумму текущего и того, с которым складываем.
            Сложение делаем покоординатно.




                  Информатика 10-11 классы    Задачи по ООП
Задание 1                                           Задание 2                               References



Шаг 4, часть 2



      Listing 14: Сложение

            d e f +(v )
               sum = V e c t o r . new
                s i z e = @ c o o r d s . s i z e −1
                for i in 0.. size
                    sum . c o o r d s [ i ] = @ c o o r d s [ i ] + v . c o o r d s [ i ]
               end
               sum
            end




                          Информатика 10-11 классы         Задачи по ООП
Задание 1                                            Задание 2                          References



Шаг 4, часть 2, альтернатива



               Для упрощения записи используем метод each_index,
               который проходит по каждому индексу массива.

      Listing 15: Упрощение

            d e f +(v )
               sum = V e c t o r . new
                @ c o o r d s . e a c h _ i n d e x { | i | sum . c o o r d s [ i ] =
                   @ c o o r d s [ i ]+ v . c o o r d s [ i ] }
               sum
            end




                          Информатика 10-11 классы           Задачи по ООП
Задание 1                               Задание 2                 References



Шаг 5



            Операция умножения немного сложнее.
            Если мы умножаем на число, то надо все компоненты
            вектора умножить на данное число.
            Если же мы умножаем вектор на вектор, то надо
            возвращать скалярное произведение.
            Как отличить, что нам передаётся в качестве аргумента?
            Используем метод class, который возвращает строку с
            названием класса.




                  Информатика 10-11 классы    Задачи по ООП
Задание 1                                 Задание 2                            References



Шаг 5, часть 2


      Listing 16: Умножение

            def ∗( v )
              i f ( v . c l a s s == V e c t o r )
                 product = 0
                 @ c o o r d s . e a c h _ i n d e x { | i | p r o d u c t+=
                     @coords [ i ] ∗ v . coords [ i ] }
              else
                 p r o d u c t = V e c t o r . new
                 @coords . each_index { | i | product . coords [ i ] =
                     @coords [ i ] ∗ v}
              end
              product
            end




                    Информатика 10-11 классы    Задачи по ООП
Задание 1                                       Задание 2                           References



Шаг 6



            Аналогично делаем остальные методы.
            Например, метод «отрицание».

      Listing 17: Отрицание

            d e f −@
                s e l f . c o o r d s = s e l f . c o o r d s . map { | i | − i }
            end




                       Информатика 10-11 классы         Задачи по ООП
Задание 1                                            Задание 2                          References



Шаг 7




      Listing 18: Упрощение

            d e f −(v )
               sum = V e c t o r . new
                @ c o o r d s . e a c h _ i n d e x { | i | sum . c o o r d s [ i ] =
                   @ c o o r d s [ i ]− v . c o o r d s [ i ] }
               sum
            end




                          Информатика 10-11 классы           Задачи по ООП
Задание 1                            Задание 2             References




                                Мысль
       Класс Vector очень и очень похож на класс Array




               Информатика 10-11 классы    Задачи по ООП
Задание 1                                Задание 2                 References



Расшифровка мысли


            Класс Vector, как мы определили на шаге 1, имеет только
            одно свойство — координаты.
            Координаты представляют собой массив.
            Раз всё в ruby — объекты, значит, и массивы тоже.
            А, значит, логично было бы вместо определения класса
            Vector, отнаследовать его от массива.

      Listing 19: Вектор vs Массив

              c l a s s Vector < Array
              end




                   Информатика 10-11 классы    Задачи по ООП
Задание 1                                      Задание 2                                           References



Работа с массивом


            Теперь мы можем обращаться к i-ой координате внутри
            класса так: self[i].
            Пример метода:

      Listing 20: Вектор как массив

              c l a s s Vector < Array
                  d e f +(a )
                      sum = V e c t o r . new
                      s e l f . e a c h _ i n d e x { | k | sum [ k ] = s e l f [ k ]+ a [ k ] }
                      sum
                  end
              end



                     Информатика 10-11 классы          Задачи по ООП
Задание 1                                       Задание 2             References



Создание векторомассива




      Listing 21: Создание

            v1 =   V e c t o r . new [ 1 , 2 , 3 ]
            v2 =   V e c t o r . new [ 3 , 4 , 5 ]
            v3 =   v1+v3
            puts   v3 . i n s p e c t




                     Информатика 10-11 классы         Задачи по ООП
Задание 1                                Задание 2                 References



References




            При подготовке данного материала использовались сайты:
            http://ru.wikibooks.org/wiki/Ruby, http://rubydev.ru,
            http://en.wikipedia.org, http://ruby-lang.org.
            Все презентации доступны на http://school.smirik.ru!
            Вопросы, предложения, д/з: smirik@gmail.com




                   Информатика 10-11 классы    Задачи по ООП

More Related Content

Viewers also liked (8)

Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивами
Evgeny Smirnov
NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.
Evgeny Smirnov
Ruby: основы ООП
Ruby: основы ООПRuby: основы ООП
Ruby: основы ООП
Evgeny Smirnov
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ru
Alexander Shcherbinin
Объектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в rubyОбъектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в ruby
Evgeny Smirnov
Мобильные приложения в школе
Мобильные приложения в школеМобильные приложения в школе
Мобильные приложения в школе
Evgeny Smirnov
1220 2-140127014612-phpapp01
1220 2-140127014612-phpapp011220 2-140127014612-phpapp01
1220 2-140127014612-phpapp01
nextgen10
2 m2 m2 m2 m
2 m2 m
YchebnikRU
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивами
Evgeny Smirnov
NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.NumBuster! Почему связи между данными важнее самих данных.
NumBuster! Почему связи между данными важнее самих данных.
Evgeny Smirnov
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ru
Alexander Shcherbinin
Объектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в rubyОбъектно-ориентированное программирование в ruby
Объектно-ориентированное программирование в ruby
Evgeny Smirnov
Мобильные приложения в школе
Мобильные приложения в школеМобильные приложения в школе
Мобильные приложения в школе
Evgeny Smirnov
1220 2-140127014612-phpapp01
1220 2-140127014612-phpapp011220 2-140127014612-phpapp01
1220 2-140127014612-phpapp01
nextgen10

More from Evgeny Smirnov (20)

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

Задачи по ООП в ruby

  • 1. Задание 1 Задание 2 References Задачи по ООП Информатика 10-11 классы 6 марта 2012 г. Информатика 10-11 классы Задачи по ООП
  • 2. Задание 1 Задание 2 References Задание Создать следующие классы: человек, ученик, ученик–раздолбай, учитель, директор. Каждый человек имеет: фамилию, имя, отчество, год рождения. Наследование определено в соответствии со здравым смыслом (ученик–раздолбай — наследник ученика). Все сущности имеют методы: 1 Посчитать возраст (getAges). 2 обратиться по имени (getName) по правилу: учитель и директор — имя + отчество, ученик — имя, ученик-раздолбай — “Бяка” + имя. 3 булевский метод главный (head?): для директора возвращается истина, для остальных — ложь. ФИО и год рождения должно задаваться в конструкторе. После реализации создать экземпляры каждого класса и вызвать для них методы getName, getAges, head?. Информатика 10-11 классы Задачи по ООП
  • 3. Задание 1 Задание 2 References Шаг 1 Прежде всего, создадим класс Person. В классе есть четыре свойства: first_name, last_name, middle_name, birthday Listing 1: Основа Person c l a s s Person a t t r _ a c c e s s o r : f i r s t _ n a m e , : last_name , : middle_name , : b i r t h d a y end Информатика 10-11 классы Задачи по ООП
  • 4. Задание 1 Задание 2 References Шаг 2 В условии задачи требуется, чтобы основные свойства класса задавались сразу. То есть, мы хотим, чтобы работал следующий код: Listing 2: Пример объекта p = P e r s o n . new ( "Иванов" , "Иван" , "Иванович" , 1 9 7 5 ) Информатика 10-11 классы Задачи по ООП
  • 5. Задание 1 Задание 2 References Шаг 3 Для того, чтобы при создании можно было сразу задать какие-либо параметры, нам нужно определить конструктор. Конструктор на вход (в соответствии с кодом предыдущего слайда) будет принимать 4 аргумента. Listing 3: Конструктор c l a s s Person a t t r _ a c c e s s o r : f i r s t _ n a m e , : last_name , : middle_name , : b i r t h d a y d e f i n i t i a l i z e ( fname , lname , mname , b i r t h d a y ) @ f i r s t _ n a m e = fname @last_name = lname @middle_name = mname @birthday = birthday end end Информатика 10-11 классы Задачи по ООП
  • 6. Задание 1 Задание 2 References Шаг 4 Возраст у экземпляров класса Person и у его наследников будет считаться всегда одинаково. Поэтому определим соответствующий метод в самом классе Person. Через механизм наследования метод автоматически будет доступен всем наследникам. Listing 4: Метод age c l a s s Person ... d e f age 2012 − @ b i r t h d a y end end Информатика 10-11 классы Задачи по ООП
  • 7. Задание 1 Задание 2 References Шаг 5 В большинстве случаев метод head? будет возвращать ложь (за исключением объекта класса Директор). Поэтому создадим базовый метод в классе Person, а в классе Headmaster используем полиморфизм (переопределение метода) для изменения результата. Listing 5: Метод head c l a s s Person ... d e f head ? false end end Информатика 10-11 классы Задачи по ООП
  • 8. Задание 1 Задание 2 References Шаг 6 Стандартное обращение к человеку — по имени–отчеству. Раз стандартное — значит, определяем в классе–родителе. При необходимости используем полиморфизм. Listing 6: Метод name c l a s s Person ... d e f name @ f i r s t _ n a m e + "␣" + @middle_name end end Информатика 10-11 классы Задачи по ООП
  • 9. Задание 1 Задание 2 References Шаг 7 Проверим класс Person, вызвав последовательно все методы. Listing 7: Person p = P e r s o n . new ( "Иванов" , "Иван" , "Иванович" , 1 9 7 5 ) p u t s p . name p u t s p . age p u t s p . head ? Информатика 10-11 классы Задачи по ООП
  • 10. Задание 1 Задание 2 References Шаг 8 Класс Teacher имеет абсолютно стандартную реализацию. Все методы в нём совпадают с методами Person. Поэтому достаточно просто его определить. Listing 8: Teacher c l a s s Teacher < Person end Информатика 10-11 классы Задачи по ООП
  • 11. Задание 1 Задание 2 References Шаг 9 У ученика другое обращение. Используем полиморфизм для переопределения метода name. Listing 9: Student c l a s s Student < Person d e f name @first_name end end Информатика 10-11 классы Задачи по ООП
  • 12. Задание 1 Задание 2 References Шаг 10 Класс BadStudent также имеет отличное ото всех обращение с приставкой «Бяка». Listing 10: BadStudent c l a s s Ba dS tud ent < S t u d e n t d e f name " Byaka ␣" + @ f i r s t _ n a m e end end Информатика 10-11 классы Задачи по ООП
  • 13. Задание 1 Задание 2 References Шаг 11 Класс Headmaster имеет стандартное обращение по имени–отчеству. Значит, метод name переопределять не надо. А вот метод head? должен возвращать истину. Listing 11: Headmaster c l a s s Headmaster < P e r s o n d e f head ? true end end Информатика 10-11 классы Задачи по ООП
  • 14. Задание 1 Задание 2 References Сложное задание Реализовать класс Двумерный Вектор. Класс имеет два свойства: x-компонента, y-компонента. Методы класса: 1 посчитать длину (модуль) 2 прибавить к текущему вектору другой 3 отнять от текущего вектора другой 4 изменить знак вектора (-вектор) 5 умножить вектор на скаляр (вещественное число) 6 скалярно умножить на другой вектор Информатика 10-11 классы Задачи по ООП
  • 15. Задание 1 Задание 2 References Шаг 1 Прежде всего, определимся, что есть у вектора. Двумерный вектор — это два числа (x,y) (аналог радиус–вектора в геометрии). Других свойств у вектора нет. Но как хранить эти? Два варианта: 1 В свойствах :x, :y. 2 В едином свойстве :coords Второй вариант универсальнее, поэтому будем использовать его. NB. Кстати, мы сделаем программу для векторов любой размерности. Информатика 10-11 классы Задачи по ООП
  • 16. Задание 1 Задание 2 References Шаг 2 В конструкторе по умолчанию зададим значение координат в виде пустого массива. Listing 12: Vector c l a s s Vector attr_accessor : coords def i n i t i a l i z e ( coords = [ ] ) @coords = coords end end v = V e c t o r . new ( [ 1 , 2 ] ) Информатика 10-11 классы Задачи по ООП
  • 17. Задание 1 Задание 2 References Шаг 3 Определим метод подсчёта модуля. Модуль вычисляется по теореме Пифагора: coords[i]2 i Listing 13: Вычисление модуля c l a s s Vector .. d e f module ( @ c o o r d s . i n j e c t ( 0 ) { | r e s , elem | r e s+elem ∗ ∗ 2 } ) ∗ ∗ 0 . 5 end end Информатика 10-11 классы Задачи по ООП
  • 18. Задание 1 Задание 2 References Шаг 4 Заметим, что модуль будет вычисляться не только для двумерного вектора, но и для вектора любой размерности. Теперь определим операцию сложения. При сложении компоненты векторов также складываются. Важно: операция сложения должна возвращать новый вектор — сумму текущего и того, с которым складываем. Сложение делаем покоординатно. Информатика 10-11 классы Задачи по ООП
  • 19. Задание 1 Задание 2 References Шаг 4, часть 2 Listing 14: Сложение d e f +(v ) sum = V e c t o r . new s i z e = @ c o o r d s . s i z e −1 for i in 0.. size sum . c o o r d s [ i ] = @ c o o r d s [ i ] + v . c o o r d s [ i ] end sum end Информатика 10-11 классы Задачи по ООП
  • 20. Задание 1 Задание 2 References Шаг 4, часть 2, альтернатива Для упрощения записи используем метод each_index, который проходит по каждому индексу массива. Listing 15: Упрощение d e f +(v ) sum = V e c t o r . new @ c o o r d s . e a c h _ i n d e x { | i | sum . c o o r d s [ i ] = @ c o o r d s [ i ]+ v . c o o r d s [ i ] } sum end Информатика 10-11 классы Задачи по ООП
  • 21. Задание 1 Задание 2 References Шаг 5 Операция умножения немного сложнее. Если мы умножаем на число, то надо все компоненты вектора умножить на данное число. Если же мы умножаем вектор на вектор, то надо возвращать скалярное произведение. Как отличить, что нам передаётся в качестве аргумента? Используем метод class, который возвращает строку с названием класса. Информатика 10-11 классы Задачи по ООП
  • 22. Задание 1 Задание 2 References Шаг 5, часть 2 Listing 16: Умножение def ∗( v ) i f ( v . c l a s s == V e c t o r ) product = 0 @ c o o r d s . e a c h _ i n d e x { | i | p r o d u c t+= @coords [ i ] ∗ v . coords [ i ] } else p r o d u c t = V e c t o r . new @coords . each_index { | i | product . coords [ i ] = @coords [ i ] ∗ v} end product end Информатика 10-11 классы Задачи по ООП
  • 23. Задание 1 Задание 2 References Шаг 6 Аналогично делаем остальные методы. Например, метод «отрицание». Listing 17: Отрицание d e f −@ s e l f . c o o r d s = s e l f . c o o r d s . map { | i | − i } end Информатика 10-11 классы Задачи по ООП
  • 24. Задание 1 Задание 2 References Шаг 7 Listing 18: Упрощение d e f −(v ) sum = V e c t o r . new @ c o o r d s . e a c h _ i n d e x { | i | sum . c o o r d s [ i ] = @ c o o r d s [ i ]− v . c o o r d s [ i ] } sum end Информатика 10-11 классы Задачи по ООП
  • 25. Задание 1 Задание 2 References Мысль Класс Vector очень и очень похож на класс Array Информатика 10-11 классы Задачи по ООП
  • 26. Задание 1 Задание 2 References Расшифровка мысли Класс Vector, как мы определили на шаге 1, имеет только одно свойство — координаты. Координаты представляют собой массив. Раз всё в ruby — объекты, значит, и массивы тоже. А, значит, логично было бы вместо определения класса Vector, отнаследовать его от массива. Listing 19: Вектор vs Массив c l a s s Vector < Array end Информатика 10-11 классы Задачи по ООП
  • 27. Задание 1 Задание 2 References Работа с массивом Теперь мы можем обращаться к i-ой координате внутри класса так: self[i]. Пример метода: Listing 20: Вектор как массив c l a s s Vector < Array d e f +(a ) sum = V e c t o r . new s e l f . e a c h _ i n d e x { | k | sum [ k ] = s e l f [ k ]+ a [ k ] } sum end end Информатика 10-11 классы Задачи по ООП
  • 28. Задание 1 Задание 2 References Создание векторомассива Listing 21: Создание v1 = V e c t o r . new [ 1 , 2 , 3 ] v2 = V e c t o r . new [ 3 , 4 , 5 ] v3 = v1+v3 puts v3 . i n s p e c t Информатика 10-11 классы Задачи по ООП
  • 29. Задание 1 Задание 2 References References При подготовке данного материала использовались сайты: http://ru.wikibooks.org/wiki/Ruby, http://rubydev.ru, http://en.wikipedia.org, http://ruby-lang.org. Все презентации доступны на http://school.smirik.ru! Вопросы, предложения, д/з: smirik@gmail.com Информатика 10-11 классы Задачи по ООП