Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


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;


Поделиться:

Дата добавления: 2015-08-05; просмотров: 130; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты