Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_KAZYMYR.doc
Скачиваний:
15
Добавлен:
09.11.2019
Размер:
3.71 Mб
Скачать

Література

  1. Бадд Т. Объектно-ориентированное программирование. – СПб.: Питер, 1997. – 464 с.

  2. Буч Г. Объектно-ориентированное проектирование с примерами применения. –М.: Конкорд, 1992. – 519 с.

  1. Вайнер Р. Пинсон Л. С++ изнутри. – К.: «Диасофт Лтд.», 1993.– 304 с.

  2. Влиссидес Д. Применение шаблонов проектирования. Дополнительные шрихи. – М.: Издательский дом «Вильямс», 2003. – 144 с.

  3. Калверт Ч. Delphi 2. Энциклопедия пользователя. К.: НИПФ «ДиаСофт Лтд.», 1995. – 736 с.

  4. Конопка Р. Создание оригинальных компонент в среде Delphi. – К.: Диасофт, 1996. – 512 с.

  5. Ленди М., Саддикви С., Свишер Д. Borland JBuilder. Руководство разработчика. –М.: Издат. Дом Вильямс., 2004. – 864 с.

  6. Макгрегор Д., Сайкс Д. Тестирование объектно-ориентированного программного обеспечения. Практическое пособие. – К.: ООО «ТИД «ДС», 2002. – 432 с.

  7. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2003. – 461 с.

  8. Пол И. Объектно-ориентированное программирование с использованием С++. – К.: НИПФ «ДиаСофт Лтд.», 1995. – 480 с.

  9. Пономарев В. Самоучитель Jbuilder 6/7. – СПб.: БХВ-Петербург, 2003. – 304 с.

  10. Страуструп Б. С++ язык программирования.–М.:Софт, 1991.–315 с.

Додатки лабораторна робота №1 об'єкти й повідомлення в smalltalk

Об'єкти

Об'єкти - це основні будівельні конструкції мови SmallTalk. В ній нема поняття типу даних, і любий елемент чи структура даних являються об’єктом.. Наприклад, "this is a string" – це об'єкт SmallTalk (рядок символів), який дуже схожий на рядки символів в інших мовах. Нижче приводяться деякі об'єкти SmallTalk, які мають аналоги в більшості інших мовах програмування:

123 ціле

'A' одиночний символ А

#(1 2 3) масив з 3-х об'єктів цілих

Зверніть увагу на останній приклад. Масив являє собою об'єкт, що містить у собі інші об'єкти.

Розглянемо деякі інші приклади:

#('array' 'of' 'four' 'strings') масив рядків

#('array' 'of' 5 'strings' 'and' 2 'integer') масив рядків і цілих

Як бачите з цих прикладів, об'єкти, що входять до складу інших об'єктів, не повинні бути обов'язково одного виду або розміру.

Розглянемо більш складний приклад:

#(1 ('two' 'three') 4) вкладений масив

У цьому прикладі об'єкт (масив) містить у собі три інших об'єкти, у тому числі масив із двох рядків. Для вкладених масивів символ # можна опускати.

Виконання виразів

Будь-який рядок символів, записаний у вікні середовища SmallTalk, є вираз мови. Вирази можна запускати на виконання. Зокрема, ви можете виконати вирази безпосередньо з тексту, що читає. Для цього зробіть наступні дії:

  • запустіть VisualAge SmallTalk;

  • використовуючи пункт меню File/New, створіть нове робоче вікно Workspace;

  • перебуваючи в даному вікні, відкрийте файл із текстом лабораторної роботи через меню File/Open…...

Тепер ви зможете перевірити роботу наведених вище виразів. Для цього необхідно:

  • виділити курсором потрібний вираз, наприклад, #(1 2 3);

  • викликати правою кнопкою миші спливаюче меню;

  • вибрати пункт меню «Display».

Поруч із виразом буде надрукований текст результату. У нашому випадку це буде просто зміст масиву:

#(1 2 3) (1 2 3)

Структура повідомлення

Об'єкт сам по собі нічого не робить. Для того, щоб він щось зробив, йому потрібно надіслати повідомлення. Повідомлення в SmallTalk подібні виклику функції в інших мовах. Розглянемо простий приклад, у якому повідомлення factorial посилається об'єкту 20:

20 factorial

Запустіть цей вираз на виконання. Результатом виконання буде велике ціле число, що дорівнює 20! :

2 432 902 008 176 640 000

Розглянемо інший приклад, у якому повідомлення size (розмір рядка) посилається символьному рядку:

'now is the time' size 15

