Объектно-ориентированное программирование Смолток. Лекция 3 Карпов В.Э.

Презентация:



Advertisements
Похожие презентации
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
Advertisements

Pascal Алгоритмы циклической структуры, программирование на языке Pascal Часть 2 8 «Б» и 10 «Б» классы.
Циклические процессы Процесс называется циклическим, если вычисления в нём многократно повторяются по одним и тем же формулам при разных значениях входящих.
1 Рекурсивное программирование Рекурсия – это метод, сводящий общую задачу к некоторым задачам более узкого, простого типа Рекурсивный алгоритм – это алгоритм,
Циклические алгоритмы Повторение - это многократное выполнение одного или нескольких предписаний алгоритма. Цикл - это оператор языка программирования,
Учебный курс Объектно-ориентированный анализ и программирование Лекция 4 Трансформация логической модели в программный код Лекции читает кандидат технических.
Программирование Задания В2, В5. Оператор присваивания в языке программирования Задание В2 – базовый уровень, время – 2 мин.
Основы операционных систем. Тема 6. Механизмы синхронизации.
1 Когда известно число повторений одного и того же действия, удобно использовать цикл с параметром Цикл с параметром (определенный цикл)
РЕКУРСИЯ РЕКУРРЕНТНЫЕ СООТНОШЕНИЯ У попа была собака - он ее любил. Она съела кусок мяса - он ее убил. Вырыл ямку - закопал, Взял дощечку – написал: У.
Объектно-ориентированный язык программирования. Переменная - эта поименованная ячейка памяти, хранящая какое-либо одно значение (одно число, один фрагмент.
Циклы в языке программирования Pascal
1 Программирование на языке Паскаль Тема 4. Циклы.
Рекурсивное программирование Рекурсия – это метод, сводящий общую задачу к некоторым задачам более узкого, простого типа Рекурсивный алгоритм – это алгоритм,
Рекурсивная обработка списков1 Структуры и алгоритмы обработки данных, 1 Лекция 3 Рекурсивная обработка списков 1.Представление и реализация.
В алгоритмической структуре «цикл» серия команд (тело цикла) выполняется многократно. Циклы бывают 2 типов: 1.Цикл со счетчиком. Используется когда заранее.
Pascal Алгоритмы циклической структуры, программирование на языке Pascal 9 класс.
Язык SmallTalk «Чистый» объектно- ориентированный язык.
К. Поляков, Программирование на алгоритмическом языке Тема 7. Алгоритмы-функции.
Лекция 12. Основы Avenue Харитонов А. Ю. Министерство образования и науки Украины Донецкий национальный технический университет Кафедра компьютерных систем.
Транксрипт:

Объектно-ориентированное программирование Смолток. Лекция 3 Карпов В.Э.

ООП Смолток2 Циклические конструкции Циклы – тоже почти все «самодельные»

ООП Смолток3 Цикл While whileTrue (покаИстина), whileFalse (покаЛожь) whileTrue: BLOCK "Выполняет заданный блок до тех пор, пока приемник не будет иметь значение 'ложь'. Выдает нуль" self value ifTrue: [BLOCK value. self whileTrue: BLOCK ]. ^nil! whileFalse: BLOCK "Выполняет заданный блок до тех пор, пока приемник не будет иметь значение 'истина'. Выдает нуль" self value ifFalse: [BLOCK value. self whileFalse: BLOCK ]. ^nil! Пример программы, копирующей файл SOURCE.TXT в файл DEST.TXT: | ввод вывод | ввод:= Файл полноеИмя: 'SOURCE.TXT'. вывод:=Файл полноеИмя: 'DEST.TXT'. [ввод вКонце] whileFalse: [ вывод поместитьСледующий: ввод следующий ]. ввод закрыть. вывод закрыть.

ООП Смолток4 Простой цикл timesRepeat: Block | n | n := self. [n > 0] whileTrue: [n := n - 1. Block value] Пример: 3 timesRepeat: [ Черепашка переместитьНа: 100; повернутьНа: 120 ]

ООП Смолток5 Арифметический цикл to:limit by:step do:block self

ООП Смолток6 Создание новых объектов Чтобы создать объект, классу посылается сообщение о создании нового экземпляра. Класс создает экземпляр, инициализирует и выдает созданный экземпляр в качестве ответа на сообщение. Пример 1: x := Array new: 10. Для того чтобы обратиться к нужному методу экземпляра класса, необходимо, чтобы уже существовал экземпляр класса. Пример 2: ДемоКласс запустить. компилятор выдает ошибку, т.к. здесь сообщение посылается классу, а в протоколе сообщений класса такого метода нет. Метод 'запустить' находится в протоколе сообщений экземпляра класса. Поэтому необходимо сначала создать экземпляр класса: ДемоКласс новыйЭкземпляр запустить. Пример 3: |c| c:= BouncingBallView new. c show. BouncingBallView show

ООП Смолток7 ПРОГРАММИРОВАНИЕ Этапы разработки программы 1. Разработка спецификации метода (предварительная постановка задачи): Что будет являться объектом - адресатом? Что будет являться объектом - параметром? Что будет являться результатом? 2. Создается новый класс объектов, необходимых для решения задачи некоторой прикладной области (анализ предметной области). определяется место класса в иерархии прикладных классов (определяется его суперкласс и возможные подклассы). 3. Для каждого класса определяется протокол сообщений и внутренняя структура экземпляров. 4. Алгоритм решения задачи записывается на языке взаимодействия объектов (проектирование прикладной системы): объекты порождаются, инициализируются, обмениваются сообщениями с другими объектами в целях получения результата решения задачи. 5. Новые классы реализуются с помощью имеющихся классов системы Смолток (программированию задачи).

ООП Смолток8 Системный генератор путей Категории - группы классов, выделенные для некоторых областей применения. Классы - классы системы Смолток. Категории методов - группы методов классов или методов экземпляров, выделенные для удобства по признаку применения или по иному свойству. Методы - методы системы Смолток.

ООП Смолток9 Системный генератор путей в DolphinSmalltalk

ООП Смолток10 Рекурсия -- Фибоначчи -- выдать N число Фибоноччи, где N - объект-адресат -- Числа Фибоначчи задаются следующей последовательностью: -- x1=1, x2=1, xi=xi-1+xi-2 fibo self

ООП Смолток11 Ханойские башни 1 Этап. Спецификация метода объект-адресат - это целое число (количество колец). метод будет принадлежать классу целых чисел. объекты-параметры - символы '1', '2', '3' (информация: с какого штырька на какой нужно переложить кольцо и какой использовать как дополнительный) результат - вывод на экран информации о последовательности выполнения данной задачи. Вызов метода будет выглядеть так: 10 ханойC: '1' на: '2' через: '3'

ООП Смолток12 Алгоритм 2 Этап. Реализация метода ханойС: x на: y через: z. Рекурсивное решение. Базис. Если число колес равно 1, то нужно просто переложить это кольцо c х на y. Если число колес равно К, то нужно переложить со штырька х на штырек z K-1 колец, а затем переложить самое большое K-е кольцо на y и переложить все остальные K-1 колец на y.

ООП Смолток13 Реализация метода ханойС: x на: y через: z "головоломка 'Ханойские башни'" self := 1 ifTrue: [ СистемнаяИнформация поместитьВсеПоследующие: 'Переложить со штырька ',x,' на штырек ',y; символВК. ] ifFalse: [ (self - 1) ханойС: x на: z через: y. СистемнаяИнформация поместитьВсеПоследующие: 'Переложить со штырька ',x,' на штырек ',y; символВК. (self - 1) ханойС: z на: y через: x ] Пример использования: 10 ханойС: '1' на: '2' через: '3'

ООП Смолток14 Пример метода в Smalltalk Express hanoiFrom: x to: y by: z result: aStream "головоломка 'Ханойские башни'" self == 1 ifTrue: [ 'Переложить со штырька ' printOn: aStream. x printOn: aStream. 'на штырек ' printOn: aStream. y printOn: aStream. (10 asCharacter) printOn: aStream.] ifFalse: [ (self - 1) hanoiFrom: x to: z by: y result: aStream. 'Переложить со штырька ' printOn: aStream. x printOn: aStream. 'на штырек ' printOn: aStream. y printOn: aStream. (10 asCharacter) printOn: aStream. (self - 1) hanoiFrom: z to: y by: x result: aStream.]

ООП Смолток15 Пример использования |aStream| aStream := WriteStream on: String new. 10 hanoiFrom: 1 to: 2 by: 3 result: aStream. aStream contents.

ООП Смолток16 ПАРАЛЛЕЛЬНЫЕ ВЫЧИСЛЕНИЯ Три механизма: 1.параллелизм (parallelism) 2.планирование (scheduling) 3.синхронизация (synchronisation). Три класса: Process, ProcessScheduler, Semaphore

ООП Смолток17 Параллелизм Класс Process реализует механизм распараллеливания [f computeFunc] fork newProcessсоздать новый процесс, но не выполнять его; resumeвыполнить остановленный процесс; suspendостановить процесс; terminateзакончить процесс. Например: FProcess := [f computeFunc] newProcess, сформируется новый процесс, однако он будет находиться в состоянии ожидания и выполняться не будет. Выполнение его начнется только после того, как будет выполнено сообщение: FProcess resume.

ООП Смолток18 Диспетчеризация. Класс ProcessScheduler ProcessScheduler имеет единственный экземпляр, указателем на который является глобальная переменная Processor Processor fork: block1 Алгоритм диспетчеризации реализуется через простую систему приоритетов (priority system). Приоритеты процессов в Smalltalk Express определяются методами класса ProcessScheduler: userPriority, highUserPriority, lowUserPriority, topPriority В SmallTalk Express: userPriority ^4! highUserPriority ^6! lowUserPriority ^2! topPriority ^7! yield – остановить процесс с учетом приоритета [Float computeFunc] forkAt:Processor userBackgroundPriority

ООП Смолток19 Пример работы (Smalltalk Express) 1.|aStream n block1 block2 w nfibo flimit| 2.w := TextWindow windowLabeled: 'Fibo' frame: extent: 3.flimit := aStream := WriteStream on: String new. 5.block1 := [ n := 0. 6.[n

ООП Смолток20 Синхронизация. Класс Semaphore Семафоры Дейкстры Функции P и V V s s=s+1 P s s=s-1 s==0?

ООП Смолток21 Задача о кольцевом буфере Буфер на N ячеек Голова (Head) и хвост (Tail) Head – первая свободная ячейка, Tail – последняя занятая. Пишем в голову, читаем из хвоста.

ООП Смолток22 Класс «Ячейка» " Класс BUFFER " Object subclass: #Buffer instanceVariableNames: 'next val ' classVariableNames: '' poolDictionaries: '' ! !Buffer methods ! next ^next.! next: link next := link.! put: data val := data.! val ^val.! ! valnext valnext valnext

ООП Смолток23 Класс «Кольцевой буфер» Object subclass: #RingBuffer instanceVariableNames: 'empty full head tail fetchprotect storeprotect ' -- семафоры: -- empty - количество данных в буфере -- full - количество свободных мест -- head, tail - указатели на начало и конец -- fetchprotect и storeprotect - вспомогательные переменные, обеспечивающие -- взаимоисключение classVariableNames: '' poolDictionaries: '' ! ! !RRingBuffer class methods ! create: size ^self new init: size.! ! !RRingBuffer methods ! init: size head := tail := Buffer new. 1 to: size - 1 do: [ :i | tail next: Buffer new. tail := tail next]. tail next: head. tail := head. empty := Semaphore new. full := Semaphore new. 1 to: size do: [:i | full signal]. fetchprotect := Semaphore new signal. storeprotect := Semaphore new signal.!

ООП Смолток24 Методы fetch и store fetch |data| empty wait. fetchprotect wait. data := tail val. tail := tail next. fetchprotect signal. full signal. ^data.! store: data full wait. storeprotect wait. head put: data. head := head next. storeprotect signal. empty signal.! !

ООП Смолток25 Пример использования 1.|n block1 block2 w nfibo rb d flimit| 2.flimit := rb := RingBuffer new init: или так: rb := RingBuffer create: w := TextWindow windowLabeled: 'Ring Buffer' frame: extent: 6.block1 := [ n := 0. 7.[n