Модульне програмування

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

Однак проблема розробки закінченої програми для виконання досить складних дій поки ще не обговорювалася Спроба розробити програму, не відриваючись від роботи за ВТУ, стає більш -менш безплідною, як тільки програма перестає поміщатися на екрані дисплея (від 20 до 40 рядків), так як ми схильні забувати те, що вже було написано, і втрачати управління в міру ускладнення ситуації

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

51 ФУНКЦІЇ, визначених користувачем

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

20   Y=5

30 Z = SQR (Y * Y + 2 * Y) або

10   PRINT SQR (981+Z)

У попередніх розділах обговорювалися стандартні функції (рядкові та числові), які автоматично виробляли такі часто вимагаються операції, як витяг квадратного кореня Якби ці функції були відсутні, то довелося б самостійно розробляти і включати у відповідне місце програми набір операторів для обчислення квадратного кореня

При аналізі складових частин завдання нерідко вдається виявити деякі неодноразово зустрічаються дії Функції й підпрограми дозволяють якось написати оператори, що виконують ці дії, і користуватися ними в декількох місцях програми

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

511 ОПЕРАТОР DEF FN

Якщо повторювані дії можна виразити у вигляді одного оператора Бейсика, результатом виконання якого є єдине значення (на зразок квадратного кореня), то для їх виконання можна визначити

функцію

У стандарті Бейсика допускаються тільки однорядкові функції, зазвичай поміщаються на початку програми, так як вони повинні бути визначені до того, як будуть використовуватися Винятком є ​​Бейсік ВВС, в якому функції і процедури не повинні визначатися в тілі програми Їх найкраще поміщати після завершального програму оператора END

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

10 REM завдання підрахунку ПРОСТОЇ ПОДАТКУ

20 REM G = ЗАГАЛЬНИЙ ДОХІД

30 REM N = ЧИСТИЙ ДОХІД ПІСЛЯ СПЛАТИ ПОДАТКУ

40 DEF FNT(A)=A-(A-1200)*35/100

50 REM

60 INPUT Введіть ЗАГАЛЬНИЙ ДОХІД; G

70 IF G&lt=1200 THEN 100

80 PRINT ЗАГАЛЬНА СУМА =; G 4MCTAH ПРИБУТОК =; FNT (G)

90 STOP 100 PRINT відрахування немає ПРИБУТОК = ; G

110 END RUN

ВВЕДІТЬ ЗАГАЛЬНИЙ ДОХІД 4500

ЗАГАЛЬНА СУМКА = 4580 ЧИСТИЙ ПРИБУТОК = 3345

END AT LINE 90

Всякий раз, коли в рядку 80 зустрічається посилання на функцію FNT (G), замість неї використовується вираз, вказане в операторі DEF FNT в рядку 40 при цьому у вираз підставляється поточне значення G При обчисленні функції значення G не змінюється

Мінлива А, зазначена у визначенні функції FNT (рядок 40 наведеної вище програми) в дужках після імені функції, називається формальним параметром Коли функція використовується в рядку 80, то змінна G виступає якфактичний параметр,надає функції конкретне вхідне значення

Оператор DEF FN

Загальна форма запису: DEF FNx = вираз або

DEF FNx (у) = вираз