Повідомлення завжди повертають об'єкт як результат, подібно функції в більшості інших мовах. При цьому селектор повідомлення подібний імені функції, а об'єкт-одержувач і аргументи подібні до параметрів функції. Виконайте такий вираз:

'20' factorial

Результатом виконання буде повідомлення про помилку. У цьому виразі 20 взято в лапки, отже, є рядком. Факторіал для рядка не має змісту. Цей приклад показує, що об'єкти завжди знають, які повідомлення призначаються саме їм.

Унарні повідомлення

Повідомлення, які не мають аргументів, називаються унарними.

Подивитеся роботу наступних унарних повідомлень:

#( 'array' 'of' 'strings' ) size

'now is the time' asUppercase

'hello there' reverse

#( 4 'five' 6 7 ) reverse

$A value ”Видає ASCII код символу“

65 asCharacter

Передостанній рядок у наведених вище прикладах містить коментар. Коментарем є будь-який рядок символів, взятий в англійські подвійні лапки. VisualAge SmallTalk ігнорує коментарі при компіляції, вони потрібні тільки для полегшення роботи з текстом. Коментар може з'явитися в будь-якому місці серії виразів.

Ключові повідомлення

Повідомлення з одним або більше аргументами називаються ключовими.

Подивіться роботу наступних ключових повідомлень:

'now is the time' at: 6

'Hello' includes: $e

'The quick brown' copyFrom: 4 to: 9

В останньому повідомленні селектори copyFrom: to: розділені аргументами. У цьому прикладі селектори повідомлень працюють із рядками, але вони можуть працювати й з масивами.

Перевірте це на прикладі:

#( 9 8 7 6 5 ) at: 3

#( 1 ( 2 3 ) 4 5 ) includes: #( 2 3 )

#( 9 8 7 6 5 ) copyFrom: 1 to: 2

З розглянутих прикладів Ви можете побачити ще одну важливу особливість: різні типи об'єктів реагують на одні і тіж повідомлення у відповідності зі своїми особливостями, що є проявленням властивості поліморфізму.

Арифметичні вирази

Арифметика SmallTalk виглядає так само, як і в інших язиках. Наприклад, 3 + 4 звичайний арифметичний вираз, але з боку SmallTalk – це повідомлення. Об'єкт цілого типу 3 є одержувачем повідомлення, + – селектором повідомлення, а ціле 4 – аргументом повідомлення.

Інші приклади арифметичних виразів:

5 * 7 “множення”

5// 2 “цілочислене ділення”

7 \\ 3 “залишок від ділення”

3.2 /3.2 “ділення”

2/6

Останнє повідомлення являє приклад раціональної арифметики, або арифметики раціональних дробів. Результати такої арифметики виходять точними, без округлення або відкидання.

Порядок обчислення арифметичних виразів відрізняється від порядку, прийнятого в інших мовах програмування. Тут немає старшинства операцій, і обчислення робляться зліва направо, але можна використовувати дужки для керування процесом обчислення.

Наприклад, у виразі

3 + 4 * 2

результат буде 14 , а не 11.

Можна одержати й 11, якщо записати так:

3 + ( 4 * 2 )

Бінарні повідомлення

Арифметичні повідомлення є прикладами бінарних повідомлень – повідомлень із одним аргументом і одним або двома спеціальними символами (не буква й не цифра), що назіваються селекторами. Бінарні повідомлення завжди обчислюються строго зліва направо, але з урахуванням дужок. От приклади бінарних повідомлень:

'hello', ' there'

#(1 2 3), #(4 5 6)

У цих повідомленнях селектором є кома. Вона зчіплює аргумент із об'єктом-одержувачем.

Вкладені повідомлення

Кожне повідомлення повертає об'єкт. Тому у виразі, де може перебувати певний об'єкт, Ви можете записати повідомлення, що повертає цей об'єкт. Наприклад, у наступному прикладі, де всі повідомлення унарні, спочатку обчислюється факторіал для 20000, отримане число перетворюється в рядок символів, а потім визначається довжина цього рядка:

20000 factorial printString size

У наступних прикладах необхідно враховувати порядок виконання повідомлень різного виду:

'hello' size + 4

'now' size + #( 1 2 3 4 ) size

#( 1 12 24 36) includes: 4 factorial

В останньому прикладі використовуються два повідомлення. Одне з них, 4 factorial, є унарним, тому й обчислюється першим. Його результат стає аргументом для повідомлення include: .

Розглянемо ще приклад:

4 factorial between: 3 + 4 and: 'hello' size * 7

