ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 28.06.2020
Просмотров: 1681
Скачиваний: 3
СОДЕРЖАНИЕ
Тема 15: Пошук і сортування елементів масиву. Класи алгоритмів сортування
Тема 16: Динамічна пам'ять. Адреси і покажчики
Тема 17: Оголошення покажчиків, виділення та звільнення динамічної пам’яті
Тема 18: Процедури та функції для роботи з динамічною пам’яттю
Тема 19: Символьний тип даних. Упаковані масиви
Тема 20: Процедури та функції для обробки рядків
Тема 21: Структурований тип даних - безліч
Тема 22: Структурований тип даних – записи
Тема 23: Опис файлових змінних. Обробка типізованих файлів
Тема 24: Послідовний та прямий доступ до файлів
Тема 25: Обробка не типізованих файлів
Тема 26: Робота з текстовими файлами
Тема 28: Поняття та робота з процедурами та функціями
Тема 29: Використання модуля CRT. Програмування клавіатури
Тема 30: Використання модуля CRT. Текстове виведення на екран. Програмування звукового генератора
Тема 31: Графічні можливості TP 7.0. Використання бібліотеки Graph
Тема 32: Бібліотечні модулі користувача
Тема 33: Основні принципи ООП. Створення об’єктів. Використання об’єктів
Основні алгоритми обробки масивів
Тема 27: Типізовані константи
У Турбо Паскалі допускається використання констант, що типізуються. Вони задаються в розділі оголошення констант таким чином:
<ідентифікатор> : <тип> = <значення>
Тут <ідентифікатор> - ідентифікатор константи;
<тип> - тип константи;
<значення> - значення константи.
Константам, що типізуються, можна привласнювати інші значення в ході виконання програми, тому фактично вони є змінними з початковими значеннями.
Константа, що типізується, набуває вказаного в її оголошенні значення, тобто ініціюється, лише один раз: до моменту початку роботи програми. При повторному вході в блок (процедуру або функцію), в якому вона оголошена, ініціація константи, що типізується, не виробляється і вона зберігає те значення, яке мала до моменту виходу з блоку.
Константи, що типізуються, можуть бути будь-якого типа, окрім файлів. Не можна також оголосити константу-запис, що типізується, якщо хоч би одне з її полів є полем файлового типа.
Оскільки константа, що типізується, фактично не відрізняється від змінної, її не можна використовувати як значення при оголошенні інших констант або кордонів типа-діапазону.
Константи простих типів і типа String
Оголошення таких констант зазвичай не викликає труднощів, оскільки як їх значення використовуються константи, що не типізуються, або їх ідентифікатори. Приклади оголошень:
type
colors = (white, red, black); { ------- Правильні оголошення: ----- }
const
Currcol colors = red;
name String = ''Вірт Н.'';
year Word =1989;
x Real = 0.1;
min Integer = 0;
max Integer =10;
days 1..31 = 1;
answer Char = '' Y''; {------ Неправильні оголошення: ------ }
mass : array [min..max] of Real; {Не можна використовувати константи, що типізуються, як кордони діапазону}
а,b,c : Byte = 0; {Не можна використовувати список ідентифікаторів}
var NAMEF: String [22] = ''prog.pas''; {Не можна оголошувати константу, що типізується, в розділі змінних}
Константи - масиви
Як початкове значення що типізується константи-масиву використовується список констант, відокремлених один від одного комами; список полягає в круглі дужки, наприклад:
type
colors ''= (white, red, black);
const
Colstr : array [colors] of String [5] =(''white'', ''red'', ''blaсk'');
vector : array [1..5] of Byte = (0,0,0,0,0); .
При оголошенні масиву символів можна використовувати ту обставину, що всі символьні масиви і рядки в Турбо Паскалі зберігаються в упакованому форматі, тому як значення масиву-константи типа CHAR допускається завдання символьного рядка відповідної довжини. Два наступні оголошення ідентичні:
const
digit : array [0..9] of Char = (''0'', Ч'',''2'',''3'',''4'',''5'',''6'', '' 7 '', '' 8 '', '' 9 '') ;
digchr: array [0..9] of Char =0123456789'';
При оголошенні багатовимірних констант-масивів безліч констант, відповідних кожному виміру, полягає в додаткові круглі дужки і відділяється від сусідньої безлічі комами. В результаті утворюються вкладені структури безлічі, причому глибина вкладення повинна відповідати кількості змін (розмірність) масиву. Сама внутрішня безліч констант зв'язується із зміною найправішого індексу масиву.
Константи - записи
Визначення константи-запису має наступний вигляд:
<ідентифікатор> : <тип> = (<сп.знач.полей>)
Тут <ідентифікатор> - ідентифікатор константи;
<тип> - тип запису;
<сп.знач.полей> - список значень полів.
Списком значень полів є список з послідовностей вигляду: ім'я поля, двокрапка і константа. Елементи списку відділяються один від одного двоєточиямі, наприклад:
type
point = record
х, у : Real;
end;
vect = array [0..1] of point;
month = (Jan, Feb, Mar, Apr, May, Jun, Jly, Aug, Sep, Oct, Nov, Dec);
date = record d : 1..31;
m : month;
у : 1900..1999
end;
const
origon :point = (x :0; у : -1) ;
line:vector = ((x:-3.1; у: 1.5), (x: 5.9; у: 3.0)) ;
Someday: date = (d : 16; m : Mar; у : 1989);
Поля повинні вказуватися в тій послідовності, в якій вони перераховані в оголошенні типа.
Якщо в записі використовується хоч би одне поле файлового типа, такий запис не можна оголосити константою, що типізується. Для записів з варіантними полями вказується лише один з можливих варіантів констант.
Константи - безліч
Значення що типізується константи-безліч задається у вигляді правильного конструктора безлічі, наприклад:
type
days = set of 1. .31;
digc = set of '' 0 '' . . '' 9 '' ;
error = set of 1..24;
const
Workdays : days = [1..5, 8.. 12, 15.. 19, 22.. 26, 29, 30];
Evendigits: digc = [''0'', ''2'', ''4'', ''6'', ''8''];
Errorflag : error= [] ;
Константи - покажчики
Єдиним значенням що типізується константи-покажчика може бути лише NIL, наприклад:
const
pr : Real= NIL;
Питання для контролю.
-
Як задаються типізовані константи?
-
В чому різниця між типізованою константою та змінною?
-
В чому різниця між типізованою константою та константою?
-
Приведіть приклад константи простого типу.
-
Приведіть приклад константи-масиву.
-
Приведіть приклад константи-запису.
-
Приведіть приклад константи-безлічі.
-
Назвіть особливість константи-покажчика?
Тема 28: Поняття та робота з процедурами та функціями
При написанні програм часто приходиться зіштовхуватися із ситуаціями, коли однаковий набір операторів потрібно повторити кілька разів. У таких випадках раціонально використовувати підпрограми.
Підпрограма – це іменована логічно закінчена група операторів, яку можна викликати за ім’ям в різних місцях програми будь-яке число раз.
У Pascal-і підпрограми реалізовані у виді процедур і функцій.
Процедура – це іменована логічно незалежна частина програми, призначена для виконання визначених дій після однократного опису.
Для виконання дій, передбачених процедурою, її викликають по імені. Ім'я процедури використовується тільки для її виклику і його не можна використовувати як операнд у вираженнях.
Функція аналогічна процедурі, але відрізняється від неї тим, що з ім'ям функції пов'язується її значення, що передається в точку виклику. Ім'я функції можна використовувати у вираженнях як операнд.
Виділяють дві групи процедур і функцій:
-
Убудовані (стандартні), що є частиною мови і мають строго фіксовані імена. Зберігаються вони в бібліотечних модулях, що підключаються до програми Uses.
-
Процедури і функції обумовлені користувачем. Ті дії, що потрібно виконувати в різних місцях програми, можна описати у вигляді процедури чи функції, а потім звертатися до них по імені.
Опис процедур і функцій розташовується в розділі описів і має ту ж структуру, що і програма.
Опис процедури:
procedure ім'я (список формальних параметрів);
розділи описів;
розділ операторів;
end;
Опис функції:
function ім'я (список формальних параметрів) : тип результату;
Розділ опису;
Розділ операторів;
end;
Локалізація імен. Імена змінних не повинні збігатися з ім'ям процедури й усередині локального блоку повинні бути унікальні. Змінні усередині блоку називаються локальними. Змінні в глобальному блоці називаються глобальними.
Імена локальних і глобальних змінних можуть збігатися. У цьому випадку ім'я локальної змінної закриває відповідну глобальною змінну.
Параметри процедур і функцій. У списку формальних параметрів вказуються імена параметрів і їхній тип. Перед іменами змінних може бути var. Приклади.
procedure demo (x,y : real; var z : real);
function power (var i,j : integer; real; var c: char) : boolean;
Список формальних параметрів може бути відсутній, тобто припустимі процедури і функції без параметрів. Формальні параметри використовуються в тілі процедури без їхнього попереднього опису в розділі опису процедури.
При звертанні до процедури чи функції формальні параметри заміняються фактичними.
Приклад.
Обчислити ab (вираження ab заміняємо вираженням exp(b ln(a))):
Приклад використання процедури:
var a,b,c : real; {фактичні параметри}
procedure demo (var x,y,z : real);
begin
if x>0 then z := exp(y*ln(x))
else if x<0 then z := exp(y*ln(abs(x)))
else if y = 0 then z := 1
else z := 0;
end;
begin {Основна програма}
writeln(‘Введіть значення a, b:’);
read(a,b);
demo(a,b,c); {при
звертанні формальні параметри заміняються}
{фактичними}
writeln(‘a^b=’,c:3:2);
end.
Приклад використання функції:
var a,b,c : real;{фактичні параметри}
function demo (var x, y: real) : real;
begin
if x > 0 then demo := exp(y*ln(x))
else if x<0 then demo := exp(y*ln(abs(x)))
else if y = 0 then demo := 1
else demo := 0;
end;
begin {Основна програма}
writeln(‘Dведіть значення a,b:’);
read(a,b);
writeln(‘a^b=’,demo(a,b):3:2);{при
звертанні формальні параметри
заміняються фактичними}
end.
Виклик функції можна використовувати в списках параметрів оператора Write і Writeln. Для процедур це неможливо.
Як бачимо, імена фактичних параметрів можуть не збігатися з формальними, оголошеними при описі процедури чи функції; важливі їхній порядок і збіг типу.
Параметрі-змінні і параметри-значення. Якщо в списку формальних параметрів процедури чи функції в описі присутнє зарезервоване слово Var, параметр називається параметр-змінної, якщо Var не є присутнім, параметр називається параметром-значенням.
1-і відмінність. При звертанні до процедури чи функції якщо формальний параметр є параметром-змінною, то в якості фактичного параметру, що відповідає даному формальному, може бути використано лише ім'я змінної. Замість параметра-значення при звертанні можна підставляти будь-яке вираження відповідного типу.
Приклад.
function power (var x,y : real) : real;
c := power(a,b); {вірно}
c := power(1,4,b); {не вірно, потрібно тільки ім'я змінної}
Якщо опис такий:
function power(x,y:real) : real;
то
c := power(a,b); {вірно}
c := power(2/*a,b+1,5);{вірно}
2-і відмінність. Якщо формальний параметр описаний як параметр-змінна, то при звертанні до процедури чи функції всі дії, описані в блоці для даного параметра, виконуються безпосередньо над глобальною перемінною, що є відповідно фактичним параметром; у випадку параметра-значення ці дії виконуються не над глобальною перемінною, а над її копією.
Приклад.
var a,b : integer;{фактичні параметри}
procedure double(x : integer; var y : integer);
begin
x := x+x; y := y+y;
writeln(‘Подвоєні: x = ’,x,’ y = ’,у);
end;
begin
a := 1; b := 3;
writeln(‘Вихідні: x = ’,a,’ y = ’,b);
double(a,b);
writeln(‘Після звертання до процедури: x = ’,a,’ y = ’,b);
end.
Результат роботи: Вихідні: x = 1, y = 3
Подвоєні x = 2, y = 6
Після звертання до процедури: x = 1, y = 6
Рекурсивні процедури і функції.
Процедура чи функція називається рекурсивної, якщо у своєму визначенні вона використовує посилання на саму себе.
Наприклад, n-факторіал можна визначити в такий спосіб:
1, якщо n = 0 При n = 1
n! = n(n-1)!, якщо n ≠ 0 1! = 1*0! = 1;
При n = 2
2!=2*1!=2*1*0!
Рекурсивна функція для обчислення факторіала,
function fact(n : word) : word;
begin
if n = 0 then fact := 1 else
fact := fact(n-1)*n;
end;
Поряд із прямою рекурсією можливий непрямий рекурсивний виклик. Наприклад:
procedure A . . . begin . . . B; . . . end; procedure B . . . begin . . . A; . . . end; |
Непряма рекурсія при такому описі порушує основний принцип ТР: будь-який ідентифікатор перед застосуванням повинний бути описаний. Щоб допустити можливість рекурсії в ТР вводиться випереджальний опис. Заголовок функції, на який передбачається посилання до опису, описується звичайним чином, а потім слідом за заголовком указується слово forward, що означає, що тіло даної процедури буде далі. Наприклад.
procedure B; forward; procedure A; . . . procedure B;
|
Питання для контролю:
-
Що таке підпрограма і як вона реалізована в Pascal?
-
Визначення процедури і функції. Відмінність функції від процедури.
-
На які групи поділяються процедури і функції?
-
Опис процедури і функції.
-
Локалізація імен змінних.
-
Параметри процедур і функцій.
-
Параметри-змінні і параметри-значення. Відмінності.
-
Рекурсивні процедури і функції. Пряма і непряма рекурсія. Випереджальний опис.