Файл: ОП Конспект лекций - Паскаль.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 28.06.2020

Просмотров: 1681

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Тема 13: Складні типи. Масиви

Тема 14: Багатомірні масиви

Тема 15: Пошук і сортування елементів масиву. Класи алгоритмів сортування

Тема 16: Динамічна пам'ять. Адреси і покажчики

Тема 17: Оголошення покажчиків, виділення та звільнення динамічної пам’яті

Тема 18: Процедури та функції для роботи з динамічною пам’яттю

Тема 19: Символьний тип даних. Упаковані масиви

Тема 20: Процедури та функції для обробки рядків

Тема 21: Структурований тип даних - безліч

Тема 22: Структурований тип даних – записи

Тема 23: Опис файлових змінних. Обробка типізованих файлів

Тема 24: Послідовний та прямий доступ до файлів

Тема 25: Обробка не типізованих файлів

Тема 26: Робота з текстовими файлами

Тема 27: Типізовані константи

Тема 28: Поняття та робота з процедурами та функціями

Тема 29: Використання модуля CRT. Програмування клавіатури

Тема 30: Використання модуля CRT. Текстове виведення на екран. Програмування звукового генератора

Тема 31: Графічні можливості TP 7.0. Використання бібліотеки Graph

PointType = record

Тема 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;


Питання для контролю.

  1. Як задаються типізовані константи?

  2. В чому різниця між типізованою константою та змінною?

  3. В чому різниця між типізованою константою та константою?

  4. Приведіть приклад константи простого типу.

  5. Приведіть приклад константи-масиву.

  6. Приведіть приклад константи-запису.

  7. Приведіть приклад константи-безлічі.

  8. Назвіть особливість константи-покажчика?



Тема 28: Поняття та робота з процедурами та функціями


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

Підпрограма – це іменована логічно закінчена група операторів, яку можна викликати за ім’ям в різних місцях програми будь-яке число раз.

У Pascal-і підпрограми реалізовані у виді процедур і функцій.

Процедура – це іменована логічно незалежна частина програми, призначена для виконання визначених дій після однократного опису.

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

Функція аналогічна процедурі, але відрізняється від неї тим, що з ім'ям функції пов'язується її значення, що передається в точку виклику. Ім'я функції можна використовувати у вираженнях як операнд.

Виділяють дві групи процедур і функцій:

  1. Убудовані (стандартні), що є частиною мови і мають строго фіксовані імена. Зберігаються вони в бібліотечних модулях, що підключаються до програми Uses.

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

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

Опис процедури:


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;





Питання для контролю:

  1. Що таке підпрограма і як вона реалізована в Pascal?

  2. Визначення процедури і функції. Відмінність функції від процедури.

  3. На які групи поділяються процедури і функції?

  4. Опис процедури і функції.

  5. Локалізація імен змінних.

  6. Параметри процедур і функцій.

  7. Параметри-змінні і параметри-значення. Відмінності.

  8. Рекурсивні процедури і функції. Пряма і непряма рекурсія. Випереджальний опис.