де х імя функції, зазвичай обмежуються однією буквою у – проста змінна, звана параметром, або список параметрів, в якому змінні вказані через кому Параметри локальні по відношенню до визначення функції (розяснення наводиться нижче) Функція може бути визначена для роботи з рядками символів або числами, і після імені функції і змінних при необхідності вказуються відповідні ознаки типу значення {$,%, #) Примітка Деякі системи, наприкладSinclair  ZX81,   не забезпечують можливість визначення користувачем функцій інші системи обмежують застосування функцій, допускаючи в їх визначенні тільки числові значення в багатьох системах, що допускають довгі імена змінних, наприклад в системах Microsoft і ВВС, допускаються і довгі імена функцій повне визначення функції повинно уміщатися в одному рядку з приводу блокових функцій см підрозд 512

Наведемо приклади однорядкових функцій: DEF FNP = 314159

DEF FNA (S)          = S*S+4

DEF FNP (Q)          =3*B + Z*Q

DEF FNZ(Q)          =SQR(137*Q + A)

DEF FNA (A, B, C) = (A + В + С) / 3

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

10 REM ПРИКЛАД ОПЕРАТОРА FN

20 А = 2

30 В = 30

40 С = -21

50 REM

60 DEF FNX(A)=A*B+C

70 REM

80 PRINT А =; А В = ; В З =; З

90 PRINT ЗНАЧЕННЯ 6 * В + С =; FNX (6)

100 PRINT A =; А В =; В С =; З

110 END

Виконання рядка 60 не викликає яких-небудь дій, крім реєстрації визначення функції, використовуваної в рядку 90 із значенням 6 Мінлива А в рядку 60 є локальною (фіктивної) і зобовязана відрізнятися від змінної А, що не входить у визначення функції При розпечатуванні значення останньої змінної до і після звернення до змінної має зображуватися одне і те ж значення

До складу зазначеного у визначенні функції вираження можуть входити інші функції за умови, що всі ці функції користувача вже були визначені Інакше кажучи, в нього можуть входити або вбудовані функції, або функції, що зявилися в програмі раніше Наприклад, функція

20   DEF FNR(X) =INT(X * RND(l) + 1)

повертає значення випадкового цілого числа в діапазоні 1 X, так що при виконанні циклу

30   FORI=1 TO 10

40      PRINT FNR (6)

50 NEXT I буде надруковано десять випадкових значень в діапазоні 1 .. 6

Подібні однорядкові функції (оператор-функції) не дуже-то здатні забезпечити необхідну для структурного програмування модульність, але досить корисні, особливо в ситуації, коли в програмі багато раз зустрічається одне і те ж довге вираження

512 Блокова ФУНКЦІЇ

Застосування як функції не одного, а декількох операторів набагато ближче до загальноприйнятого поняттю функції порівняно з однорядковими функціями, що допускаються в більшості систем з Бейсиком У багатьох інших мовах програмування тіло функції може бути утворено групою операторів, але лише деякі з розширених систем з Бейсиком володіють такою просунутої можливістю

У межах блоків, що утворюють функції, можна визначати додаткові локальні змінні, схожі на параметри-змінні тим, що вони абсолютно не повязані з однойменними зовнішніми змінними

Система з Бейсиком для ЕОМ ICL 2903/4 допускає включення в який утворює функцію блок операторів будь-якого типу блок завершується новим оператором FNEND Визначення локальних змінних поміщається у рядку з оператором DEF FNx після дужки, завершальній список параметрів Наведений нижче приклад ілюструє блокову функцію, яка обчислює N ≡ N факторіал, де

N ≡ N * (N-1) * (N-2) * .. * 3 * 2 * 1 так що

3 =3 * 2* 1                                       5=5*4*3*2*1 142

10 REM ПРИКЛАД БЛОКОВОЇ ФУНКЦІЇ

20 DEF FNF(N) T, I

30 T=I

40 FOR I=1 TO N

50  T=T*I

60 NEXT I

70 FNF=T

80 FNEND

90 REM

100 PRINT &quot3 ="FNF(3)

110 PRINT &quot2 ="FNF(2)

120 PRINT &quot5 ="FNF(5)

130 END RUN 3=6

2=2

5=120

END AT LINE 130

Створюючий функцію блок простягається від рядка 20 до рядка 80 (включно), а Т і I

є додатковими локальними змінними

У Бейсике ICL 2903/4 можна визначати рекурсивні функції Рекурсія в даному випадку означає, що функція може викликати сама себе Ця властивість мови програмування корисно, але цінність його часто перебільшується Конструювання рекурсивних функцій вимагає великої майстерності, але при виконанні програми може виявитися, що їх застосування неефективно і викликає труднощі Наведену вище програму обчислення факторіала можна написати у вигляді рекурсивної функції:

10 REM ПРИКЛАД рекурсивних функцій

20 DEF FNF(N)

30 IF N=1 THEN 60

40   FNF=N*FNF(N-1)

50   GOTO 70

60 FNF=1

70 FNEND

У цьому прикладі значення локальної змінної N утворюють стек Кожен раз, коли функція викликається з самої себе, на верх стека поміщається нове значення Виклик FNF (3) призводить до того, що N покладається рівним 3 і управління передається функції FNF При її виконанні в рядку 40 відбувається виклик FNF (2), в результаті чого значення 3 поміщається в стек Виклик FNF (2) призводить до того, що N покладається рівним 2, і при виконанні рядка 40 при даному виклику значення 2 поміщається в стек значень N і відбувається виклик FNF (1), B результаті якого тільки всього і

відбувається, що повертається значення FNF, рівне 1 Тепер можна по черзі виконати всі виклики: кожен раз знімається верхній елемент стека значень N і множиться на поточне значення FNF Послідовність повернень результатів така:

FNF = 1 тягне за собою FNF (1) = 1,

потім 2 * FNF (1) = 2 * 1 спричиняє FNF (2) = 2, потім 3 * FNF (2) = 3 * 2 тягне за собою FNF (3) = 6143

Кінцевий результат – правильне значення 3.

У Бейсике ВВС можна визначати функцію кількома рядками і задавати локальні змінні за допомогою оператора LOCAL Визначення функції завершується привласненням (=), що задає значення функції, але не мають лівої частини Як показують наступні два приклади, при цьому угоді в Бейсике ВВС однорядкові функції мають звичайний вигляд:

20 DEFFNF (X) = Х * Х +3 * Х-20 10 DEF FNS (X) = SQRT (X + В-С)

Якщо визначення функції займає кілька рядків, то знак присвоювання (=), що задає значення функції в Бейсике ВВС, може зустрічатися в ньому один або кілька разів Наприклад, наступна функція повертає в якості результату найбільше з двох значень:

100   DEF FNZ(Q,R)

110   IF Q&gtR THEN = Q ELSE = R

Таким чином, при виконанні оператора 10 PRINT FNZ (2,3)

буде отриманий результат 3 Повторимо приклад функції для обчислення факторіала: 10 REM ПРИКЛАД ФУНКЦІЇ В Бейсік ВВС

20 DEF FNFACT(N)

30 LOCAL T,I

40 T=1

50 FOR I = 1 ТО N

60 Т = Т * I

7В NEXT I

80 = Т

Знак присвоювання в рядку 80 служить ознакою завершення визначення функції і дає значення функції FNFACT ()

У Бейсике ВВС функції можуть бути рекурсивними, тому в разі застосування ознаки завершення визначення (=) можна переписати і рекурсивний приклад обчислення факторіала, скориставшись до того ж можливість дати функції більш повне імя Вживаючи розширений варіант оператора IF Бейсика ВВС, можна написати наступне визначення:

10 REM ПРИКЛАД рекурсивних функцій У Бейсік ВВС

20 DEF FNFACTORIAL(N)

30 IF N=1 THEN =1 ELSE =N*FNFACTORIAL(N-1)

40 REM

Тут визначення функції займає лише рядки 20 і 30 Врахуйте, що в Бейсике ВВС визначення функцій і процедур не повинні входити в основну частину програми

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

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

Джерело: Уолш Б Програмування на Бейсике: Пер з англ М: Радіо і звязок, 1988 336 с: ил

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*