КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Reset (f1);Rewrite (f2); WHILE NOT eof (f1) DO BEGIN Read (f 1,x); Write (f2,x) END; Файли, які використовуються у програмі, можуть бути внутрішніми і зовнішніми. Внутрішні файли — це ті, які створюються і використовуються тільки під час роботи програми, вони є локальними змінними і не використовуються для введення-виведення даних. Файли, які існують поза програмою, називають зовнішніми. Імена зовнішніх файлів повинні бути вказані в списку параметрів заголовка програми поряд з іменами стандартних файлів input і output. У Паскалі передбачено використання файлів, які містять символи, об'єднані в рядки. Такі файли називаються текстовими і належать до стандартного типу з ім'ям text. Зазначимо що тип text не рівносильний типу FILE OF char. Отже, text — це стандартний ідентифікатор, такий, як і integer, real, char, boolean. Змінна типу текстовий файл описується за допомогою посилання на стандартний ідентифікатор типу text. Наприклад, VAR tf1, tf2 : text; Тут змінні tf1 і tf2 є файлами типу text. Стандартні файли input і output належать також до текстових файлів. Особливістю текстових файлів є те, що вони поділені на окремі рядки. Ознакою кінця рядка служить спеціальний символ (він не належить стандартному типу char), конкретна реалізація якого залежить від ЕОМ. Існує стандартна булева функція eoln (end of line — кінець рядка), яка дає змогу перевірити, чи досягнуто при обробці файла кінець рядка. Функція еоln(іф) набуває значення true, якщо в текстовому файлі іф досягнуто кінець рядка, і значення false—якщо його не досягнуто. При досягненні кінця рядка значення буферної змінної іф відповідає символу пропуск. Для роботи з текстовими файлами, крім описаних вище процедур reset, rewrite, get, put означено і деякі інші стандартні процедури. Зокрема, readln (іф) — забезпечує перехід до початку наступного рядка текстового файла іф; при цьому буферна змінна іф набуває значення першого символу наступного рядка; writeln (іф) — завершує рядок текстового файла іф (записує ознаку кінця рядка) і здійснює перехід до нового рядка; read (іф, х) (х — змінна типу char) — процедура виконує дії, рівносильні послідовності вказівок: х:= іф; get (іф); write (іф, х) — процедура виконує дії, рівносильні послідовності вказівок: іф: = x; put (іф); Якщо розглянуті процедури, а також функції eoln і eof застосовуються до стандартних файлів input і output, то ім'я файла (іф) можна опускати. Перелічені процедури можна використовувати не тількии для вводу-виводу змінних char, їх можна використовувати для введення змінних типу integer і real. При цьому відбувається автоматичне перетворення їх із символьного типу, в якому вони зберігаються у файлі іф, до типу integer чи real. Процедури виведення можна використовувати для змінних типу integer, real, boolean, а також рядкових змінних. Робота з файлом закінчується стандартною процедурою close (ім'я файл. змінної) Ця процедура (close — зачиняти, закривати) — закриває файл, тобто пересилає на зовнішній пристрій не до кінця заповнений буфер, розриває зв'язок між вказаною файловою змінною і зовнішнім файлом і звільнює буферну пам'ять для використання її в інших цілях. Будь-яка робота з файлом, який створюється програмою (вихідним файлом), завжди повинна закінчуватися викликом процедури close, інакше можна втратити останній буфер, який не буде записаний у файл. Закриття файлів для вводу (читання) не обов'язкове. 2.14. Процедури і функції Допоміжним алгоритмам і допоміжним алгоритмам обчислення значень функцій навчальної алгоритмічної мови у мові Паскаль відповідають процедури й функції. Використання цих конструкцій дає змогу не тільки запобігти повторних записів однакових серій операторів, а й реалізовувати метод послідовного уточнення алгоритму при структурному програмуванні. У програмі процедури і функції задаються описами, які розміщуються після розділу опису змінних. Описи процедур і функцій за структурою подібні до описів програм: вони складаються із заголовка і блоку. Спочатку детальніше розглянемо опис і використання процедур. Заголовок процедури починається службовим словом PROCEDURE і має вигляд: PROCEDURE ім'я процедури (список формальних параметрів); Ім'я процедури — це звичайний ідентифікатор. У списку формальних параметрів перелічуються імена параметрів і вказуються їх типи. Причому тип вказується лише за допомогою ідентифікаторів типу. Список може містити кілька груп параметрів. Якщо груп параметрів кілька, то вони відокремлюються один від одного крапкою з комою. Формальні параметри є аргументами і результатами процедури. Приклади заголовків процедур: PROCEDURE fact (k : integer; VAR f : integer); PROCEDURE pr (VAR a, b, c : real); PROCEDURE zamina (VAR a, b : vector); В останньому прикладі vector — це ім'я (ідентифікатор) типу, який повинен бути визначений у програмі раніше. Формальні параметри можуть бути відсутні. Тоді заголовок процедури має вигляд PROCEDURE ім'я процедури; Блок процедури складається з тих розділів, що й блок програми. На початку блоку даються означення і описи міток, констант, типів, змінних, процедур і функцій, які використовуються тільки в цій процедурі (тобто вони є локальні щодо процедури). Це означає, що відповідні імена мають сенс тільки всередині тексту процедури, він і є областю дії цих імен. Формальні параметри не потребують додаткових описів у блоці процедури (вони описані в заголовку) і повинні відрізнятися від всіх інших ідентифікаторів, які використовуються в тілі процедури. Якщо в тілі процедури використовуються деякі імена, які не описані в блоці процедури і не є формальними параметрами, то вони вважаються глобальними щодо даного опису процедури. Їх означення чи описи повинні міститися на початку одного з блоків, який охоплює даний опис процедури. Ім'я процедури не потребує додаткового означення чи опису в іншому місці програми (крім заголовка процедури). Область його дії — блок (зокрема — вся програма), який безпосередньо містить даний опис процедури. Отже, всередині блоку, який містить опис процедури, ім'я процедури повинно відрізнятися від усіх інших ідентифікаторів. Останнім розділом блоку процедури, як і будь-якої програми, є розділ операторів. Усі оператори процедури обмежуються службовими словами BEGIN і END. Блок процедури закінчується символом — крапкою з комою. Звернення до процедури здійснюється за допомогою оператора процедури, який має вигляд: ім'я процедури (список фактичних параметрів) Якщо заголовок процедури, що викликається, не містить параметрів, то параметри відсутні також в операторі процедури. Між формальними і фактичними параметрами встановлюється взаємно однозначна відповідність у порядку їх слідування. Відповідні формальні і фактичні параметри повинні бути сумісні за типами, тобто задовольняти умови, при яких забезпечується присвоювання значень фактичних параметрів формальним параметрам процедури. Існує чотири види параметрів: параметри-змінні, параметри-значення, параметри-процедури і параметри-функції, В останніх двох випадках фактичними параметрами є імена процедур і функцій відповідно. Розглянемо детальніше випадки параметрів перших двох видів. Якщо групі формальних параметрів списку ідентифікаторів передує службове слово VAR, то всі ці параметри є параметрами-змінними, Інакше — це параметри-значення. При виклику процедури фактичний параметр, який відповідає параметру-змінній, повинен бути ідентифікатором змінної. Він на час виконання процедури замінює формальний параметр-змінну. При виклику процедури в підпрограму передаються адреси комірок пам'яті фактичних параметрів. І будь-які дії над формальними параметрами-змінними в дійсності виконуються над відповідними фактичними параметрами. Якщо параметр є деяким результатом процедури, то він обов'язково повинен бути визначений як параметр-змінна. Якщо процедура має різні параметри-зміннІ, то й всі фактичні параметри повинні бути різними змінними. Якщо формальному параметру в заголовку процедури не передує службове слово VAR, то цей параметр є параметр-значення. Фактичні параметри, які відповідають параметрам-значенням, можуть бути будь-якими виразами, зокрема, константами чи змінними, значення яких належить тим самим типам, що й відповідні формальні параметри. При виклику процедури вирази обчислюються, результати копіюються у виділену область параметрів і передаються в процедуру, а при виході з неї ця область звільняється. Доцільно параметрами-значеннями вибирати параметри, які відповідають аргументам процедури. Формальні параметри, які є результатами процедури, повинні бути параметрами-змінними. Через них у викликаючу програму передаються результати обробки даних. У мові Паскаль крім процедур можна використовувати функції (і не тільки стандартні). Функції, які означаються програмістом, є аналогами допоміжних алгоритмів обчислення значень функцій навчальної алгоритмічної мови. У вигляді функції можна подати довільний алгоритм, в результаті виконання якого дістаємо одне значення. Заголовок функції починається службовим словом FUNCTION і має вигляд FUNCTION Ім'я функції (список параметрів з вказівкою про тип): тип результату; Наприклад, FUNCTION sh (x : real) : real; FUNCTION g (а, Ь, с: real) : real; FUNCTION number (х : char): integer; Формальні параметри, які вказані в заголовку функції, є її аргументами. Параметри-змінні тут, як правило, не використовуються. У мові Паскаль результат функції повертається у викликаючу програму тільки через ім'я функції. Тому в розділі операторів функції обов'язково повинний бути оператор ім'я функції: = вираз, Наприклад, sh: = (ехр (x) + ехр (—х))/2 g:= (а + b) * с number : = 1 Виклик функцій, які визначаються програмістом, не відрізняється від виклику стандартних функцій. Виклик функції — це не окрема команда (як виклик процедури), а компонент виразу. Параметри процедур і функцій можуть бути не лише параметрами-змінними чи параметрами-значеннями, а й параметрами-процедурами і параметрами-функціями. Параметри двох останніх видів це такі параметри, які самі є процедурами і функціями. Для параметра-процедури в заголовку процедури вказується лише ім'я формального параметра; для параметра-функції, крім імені, вказується і тип результату. В обох випадках при виклику підпрограми (процедури чи функції) формальним параметрам-процедурам і параметрам-функціям повинні відповідати фактичні параметри, які збігаються з ними за кількістю і типом. Мова Паскаль дозволяє використовувати рекурсивні процедури і функції, В описі таких процедур і функцій зустрічаються звернення до самої себе. Якщо, наприклад, для визначення факторіала невід'ємного цілого числа використати співвідношення:
æ1, якщо k < 2; k! = í è (k-1)! k, якщо k > 1;
то неважко описати відповідну рекурсивну функцію FUNCTION fact (k:integer): integer; BEGIN IF k < 2 THEN fact:=1 ELSE fact: = fact(k-l)*k END. Для того, щоб у програмі, в якій описана функція fact, обчислити у == п!, треба записати оператор у:=fact(n). При зверненні до функції fact з параметром-значенням n здійснюється передача значення цього параметра змінній k, яка є локальною щодо функції. Якщo n ³ 2, то виникає рекурсивне звернення до функції fact із значенням параметра n - 1. При цьому створюється копія тіла функції. Для нового параметра-значення n - 1 резервується нова змінна, локальна в копії тіла функції, і їй присвоюється значення n - 1. Тоді знову відбувається звернення до функції із значенням параметра n - 2 i т. д., поки значення параметра не стане дорівнювати одиниці. Після цього відбуваються послідовні обчислення копій функцій в оберненому, щодо описаного, порядку для обчислення n!. Для того, щоб не було нескінченної кількості викликів, рекурсивні процедури і функції обов'язково повинні містити перевірку умови (умови завершення), при якій початкова задача має тривіальний нерекурсивний розв'язок. Причому при будь-яких допустимих початкових значеннях аргументів через скінченне число кроків дістанемо такі їх значення, які забезпечать iстинність умови. У наведеному прикладі такою умовою є k < 2. У мові Паскаль допустимі випадки непрямої рекурсії. Непряма — це така рекурсія, коли деяка функція (процедура) звертається до іншої функції (процедури), а та, в свою чергу, викликає початкову функцію (процедуру). При цьому функція, яка описана в програмі першою, міститиме звертання до функції, яка ще не описана. Тобто при непрямій рекурсії обов'язково виникає посилання вперед (до функції чи процедури, які ще не описані). Мова Паскаль дає змогу використовувати такі посилання, але при цьому програма обов'язково повинна містити попередні описи функції (процедури), які передують звичайному опису. Попередній опис — це опис заголовка функції (процедури), за яким записано службове слово FORWARD. Це слово «заздалегідь повідомляє» транслятор про те, що повний опис функції чи процедури знаходитиметься в тексті програми далі. Зауважимо, що список параметрів, а для функції і тип результату в повному описі не повторюються. Якщо, наприклад, в програмі використовуються дві взаємно рекурсивні функції f1(х) і f2 (y), то опис їх програмі повинен мати вигляд: FUNCTION f2(x: integer) : real ; forward; FUNCTION f1(y: integer): real; BEGIN ……………………… z := f2(a); …………….. END;
|