Тут 5 повідомлень із селекторами factorial, +, size, *, between: and: . Повідомлення 4 factorial і 'hello' size є унарними й тому обчислюються першими. Потім обчислюються бінарні повідомлення 3 + 4 і 5 * 7. Останнім обчислюється ключове повідомлення 24 between: 7 and: 35.

Якщо необхідно змінити встановлений порядок обчислення повідомлень, варто використати дужки. Наприклад:

'hello' at: ( #( 5 3 1 ) at: 2)

Цей вираз складається із двох at: повідомлень. Одне з них адресоване масиву, інше – рядку. Якщо в цьому виразі забрати дужки, одержимо безглузде повідомлення із двома аргументами at: at:

'hello' at: #( 5 3 1 ) at: 2

Тимчасові змінні

Тимчасові змінні називаються так тому, що SmallTalk видаляє їх, як тільки закінчується виконання програми. Тимчасові змінні оголошуються в першому рядку серії повідомлень шляхом включення їх у вертикальні дужки | |. Ім'я тимчасової змінної повинне починатися з маленької букви, інша частина може бути написана будь-якими буквами й цифрами.

Подивіться приклад, у якому використовуються три тимчасових змінних і цикл для того, щоб підрахувати масив із декількох факторіалів:

| temp index factorials |

factorials:= # ( 3 4 5 6 ).

index := 1.

factorials size timesRepeat: [

temp := factorials at: index.

factorials at: index put: temp factorial.

index := index + 1].

^ factorials

У першому рядку цієї програми об’явлено три тимчасових змінних: temp, index, factorials. Зверніть увагу, при оголошенні часової змінної об'єкт, на який вона може вказувати, не визначається. Об'єкт визначається безпосередньо під час виконання програми шляхом присвоювання. При цьому одна змінна може послідовно вказувати на різні об’єкти.

Наведена программа складається із серії виразів, розділених точкою.

Вирази, що повертають значення

Останній вираз в прикладі має такий вигляд:

^ factorials

Знак ^ показує, що дана величина повинна бути повернута як результат. Вираз, що починається зі знака ^, називається виразом, що повертає значення.

Вирази присвоювання

У наведеному вище прикладі використовуються чотири вирази присвоювання:

index := 1

factorials:= Array new:4

temp := factorials at: index

index := index + 1

У першому з них тимчасовій змінній присвоюється безпосередньо ціле значення – об’єкт 1, у трьох іншіх присвоюються результати повідомлень. Але, тому що результатом повідомлення завжди є об'єкт, то тимчасовій змінній завжди присвоюється деякий об'єкт. Варто мати на увазі, що при присвоюванні новий об'єкт не створюється. Змінна містить тільки посилання на об'єкт. Щоб переконатися в цьому, проаналізуйте наступний приклад:

|w1 w2|

w1:= AbtShellView new.

w2:=w1.

w1 title:'Заголовок вікна'.

w2 openWidget.

Запуск програми на виконання відбувається шляхом вибору строки Execute у вспливаючому меню. Тут створюється одне вікно, хоча на нього посилаються різні змінні. Тому змінна w2 відкриває вікно з заголовком, заданним для змінної w1. Обидві змінні посилаються на один и той же об’єкт, створений в результаті виконання повідомлення AbtShellView new.

Каскад повідомлень

У тих випадках, коли одному об'єкту необхідно послідовно послати декілька повідомлень, дозволяється їх розділити крапкою з комою, не повторюючи імені об'єкта. Така конструкція називається каскадом повідомлень. Нижче наводится програма, аналогічна прикладу із серією виразів, в якій використовується каскад повідомлень для створення вікна, визначення його параметрів й відкриття:

Зрівняйте наступний приклад з попереднім:

|w|

w:= AbtShellView new.

w title:’Заголовок вікна’;

backgroundColor:'SkyBlue';

openWidget.

Блоки

Блок – це об'єкт, що представляє собою серію повідомлень, які взяті у квадратні дужки. Блоку можна надсилати повідомлення. Також блок може бути аргументом повідомлення. У прикладі створення масиву значень факторіалів, блок передавався як аргумент повідомлення timesRepeat:. Фактично, у цьому повідомленні за допомогою блоку передавався код, який потрібно було повторити задане число раз.

Код, записаний усередині блоку, сам по собі не виконується. Щоб код, записаний у блоці, виконувався, блоку необхідно послати повідомлення value. Подивиться результат виконання такого повідомлення:

[2+3] value

Блоки можуть мати аргументи. Список імен аргументів записується на початку блоку й завершується вертикальною рисою. Перед кожним аргументом у списку ставиться двокрапка. Для виконання коду, записаного в блоці, необхідно передати значення параметрів за допомогою ключового повідомлення value: для кожного з аргументів блоку. Подивіться результат виконання наступного повідомлення:

[:x :y|x+y] value:2 value:3

Порівняння об’єктів

В Smalltalk порівняння об’єктів виконується також шляхом надсилання повідомлень. Звичайні операції порівняння < , <= , > , >= та = реалізуються у вигляді бінарних повідомлень. Результатом порівняння є об’єкти true або false.

Виконайте наступне повідомлення:

3 < 4

#( 1 2 3 4) = #(1 2 3 4)

Операція порівняння = доступна всім об’єктам. Окрім того, для деяких об’єктів визначені операції-відношення, як в наступному прикладі:

'hello' <= 'goodbye'

'good' <= 'goodbye'

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

5 = (2 + 3)

5 = 2 + 3

У другому випадку програма видасть помилку.

Умовні вирази

Більшість мов програмування використовує оператор if для виконання груп операторів залежно від деяких умов. В Smalltalk для цих цілей використовуються блоки. Проаналізуйте програму, що обчислює більше з двох чисел:

| max a b |

a := 5 squared.

b := 4 factorial.

a < b

ifTrue: [max := b]

ifFalse: [max := a].

^max

В цій програмі повідомлення a < b повертає або true, або false. Цей об’єкт, що повертається, становиться отримувачем повідомлення ifTrue: ifFalse:, аргументами для якого є результати обчислення блоків. Повідомлення ifTrue: ifFalse: повертає результат останнього повідомлення в блоці, який обчислюється у відповідності до результатів порівняння. Переконатися в цьому можна, якщо виконати наступний умовний вираз:

3 < 4

ifTrue: ['the true block']

ifFalse: ['the false block']

Булеві вирази

У розглянутих вище прикладах використовувалися прості порівняння, такі як а > b або 3 < 4 . Але часто доводиться застосовувати й більш складні порівняння. Для реалізації таких порівнянь використовуються повідомлення and: і or: із блоками як аргументами. Ці повідомлення фактично виконують відповідні булеві операції. Для приклада подивіться програму, що перетворює рядок із чисел і символів у ціле число доти, поки не зустрінеться нечисловий символ.

|string index answer char|

string := '1234 is the number'.

answer := 0.

index := 1.

string size timesRepeat: [

char := string at: index.

(char < $0 or: [ char > $9 ] )

ifTrue: [^answer].

answer := answer * 10

+ char value - $0 value.

index := index + 1].

Зверніть увагу на вираз, що повертає значення, ifTrue: [ ^answer ] у середині програми. Цей вираз забезпечує вихід із програми, як тільки зустрінеться перший не цифровий символ. Одержувачем повідомлення or: є результат першого порівняння ( true або false ). Аргументом повідомлення or: є результат другого порівняння.

Повторювачі

Повторювачі використовуються для організації циклів. З одним з них, а саме timesRepeat:, Ви вже зустрічалися при обчисленні масиву значень факторіалу. Розглянемо іншій приклад.

Ця програма копіює файл із ім'ям 'file1.doc' у файл із ім'ям 'file2.doc'. Якщо в поточному каталозі немає файлу з ім'ям 'file1.doc' то створіть його, або зменіть ім'я любого вже існуючого файлу.

| input output |

input := CfsReadFileStream open: 'file1.doc'.

output := CfsWriteFileStream open: 'file2.doc'.

[input atEnd]

whileFalse: [output nextPut: input next].

input close.

output close.

У наведеному прикладі цикл організований за допомогою повідомлення whileFalse: і двох блоків. При виконанні повідомлення спочатку обчислюється перший блок. Якщо результат даного обчислення false, то обчислюється другий блок. Після цього знову обчислюється перший блок і так далі, поки результат обчислення першого блоку не буде дорівнювати true. Аналогічно працює й повідомлення whileTrue:, але для нього умовою виходу з циклу є значення false. На базі цих двох умовних повторювачів можна побудувати цикли із передумовами й постумовами.

Зверніть увагу на повідомлення atEnd, що надсилається об’єкту input. Це повідомлення повертає true у тих випадках, коли у вхідному потоці виявляється кінець файлу (вичерпані усі символи). В протилежному випадку повертається false. Читання із вхідного потоку забезпечується унарним повідомленням next, яке повертає черговий символ файлу. Записування символу забезпечується ключовим повідомленням nextPut:, яке передає свій аргумент вихідному файлу. Повідомлення whileFalse: має блоки як аргумент і як одержувач повідомлення. Це повідомлення активізує свій блок-одержувач до тех пір, поки результатом виконання цього блоку є false. Коли ж значення блок-одержувача стане true, повідомлення whileFalse пропускається й виконується повідомлення, яке закриває вхідний та вихідний файли.

У наведеному нижче прикладі реалізований цикл із постумовою. Тут підраховується кількість випадкових чисел, необхідне для отримання суми не меншої сотні. Тут усе робиться в першому блоці. Другий блок порожній.

|rnd i sum|

rnd:=EsRandom new.

sum:=0.

i:=0.

[i:=i+1.(sum:=sum+rnd next)<100]

whileTrue:[].

^i

Використання умовних повторювачів є найбільш універсальним засобом організації циклів, однак в Smalltalk є багато інших способів організації повторних обчислень, наприклад, повторювачі do:,select::, reject:, collect, в яких використовуються блоки з аргументами.

Повторювач do:

Найпростішим із всіх перерахованих повторювачів є повідомлення do:. Розглянемо приклад:

| vowels |

vowels := 0.

'Now is the time' do: [ :char |

char isVowel

ifTrue: [ vowels := vowels + 1 ] ].

^vowels

У даному прикладі, за допомогою повторювача do: забезпечується послідовна вибірка всіх символів рядка й передача їх у блок для аналізу на гласну. Значення символу присвоюється аргументу блока – змінній char.

Повторювач select:

Це один з варіантів повторювача do:. Подивіться приклад:

|rnd s|

rnd:=EsRandom new.

s:= String new.

[ s size<10]

whileTrue: [s:= s, (rnd next *10) asInteger printString].

s select: [ :i | i asInteger < 53]

Тут спочатку формується рядок символів з цілих чисел, які вибіраються випадковим чином за допомогою об’єкта rnd. Повідомлення select: забезпечує перегляд всіх елементів об'єкта-одержувача й повернення тільки тих з них, які задовольняють умові, записаній в блоці. У нашому випадку це повідомлення поверне рядок, що складається з цифр, меньших 5.

Повторювач reject:

Він працює майже так само, як і select:. Різниця в тім, що це повідомлення повертає ті елементи об'єкта одержувача, які не задовольняють умові, записаній в блоці. Для приклада, розглянемо програму, яка довгі імена скорочує до 8 символів шляхом видалення голосних.

| name length |

name := 'Some Big File Name'.

length := name size.

( name reverse reject: [ :c |

c isSeparator or: [

c isVowel and: [

( length := length - 1 ) >= 8 ] ] ] )

reverse, ' '

copyFrom: 1 to: 8

Ім'я файлу реверсується й проглядається з кінця. Результат знову реверсується. Скорочення робиться шляхом видалення голосних за допомогою повідомлення reject:. Операція "," додає пробіли, коли ім'я виявиться менше 8 символів. Копіювання видаляє зайві пробіли.

Повторювач collect:

Цей повторювач також забезпечує перегляд всіх елементів об'єкта-одержувача, але повертає масив результатів, одержаних у блоці. Для приклада розрахуємо квадрати всіх елементів масиву:

#(1 13 7 10) collect: [ :i | i * i ]

Для того, щоб побачити різницю між повторювачами select:, reject: і collect:, виконайте наступні вирази:

#(1 2 3 4 5 6 7) select: [ :c | c odd ]

#(1 2 3 4 5 6 7) reject: [ :c | c odd ]

#(1 2 3 4 5 6 7) collect: [ :c | c odd ]

Заключний приклад

Нижче наведений приклад програми, що малює трикутник:

|w ww gc x0 x1 y0 y1|

"Створюємо вікно"

w:= (AbtShellView new ) title:'Example';openWidget.

"Створюємо малювальник для вікна"

ww:= w primaryWidget window.

"Визначаємо графічні параметри малювальник"

gc:= CgGC default.

gc setLineAttributes:3

lineStyle: 0

capStyle: 0

joinStyle:0.

gc setForeground:12.

"Виводимо текст у вікні"

ww drawString: gc x: 60 y: 180 string:' Triangle '.

"Малюємо трикутник"

ww drawLine: gc x1:10 y1:10 x2:100 y2: 100.

ww drawLine: gc x1:100 y1:100 x2:200 y2: 10.

ww drawLine: gc x1:200 y1:10 x2:10 y2: 10.

Завдання для самостійної роботи:

  1. Доповніть програму так, щоб у вікні малювалася квітка.

  1. Створіть букетик із трьох квіток, кольори яких вибираються випадковим чином, і напишіть побажання.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]