Програмування.

Обчислювальна  техніка та програмування. Інформатика.

 

Методичні вказівки та завдання з лабораторних робіт

для студентів денної форми навчання

 

 

 

 

Затверджено на засіданні кафедри

комп’ютерних систем.

Протокол №8 від 11.06.2001р.

 

 

 

Хмельницький - 2002

 

Програмування. Обчислювальна техніка та програмування. Інформатика. Методичні вказівки та завдання з лабораторних робіт  для студентів денної форми навчання / В.М. Джулій, О.С. Савенко, –Хмельницький: ТУП, 2002. – 84 с.

 

Зміст

ЛАБОРАТОРНА РОБОТА №1

ЛАБОРАТОРНА РОБОТА №2

ЛАБОРАТОРНА РОБОТА №3

ЛАБОРАТОРНА РОБОТА №4

ЛАБОРАТОРНА РОБОТА №5

ЛАБОРАТОРНА РОБОТА №6

ЛАБОРАТОРНА РОБОТА №7

ЛАБОРАТОРНА РОБОТА №8

ЛАБОРАТОРНА РОБОТА №9

ЛАБОРАТОРНА РОБОТА №10

ОСНОВНІ ПОВІДОМЛЕННЯ ПРО ПОМИЛКИ

ЛІТЕРАТУРА

 

ВСТУП

Студенти спеціальності «Комп’ютерні системи та мережі» вивчають курс «Програмування» в 1 та 2 семестрах. Студенти спеціальності «Виробництва електронних засобів» вивчають курс «Обчислювальна техніка та програмування» в 1 семестрі. Студенти спеціальності “Радіотехніка” вивчають курс “Інформатика” в 1 семестрі. Базовою мовою є Паскаль.

Мета лабораторних робіт – закріплення теоретичного матеріалу, придбання стійких практичних навичок в складанні, відлагодженні та виконанні програм на мові Паскаль в системі програмування Turbo Pascal 7.0, набуття навичок самостійного розв’язування задач на ПЕОМ сумісних з IBM PC AT/XT. Для виконання кожної лабораторної роботи треба вивчити відповідний теоретичний матеріал по конспектах лекцій і методичних вказівках, або із рекомендованої літератури, а також відповісти на питання для самоперевірки (якщо вони вказані).

Всі роботи орієнтовані на виконання з допомогою ПЕОМ, дозволяється використовувати будь-яку ПЕОМ з системою програмування Турбо Паскаль. Кожна лабораторна робота повинна мати наступні розділи:

1) номер роботи;

2) тема;

3) мета роботи;

4) умова завдання;

5) список використовуваних змінних (позначень);

6) блок-схема алгоритму розв’язування завдання;

7) роздруківка програми разом з коментаріями;

8) роздруківка результатів.

Пpимітка. Пpи офоpмленні pобіт дотримання вимог державних стандартів необов’язково. Всі лабораторні роботи оформляються в одному зошиті. Вибір варіантів завдань здійснюється по списку студентів в журналі групи або викладачем. Лабораторні роботи мають тривалість 2 або 4 години в залежності від спеціальності та форми навчання. Для денної форми навчання останнє двогодинне заняття є заліковим, на якому здається зошит з усіма зарахованими лабораторними роботами. Кількість лабораторних робіт визначається робочою програмою навчальної дисципліни.

 

 

ЛАБОРАТОРНА РОБОТА №1

Студенти спеціальності «Комп’ютерні системи та мережі» ви ЛАБОРАТОРНА РОБОТА №1вчають курс «Програмування» в 1 та 2 семестрах. Студенти спеціальності «Виробництва електронних засобів» вивчають курс «Обчислювальна техніка та програмування» в 1 семестрі. Студенти спеціальності “Радіотехніка” вивчають курс “Інформатика” в 1 семестрі. Базовою мовою є Паскаль.

Мета лабораторних робіт – закріплення теоретичного матеріалу, придбання стійких практичних навичок в складанні, відлагодженні та виконанні програм на мові Паскаль в системі програмування Turbo Pascal 7.0, набуття навичок самостійного розв’язування задач на ПЕОМ сумісних з IBM PC AT/XT. Для виконання кожної лабораторної роботи треба вивчити відповідний теоретичний матеріал по конспектах лекцій і методичних вказівках, або із рекомендованої літератури, а також відповісти на питання для самоперевірки (якщо вони вказані).

Всі роботи орієнтовані на виконання з допомогою ПЕОМ, дозволя-ється використовувати будь-яку ПЕОМ з системою програмування Турбо Паскаль. Кожна лабораторна робота повинна мати наступні розділи:

1) номер роботи;

2) тема;

3) мета роботи;

4) умова завдання;

5) список використовуваних змінних (позначень);

6) блок-схема алгоритму розв’язування завдання;

7) роздруківка програми разом з коментаріями;

8) роздруківка результатів.

Пpимітка. Пpи офоpмленні pобіт дотримання вимог державних стандартів необов’язково. Всі лабораторні роботи оформляються в одному зошиті. Вибір варіантів завдань здійснюється по списку студентів в журналі групи або викладачем. Лабораторні роботи мають тривалість 2 або 4 години в залежності від спеціальності та форми навчання. Для денної форми навчання останнє двогодинне заняття є заліковим, на якому здається зошит з усіма зарахованими лабораторними роботами. Кількість лабораторних робіт визначається робочою програмою навчальної дисципліни.

 

ЛАБОРАТОРНА РОБОТА №1

 

Тема. Ознайомлення з операційною системою і програмою Norton Commander (Volcov Commander). Вивчення системи програмування Turbo Pascal 7.0. Поpядок cтворення, вiдлагодження та запуску Паскаль-пpогpами в оболочці Turbo Pascal.

Мета роботи. Навчитися виконувати прості команди DOS з використанням програми Norton Commander; розглянути операційну систему Windows’95 та її основні команди; вивчити режими File, Edit та Run системи програмування Turbo Pascal 7.0; навчитися створювати, відлагоджувати і виконувати Паскаль-пpогpами; навчитися працювати з принтером.

 

Порядок виконання роботи

 

1.    Вивчення основних команд DOS та їх виконання за допомогою програми Norton Commander (вивчення основних команд Windows’95).

2.    Вивчення системи програмування Turbo Pascal 7.0 та роботи в основних режимах (File, Edit, Run) згідно з наведеною інструкцією використання прикладу зразка програми.

3.    Робота з друкуючим пристроєм (ДП). Порядок виведення програми та результатів роботи на ДП.

4.    Робота з зовнішніми запам’ятовуючими приладами (дисководом). Порядок збереження програми на гнучкому магнiтном диску (дискеті), на твердому диску (вінчестері). Завантаження (зчитування) програми з зовнішніх запам’ятовуючих приладів у оперативну пам'ять ЕОМ.

 

Стислі теоретичні відомості і методичні вказівки

 

Пpи увімкненні комп'ютеpа опеpаційна система (ОС) завантажується автоматично. Після завантаження ОС автоматично також завантажується пpогpама Norton Comander, що дозволить полегшити pоботу користувача на pівні команд ОС. Всі доступні команди, а також пеpелік клавіш, активiзуючих кожну команду, вказані в нижній стрічці екpана. Опис кожної команди вказано в довіднику, викликати який можна натиском клавіші F1 (Help). Для вивчення системи програмування Turbo Pascal 7.0 необхідно дотримуватись нижченаведеної iнстpукції.

 

Інструкція по роботі з системою програмування  Turbo Pascal 7.0

 

1. Вхід в каталог Pascal 7.0 (назва може бути іншою, тому здійснити пошук Alt+F7 файла bp.exe або використати меню користувача F2).

2. Завантажити файл bр. exe.

3. Якщо вікно редагування зайнято текстом іншої програми – ввійти в головне меню (кл. F10), після цього в режимі File виконати команду New. Ввести текст програми в ЕОМ. Якщо текст програми вже записаний на зовнішній запам’ятовуючий пристрій (ЗЗП), треба продовжити редагування, у режимі File виконати команду Open (кл. F3). Якщо потрібний файл має розширення. Pas та знаходиться в у каталозі Pascal 7.0, далі натиснути тільки клавішу <Еnter>. Якщо ж файл знаходиться у каталозі Pascal 7.0, але має інше розширення – в виділеному рядку прибрати Pas, написати потрібне розширення і натиснути кл. <Еnter>. У виділеному вікні за допомогою клавіш керування курсором вибрати потрібний файл і натиснути кл. <Еnter>. Якщо потрібний файл знаходиться на іншому приладі – у виділеному рядку прибрати текст, записати ім'я файла разом з ім'ям приладу, на якому він знаходиться (наприклад, A: Rew. Txt) і та натиснути кл. <Еnter>. Після завантаження потрібної програми продовжити редагування.

4. Відлагодити програму та виконати режим Run. Для цього натиснути кл. F10 і далі активізувати режим Run, не виходячи з редактора, натиснути спільно кл. Ctrl+F9. Програма компiлюється до вияву першої помилки. За наявністю помилки видається відповідне повідомлення                (додаток 1). Для виправлення слід натиснути будь-яку клавішу і виправити помилку. Далі повторити п. 4, поки всі помилки не будуть виправлені. Якщо помилок немає – програма компiлюється і виконується. Після її виконання відбувається повернення у редактор (перехід дуже швидкий). Для фіксації на екрані і перегляду результатів роботи програми – натиснути спільно кл. Alt+F5. Натиск після цього будь-якої клавіші приведе до повернення у редактор системи програмування.

5. При початковому введенні програми в ЕОМ їй присвоюється стандартне ім'я NONAME00.PAS. Його рекомендується змінити, а при необхідності зберегти програму на ЗЗП. Для збереження програми на ЗЗП необхідно ввійти в головне меню (кл. F10), після цього в режимі File виконати команду Save або Save As... (при цьому слідувати запитам системи). Якщо ім'я програми змінено, для її збереження на ЗЗП достатньо, не виходячи з режиму редагування, натиснути кл. F2.

6.     Для компiляцiї та збереження на ЗЗП окремих модулів програми (в машинних кодах) використовується режим Compile. Робота з цим режимом для виконання лабораторних робіт необов’язкова.

7.     Для виходу з системи програмування Turbo Pascal 7.0 натиснути спільно Alt+Х.

8.     Роздрук лiстингу програми можна здійснити командою <Copy>          (кл. F5) після виходу із системи програмування), встановив маркер на ім'я потрібної програми в каталозі. Далі на запит Dos ввести Prn і та натиснути кл. <Еnter>  (при цьому слідкувати, щоб принтер був готовий до друку).

9.     Для надрукування результатів роботи програми на принтері потрібно у розділі uses, крім crt, підключити printer, а в операторах, здійснюючих вивід результатів, у список виведених об'єктів додати lst (на перше місце). У наведеній вище програмі другий рядок замінимо таким: uses crt, printer; передостанній рядок (перед службовим словом end) замінимо таким:  writeln (lst, 'x=', x, ' y=', y, ' z=', z);

 

Зразок програми

 

uses crt;

var

x, y, z: real;

begin

writeln ('введіть значення x, y (через пропуск): ');

readln (x, y);

z: =x+y;

writeln ('x=', x, ' y=', y, ' z=', z)

end.

 

ЛАБОРАТОРНА РОБОТА №2

 

Тема. Програмування лiнійних алгоритмів.

Мета роботи. Ознайомитися з операторами введення і виведення і присвоєння, навчитися записувати лiнійні алгоритми на мові програмування Pascal.

 

Стислі теоретичні відомості і методичні вказівки

 

Програма, що реалізує лiнійний алгоритм, виконує тільки розділ опису змінних і блок операторів. Блок операторів програми містить оператори введення, виведення і присвоєння. Розділ Uses містить модулі Crt і Printer. Розглянемо організацію введення і виведення даних на мові Pascal.

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

 

Формат:

write    (<список виразів>);

writeln  (<cписок виразів>);

write    (<список звісток>);

writeln  (<список звісток>);

де <список виразів> і <список звісток> - це та інформація, виведення якої треба здійснити. При цьому під <список виразів> розуміється будь-яка конструкція, визначена як вираз, а під <список звісток> – будь-яка послідовність символів мови, укладена в лапки, тобто, літерна константа.

Елементи списку розділяються комами. При виведенні інформації значення елементів списку друкуються без розділу. Тому про наочну і слушну форму виведення даних користувачеві треба піклуватися самому.

 

Наприклад,

write (x);         {виведення значення змінної}

writeln ('x=', x); {виведення повідомлення х=, значення змінної х і перехід на наступну стрічку}

writeln (a+b);    {виведення значення вислову a+b і перехід на наступну стрічку}

write ('програма: ');   {виведення звернення}

 

Виводити безпосередньо можна тільки значення стандартних скалярних типів і рядки. Виведення значень інших типів треба організовувати програмним шляхом.

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

 

Наприклад,

writeln (x: 5);   { для значення змінної “х” відведено місце із 5 позицій}

writeln (a: 8: 4); { для виведення значення змінної відведено 8 позицій, при цьому на мантису відведено 

4 позиції (змінна а вважається дійсною)}

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

Для виведення інформації на друкуючий прилад необхідно в розділі Uses вказати модуль Printer, а в списках всіх операторів write і writeln, що повинні виводити інформацію на принтер, у вигляді першого параметра вказати lst.

 

Hаприклад,

write (lst, 'результат: ');

writeln (lst, x, y, z);.

Введення даних в ЕОМ здійснюється за допомогою операторів read і readln.

 

Формат:

read (<список змінних>),

readln (<список змінних),

де <список змінних> – це список тих допустимих об'єктів, значення яких користувач вводить із клавiатури. Значення списку набираються мінімум через один пропуск на клавiатурі і відображаються на екрані. В кінці введення значень списку одного оператора read треба натиснути клавішу <Еnter>. При цьому слід суворо дотримуватися відповідності типів введених значень до типів змінних списку оператора read.

 

Наприклад,

read (x); {введення із клавiатури значення змінної}

read (a, b); {введення із клавiатури значень змінних a, b}

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

 

Наприклад,

а) write ('введiть значення змінної: '); read (x);

б) writeln ('введiть значення a і b: '); read (a, b);

 

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

Оператор readln аналогічий операторові read, єдина відміна полягає в тому, що після зчитування останнього значення в списку оператора readln дані списку наступного оператора readln будуть зчитуватися (відображатися на екрані) із початку нового рядка.

Оператор присвоєння (: =) приписує виконати вираз, заданий в його правій частини, і присвоїти результат змінній, iдентiфикатор якої розташований в лівій частині.

 

Формат:

<iдентифікатор>: =<вираз>;

Змінна і вираз повинні мати один і той же тип. Допускається змінна дійсного типу, а вираз – цілого. Допустиме присвоєння будь-яких типів даних, крім файлових.

 

Наприклад,

S: =1; gh: =x+y;

Nazv: ='модель N2';

 

Приклад 2.1. До матеріальної точки під кутом a радiан прикладені дві  сили. Обчислити величину рівнодіючої цих сил.

Розв’язування: Позначимо вихідні сили iдентифікаторами f1 і f2, результат – f, кут a (всі імена вибираються користувачем.). Очевидно, що f1 і f2 мають цілий тип, f і a-дійсний. Рівнодіюча двох сил знаходиться за правилом паралелограма (рис. 2.1):

 


Рис. 2.1

 


Величина рівнодіючої двох сил знаходиться за формулою (використовується відома теорема косинусів):

 


             f =   f1×f1 + f2×f2 - 2×f1×f2×сos (p - a)             або, після спрощення,

 


                            f =     f1×f2 + f2×f2 + 2×f1×f2×cos (a)

Блок-схема алгоритму представлена на рис. 2.2.

 

 

Рис. 2.2

 

Програма 2.1

uses crt;

var f1, f2: integer; {вихідні дані}

  alfa: real;

  f: real; {результат}

begin

  write ('введення вихідних сил: ');

readln (f1, f2);

  write ('введення кута альфа: ');   readln (alfa); writeln;

  f: = sqrt (sqr (f1) +sqr (f2) +2*f1*f2*cos (alfa)); writeln ('вихідні дані: ');

  writeln ('f1=', f1, ' f2=', f2, ' кут альфа=', alfa);

  writeln ('результат: ', 'f=', f: 6: 3)

end.

 

Результати роботи програми:

Введення вихідних сил: 12  34

Введення кута альфа: 0.3

Вихідні дані:

f1=12 f2=34 кут альфа = 3.0000000000Е-01

Результат: f = 45.602

Питання для самоперевірки

 

1.     Яка алгоритмічна структура називається лiнійною?

2.     Які оператори частіше всього застосовуються для запису лiнійних алгоритмів?

3.     Дати характеристику операторам виведення; в чому їх відміна?

4.     Дати характеристику операторам введення; в чому їх відміна?

5.     Введення яких типів даних допускається здійснювати за допомогою оператора read?

6.     Виведення яких типів даних допускається здійснювати за допомогою оператора write?

7.     В чому суть форматного виведення?

8.     Який формат оператора присвоєння? Присвоєння яких типів даних допустиме в мові Pascal?

9.     Чи можна присвоїти змінній дійсного типу значення цілого типу; змінній лiтерного типу – значення дійсного типу?

 

Завдання до роботи

 

По заданим сторонам a, b, c трикутника (рис. 2.3) знайти всі величини, що характеризують трикутник згідно з варіантом, який обирається згідно номера студента в журналі. Передбачити введення значень a, b, c із клавiатури. Виведення вихідних даних здійснювати з відповідним пояснюючим текстом (розрахункові формули наведено після варіантів завдань).

 

Рис. 2.3

 

Варіанти завдань

 

1.          Висоти трикутника.

2.          Медiани трикутника.

3.          Бiсектриси трикутника.

4.          Радіус вписаного кола.

5.          Радіус описаного кола.

6.          Косинус кута a, синус кута b.

7.          Суму косинусів кутів трикутника.

8.          Суму косинуса і синуса кута a.

9.          Суму синусів кутів трикутника.

10.       Синус кута 2a.

11.       Косинус кута 2b.

12.       Тангенс кута a.

13.       Синус кута (a-b).

14.       Синус кута (a+b).

15.       Косинус кута (a-g).

16.       Косинус кута (a+g).

17.       Синус a/2.

18.       Косинус b/2.

19.       Котангенс кута b.

20.       Суму косинуса 2g і синуса a/2.

21.       Суму косинуса 2a і косинуса a/2.

22.       Синус кута (45° - g).

23.       Косинус кута (a- 30°).

24.       Тангенс кута (45° -b).

25.       Котангенс кута (a- 45°).

26.       Тангенс кута 2a.

27.       Котангенс кута 2b.

28.       Суму тангенса кута 2g і котангенса g.

29.       Тангенс кута b/2.

30.       Котангенс кута g/2.

31.       Kут a, висоту hb.                    

32.       Кут g, медіану ma.                   

33.       Кут b, бісектрису la.               

34.       Кут a, радіус R.                      

35.       Кут g, медiану mc.                   

36.       Кут b, висоту ha.                    

37.       Кут b, радiус r.                       

38.       Кут g. висоту hа.                     

39.       Кут a, бісектрису lb.               

40.       Кут g, бісектрису lb.                

41.       Кут b, медіану mc.          

42.       Кут a, висоту ha.                    

43.       Кут b, медiану ma.                  

44.       Кут g, висоту ha.                     

45.       Кут b, бісектрису lg.               

46.       Кут a, радіус r.                       

47.       Кут g, висоту hb.                     

48.       Кут a, медіану ma.                  

49.       Кут b, бісектрису lb.               

50.       Кут g, медіану mc.                   

51.       Кут b, висоту hc.                    

52.       Кут a., медіану mb.                 

53.       Кут g, радіус r.                        

54.       Кут a, висоту hc.                    

55.       Кут g, медіану mb.                   

56.       Кут b, висоту hb.                    

57.       Кут b, радіус R.                      

58.       Кут g, бісектрису la.                

59.       Кут b, медiану mc.                   

60.       Кут a, бісектрису lg.                

 

Розрахункові формули (a, b, c – сторони, a, b, g – кути):

Півпериметр трикутника: p = (a+b+c) /2.

Площа трикутника: S =Ö p (p–a) (p–b) (p–c).

Висоти трикутника: ha = 2s/a;    hb = 2s/b;    hc = 2s/c.


Медiани трикутника: ma = Ö2 (b2 + c2) – a2 /2;   mb = Ö2(a2 + c2) – b2 /2,


                                                    mc = Ö2 (a2 + b2) – c2 /2.

Бiсектриси  трикутника: la = 2Ö bcp (p-a) / (b+c);  

 lb = 2 Öacp (p–b) / (a+c);       lg = 2 Öabp (p–c) / (a+b).

Радіуси: вписаного кола r = S/p, описаного кола R = abc/ (4s).

сos a = (b2 + c2 – a2) / (2bc),

cos b= (a2 + c2 – b2) / (2ac),

cos g = (a2 + b2 – c2) / (2ab).

Якщо х–кут трикутника, тоді справедливі формули: 

sin2 x + cos2 x = 1.

tg x = sin x/cos x,         ctg x = cos x/sin x = 1/tg x.

sin 2x = 2sin x cos x,      cos 2x = cos2 x – sin2 x.

sin (x – y) = sin x cos y – cos x sin y,

sin (x + y) = sin x cos y + cos x sin y,

cos (x – y) = cos x cos y + sin x sin y,

cos (x + y) = cos x cos y – sin x sin y,

tg (x + y) = (tg x + tg y) / (1–tg x tg y),

tg (x – y) = (tg x – tg y) / (1+tg x tg y).

cos x/2 = ;     sin x/2 =  

Якщо x – кут трикутника, тоді кут x/2 завжди менший або рівний 90°, то        cos x/2 ³ 0 і sin x/2 ³ 0).

            Зображення обернених тригонометричних функцій через arctg:

arcsin x=arctg

arccos x=arctg

acctg x=arctg(1/x)

Кути: 

a=arccos((b2+c2–a2)/(2bc))

b=arccos((a2+c2–b2)/(2ac))

g=arccos((b2+a2–c2)/(2ab))

 

 

ЛАБОРАТОРНА РОБОТА №3

 

Тема. Програмування розгалужених алгоритмів.

Мета роботи. Закріпити теоретичні відомості про розгалужені алгоритми, оператори передачі управління; навчитися програмувати розгалуження.

 

Стислі теоретичні відомості і методичні вказівки

 

При програмуванні лiнійних алгоритмів в Pascal реалізується звичайний порядок слідування операторів. Але в реальних завданнях дуже часто вимагається змінити його в залежності від вихідних даних чи результатів проміжних обчислень. В цьому випадку для організації розгалужених обчислювальних процесів використовуються оператори передачі управління: безумовний (goto) і умовний (if), а також оператор вибору (case).

Безумовний оператор передає управління на оператор із зазначеною міткою.

 

Формат:

goto <мітка>;

де <мітка> – будь-який допустимий iдентифікатор, а також послідовність цифр чи цифр і літер; <мітка> повинна бути описана в розділі опису міток (label).

Наприклад,

  ...

  Label 1;

  ...

  begin

  goto 1;

...

1: a: =b+c;

 ...

 

Умовний оператор забезпечує виконання чи невиконання якого-небудь оператора в залежності від умови.

Формат:

if <умова> then <оператор1> else <оператор2>;

де <умова> – вислів логічного типу. Якщо значення <умова> рівне true, тоді виконується <оператор1>, а <оператор2> ігнорується; якщо ж значення <умова> рівна false, тоді виконується <оператор2>, а <оператор1> ігнорується.

 

 

Наприклад,

if x>y then z: =x else z: =y; {знаходження максимального з двох чисел }

  <оператор1> (або <оператор2>) може бути і структурним, тобто групою операторів, укладеною в "операторні дужки" (begin і end).

   Частковим випадком умовного оператора є оператор if <умова> then <оператор>; {else не містить ніяких дій}

 

Наприклад,

if x>y then

 begin {сортування двох чисел за зростанням}

  z: =x; x: =y; y: =z

   end;

В Pascal допустима вкладеність операторів if:

if <усл. 1> then if <усл. 2> then...

     else if <умов. N> then...

     else if <умов. K> then... else...;

Така вкладеність операторів if обмежується тільки обсягом доступної пам'яті комп'ютера. Оператор вибору (варіанта) case дозволяє зробити вибір із довільного числа існуючих варіантів.

 

Формат:

    case <вираз> of

<мітка1>: <оператор1>;

<мітка2>: <оператор2>;

...

<міткаn>: <операторn>

      end;

де <вираз> – вислів будь-якого скалярного типу, крім дійсного; <мітка1>, <мітка2>,..., <міткаn> – значення того ж типу, що і <вираз>; ці мітки в розділі label оголошувати не треба.

Оператор case виконується таким чином: спочатку вираховується значення <вираз>, після цього виконується оператор з тією міткою, що співпадає з цим значенням, а всі інші оператори ігноруються; далі управління передається операторові, слідуючому за службовим словом end. Якщо ж оператора із такою міткою немає, тоді управління зразу ж передається на оператор, слідуючий за end.

Якщо для двох різних міток треба виконати одну дію, тоді перед відповідним оператором записуються обидві мітки (через кому).

 

Наприклад,

   case I of

1, 2: <оператор1>;

...

  end;

Оператор case може містити також службове слово else і <вираз> iнтервального типу.

 

 Наприклад,

   case I of

1.. 10:... ;     {дія після else виконується в тому випадку,

11.. 20:...;      якщо I<1 і I>20}

   else...

   end;

 

Якщо міток-діапазонів декілька в одному операторі, тоді вони також розділяються комами.

 

Примітки

 

1.    Не можна передавати управління із однієї альтернативи оператора if на іншу (те ж для оператора case).

2.    Не можна ззовні оператора if входити на яку-небудь його альтернативу з допомогою оператора goto.

3.    Не можна входити в тіло оператора case за допомогою оператора goto.

4.    Службове слово end може мати мітку, наприклад, 5: end. Якщо в програмі є оператор goto 5, тоді це означає, що буде виконуватися передача на пустий оператор із міткою 5.

 

Приклад 3.1

Дано 10 дійсних чисел. Знайти величину найбільшого із них.

Розв’язування. Введемо такі позначення: в змінну x дійсного типу будемо вводити чергове число послідовності; дійсною змінною max позначимо найбільше із введених чисел, цілій змінній і – лічильник кількості чисел.

 

 

 

Блок-схема алгоритму приведена на рис. 3.1

 

Рис. 3.1

 

Програма 3.1

uses crt;

label 4, 9; ітки}

const n=10; {кількість чисел }

var

  i: integer; {лічильник кількості введених чисел }

  max: real; {найбільше число серед введених}

x: real;     {наступне число}

begin write  {'вихідні числа: '};

   i: =1;

   read (max);     {введення першого числа}

  4: i: =i+1; if i>n then goto 9;

   read (x); {введення чергового числа}

   if x>max then max: =x;

   goto 4;

  9: writeln; writeln ('результат: ');

   writeln ('max=', max: 6: 2)

   end.

Нехай введено 10 чисел: 1.2; –3,4; 13,85; 10,4; –2,2; 4; 5; 8; 20; 1,1. Тоді результати роботи програми будуть такі:

Вихідні числа: 1,2; –3,4;  13,85;  10,4;   –2,2;  4;  5;  8;  20;  1,1.

Результат: max= 20,00

 

Питання для самоперевірки

 

1.   Яка алгоритмічна структура називається розгалуженою?

2.   Які оператори застосовуються для запису розгалужених алгоритмів?

3.   Дати характеристику оператора goto.

4.   Дати характеристику оператора if. Допускається чи ні в Паскалі вкладеність операторів if?

5.   Як виконується оператор case? Допустимий <вираз> типу real?

6.   Що таке пустий оператор?

 

Варіанти завдань

 

1.     Дані два цілі числа a і b. Знайти їх найбільший спільний дільник.

2.     Дані два дійсні числа x і y. Надрукувати номер квадрата на координатній площинi, якому належить точка (x, y).

3.     Дано 5 дійсних чисел: a1, a2, a3, a4, a5. Відомо, що одне із них відмінне від чотирьох інших, рівних між собою. Знайти номер цього числа.

4.     Дані числа a, b, c. Визначити, чи існує трикутник із такими сторонами.

5.     Даний трикутник зі сторонами a, b, c. Визначити, який він (гострокутний, прямокутний, тупокутний).

6.     Даний трикутник зі сторонами a, b, c. Визначити, який він (рівносторонній, рівнобедрений, різносторонній).

7.     Дані числа a, b, c. Знайти суму найбільшого і найменшого із них.

8.     Дані числа a, b, c. Надрукувати їх в порядку зменшення.

9.     Дані числа a, b, c. Надрукувати їх в порядку зростання.

10. Дані числа a, b, c, d. Визначити, скільки із них від'ємних.

11. Дані числа a, b, c, d. Знайти суму додатних чисел.

12. Дані числа a, b, c. Визначити, скільки із них однакових.

13. Дані числа a, b, c. Визначити, чи можна скласти із них арифметичну прогресiю.

14. Дані числа a, b, c. Визначити, чи можна скласти із них геометричну прогресiю.

15. Дано додатне число N. Перевірити, чи всі його цифри різні; якщо ні, тоді скільки однакових?

16. Дано додатне тризначне число N. Перевірити, чи є серед його цифр дві однакові.

17. Дано додатне чотиризначне число N. Перевірити, входить чи в запис цього числа цифра 9.

18. Дано ціле додатне число N. Визначити, скільки в ньому цифр.

19. Дано позитивне тризначне число N. Якщо всі цифри його різні, надрукувати число, записане тими ж цифрами, але в зворотному порядку.

20. Змінній х присвоїти значення кореня рівняння: arccos (1-lnx) =a,  якщо такий існує. Значення a задати самостійно.

21. Обчислити значення функції:

     

         max (x, y) при x<0

Z =

         min (x, y) при x>=0

     

22. Дані числа a, b, c (a<>0). Знайти дійсні коренi рівняння:

ax4 + bx2 + c = 0.

Якщо коренів немає – надрукувати відповідне повідомлення.

23. Для заданого числа  a  знайти корінь рівняння f (x) = 0, де

      

                2ax + a-1                  при a>0

f (x) = 

  (exp (x)) / (Ö1 + a2) – 1    при a0

 

24. Дві прямі описуються рівняннями a1 × x + b1 × y = c1  і  a2 × x + b2 × y = c2. Визначити, паралельні вони збігаються, чи перетинаються.

25. Якщо серед чисел a, b, c, d немає від'ємних, тоді обчислити їх середнє геометричне.

26. Дано чотири числа a, b, c, d. Знайти серед них число, не рівне 0, і поділити на нього дані числа. Якщо серед заданих всі числа рівні 0 – видати відповідне повідомлення.

27. Дано додатне чотиризначне число N. Визначити, чи є серед його цифр 0 і, якщо є, тоді скільки.

28. Функція y = f(x) задана графічно:

обчислити значення цієї функції (х задавати самостійно).

29. Обчислити значення функції = f(x) (x задавати самостійно), графік якої зображений на малюнку:

 

 
Обчислити значення функції y = f(x) (x задавати самостійно), графік якої зображений на малюнку:

 

 

 

 

 

 

ЛАБОРАТОРНА РОБОТА №4

 

Тема. Програмування циклічних алгоритмів.

Мета роботи. Закріпити теоретичні відомості про алгоритми циклічних структур, оператори циклу; навчитися програмувати циклічні алгоритми з допомогою операторів циклу і операторів передачі управління.

 

Стислі теоретичні відомості і методичні вказівки

 

Цикл – це алгоритмічна структура, в якій група операторів вико­нується неодноразово. Цикл складається із блоку початкових присвоєнь, тіла циклу і умови. Розрізняють арифметичні і iтераційні цикли. Кількість повторень арифметичного циклу можна визначити заздалегідь; для iтераційного циклу цього зробити не можна.

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

 

1. Оператор циклу із зростаючим параметром

 

Формат:

 for <параметр>:=<п.з.> to <к.з.> do <тіло циклу>;

де <параметр> – змінна будь-якого скалярного типу, крім дійсного; <п. з. > - початкове значення <параметр>; <к. з. > кінцеве значення <параметр>; <тіло циклу> - оператор.

 

Порядок виконання:

а)  якщо початкове значення <параметр> більше кінцевого, тоді         <тіло циклу> не виконається жодного разу - перехід на оператор, слідуючий  за <тілом циклу>; iнакше - перехід до п. б);

б)  <параметр> присвоюється <п. з. >;

в)  виконується <тіло циклу>;

г)  якщо значення <параметр> рівне <к. з. >, тоді виконується  перехід  на оператор, слідуючий за <тілом циклу>; iнакше - перехід  до пункту д;

д)  вираховується чергове значення <параметр> з допомогою функції succ; далі – перехід до пункту в.

 

Наприклад,

for i:=1 to 10 do write('*'); {друкує рядок із 10 зірочок}

 

Якщо в <тілі циклу> треба записати більше одного оператора, тоді ця група операторів повинна бути укладена в операторні дужки.

 

Наприклад,

а) for j: =1 to 10 do                  { тут оператор writeln не відноситься

         k: =j*j; writeln (j, k);       до <тіла циклу>! }

б) for j: =1 to 10 do

begin k: =j*j;                     { тут <тіло циклу> містить два

     writeln (j, k)                  оператори }

  end;

Забороняється змінювати значення <параметр> в <тілі циклу>.

 

2. Оператор циклу із зменшуваним параметром

 

Формат:

 for <параметр>: =<н. з. > downto <к. з. > do <тіло циклу>;

Порядок виконання цього оператора такий самий, як і оператора циклу із зростаючим параметром. Відміна тільки в тому, що кінцеве значення <параметр> не повинне перевищувати за початкове; чергове значення <параметр> вираховується з допомогою функції pred.

 

Наприклад,

а) for i: =10 downto 1 do write ('*'); {буде надрукований рядок із 10 зірочок}

б) for j: =10 downto 1 do                  {буде надрукована таблиця

    begin k: =j*j; writeln (j, k) end;   квадратів чисел від 10 до 1}

 

3. Оператор циклу із передумовою

 

Формат:

 while <умова> do <тіло циклу>;

де <умова> – вислів логічного типу; якщо його значення рівне true, тоді виконується <тіло циклу>; в противному випадку виконується перехід на оператор, слідуючий за <тілом циклу>, тобто виконання <тіло циклу> повторюється до тих пір, поки <умова> не прийме значення false.                <тіло циклу> містить тільки один оператор; якщо ж <тіло циклу> повинно містити більше одного оператора, тоді їх беруть в операторні дужки.

 

Наприклад,

i: =1;

while i<10 do

 begin     {будуть надруковані числа від 2 до 10}

  i: =i+1; write (i)

 end;

 

Якщо при першому виконанні оператора while значення <умова> рівно false, тоді <тіло циклу> не виконається жодного разу.

При виконанні оператора while необхідно слідкувати за тим, щоб в <тілі циклу> були передбачені дії, що змінять правильність <умова> (на якомусь кроці), iнакше виконання <тіла циклу> буде повторюватися нескінченно.

 

Наприклад,

i: =1;                                                 {тут <тіло циклу> містить один

while i<10 do write (i); i: =i+1;         оператор; умова i<10 iстинно завжди,

                                                  тому цикл нескінченний}

 

4. Оператор циклу із після умови

 

Формат:

 repeat <тіло циклу> until <умова>;

де <умова> - вислів логічного типу, <тіло циклу> оператор чи група операторів (яку необхідно об’єднувати в операторні дужки).

Якщо <умова> має значення false, тоді виконання <тіло циклу> повторюється; в противному випадку управління передається на оператор, слідуючий за until <умова>, тобто виконання <тіло циклу> повторюється до тих пір, поки значення <умова> не стане рівним true.

 

Наприклад,

 

i: =1;

repeat i: =i+1; write (i) {будуть надруковані       значення від 2  до 11}

until i>10;

 

В операторі repeat <тіло циклу> виконується хоча б один раз незалежно від значення <умова>.

При виконанні оператора repeat також треба слідкувати за тим, щоб в <тілі циклу> були передбачені дії, що змінять правильність <умова> (на якомусь кроці), iнакше виконання <тіло циклу> буде повторюватися нескінченно.

Цикли можуть бути вкладеними; кількість вкладень обмежується тільки обсягом доступної пам'яті.

 

Приклад 4.1. Обчислити значення N!

 

Алгоритм розв’язування цього завдання реалізує типічний підхід до обчислення виразу з накопичуванням. Використовувані змінні:

n – ціле число, для якого треба обчислити N!;

f – результат;

i – параметр циклу.

Блок-схема алгоритму приведена на рис. 4.1.

 

Програма 4.1.1. (програма, що використовує оператор циклу for-to):

 

 uses crt;

 var n, f, i: integer;

 begin

 write ('введiть значення n: '); readln (n);

  f: =1;

  for i: =2 to n do f: =f*i;

  writeln ('значення n! = ', f)

 end.

 

Результати роботи програми:

Введiть значення n: 5

Значення n! = 120

 

Програма 4.1.2 (програма, що використовує оператор циклу for-downto):

 

uses crt;

var n,f, i: integer;

begin

  write ('введiть значення n: '); readln (n);

  f: =1;

  for i: =n downto 2 do f: =f*i;

  writeln ('значення n! = ', f)

end.

 

Результат роботи програми 4.1.2 такий ж, як і в програмі 4.1.1.

 

 

Рис. 4.1

 

Приклад 4.2. Задана послідовність невід'ємних цілих чисел, за якою слідує від'ємне число (це число не є членом послідовності). Визначити кількість нулів в цій послідовності.

Позначимо кількість нулів послідовності цілої змінної k. Члени послідовності будемо вводити в цілу численну змінну n. Ми бачимо, що такий підхід можливий, бо самі числа не треба запам’ятовувати для наступної обробки.

Блок-схема алгоритму приведена на рис. 4.2.

 

Рис. 4.2

 

При реалізації алгоритму використовується оператор циклу із передумовами. Вихідні дані: 2; 0, 91, 0, 34, 5, 0, –4.

 

Програма 4. 2.

 

uses crt;

var n, k: integer;

begin

  write ('введiть ціле число: ');

  readln (n);

  k: =0;

  while n>=0 do begin if n=0 then k: =succ (k);

     write ('введiть наступне ціле число: ');

     readln (n) end;

  writeln;

  writeln ('в даній послідовності нулів: ', k)

end.

Результати роботи програми:

 

Введіть наступне ціле число: 2

Введiть наступне ціле число: 0

Введiть наступне ціле число: 91

Введiть наступне ціле число: 0

Введiть  наступне ціле число: 34

Введiть наступне ціле число: 5

Введiть наступне ціле число: 0

Введiть наступне ціле число: – 4

В даній послідовності нулів: 3

 

Приклад 4.3. Знайти перший від'ємний член послідовності  cos (ctgn), n = 1, 2, 3,...

Введемо позначення:

u – черговий член послідовності (real),

n – його номер    (integer).

Блок-схема алгоритму представлена на рис. 4.3.

 

Програма 4.3

 

uses crt;

var

  n: integer;

  u: real;

begin

   n: =0;

 repeat

    n: =n+1; u: =cos (cos (n) /sin (n))

 until u<0;

 writeln ('перший від'ємний член має номер ', n);

 writeln ('його значення рівне', u: 10: 7)

end.

 

Результати роботи програми:

перший від'ємний член має номер 6;

його значення рівне – 0,9568718.

 

 

Рис. 4.3

 

Питання для самоперевірки

 

1. Яка алгоритмічна структура називається циклічною?

2. Який цикл називається арифметичним, iтераційним?

3. Пояснiть порядок роботи операторів циклу із параметром. Який тип  даних допустимий для параметра циклу?

4. Скільки операторів допускається в тілі циклу for?

5. Як вираховується чергове значення параметра циклів for?

6. Пояснити порядок роботи оператора циклу із передумовою (while).

7. Пояснити порядок роботи оператора циклу із постумовою  (repeat). Чи треба групу операторів тіла циклу укладати в операторні дужки?

 

Варіанти завдань

 

1. Дані натуральні числа N і M. Знайти їх найбільший спільний дільник.

2. Дана послідовність із N цілих чисел. Визначити, cкільки додатних чисел зустрічається до першого від’ємного числа.

3. Дана послідовність із N цілих чисел, серед яких є 0. Визначити, скільки чисел йде до 0.

4. Дана послідовність довільних натуральних чисел, за якою слідує 0. Знайти суму цих чисел.

5. Дано ціле число N. Знайти суму цифр цього числа.

6. Дано ціле число N>0. Знайти найбільше ціле число, для якого виконується  умова 2k < N.

7. Дано ціле число N. Знайти першу цифру цього числа.

8. Дано ціле число N. Поміняти місцями першу і останню цифри цього числа.

9. Дана послідовність натуральних чисел (1, 2,...). Яку мінімальну кількість непарних чисел треба додати щоб їх сума стала більше 150?

10.Дана послідовність із нулів та одиниць. Визначити, кількість яких цифр раніше досягне 10.

11. Дана послідовність додатних і від'ємних чисел. Визначити, сума яких чисел  (за модулем) раніше перевищить 20.

12. Дана послідовність дійсних чисел. Визначити, скільки додатних чисел розташовано між першими двома від'ємними.

13. Дані дійсні числа a і b. Визначити перше ціле число, що належить iнтервалу (a, b), що ділиться на 5.

14. Визначити перший номер N, для якого вираз y = –20 –6n + N3 стане більше 0  (N = 1, 2, 3,...).

15. Дана послідовність натуральних чисел (1, 2,...). Визначити, скільки непарних чисел, не кратних 3, треба додати, щоб їх сума стала більше 200.

16. Дана послідовність довільних дійсних чисел Х0, A0, A1,..., An і ціле число N>0. Обчислити значення багаточлена A0 + A1×x +,..., + An × xn в точці X = X0  (використати  схему Горнера).

17. Дано ціле число N>0 і за ним послідовність із N дійсних чисел. Знайти добуток максимального і мінімального членів цієї послідовності (число N не є членом послідовностi).

18. Дано ціле число N>0 і за ним послідовність із N дійсних чисел. Знайти номер найбільшого із них (число N не є членом послідовності).

19. Дана послідовність довільних натуральних чисел, за якою слідує 0. Знайти різницю між найбільшим і найменшим із цих чисел.

20. Дано ціле число N>0 і за ним послідовність із N дійсних чисел. Визначити в цій послідовності найбільший член і кількість членів, рівних йому (число N не є членом послідовності).

21. Дано ціле число N>0 і за ним послідовність із N дійсних чисел. Знайти найбільшу різницю між двома сусідніми числами (число N не є членом послідовності).

22. Дана послідовність довільних натуральних чисел, за якою слідує 0. Перевірити,  чи є ця послідовність  зростаючою.

23. Дані два натуральні числа N і M. Визначити кількість співпадаючих цифр, що знаходяться в однакових розрядах.

24. Дана послідовність довільних натуральних чисел, за якою слідує 0. Знайти частки найбільшого і найменшого із них.

25. Дана послідовність із N довільних чисел. Визначити, чи є в ній два однакові числа, що ідуть підряд.

26. Дана послідовність із N довільних цілих чисел. Визначити, чи є в ній число, рівне першому членові цієї послідовності.

27. Дана послідовність із N довільних дійсних чисел. Знайти найбільше із чисел, за модулем менше двох.

28. Дана послідовність довільних дійсних чисел, серед яких є хоча б два нулі. Визначити, скільки чисел знаходиться між першими двома нулями.

29. Дана послідовність довільних натуральних чисел, за якої слідує 0. Знайти середнє геометричне чисел, більших 5.

30. Дана послідовність із N довільних цілих чисел. Визначити, чи є вона спадною.

31 – 60. Скласти програму табулювання функцїї y = f(x) на інтервалі [а;b] з кроком h = (b–a)/N, де N – ціле число (вводиться з клавіатури). У програмi передбачити обчислення величин, вказаних у вapiaнтаx завдань. За складеною програмою провести обчислення.

 

п/п

y = f(x)

Інтервал

Величини, які необхідно обчислити

a

b

1

2

3

4

5

31.  

y=x2+16/x-16

1

4

середнє арифметичне всix у

32.  

y=arctgx

0

2

суму і кількість 0,71<у<2

33.  

y=ln(2+sin2x)

0

4

суму у>1 i кількість у<1

34.  

y=xln(l+x)

1

6

кількість i добуток у<100

35.  

у=хе2x

0

6

середнє арифметичне 1<у<7,9

36.  

y=arctgx/(l +x2)

0

1,5

суму у<0,4 i добуток у>0,4

37.  

y=sin2x/(l+x2)

0

6

суму y<0 i кількість у>0

38.  

y=xex

–2

3

суму i добуток у>0

39.  

y=lnx+arctgx

0,5

2

середнє геометричне у>0,3

40.  

y=(ex–e-x)/2

0,3

2

добуток у>1 i суму у<1

41.  

y=xlnx

1

10

середнє геометричне у>5

42.  

y=lnx+cos2x

1

1,5

середнє арифметичне у>0,3

43.  

y=(ex+e-x)/2

–1

2

суму i кількість у>2

44.  

y=arccosx

0,1

0,6

суму i кількість у< 1,3

45.  

y=(4-x)4/x2

1

4

кількість у<-0,5 i у>-0,5

46.  

y=e-x

0

1

кількість i добуток y>4,12

47.  

у=1n(2+х)2

0

3

суму i добуток y<0,95

 

 

Продовження таблиці

1

2

3

4

5

48.   

у=3-х-4/(х+2)2

–1

2

кількість y<0 i y>0

49.   

y=(lnx)/x

1

2

кількість i суму 0,2<y<0.5

50.   

y=x/arcsinx

0,5

1

суми y>-0,1 i y<-0,l

51.   

y=(sinx+x2)/lnx

2

4

кількість y>8,3 i y<8,3

52.   

y=xexsinx

0

1

середнє геометричне 0<y <0.7

53.   

y=lnx+arctgx

1

2

суму i добуток 0,5<y< 1,5

54.   

y=xe-x

1

2

добуток i кількість 0<y<0.3

55.   

y=ln(l+x2)

0

2

добуток i суму y> 1

56.   

y=8x+4/(x-2)

0,5

2

кількість i добуток y< 1,3

57.   

y=xsin2x

0

1,5

суму i кількість у>0,3

58.   

y=exsinx

0

3

середнє арифметичне y>2,15

59.   

y=sin2x

0

3

середнє геометричне у>0

60.   

y=arctgx

0

2

середнє арифметичне 0<у<0,5

 

 

 

 

 

 

ЛАБОРАТОРНА РОБОТА №5

 

Тема. Обробка одномірних масивів.

Мета роботи. Ознайомитися з поняттям одномірного масиву як одного із структурних (регулярних) типів даних; вивчити засоби опису одномірних масивів, а також дії над масивами і їх елементами; навчитися застосовувати одержані знання при рішенні завдань з використанням одномірних масивів.

 

Стислі теоретичні відомості і методичні вказівки

 

Масив – це структурний тип  даних, що складається із фіксованого числа елементів, що мають один і той же тип. Число елементів масиву фіксується при його описі. Доступ до кожного окремого елемента масиву здійснюється шляхом iндексування його елементів. Індекси становлять вирази будь-якого скалярного типу, безліч значень якого перераховано і обмежено.

Будь-який масив, використаний в програмі, повинен бути оголошений (описаний) в блоці оголошень. Одномiрний масив описується так:

 

Формат:

 

Type

<iм'я типу>=array [<тип iндексу>] of <тип компонент>;

Var

  <iдентифікатор,... >: <iм'я типу>;

 

де <iм'я типу> не слід допускати щоб співпадало з зарезервованими словами; <тип iндексу> – будь-який скалярний тип (стандартний чи користувача), крім real і integer; <тип компонент> – будь-який.

Ми бачимо, що <тип iндексу> може бути обмеженим на базі типу integer.

 

Наприклад,

 

Type

  mass=array [ 1.. 10 ] of real;

  day= (пн, вт, ср, чт, пт, сб, вс);

  komp=array [ day ] of boolean;

Var

  a, b: mass;

  k1: komp;

Тут описано два регулярні типи: mass і komp. До елементів масивів a і b можна звернутися так:   a [ 1 ], a [ 2 ],..., a [ 10 ], b [ 1 ], b [ 2 ],..., b [ 10 ].

До елементів масиву k1 можна звернутися так: k1 [ пн ], k1 [ вт ],..., k1 [ вс ].

Масив може бути описаний і без подання типу в розділі Type, а безпосередньо в розділі Var.

 

Формат:

Var

<iдентифікатор>:array[<тип iндексу>]of<тип компонент>;

 

Наприклад,

 

Var

  a, b: array [ 1.. 10 ] of real;

  k1: array [ day ] of boolean;

 

Для опису масиву можна використати заздалегідь відомі константи (у вигляді індексів):

 

Const

 i1=4; i2=15;

Var

  mas: array [ i1.. i2 ] of integer;

 

Над одномірними масивами допустимі такі дії:

 

а) присвоєння, наприклад, а: =b;

б) операція "рівно": a=b. Результат цієї операції рівний true, якщо значення кожного елемента масиву a рівне відповідному значенню масиву b;

в) операція "не рівно": a<>b. Результат цієї операції рівний  true, якщо хоч би одне значення елемента масиву a не рівно значенню відповідного елемента масиву b. Масиви, що приймають участь в цих діях, повинні мати однакові типи індексів і однакові типи компонент.

Дії над елементами масиву виконуються так само, як і над простими змінними відповідних типів. Введення-виведення, а також обробка одномірних масивів здійснюється, як правило, з використанням простих (інколи вкладених) циклів.

 

Наприклад,

 

for i: =1 to 10 do

 begin

   read (a ([ i ], b [ i ]);  

{почергове введення елементів масивів}

   c [ i ]: =a [ i ] +b [ i ];     

{підсумовування відповідних елементів масивів}

end

 

При описі масивів треба пам'ятати, що кожна змінна може бути описана не більше одного разу, тому не можна одні і ті ж імена використовувати у вигляді імені масиву  і  імені простої змінної одночасно.

 

Приклад 5. 1

Дана послідовність із 10 дійсних чисел. Визначити, скільки в ній нулів.

Для розв’язування приймемо такі позначення: a – масив із 10 дійсних чисел, i – індекс і параметр циклу (integer), k – лічильник кількості нулів (integer).

 

Блок-схема алгоритму представлена на рис. 5.1.

 

Програма 5.1

 

uses crt;

var


a:array [ 1.. 10 ] of real; {тип індексу обмежений}

  i, k: integer;

 

Рис. 5.1

 

{для індексу i допустимий тип  integer, бо цей тип є базовим для обмеженого типу 1.. 10; в загальному випадку змінна,  використана у вигляді індексу, повинна мати тип,  співпадаючий із <типом iндексу>}

 

  begin k: =0;

  writeln ('введiть елементи масиву: ');

  for i: =1 to 10 do begin read (a [ i ]);

      if a [ i ] =0 then k: =k+1

    end;

  writeln; writeln ('в послідовності: ');

  for i: =1 to 10 do write (a [ i ]: 6: 2);

  writeln; writeln ('нулів- ', k)

 end.

 

Результати роботи програми:

Введiть  елементи масиву: –4.2,  5.35,  -0.3,  0,  0, 15,  28.4  0, 11.3,  0.

В послідовності: –4.20,  5.35, -0.30,  0.00,  0.00,  15.00,  28.40,  0.00, 11.30,  0.00.

Нулів: –4.

 

Питання для самоперевірки

 

1. Що таке масив?

2. Як описується одномiрний масив?

3. Яким може бути тип  індексу, компонент масиву?

4. Чи може тип  індексу бути real, integer користувача?

5. Які дії допустимі над масивами, над елементами масивів?

6. Який тип повинна мати змінна, використана у вигляді індексу?

 

Завдання до роботи

 

1. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти найбільше з чисел з парним номером.

2. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти найменше з чисел з непарним номером.

3. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти найбільше з квадратів цих чисел.

4. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти найменше з послідовності a(1), a(2)12, a(3)13,..., a(N)1N.

5. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти найближче число до середнього арифметичного цих чисел.

6. Задано послідовність з N чисел:  a(1), a(2), a(3),..., a(N).  Знайти кількість парних чисел.

7. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти добуток додатних чисел.

8. Задано послідовність з N чисел:  a(1), a(2), a(3),..., a(N).  Знайти кількість від’ємних чисел.

9. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму квадратів непарних чисел.

10. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти різницю між добутком додатних і добутком від’ємних.

11. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість чисел менших середнього арифметичного.

12. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму чисел більших середнього арифметичного.

13. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти, чи є в цій послідовності число рівне середньому арифметичному.

14. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість від’ємних чисел менших (за модулем) свого номера (i<¦a(i)¦<0).

15. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму непарних чисел.

16. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість чисел кратних 5, і не кратних 3.

17. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість чисел, які при діленні на 7 дають залишок 1 або 5.

18. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість чисел, які належать відрізку [a,b].

19. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість чисел, які не належать відрізку [a,b].

20. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість чисел, які задовольняють умові i<a(i)<2i.

21. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість чисел, які задовольняють умові a(i)<(a(i-1)+a(i+1))/2

22. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти добуток чисел кратних 3.

23. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму чисел, які мають непарні порядкові номера і є парними.

24. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти добуток чисел, які належать відрізку [0,10].

25. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти добуток чисел, які не належать відрізку [2,8].

26. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість чисел, які є подвійними парними числами.

27. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість парних чисел кратних 3.

28. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму непарних чисел, кратних 4.

29. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти різницю між сумами парних і непарних чисел.

30. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість парних чисел, які задовольняють умові i<a(i)<2i.

31. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти найменше з добутків цих чисел.

32. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти найбільш віддалене число від середнього арифметичного цих чисел.

33. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість непарних чисел.

34. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму від’ємних чисел.

35. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість додатних чисел.

36. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму чисел менших середнього арифметичного.

37. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість від’ємних чисел більших (за модулем) свого номера (0<¦a(i)¦<i).

38. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти найменше з чисел з парним номером.

39. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти добуток від’ємних чисел.

40. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму квадратів парних чисел.

41. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму добутку додатних і добутку від’ємних.

42. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N).  Знайти кількість чисел більших середнього арифметичного.

43. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму парних чисел.

44. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Визначити, чи є числа, які лежать на кінцях відрізка [a,b].

45. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму чисел кратних 5.

46. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму чисел, які мають парні порядкові номера і є непарними.

47. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму чисел, які належать відрізку [0,10].

48. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму чисел, які не належать відрізку [2,8].

49. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти різницю між добутками парних і непарних чисел.

50. Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму парних чисел.

 

ЛАБОРАТОРНА РОБОТА №6

 

Тема. Обробка двомірних масивів.

Мета роботи. Вивчити засоби задання багатомірних, зокрема, двомірних масивів, навчитися застосовувати алгоритми обробки двомірних масивів для розв’язування завдань.

            

Стислі теоретичні відомості і методичні вказівки

 

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

Виходячи з цього, а також враховуючи матеріал лабораторної роботи №4, опис двомірних масивів можна здійснити таким чином.

 

Формат.

 

Type

<iм'я типу_1>=array[<тип iндексу_1]of <тип компонент>;

<iм'я типу_2>=array[<тип iндексу_2>]of <iм'я типу_1>;

Var

  <iдентифікатор>: <iм'я типу_2>;

 

Або

 

Type

<iм'я типу>=array [ <тип iндексу_1> ] of array [ <тип iндексу_2> ]  of <тип компонент>;

     

 Var

  <iдентифікатор>: <iм'я типу>;

 

Наприклад,

 

Type

  mas=array [ -5.. 5 ] of real;

  matr=array [ 1.. 10 ] of mas;

Var

  a: matr;

 

Або

Type

  matr=array [ 1.. 10 ] of array [ -5.. 5 ] of real;

Var

  a: matr;

Тут масив a розглядається як одномiрний масив, кожний елемент якого в свою чергу також є одномiрним масивом. При обробці двомірного масиву a, звертання до його елементів можна здійснювати як до елементів одномірного масиву, наприклад, a[ 1 ] – перший рядок масиву a (крім процедур введення-виведення). Звертання ж до скалярного елемента масиву a здійснюється за ім’ям цього масиву і двох індексам, наприклад, a [ i ] [ j ] або a [ i, j ], де i, j – індекси.

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

 

Формат.

 

Type

  <iм'я типу>=array [ <тип iнд_1, <тип iнд_2> ] of

[ <тип компонент> ];

 Var

  <iдентифікатор>: <iм'я типу>;

 

Наприклад,

 

Type

  day= (пн, вт, ср, чт, пт, сб, вс);

  mas=array [ day, 1.. 10 ] of real;

Var

  a, b: mas;

 

   <тип iндексу_1> і <тип iндексу_2> можуть бути різними.

Двомірні масиви можна описати і неявно (без завдання ім'я типу) безпосередньо в розділі опису змінних.

 

 

 

Наприклад,

 

Var

  v1: array [ 1.. 10 ] of array [ 1.. 10 ] of real;

  a, b: array [ -4.. 4, 1.. 10 ] of integer;

 

Звертання до елементів двомірних масивів зручніше здійснювати так: v1 [ i, j ], a [ i, j ], b [ i, j ] (якщо i, j – індекси).

Дії над багатомірними масивами і їх елементами виконуються так само, як і над одномiрними. Введення-виведення, а також обробка двомірних масивів виконується, як правило, з використанням вкладених циклів.

При обробці двомірних масивів необхідно ввести в розділі опису змінних принаймні ще дві змінні для звертання до конкретних елементів масиву.

 

Приклад 6. 1.

 

Для цілочисельної квадратної матриці розмірністю 4´4 поміняти місцями першу і останню, а також другий і третій рядки.

Розв’язування. Введемо тип  matrix, в якому визначимо потрібну структуру даних. Для цієї цілі ми там само введемо допоміжну структуру stroka, в якій визначимо одномiрний масив із 4-х елементів. Таким чином, тип  matrix буде задано як одномiрний масив із рядків матриці. Таке подання полегшить розв’язування поставленого завдання. В розділі опису змінних введемо а  як ім'я для вихідної і результуючої матриці, i, j – для звертання до її елементів при введенні і виведенні, а також допоміжні змінні r типу stroka і k-типу integer для більш слушного процесу перестановки рядків. Тут якраз буде використовуватись той факт, що в пам'яті ЕОМ двомірний масив зберігається по рядкам, тобто те, що відображено при завданні відповідної структури matrix. Ми бачимо, що в разі маніпулювання зі стовпцями масиву таке подання нічого не давало б, в силу вище сказаного.

Введення вихідного масиву здійснимо, використовуючи два вкладені цикли. Виведення елементів даного масиву і масиву-результату здійснимо також, однак для подання їх у вигляді прямокутної таблиці виведення елементів рядків в внутрішньому циклі здійснимо за допомогою оператора write, а для забезпечення переходу на новий рядок після завершення друкування поточного рядка додамо оператор writeln.

Блок-схема алгоритму представлена на рис. 6. 1.

 

Рис. 6.1

Програма 6.1

uses crt;

type

  stroka=array [ 1.. 4 ] of integer;

  matrix=array [ 1.. 4 ] of stroka;

var

  a: matrix; {початкова матриця}

  r: stroka; {Одномiрний масив}

  i, j, k: integer;

begin     { Введення елементів вихідного масиву }

 for i: =1 to 4 do

 for j: =1 to 4 do read (a [ i, j ]); {Виведення елементів вихідного масиву }

 writeln ('початковий масив: ');

 for i:=1 to 4 do

   begin

    for j: =1 to 4 do write (a [ i, j ]: 4);

     writeln

   end;       { Обробка масиву }

   k: =3;

   for i: =1 to 2 do

     begin r: =a [ i+k ];

        a [ i+k ]: =a [ i ];

        a [ i ]: =r;

        k: =1

     end;

{ Виведення елементів масиву - результату }

   writeln;

 writeln ('результат: ');

   for i: =1 to 4 do

    begin

      for j: =1 to 4 do write (a [ i, j ]: 4);

      writeln

    end

end.

 

Результати роботи програми:

Початковий масив:

  1      3  –6      8

  0    –5    6    –3

  4      5    7      8

–2      3    4    –4

Результат:

–2      3    4    –4

  4      5    7      8

  0    –5    6    –3

  1      3  –6      8

 

Приклад 6.2. В заданій дійсній матриці 5´3 знайти найбільший елемент і його індекси.

Розв’язування. Задаємо тип  matrix як звичайну двомірну структуру даних, оскільки подання її у вигляді, аналогічному попередньому завданню, не дасть ніякого ефекту. Введення і виведення інформації здійснимо аналогічно попередньому завданню. Пошук найбільшого елемента здійснимо, використовуючи стандартний спосіб. При цьому у змінній max будемо зберігати значення цього елемента, а змінні l і k використовуємо для позначення відповідно до номерів рядка і стовпця цього елемента (індексів). У вигляді параметрів циклів введемо також цілі змінні j та i.

Блок-схема алгоритму представлена на рис. 6.2.

Програма 6.2

uses crt;

type

  matrix=array [ 1.. 5, 1.. 3 ] of real;

var

  a: matrix; {початкова матриця}

  i, j: integer; {параметри циклу}

  max: real; {максимальний елемент}

  l, k: integer; {iндекси максимального елемента}

begin

       { Введення елементів початкової матриці }

 for i: =1 to 5 do

 for j: =1 to 3 do read (a [ i, j ]);

       { Виведення елементів початкової матриці }

 writeln ('початкова матриця: ');

    for i: =1 to 5 do

      begin

      for j:=1 to 3 do write(a[i,j]: 8: 3);

      writeln; end;

  { Пошук максимального елемента}

 max: =a [ 1, 1 ]; l: =1; k: =1;

   for i: =1 to 5 do

     for j: =1 to 3 do

       if a[i,j] >max then begin max:=a[i,j];

          l: =i; k: =j

        end;

       { Виведення результатів: }

   writeln;

   writeln ('найбільший елемент матрицi', max:8:3);

   writeln('він є в',l,'рядку,', k,' стовпці')

   end.

Рис. 6.2

Результати роботи програми:

Початкова матриця:

  2,000  –5,800  –34,900

  0,450  –3,560     5,760

  2,120    2,320     3,610

–0,080    4,710     9,930

  0,680    0,560     7,290

 

Найбільший елемент матрицi рівний  9,930 знаходиться в 4 рядку, 3 стовпці.

Питання для самоперевірки

 

1.    Як задається двомірний, багатомірний масиви?

2.    Чи можна описувати багатомірні масиви безпосередньо в розділі опису змінних? Якщо можна, тоді як?

3.    Як здійснюється звертання до елементів двомірних масивів?

4.    Які дії можна виконувати над багатомірними масивами?  Над їх елементами?

5.    Чи можуть <типи iндексів> багатомірних масивів бути різно­манітними?

 

Завдання до роботи

 

Дана матриця A розміром 4´4 (масив задається самостійно або автоматичним генеруванням випадкових чисел).

1.       Знайти maxi Sj a (i, j).

2.       Знайти maxj Si a (i, j).

3.       Задана матриця A розмірності 4´5. Знайти найменший елемент матриці і видалити рядок, в якій він знаходиться.

4.       Задана матриця A розмірності 8´4. Знайти найбільший елемент матриці і видалити стовпець, в якій він знаходиться.

5.       Задана матриця A розмірності 9´5. Знайти найменший елемент матриці і роздрукувати відповідний рядок.

6.       Задана матриця A розмірності 3´4. Знайти найбільший елемент матриці і роздрукувати відповідний рядок.

7.       Задана матриця A розмірності 7´5. Знайти суму від’ємних елементів.

8.       Задана матриця A розмірності 5´3. Знайти добуток невід’ємних елементів.

9.       Задана матриця A розмірності 3´7. Знайти рядок з найменшим елементом і поміняти її місцями з першою.

10.   Задана матриця A розмірності 9´5. Знайти рядок з найбільшим елементом і поміняти його місцями з останнім.

11.   Задана матриця A розмірності 2´4. Знайти суму елементів i-го стовпця і розділити на неї i-тий рядок.

12.   Задана матриця A розмірності 8´8. Знайти суму елементів i-го рядка і розділити на неї i-тий стовпець.

13.   Задана матриця A розмірності 5´5. Знайти суму діагональних елементів і розділити на неї перший рядок.

14.   Задана матриця A розмірності 4´4. Знайти суму квадратів діагональних елементів і розділити на неї останній рядок.

15.   Задана матриця A розмірності 7´5. Знайти добуток між кількістю додатни і від’ємних елементів матриці.

16.   Задана матриця A розмірності 7´7. Знайти суму елементів, які лежать нижче головної діагоналі.

17.   Задана матриця A розмірності 3´5. Записати всі елементи матриці в одномірний масив.

18.   Задана матриця A розмірності 6´3. Вибрати довільно елемент A(i,j) і видалити рядок, в якому він знаходиться.

19.   Задана матриця A розмірності 5´5. Поміняти місцями останній рядок і останній стовпець.

20.   Задана матриця A розмірності 7´7. Знайти добуток елементів, які лежать нижче головної діагоналі.

21.   Задана матриця A розмірності 4´8. Знайти суму елементів кожного стовпця. Результат помістити в одномірний масив.

22.   Задана матриця A розмірності 6´6. Поміняти місцями перший рядок і останній стовпець.

23.   Задана матриця A розмірності 8´8. Знайти скалярний добуток першого стовпця і останнього рядка.

24.   Задана матриця A розмірності 4´8. Знайти суму елементів кожного рядка. Результат помістити в одномірний масив.

25.   Задана матриця A розмірності 4´8. Знайти кількість непарних елементів масиву.

26.   Задана матриця A розмірності 4´4. Поміняти місцями другий рядок і останній стовпець.

27.   Задана матриця A розмірності 6´3. Вибрати довільно елемент A(i,j) і видалити стовпець, в якому він знаходиться.

28.   Задана матриця A розмірності 4´4. Поміняти місцями елементи, розташовані на діагоналях матриці.

29.   Задана матриця A розмірності 4´8. Знайти кількість парних елементів масиву.

30.   Задана матриця A розмірності 5´8. Знайти середнє арифметичне елементів матриці і кількість елементів, менших середнього арифметичного.

31.   Задана матриця A розмірності 4´5. Знайти найбільший елемент матриці і видалити рядок, в якій він знаходиться.

32.   Задана матриця A розмірності 8´4. Знайти найменший елемент матриці і видалити стовпець, в якій він знаходиться.

33.   Задана матриця A розмірності 9´5. Знайти найменший елемент матриці і роздрукувати відповідний стовпець.

34.   Задана матриця A розмірності 3´4. Знайти найбільший елемент матриці і роздрукувати відповідний стовпець.

35.   Задана матриця A розмірності 7´5. Знайти суму додатних елементів.

36.   Задана матриця A розмірності 5´3. Знайти добуток від’ємних елементів.

37.   Задана матриця A розмірності 3´7. Знайти рядок з найбільшим елементом і поміняти його місцями з першим рядком.

38.   Задана матриця A розмірності 9´5. Знайти рядок з найменшим елементом і поміняти його місцями з останнім.

39.   Задана матриця A розмірності 9´5. Знайти найменший елемент матриці і видалити стовпець, в якій він знаходиться.

40.   Задана матриця A розмірності 9´5. Знайти найбільший елемент матриці і видалити рядок, в якій він знаходиться.

41.   Задана матриця A розмірності 9´5. Знайти найменший елемент матриці і роздрукувати відповідний стовпець.

42.   Задана матриця A розмірності 9´5. Знайти найбільший елемент матриці і роздрукувати відповідний стовпець.

43.   Задана матриця A розмірності 9´5. Знайти добуток від’ємних елементів.

44.   Задана матриця A розмірності 9´5. Знайти суму невід’ємних елементів.

45.   Задана матриця A розмірності 2´4. Знайти суму елементів i-го стовпця і домножити на неї i-тий рядок.

46.   Задана матриця A розмірності 8´8. Знайти суму елементів i-го рядка і домножити на неї i-тий стовпець.

47.   Задана матриця A розмірності 3´2. Знайти суму елементів, які лежать вище головної діагоналі.

48.   Задана матриця A розмірності 6´3. Вибрати довільно елемент A(i,j) і видалити стовпець, в якому він знаходиться.

49.   Задана матриця A розмірності 5´5. Поміняти місцями останній стовпець і останній рядок.

50.   Задана матриця A розмірності 7´7. Знайти суму елементів, які лежать вище головної діагоналі.

 

 

ЛАБОРАТОРНА РОБОТА №7

 

Тема. Процедури та функції

Мета роботи. Ознайомитись з поняттям процедур та функцій та вивчити засоби опису процедур та функцій, а також дії над ними; навчитися застосовувати одержані знання при вирішенні завдань з використанням процедур та функцій.

 

Стислі теоретичні відомості і методичні вказівки

 

            Процедури та функції дозволяють включати в основний програмний блок допоміжні блоки. Кожне оголошення процедури або функції має заголовок, за яким іде блок.

 

1. Оголошення процедур

 

            Оголошення процедури дозволяє зв’язати ідентифікатор з блоком процедури. Процедура складається із заголовка процедури і операторної частини (тіла) процедури.

            В заголовку процедури вказується ім’я процедури і описується список формальних параметрів (якщо він присутній).

            Запуск процедури здійснюється за допомогою оператора процедури, в якому знаходяться ім’я процедури та фактичні змінні. Оператори, які повинні виконуватися при запуску процедури, використовуються в операторній частині блока процедури. Якщо в операторі процедури всередині блока процедури використовується ідентифікатор процедури, то процедура буде виконуватись рекурсивно (при виконанні буде звертатись сама до себе).

 

Приклад оголошення процедури

 

     Procedure NumString (N:Integer; var S:String);

     var

       V:Integer;

     Begin

        V:=ABS(N);

        S:=’’;

        Repeat

          S:=CHR(N mod 10+ord(‘0’))+S;

          N:=N div 10;

        Until N=0;

        If N<0 then

          S:=’-’+S;

        End;      

 

2. Оголошення функцій

 

Оголошення функцій визначає частину програми, в якій      обчислюється значення, яке повертається через ім’я функції. В заголовку функції знаходиться ідентифікатор для функції, формальні параметри (якщо вони присутні) і тип результату функції.

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

Операторна частина блока функції має оператори, які виконуються при активізації функції. Блок повинен мати по крайній мірі один оператор присвоювання, в якому присвоюється значення ідентифікатору функції. Результатом виконання функції буде останнє присвоєне значення. Якщо такого оператора немає, то значення, яке повертається функцією буде невизначеним. Якщо ідентифікатор функції використовується для виклику функції в середині блока функції, то функція буде виконуватись рекурсивно.

 

Приклад оголошення функції:

function Max (A:Vector;N:Integer):Extended;

var

     X:Extended;

     I:Integer;

begin

     X:=A[I];

     for I:=2 to N do

          if X<A[I] then X:=A[I];

Max:=X;

end;

function Power (X:Extended;Y:Integer):Extended;

var

     Z:Extended;

     I:Integer;

begin

     Z:=1.0;

     I:=Y;

     while I>0 do

     begin

          if Odd(I) then Z:=Z*X;

I:=I div 2;

          X:=Sqr(X);

     end;

     Power:=Z;

end;         

3. Параметри

 

            Оголошення процедури або функції має список формальних параметрів. Кожен параметр, оголошений в списку формальних параметрів, відноситься до оголошеної процедури або функції. На нього можна посилатися за допомогою ідентифікатора в блоці, зв’язаному з процедурою або з функцією.

            Існує три види параметрів: значення, зміни і нетипованих змін. Вони характеризуються:

-      групою параметрів без ключового слова VAR та із наступним за нею типом є списком параметрів – значень;

-      групою параметрів із ключовим словом VAR та із наступним за нею типом є списком параметрів – змінних;

-      групою параметрів із ключовим словом VAR і без типу є списком нетипованих параметрів змінних.

 

4. Процедурні типи

 

Як розширення стандартного Pascal, Тurbo Pascal дозволяє розглядати процедуру і функцію як об’єкти, які можна присвоїти змінним і які можуть виступати як параметри – процедурні типи дають таку можливість.

 

5. Процедурні змінні

 

Як тільки процедурний тип визначений, можливо оголошувати змінні цього типу. Такі змінні називаються процедурними. Наприклад, використовуючи наведене раніше оголошення типу, дозволяє описати наступні змінні:

     Var

     P:SwapProc;

     P:MathFunc;

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

Наприклад, дані оголошення процедур и функцій:

     {$F+}

     Procedure Swap(var A,B: integer)

     var

          Temp:Imteger;

     begin

          Temp:=A;

          A:=B;

          B:=Temp;

     end;

     Function Tan(Angle:Real):Real;

     begin

          Tan:=sin(Angle)/cos(Angle);

     end;

     {$F-}

Змінним Р і F, оголошеним раніше, можна присвоїти значення:

 

            P:=Swap;T:=Tan;   

Згідно цим присвоєнням, виклик P(I,J) еквівалентний виклику Swap(I,J) а виклик F(X) еквівалентний виклику Tan(X).

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

Стандартні процедури і функції, такі як WRITELN, READLN, CHR і ORD, оголошені в модулі SYSTEM. Для того, щоб використовувати стандартну процедуру або функцію з процедурною змінною, її треба огородити «оболонкою». Наприклад, заданий тип процедури:

Type

   IntProc = procedure (N:Integer);

Потім приведена сумісна по присвоєнню процедура для виведення цілого числа:

Procedure WriteInt(Nunber:Integer);far;

begin

     write (Number)

end;

Вкладені процедури або функції не можна використовувати з процедурними змінними. Процедура або функція називається вкладеною, якщо вона оголошена в середині іншої процедури або функції. В наступному прикладі Inner вкладена в Outer, звідси випливає, що Inner неможливо присвоїти процедурній змінній:

 

progrom Nested;

procedure Outer;

procedure Inner;

begin

     Writeln(’Inner is nested’);

end;

begin

     Inner;

end;

begin

     Outer;

end.

Використовування процедурного типу не обмежується простими процедурними змінними. Так, як і інший процедурний тип може знаходитись в оголошенні структурного типа:

 

Приклад:

type

     GoToProc = procedure(X,Y:Integer);

     ProcList=array[1..10] of GoToProc;

     WindowPtr=^WindowRec;

     Window=record

          Next:WindowPrt;

          Header:String[31];

          Top,Left,Bottom,Right:Integer;

          SetCursor:GoToProc;

     end;

     var

     P:ProcList,

W:WindowPtr;

 

Згідно цьому оголошенню процедури оператори є діючими викликами процедури:

P[3] (1,1);

W^.SetCursor(10,10);

Коли процедурне значення присвоюється процедурною змінною, яка фізично представляє собою адрес процедури, то воно зберігається в змінній. Фактично процедурна змінна діє як змінна – показник за виключенням того, що замість вказування на дані, вона вказує на процедуру або на функцію. Як і показник, процедурна змінна займає 4 байти (два слова), які знаходяться в пам’яті. Перше слово зберігає зміщення адреси, друге – сегментну частину.

 

Завдання до роботи

 

1. Дано вектори a і b, що складаються з семи компонент. Знайти max(max(Ai), max(Bi), max(¦Ai-Bi¦), max(Ai+Bі),1).

2. Дано вектори a і b, що складаються з семи компонент. Обчислити:

3. Дано вектори a і b, що складаються з шести компонент. Обчислити:

4. Дано вектори a і b, що складаються з дев’яти компонент. Обчислити:

5. Дано вектори a і b, що складаються з десяти компонент. Обчислити:

MAX(Ai) × MAX(Bi)/MAX(Ai+Bi).

6. Дано вектори a і b, що складаються з семи компонент. Обчислити:

MIN(Ai) × MIN(Bi)/(MIN(Ai Bi))1/2.

7. Дано вектори a і b, що складаються з п`яти компонент. Обчислити:

MAX

8. Дано вектори a і b, що складаються з дев’яти компонент. Обчислити:

(

9. Дано вектори a і b, що складаються з десяти компонент. Обчислити:

(MIN(Ai+Bi)+MAX(Ai-Bi))/(MIN(Ai)+MAX(Bi))

10. Обчислити:

11. Обчислити:

12. Обчислити:

13. Обчислити:

14. Обчислити:

n!! × m!! / (n-m)!!, n10, m10, nm.

15. Дано вектори a і b, що складаються з семи компонент. Обчислити:

.

16. Дано три числа a, b, c. Знайти найменше спільне кратне.

17. Дано трикутник зі сторонами a, b, c. Знайти висоти трикутника побудованого із висот заданого.

18. Дана матриця A (6´5). Побудувати вектор, який складається з найменших елементів рядків матриці. (Пошук найменшого елемента оформити в вигляді процедури).

19. Дана матриця A (4´5). Впорядкувати всі стовпці за спаданням. (Оформити в вигляді процедури).

20. Дана матриця A (7´5). Впорядкувати всі рядки за спаданням. (Оформити в вигляді процедури).

21. Дана матриця A (4´5). Побудувати вектор, який складається з суми елементів стовпців матриці.

22. В тривимірному просторі дано чотири точки. Визначити найменшу віддаль між ними.

23. Дано чотири вектори з чотирьох компонент. Визначити найбільшу компоненту з найбільших компонент вектора.

24. На площині дано п’ять точок, які утворюють опуклий многокутник. Знайти його площу. (Розбити на трикутники. Обчислення кожної з площ оформити в вигляді підпрограми).

25. Дано три вектори, розмірністю 5. Визначити, який з них має найменшу довжину.

26. Дано послідовність з 20 чисел. Визначити, яка з цифр зустрічається найменш часто.

27. Дано дві послідовності з 20 чисел. Визначити, в якій із них цифр менше.

28. Скількома способами можна відібрати команду в складі з 8 кандидатів; з 10 кандидатів; з 11 кандидатів? Підрахунок кількості способів оформити в виді функції.

29. До порту в середньому приходить 3 кораблі на день. Яка імовірність того, що до порту в день прийде 2 кораблі; 5 кораблів? Підрахунок імовірностей оформити в виді функції.

30. В партії, яка складається з K виробів, є G з дефектами. З партії вибирається для контролю R виробів. Яка імовірність того, що рівно S виробів будуть з дефектом?

31. Два трикутники задані своїми сторонами a, b, c. Обчислити площі трикутників за формулою Герона і визначити, який з трикутників має більшу площу.

32. Два трикутники задані координатами своїх вершин a, b, c. Обчислити площі трикутників, не використовуючи формули Герона, і визначити, який з трикутників має більшу площу.

33. Футболіст ударом ноги посилає м’яч вертикально вверх з висоти 1м з початковою швидкістю 20 м/с. На якій висоті буде м’яч через 1; 3; 4 с?

34. Футболіст ударом ноги посилає м’яч вертикально вверх з висоти 1м з початковою швидкістю 20 м/с. Коли м’яч буде на висоті 5; 10 м?

35. Футболіст ударом ноги посилає м’яч вертикально вверх з висоти 1м з пoчатковою швидкістю 20 м/с. Визначити з точністю до 0,25с, коли і на якій максимальній висоті опиниться м’яч за 4 с?

36. Дано дійсні числа S, T. Обчислити A = F(T,–2S,1,17)+F(2.2,T,S–T) де F(A,B,C) =  (2A–B–sinC)/(5+|C|). Обчислення F оформити в виді функції.

37. Дано дійсні числа S,T. Обчислити B = G(1,2,S)+G(T,S)–G(2S–1,ST), де G(A,B) = (A+B)/(A+2AB+3B+4). Обчислення G оформити в виді функції.

38. Дано дійсні числа S, T. Обчислити F = H(1S,T)+MAX(H(S–T,ST)––H(1,1)), де H(A,B) = A/(1+B)+B/(1+A)–(A–B). Обчислення H оформити в виді функції.

39. Дано дійсні числа A1, A2,..., A9; B1, B2,..., B11. Максимальний елемент першої послідовності замінити на максимальний елемент другої послідовності і навпаки.

40. Два трикутники задані координатами своїх вершин a, b, c. Обчислити площі трикутників, використовуючи формули Герона, і визначити, який з трикутників має більшу площу.

41. Чого більше: всіх можливих тризначних чисел, які записані цифрами 1, 2, 3, 4, 5; всіх двозначних чисел, які записані цифрами 2, 4, 6, 8; всіх чотиризначних чисел, які записані цифрами 1, 3, 7, 8, 9 ?

42.  Дано дійсні числа a, b, c. Обчислити A=MAX(a,a+b)+ MAX(a,b+c))/

/(1+MAX(a+bc,1)).

43.  Дано дійсні числа A, B. Обчислити MIN(u+v,3,14),                              де  u = MIN(a,b),  v = MIN(ab,a+b).

44. Дано ціле число K. Знайти його факторіал.

45. Дана матриця A (4´5). Впорядкувати всі стовпці за зростанням. (Оформити в вигляді процедури).

46. Дана матриця A (6´5). Впорядкувати всі рядки за зростанням. (Оформити в вигляді процедури).

47.  В тривимірному просторі дано чотири точки. Визначити найбільшу віддаль між ними.

48. Дано три вектори розмірністю 5. Визначити, який з них має найбільшу довжину.

49. Дано дві послідовності з 20 чисел. Визначити, в якій із них цифр більше.

50. Дано послідовність з 20 чисел. Визначити, яка з цифр зустрічається найбільш часто.

 

 

 

ЛАБОРАТОРНА РОБОТА №8

 

Тема. Обробка рядків.

Мета роботи. Вивчити структурований тип даних string, навчитися опрацьовувати дані рядкового типу, а також ефективно  використовувати їх для одержання і виведення різноманітного роду повідомлень.

 

Стислі теоретичні відомості і методичні вказівки.

 

Рядок – це послідовність символів кодової таблиці ПЕОМ. При використанні літерна константа заключається в апострофи. Максимально допустима довжина рядка – 255 байт (символів).

Змінну рядкового типу можна визначити через опис типу в розділі опису типів чи безпосередньо в розділі опису змінних. Визначення рядкового типу встановлює максимальну кількість символів, що може містити рядок.

Формат.

 

Type

  <iм'я типу>=string [ максимальна довжина рядка ];

Var

  <iдентифікатор,... >: <iм'я типу>;

Або

Var

  <iдентифікатор,... >: string [ максимальна довжина рядка ];

 

Максимальну довжину рядка можна не задавати, тоді вона автоматично приймається рівною  255.

 

Наприклад,

 

Type

  Adress=string [ 50 ];

Var

  a: Adress; { Довжина строкової змінної a дорівнює 50 байт }

  b: string; { Максимальна довжина не задана, отже

        довжина строковой змінної  b дорівнює 255 байт }

 

Для визначення пам'яті в байтах, необхідної для розміщення рядка, до значення її максимальної довжини добавляємо 1. Так, для розміщення в пам'яті змінних a і b вимагає відповідно 51 і 256 байт. Додатковий байт розташований в самому початку рядка (має нульовий номер) і містить значення поточної довжини рядка. Розглянемо структуру розміщення рядка в пам'яті на прикладі. Хай M – максимальна довжина рядка, L – поточна довжина, A - комірка пам'яті. Тоді:

A – містить величину поточної  довжини;

A+1 – перший символ;

  ...

A+L – останній значущий символ;

L+1…+A+M – незайняті комірки пам'яті.

 

До окремих символів рядка можна звернутися по номеру цього символу в рядку (як до елемента одномірного масиву). Наприклад, a [3], b [255]. Значення a (0), b (0) рівні поточній довжині змінних a і b.

Рядковий вислів – це вислів, в якому операндами служать рядкові дані і операції. Над рядковими даними допустимі наступні операції:

а) конкатенацiя (зчеплення), позначається знаком плюс (+). Наприк­лад, вислів “прізвище”, + “iм’я” рівноконстантне “прізвище, ім’я”;

б) операції відношення (<, >, =, <>, <=, >=); результат виконання кожної із них має тип boolean. При виконанні цих операцій треба пам'ятати наступне: рівняння рядків виконується зліва направо по кодах відповідних символів і той рядок вважається більшим, в якому перший символ, що не збігається, має більший код. Якщо при порівнянні рядків виявлено кінець одного із них, тоді коротший рядок вважається меншим.

Операція зчеплення має більш високий пріоритет, ніж операції відношення.

Для присвоєння рядковій змінній значення рядкового вислову використовується оператор присвоєння, наприклад,

 

  Str1: ='група студентів';

  Str2: =str1;

 

При виконанні оператора присвоєння можливі 3 випадки:

а) максимальні довжини змінних Str1 і Str2 (задані в розділі опису) співпадають; в цьому випадку попереднє значення змінної Str2 знищується, а нове стає рівним значенню змінної Str1;

б) максимальна довжина змінної Str1 менша максимальної довжини змінної Str2; в цьому випадку старе значення змінної Str2 також повністю стирається і замінюється значенням змінної Str1; поточна довжина змінної Str2 стає рівною поточній довжині змінної Str1;

в) максимальна довжина змінної Str1 більше максимальної довжини змінної Str2; в цьому випадку змінній Str2 буде присвоєно кількість символів значення Str1, рівне максимальній довжині змінної Str2, починаючи ліворуч; надлишкові символи відкидаються. Ми бачимо, що втрати значущих символів не станеться, якщо поточна довжина Str1 не перевищує максимальної довжини Str2.

Типи string і char суміснi між собою. Це означає, що в усіх тих місцях, де допустиме використання даних рядкового типу, допустиме звертання і до даних типу char, і навпаки.

Необхідно тільки слідкувати за тим, щоб при присвоєннi рядкового вислову змінній типу char довжина послідовності символів була рівна 1.

Обробка рядкових даних має певні відміни від обробки даних інших типів. Наприклад, рядок з одного боку може розглядатись як єдине ціле для деяких операцій (наприклад, операцій введення, виведення та ін.), а з іншого боку, рядок може бути опрацьований як одномiрний масив даних лiтерного типу.

Розглянемо процес введення даних рядкового типу із клавiатури. Особливість полягає в тому, що із клавiатури необхідно вводити стільки символів для кожної змінної рядкового типу, яка максимальна довжина цієї змінної була задана при її визначенні в розділі опису змінних.

 

Наприклад,

 

var

  st1, st2: string [ 10 ];

begin

.....

  read (st1, st2);

....

 

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

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

 

var

  str1, str2: string [ 10 ];

begin

...

  readln (st1);

  readln (st2);

...

 

В Паскалі існує ряд стандартних процедур і функцій, призначених для роботи із даними рядкових типів. Результат виконання функції присвоюється імені цієї функції і в пам'яті не зберігається; для збереження його необхідно виконати оператор присвоєння, в правій частині якого записується дана функція (аналогічно стандартним математичним функціям). Для виконання процедури треба записати тільки ім'я цієї процедури з списком необхідних параметрів.

 

1. Процедура видалення

 

Delete (st, m, n), де st – рядок, m – початкова позиція, n Кількість видаляємих символів (від початкової позиції включно).

Наприклад, запис Delete (st, 4, 3) означає, що в рядку st, починаючи із позиції 4, cлід усунути 3 символи. При цьому нова поточна довжина рядка st стане на 3 менша, ніж попередня.

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

 

2. Процедура вставки

 

Insert (St1, St2, I), де St1 – рядок, що вставляється, St2 – приймаючий рядок, I – позиція рядка St2, із якого починається вставка. Наприклад, запис Insert ('plain', st, 4) означає, що в рядок st треба вставити текст 'plain', починаючи із 4 позиції; при цьому символ в 4 позиції рядка st пересунеться на 5 символів праворуч.

Якщо значення I знаходиться поза відрізком 1... 255, виникне помилка виконання програми; якщо після вставки нова довжина рядка St2 перевищить її максимально допустиму довжину, значення St2 урізається до максимально допустимої довжини (виникає втрата самих правих символів). Якщо позиція вставки більше поточної довжини рядка, тоді буде мати місце проста конкатенація.

 

3. Процедура перетворення числового значення в рядкове

 

Str (I, st), де I – числове значення цілого чи дійсного типів, st – рядок, в який поміщається результат перетворення числа I.

Наприклад, якщо I = 5, тоді після виконання цієї процедури рядкова змінна st одержить значення '5'.

Після I може записуваватися формат (аналогічно форматам виведення). Якщо в форматі вказана недостатня для виводу кількість розрядів, місце виведення автоматично розширюєтьтся до потрібної довжини.

Наприклад, при I = 1500° після виконання процедури Str (I: 6, st) результат має вид: '1500'; при I = 4. 8e+03 після виконання процедури Str (I: 10, st) результат має вид: ' 4800'; при I = 768 після виконання процедури Str (–i: 2, st) результат має вид: '–768'. При завданні формату необхідно слідкувати, щоб його розмір не перевищував максимальної довжини рядка st, заданого при описі змінної st.

 

4. Процедура перетворення рядкового значення в числове

 

Val (st, I, Cod) – де st – рядок, I – зміна цілого або дійсного типу, в якій розміщується результат перетворення рядка st, Cod – цілочисельна змінна. Якщо під час операції перетворення помилки не виявлено, значення Cod рівно нулю; якщо помилка виявлена (наприклад, лiтерне значення перекладається в числове), Cod буде містити номер позиції першого помилкового символу, а значення I не визначено.

 

Приклади

Значення st

    Процедура

   Результат

'1450'

'14. 2e+02'

'14. 2fgh'

Val (st, I, Cod)

Val (st, I, Cod)

Val (st, I, Cod)?

1450, Cod=0

1420, Cod=0

Cod=5

 

 

5. Функція Length (St) – обчислює поточну довжину в символах рядка St. Результат має цілий тип. Наприклад, якщо St ='rte', тоді результатом функції Length (St) буде число 3.

 

6. Функція Copy (St, Poz, N) - виділяє із St підрядок довжиною N символів, починаючи із позиції Poz. Змінні Poz і N мають цілочисельний тип. Якщо Poz>length (St), тоді результатом буде пропуск; якщо Poz>255, виникає помилка при виконанні.

Приклади

Значення St            Функція              Результат

'abcdefg'              Copy (St, 2, 3)            'bcd'

'abcdefg'              Copy (St, 4, 10)         'defg'

 

7. Функція Pos (St1, St2) – виявляє першу появу в рядку St2 підрядка St1. Результат має цілий тип і рівний номеру тієї позиції в рядку St2, де знаходиться перший символ підрядка St1. Якщо в St2 підрядок St1 не знайдений, то результат рівний 0. Наприклад, якщо St ='abcdef', тоді результатом функції Pos ('de', st) є число 4, а результат функції Pos ('r', St) є число 0.

 

8. Функція Concat (St1, St2,..., Stn) – виконує зчеплення рядків St1, St2, ..., Stn в тому порядку, в якому вони вказані в списку. Cума символів всіх зчеплених рядків не повинна перевищувати 255. Наприклад, результатом функції Concat ('aa', 'xx', 'y') є літерна  величина 'aaxxy'.

 

9. Функція Upcase (Ch) – перетворює малу літеру латинського алфавіту в велику. Параметр і результат мають тип Char. Наприклад, результатом функції Upcase ('a') є символ 'a'.

 

Приклад 7.1

Задано текст, слова якого поділені пропуском. Виділити і надрукувати всі слова тексту, кожне із нового рядка.

Розв’язування. Введемо рядкову змінну st, оголосивши її довжину за максимумом (255 байт). В цій змінній будемо вводити заданий рядок. Введемо також рядкову змінну w, в яку будемо заносити чергове слово рядка st, і цілочисельну змінну p для позначення позиції чергового пропуску.

Блок-схема алгоритму представлена на рис. 7.1.

 

Програма 7.1

 

uses crt;

var

  st: string;

  w: string;

  p: integer;

begin

  writeln ('введiть текст, розділяючи слова пропуском: ');

  readln (st);

  writeln ('заданий текст: ');

  writeln (st);

  p: =pos (' ', st); { Знаходження позиції 1-го пропуску }

  writeln;

  writeln ('в текст входять слова: ');

  while p>0 do

    begin w: =copy (st, 1, p-1); { Виділення слова }

       delete (st, 1, p); { Видалення цього слова із тексту разом з пропуском }  writeln (w);                      { Друк   виділеного слова }

 p: =pos (' ', st)        { Знаходження позиції чергового

                            пропуску }

 end; writeln (st)        { Друк останнього слова }

 end.

 

Результати роботи програми:

Заданий текст: це програма обробки рядків на Pascal.

В текст входять слова:

це

програма

обробки

рядків

на

Паскалі

 

Питання для самоперевірки

 

1.    Що таке рядок на Pascal?

2.    Як задається рядковий тип  даних?

3.    Яка максимально допустима довжина рядка? Чи можна задати довжину рядка меншою максимально допустимого? Якщо можна, тоді як?

4.    Як можна звернутися до окремих символів рядка?

5.    Як визначити поточну довжину рядка, не використовуючи відповідну функцію?

6.    Що таке рядковий вислів? Чи допускається в рядковому вислові змішування операндів рядкового і лiтерного типів?

7.    Перерахувати операції, допустимі над рядковими даними.

8.    Які стандартні функції процедури використовуються для обробки рядкових даних?

9.    Чи можна рядкові дані застосовувати у вигляді <виразу> в  операторі case?

 

Завдання до роботи

 

1.    Ввести свої прізвище, ім’я та по батькові. Визначити які букви зустрічаються частіше – голосні чи приголосні?

2.    Ввести свої прізвище, ім’я та по батькові. Ім’я та по батькові замінити на ініціали.

3.    В заданому рядку визначити слова, взяті в дужки, і видалити їх.

4.    В заданому рядку визначити саме довше слово і надрукувати його.

5.    В заданому рядку визначити кількість слів, які закінчуються на задану букву.

6.    В заданому рядку визначити саме коротше слово і надрукувати його.

7.    В заданому рядку для кожного слова вказати його довжину.

8.    В заданому рядку визначити кількість слів (слова можуть розділятися одним або кількома пропусками).

9.    В заданому рядку визначити, скільки раз зустрічається задане слово.

10.                      В заданому рядку слова розділені пропуском. Замінити всі пропуски комою і пропуском.

11.                      В заданому рядку визначити кількість подвійних приголосних.

12.                      В заданому рядку визначити кількість слів, в яких задана буква зустрічається більше одного разу.

13.                      В заданому рядку всі слова розділені декількома пропусками. Видалити всі лишні пропуски.

14.                      В заданому рядку кожне слово замінити кількістю букв в цьому слові.

15.                      В заданому рядку видалити всі пропуски.

16.                      В заданому рядку, слова якого розділені або пропусками, або комами, визначити кількість слів.

17.                      В заданому рядку замінити всі великі букви на мaленькі і навпаки.

18.                      Надрукувати всі слова взяті в лапки.

19.                       В заданому рядку слова розділені пропуском. Надрукувати саме довше слово.

20.                      В заданому рядку визначити, чи є він ідентифікатором.

21.                      В заданому рядку визначити, чи є він шістнадцятиричним числом.

22.                      Надрукувати таблицю множення в шістнадцятиричній системі числення.

23.                      В заданому рядку слова розділені пропуском. Надрукувати всі слова, які містять в собі задану послідовність символів.

24.                      В заданому рядку слова розділені пропуском. Замінити в кожному слові першу букву на велику.

25.                      В заданому рядку слова розділені пропуском. Визначити, чи є в ній слова, які співпадають з останнім словом.

26.                      В заданому рядку слова розділені пропуском. Замінити групу пропусків одним.

27.                      В заданому рядку, який представляє собою вираз, який містить в собі тільки числа і знаки "+" і "-", обчислити значення виразу.

28.                      В заданому рядку надрукувати всі числа, які містяться в рядку.

29.                      В заданому тексті видалити частину тексту, взяту в квадратні дужки.

30.                      Визначити, скільки слів в тексті починаються на букву А. Слова розділені комами.

31.                      Визначити, скільки разів в тексті зустрічається буква К.

32.                      В заданому тексті замінити слово S1 на S2.

33.                      Визначити в тексті і надрукувати саме коротке слово.

34.                      Визначити, скільки слів в тексті закінчується подвійною приголосною.

35.                      Яка буква в заданому тексті зустрічається частіше – А чи В?

36.                      Визначити, чи є заданий текст правильним записом цілого числа.

37.                      З заданого тексту видалити всі цифри.

38.                      В заданому тексті визначити кількість слів, які закінчуються на букву А.

39.                      В заданому тексті визначити кількість слів, які починаються  і закінчуються однією і тією ж буквою.

40.                      В заданому тексті визначити кількість слів, які містять рівно три літери Е.

41.                      Підрахувати, скільки разів в тексті зустрічається задане слово (слова розділені пропуском).

42.                      Текст заданий наступним чином: перший символ – цифра, яка вказує на довжину першого слова, за першим словом – знову цифра, яка вказує довжину другого слова (довжина кожного слова 9) і т.д. Виписати К-е слово з тексту (значення К задавати в вхідній змінній).

43.                      З заданого тексту видалити всі лишні пропуски.

44.                      Провірити, чи входить в заданий текст кожна з букв слова KEY.

45.                      Перевірити, чи входить в заданий текст літера А. Надрукувати літеру тексту, яка іде зразу за першою літерою А (якщо літера А не є останньою в тексті).

46.                      В заданому тексті видалити всі букви В, які стоять зразу після букви С.

47.                      Перевірити, чи є значеннями символьних змінних С2, С1, С0 цифри. Якщо да, то присвоїти числовій змінній К число, складене з цих цифр.

48.                      Задано ціле число. Записати це число словами.

49.                      Визначити, яка з літер найбільше зустрічається в заданому тексті.

50.                      Визначити, чи є в заданому тексті слова, які читаються однаково з обох сторін.

 

Рис. 9.1

 

 

ЛАБОРАТОРНА РОБОТА №9

 

Тема. Обробка файлів.

Мета роботи. Навчитися працювати з файлами даних, обмінюватися даними із зовнішніми пристроями, а також оброблювати дані комбінованого типу.

 

Стислі теоретичні відомості і методичні вказівки

                                                                           

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

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

 

1. Визначення типу файла

 

Визначення типу починається зарезервованим словом FILE OF, після якого задається тип компонентів файла, а за ним іде ідентифікатор визначеного типу файлів.

            Наприклад:

TYPE

PRODUKTNAME = STRING [80];

PRODUKT = FILE OF RECORD

NAME: PRODUCNAME;

ITEMNUBER: REAL;

MINSTOCK: REAL;

SUPPLIER: INTEGER;

END;

VAR

PRODUCFILE: PRODUCT

PRODUCTNAMES: FILE OF PRODUCTNAMES;

Типом компонентів файла може бути любий тип, крім типу файла. Змінні типу файла не можна використовувати ні в операторах присвоєння, ні в виразах.

 

2. Операції над файлами

 

Ідентифікатор FILVAR використовується в подальшому для позначення ідентифікатора змінного типу файлів, описаних раніше.

ОПЕРАЦІЯ REWRITE (створення нового файла)

 

Синтаксис: REWRITE (FILVAR);

При виконанні цієї процедури створюється новий файл на диску з ім’ям, присвоєним змінною типу файла (FILVAR). Новий файл підготовлюється до обробки. Любий існуючий файл з таким самим ім’ям стирається. Дисковий файл, що створюється за допомогою процедури REWRITE спочатку є порожнім і не має ні одної компоненти.

 

ОПЕРАЦІЯ RESET (встановлювання файла в початкове положення)

 

Синтаксис: RESET (FILVAR);

При виконанні цієї операції дисковий файл з ім’ям, присвоєним файловою змінною FILVAR, підготовлюється до обробки і показник файла встановлюється на початок файла (компонента з номером 0). FILVAR повинна задавати існуючий файл, інакше виникне помилка введення/виведення.

 

ОПЕРАЦІЯ READ (читання з файла)

 

Синтаксис: READ (FILVAR,VAR);

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

 

ОПЕРАЦІЯ WRITE (записування в файл)

 

Синтаксис: WRITE (FILVAR, VAR);

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

 

3. Стандартні функції для обробки файлів

 

В мові Pascal реалізовані наступні стандартні функції, призначені для обробки файлів:

 

ФУНКЦІЯ EOF

 

Синтаксис: EOF (FILVAR);

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

4. Текстові файли

 

На відміну від інших типових файлів, текстові файли – це не просто послідовність величин визначеного типу. Хоч основними елементами текстового файла є символи, вони організовані в лінії, і в кінці кожного рядка стоїть маркер кінця рядка. В кінці тектового файла ставиться маркер кінця рядка (CTRL-Z). Текстові файли можна оброблювати тільки послідовно. Більш того введення і виведення файла неможна проводити одночасно.

 

ОПЕРАЦІЇ НАД ТЕКСТОВИМИ ФАЙЛАМИ 

 

REWRITE – використовується для створення нового файла.

RESET – відкриває вже існуючий файл.

READ – читання символів в текстовому файлі.

WRITE – запис символів в текстовому файлі.

 

            Рядки в текстовому файлі оброблюються за допомогою спеціальних операцій над текстовими файлами:

 

Синтаксис READLN (FILVAR);

            Виконується перехід на початок наступного рядка.

 

            Синтаксис WRITELN (FILVAR);

            Записується маркер кінця рядка.

           

            Синтаксис EOLN (FILVAR);

            Логічна функція, результат якої рівний TRUE якщо показник файла стоїть на символі СR маркера рядка CR/LF. Якщо результат операції FOR(FILVAR) рівний TRUE, то результат EOLN(FILVAR)  також приймає значення TRUE.

 

Варіанти завдань

 

1.     Сформувати файл, що містить прізвища, стать, рік народження та групу крові N донорів. Використовуючи сформований файл, надрукувати прізвища донорів жіночої статі, що мають 4-ту групу крові.

2.     Сформувати файл, що містить прізвища, стать, групу крові та резус-фактори N донорів. Використовуючи сформований файл, надрукувати прізвища донорів, що мають першу групу крові та резус-фактор «–».

3.     Сформувати файл, що містить дані про N книг з програмування Вашої особистої бібліотеки (прізвище автора та його ініціали, назва книги, назва видавництва). Використовуючи сформований файл, надрукувати прізвища авторів та назви книг видавництва «Наука».

4.     Сформувати файл, що містить дані про N книг по ЕОМ Вашої особистої бібліотеки (прізвище автора та його ініціали, назва книги, назва видавництва). Використовуючи сформований файл, надрукувати прізвища авторів та назв книг, що видані не пізніше 1988 р.

5.     Сформувати файл, що містить інформацію про N побутових магнітофонів (марка, де виробляється, ціна). Використовуючи сформований файл, надрукувати інформацію про магнітофони, що зроблено в Україні і з ціною у заданих межах (межі вибираються самостійно).

6.     Сформувати файл, що містить інформацію про N поїздів, що відправляються з вокзалу станції м. Хмельницький (номер поїзду, станція призначення, час відправлення, час в дорозі). Використовуючи сформований файл, надрукувати інформацію про поїзди, що відправляються не пізніше          21 години.

7.      Сформувати файл, що містить інформацію про N поїздів, що відправляються з вокзалу станції м. Хмельницький (номер поїзду, станція призначення, час відправлення, час прибуття). Використовуючи сформований файл, надрукувати інформацію про поїзди, час в дорозі яких не перевищує 17 годин.

8.     Сформувати файл, що містить інформацію про N телевізорів (марка телевізора, його ціна, де випускається). Використовуючи сформований файл, надрукувати інформацію про найдешевший телевізор.

9.     Сформувати файл, що містить прізвища N студентів та оцінки кожного студента за результатами 5 іспитів. Використовуючи сформований файл, надрукувати прізвища студентів, що мають найвищий бал.

10.   Сформувати файл, що містить прізвища N студентів та оцінки кожного студента за результатами 5 іспитів. Використовуючи сформований файл, надрукувати прізвища студентів, що здали всі іспити з оцінками «5».

11.   Сформувати файл-протокол лижних гонок, що містить прізвища N учасників, час старту, час фінішу для кожного учасника (години, хвилини, секунди). Використовуючи сформований файл, надрукувати прізвище учасника, що посів перше місце.

12.   Сформувати файл за результатами здачі сесії N студентами (5 іс­питів). Інформація про кожного студента вводиться в одну літерну змінну у літерному вигляді в наступному порядку: прізвище*M1*M2*M3*M4*M5, де Mі (і=1, 2, 3, 4, 5) – оцінки. Використовуючи сформований файл, результати сесії роздрукувати у вигляді таблиці.

13.   Сформувати файл-довідник, що містить прізвища N співробітників відділу та номери їх домашніх телефонів (інформація про кожного співробітника вводиться в одну літерну змінну в літерному вигляді у наступному порядку: прізвище – п’ятизначне число, що визначає номер телефону, наприклад, Петров-66803). Використовуючи сформований файл, роздрукувати номер телефону даного співробітника (пошук номера телефону за прізвищем) у звичайному вигляді (наприклад, 6-68-03).

14.   Сформувати файл, що містить інформацію про N студентів (прізвище, стать, рік народження, місяць народження). Використовуючи сформований файл, надрукувати прізвища студентів, що народилися влітку.

15.   Сформувати файл, що містить інформацію про N студентів (прізвище, стать, рік народження). Використовуючи сформований файл, надрукувати прізвища студентів жіночої статі з вказанням віку.

16.   Сформувати файл, що містить прізвища N студентів групи (у довільному порядку). Використовуючи сформований файл, надрукувати прізвища студентів у алфавітному порядку.

17.   Сформувати файл, що містить інформацію про дати народження N Ваших друзів (інформація про одного друга вводиться в одну літерну змінну у наступному порядку: прізвище- ДД.ММ.РРРР, наприклад, Сидоров-7.03.1980). Використовуючи сформований файл, надрукувати прізвища друзів, що народилися восени.

18.   Сформувати файл, що містить інформацію про N людей, що мають автомобілі (прізвище, марка автомобіля, колір). Використовуючи сформований файл, надрукувати прізвища тих із них, хто має «Ладу» червоного кольору.

19.   Сформувати файл, що містить інформацію про N людей, що мають автомобілі (прізвище, марка автомобіля, його номер. Номер записується повністю, наприклад, В34-61ХМ). Використовуючи сформований файл, надрукувати прізвища тих із них, чий номер містить цифри 72-15 (якщо таких немає – вивести відповідне повідомлення).

20.   Сформувати файл, що містить інформацію про N магазинів Вашого міста: назва магазину (універмаг, продукти і т. д.), його номер та адреса (вулиця). Використовуючи сформований файл, надрукувати інформацію про тих з них, що знаходяться на вулиці Кам’янецькій.

21.   Сформувати файл, що містить інформацію про всі технікуми Вашого міста: назва, адреса (інформація про кожного співробітника вводиться в одну літерну змінну в літерному вигляді у наступному порядку: назва вулиці, номер дома, наприклад, комерційний, Кам’янецька, 114). Використовуючи сформований файл, визначити, чи є у Вашому місті медичний технікум, та, якщо є, надрукувати його адресу у звичайному вигляді (наприклад, вул. Кам’янецька, 114).

22.   Сформувати файл, що містить інформацію про N магазинів Вашого міста: назва магазину (універмаг, продукти і т. д.), його номер та адреса (вулиця). Використовуючи сформований файл, надрукувати інформацію про всі магазини

23.   Сформувати файл, що містить інформацію про N співробітників відділу: прізвище, ім’я, по батькові, посада (інженер, бухгалтер, програміст і т. д.), оклад. Використовуючи сформований файл, підрахувати, скільки програмістів у відділі, надрукувати їх прізвища, ім’я, по батькові, оклад.

24.   Сформувати файл, що містить інформацію про N співробітників відділу: прізвище, ім’я, по батькові, посада, оклад. Використовуючи сформований файл, надрукувати прізвища, ім’я, по батькові, посади співробітників, що мають найменший оклад.

25.   Сформувати файл, що містить інформацію про N співробітників відділу: прізвище, ім’я, по батькові, посада, оклад. Використовуючи сформований файл, визначити та надрукувати середній оклад по відділу, а також інформацію про співробітника, що має оклад, найближчий до середнього.

26.   Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, результати сесії (4 предмети)). Використовуючи сформований файл, визначити та надрукувати прізвища студентів І-го курсу, що отримують стипендію.

27.   Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, результати сесії (4 предмети)). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що здали сесію без трійок (оцінки вказати).

28.   Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, результати сесії (4 предмети). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що здали сесію з однією трійкою.

29.   Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, результати сесії (4 предмети)). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що здали сесію на відмінно (вказати курс і групу).

30.  Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, адреса, телефон). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що живуть у гуртожитку.

31.  Сформувати файл, що містить інформацію про N студентів (факультет, адреса, телефон). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що мають телефон. Вказати номер.

32.  Сформувати файл, що містить інформацію про N студентів (факультет, адреса, телефон). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що живуть на заданій вулиці.

33.  Сформувати файл, що містить інформацію про N студентів (факультет, дата народження). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що народилися до заданої дати (вказати дату народження).

34.  Сформувати файл, що містить інформацію про N студентів (факультет, стать, курс, група). Використовуючи сформований файл, визначити та надрукувати прізвища студентів чоловічої статі (вказати курс і групу).

35.  Сформувати файл, що містить інформацію про N студентів (факультет, дата народження). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що народились у заданому році.

36.  Сформувати файл, що містить інформацію про N студентів (факультет, дата народження). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що народились під знаком Рака (22.06-21.07).

37.  Сформувати файл, що містить інформацію про N студентів (факультет, дата народження). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що народились взимку.

38.  Сформувати файл, що містить інформацію про N студентів (факультет, стать, курс, група). Використовуючи сформований файл, визначити та надрукувати прізвища студентів жіночої статі з вказанням курсу і групи.

39.  Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, адреса, телефон). Використовуючи сформований файл, визначити та надрукувати прізвища студентів, що не мають телефону (вказати адресу).

40.  Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, результати сесії (4 предмети). Використовуючи сформований файл, визначити та надрукувати середній бал по кожному іспиту.

41.  Сформувати файл, що містить інформацію про N студентів (факультет, стать, курс, група). Впорядкувати інформацію та вивести її у алфавітному порядку по прізвищам з вказанням курсу та групи.

42.  Сформувати файл, що містить інформацію про N студентів (факультет, адреса, телефон). Впорядкувати інформацію та вивести її у алфавітному порядку за адресами з вказанням прізвища та адреси.

43.  Сформувати файл, що містить інформацію про N студентів (факультет, дата народження). Впорядкувати інформацію та вивести її у порядку старшинства за віком з вказанням прізвища та дати народження.

44.  Сформувати файл, що містить інформацію про N студентів (факультет, адреса, телефон). Впорядкувати інформацію та вивести її у порядку зростання номерів телефону з вказанням номера телефону та прізвища.

45.  Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, результати сесії (4 предмети). Впорядкувати інформацію та вивести її за успішністю по всіх предметах з вказанням середнього бала за екзаменаційними оцінками.

46.  Сформувати файл, що містить інформацію про N студентів (факультет, дата народження, стать, адреса, телефон, курс, група, результати сесії (4 предмети). Впорядкувати інформацію та вивести її по курсах з вказанням курсу та прізвищ студентів даного курсу.

47.   Сформувати файл, що містить інформацію про N студентів (факультет, дата народження). Впорядкувати інформацію та вивести її за днями народження в даному місяці з вказанням дати.

48.   Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, результати сесії (4 предмети). Впорядкувати інформацію та вивести її за успішністю для кожного курсу з вказанням екзаменаційних оцінок.

49.   Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, результати сесії (4 предмети). Впорядкувати інформацію та вивести її за кількістю зданих на «відмінно» іспитів для кожної групи.

50.   Сформувати файл, що містить інформацію про N студентів (факультет, курс, група, результати сесії (4 предмети). Впорядкувати інформацію та вивести її за кількістю зданих на «відмінно» іспитів для кожного курсу.

 

 

ЛАБОРАТОРНА РОБОТА №10

 

Тема. Динамічні змінні

Мета роботи. Ознайомитися з поняттям динамічних змінних, вивчити засоби опису динамічних змінних, а також дії над ними; навчитися застосовувати одержані знання при рішенні завдань із використанням динамічних змінних.

 

Стислі теоретичні відомості і методичні вказівки

 

В багатьох задачах неможливо передбачити розмір памяті, яку будуть займати змінні в момент написання програми. Тоді змінні формують динамічно, не зв’язуючи зі структурою програми. Оскільки засобів для явного опису таких змінних не існує, то звертатися до них по імені неможливо. Замість цього до таких змінних звертаються за допомогою так званих посилочних змінних (покажчиків), що утворюються при формуванні динамічних змінних. На схемі вказується, що «посилочний тип – це необмежена множина значень, вказуючих на елементи деякого одного типу. Для посилань не існує ніяких операцій крім порівняння на рівність».

Приклад однонаправленого зв’язного списку приведений нижче:

 

 

Покажчик вказує на наступний елемент. Всі елементи списку мають однаковий формат. Верхнє поле кожного елемента використовується для вказування наступного елемента. Якщо елемент не має наступного елемента, то покажчику присвоюється значення NIL.

Опис типу «покажчик» має вид:

^<Ідентифікатор типу>

 

Приклад:

type

   Link=^object;

var

   P:Link;

Змінна Р є покажчиком на дані типу object покажчик – це адреса, а вказівна змінна – це те, що знаходиться за адресою.

Приклад:

Описати динамічну структуру даних, яка є однонаправленим списком. Кожний елемент структури має два поля. Перше поле відводиться під дійсне число, а друге – містить адресу наступного елемента динамічної структури.

 

Type

     Point=^Data;

     Data=Record;

          R:real:

          Next:Point

     end;

var

     A:Point;

A – ідентифікатор, який має тип покажчика. Спочатку значення А невизначене, тому що  описана структура даних не створена і покажчик не вказує адрес початкового елемента динамічної структури. Щоб створити таку структуру в Pascal, передбачена процедура NEW(A). Ця процедура створює перший елемент динамічної структури і поміщає адресу цієї структури у покажчик. Пам’ять для розміщення елементів береться поза програмою. Цю пам’ять прийнято назвати «КУЧЕЮ». В зв’язку з введенням в Pascal типу даних «покажчик» в стандарті мови передбачена передбачувальна константа з ім’ям NIL. NIL – це покажчик, який ні на що не вказує.

В Pascal є процедура DISPOSE, форма запису якої має вид:

DISPOSE (Ідентифікатор);

За допомогою цієї процедури звільнюється пам’ять, заповнена структурами даних, на які вказується посилання. Звільнена пам’ять переходить в секцію «КУЧА».

Приклад:

var

     Q:^t;

begin

     ...

     ...

     New(Q);

     ...

     ...

     Dispose(Q);

     ...

 

Приклад:

type

     D1:^data1;

     D2:^data2;

var

     E1:D1;

     E2:D2;

Наступні нижче оператори присвоєння заборонені в Pascal тому, що  Е1 і Е2 покажчики різних типів даних:

            Е1:=Е2;

або

            Е2:=Е1;

Після виконання першого оператора присвоєння маємо, що посилання на об’єкт типу data1 буде посиланням на об’єкт типу data2 і навпаки, що в Pascal заборонено.

Приклад:

Маємо файл цілих додатних чисел, складений з деяких послідовностей чисел, кожне із яких обмежується цілим від’ємним числом.

1. Вивести у вихідний файл ці послідовності чисел, але в середині кожної послідовності числа повинні іти в оберненому порядку.

Вхідний файл: 1 3 7 -1 2 0 6 7 -1

Вихідний файл: 7 3 1 -1 7 6 0 2 -1

Довжина цих послідовностей невизначена, тому змінні, в яких будуть поміщатися ці числа, повинні мати динамічну структуру.

Program Lists (Inp,Out);

type

     Pointer=^DataSet;

     DataSrt=record;

          Data:integer;

          Point:pointer;

     end;

var

     R1,R2:pointer;

     I:integer;

     Inp,Out:file of integer;

begin

     Reset(inp);Rewrite(out);

     while not Eof(inp) do

     begin

          R1:=Nil;

          Read(inp,I0;

     while I<>-1 do

begin

          New(r2);

R2^.data:=I;

R2^.point:=R1;

R1:=R2;

Read(inp,I);

end;

R2:=R1;

while R2<>Nil do begin

     write (Out,R2^.data);

     R2:=R2^.point

end;

Write (Out,’-1’);

end;

end.    

Приклад:

Знайти максимальний елемент масиву

Type Mas=array[1..10] of real;

Var M:^Mas;

Begin

 New(M);

 For j:=1 to 10 do readln(M^[j]);

 MAX:=M^[1];

 For j:= 2 to 10 do

 If M^[j]>MAX then MAX:=M^[j];

 Writeln(‘MAX=’,MAX);

 Dispose(M);

End.

 

Варіанти завдань

 

1.    Зчитати з клавіатури “n” цілих чисел та вивести їх у зворотному порядку.

2.    Задано дві квадратні матриці порядку n та m. Надрукувати ту з них, у якої менший слід.

3.    Визначити, чи є дана матриця магічним квадратом.

4.    Дана квадратна матриця. Надрукувати індекси її сідлових точок (ті, які одночасно є найбільшим елементом рядка та найменшим елементом стовпця чи навпаки).

5.    Дана дійсна матриця. Впорядкувати її рядки за зростанням перших її елементів.

6.    Дана послідовність чисел. Визначити кількість інверсій у цій послідовності.

7.    Дано текст із цифр. Надрукувати всі літери, які входять до тексту, і поряд – кількість їх входжень до тексту.

8.    Дано текст із рядкових латинських літер, що закінчуються крапкою. Надрукувати всі літери, які входять в текст по одному разу.

9.    Дана послідовність слів, що розділені пропуском, за останнім –словом крапка. Надрукувати ці слова за алфавітом.

10.Дана послідовність, що містить не менше 2 слів, в кожному з яких не менше 2 літер. Надрукувати всі слова, крім останнього, попередньо помінявши першу та останню літери.

11.Перетворити масив, повернувши його на 90° проти годинникової стрілки.

12.Дано 2 матриці. Перетворити їх так, щоб в першій були елементи рівні скалярному добутку матриць, а в іншій – частки від їх ділення.

13.Дана квадратна матриця. Перетворити її так, щоб вона була скалярним добутком на матрицю, що отримується з даної поворотом на 90°.

14.Дано дві квадратні матриці. Визначити, чи можливо отримати одну з них відбиттям головної діагоналі іншою.

15.Описати процедуру, яка б з непорожнього списку L видаляла останній елемент.

16.Описати процедуру, яка б вставляла до списку L новий елемент Е1 перед першим входженням елемента Е, якщо він входить.

17.     Описати функцію, значенням якої є список, побудований з  елементів файла f.

18.     У вхідному файлі заданий текст, після якого – крапка. Роздруку­вати цей текст в оберненому порядку.

19.     Дано текст, який закінчується крапкою. В літерах цього тексту особливу роль грає знак #, з’явлення якого в тексті означає відміну літери, яка йде перед цим знаком. Надрукувати виправлений текст.

20.     Надрукувати всі елементи списку, які находяться між двома однаковими елементами списку.

21.     Дана черга. Перемістити, якщо потрібно, до її лівого краю і доповнити до кінця елементами, введеними користувачем.

22.     Написати програму, що перевіряє впорядкованість елементів даного списку за алфавітом.

23.     Написати програму, яка визначає, скільки елементів списку L1 входить в L2.

24.     Написати програму, яка видаляє із списку L2 перше входження елементів списку L1.

25.     Продивляючись один раз файл f, надрукувати елементи файла так: спочатку всі числа <а, потім числа з [a,b] і потім решта, зберігаючи початковий порядок.

26.     Написати функцію, яка б визначала число входжень елемента Е в дерево Т.

27.     Написати процедуру, яка б друкувала всі елементи дерева Т за рівнями: спочатку з кореня дерева, потім з вершин, дочірніх по відношенню до кореня і т.д.

28.     Написати функцію, яка б визначала максимальну глибину непорожнього дерева (число віток в самому довгому із шляхів).

29.     Перевірити, чи однакові списки L1 и L2; якщо вони не однакові, то добавити в кінець списку L1 список L2.

30.     В текстовому файлі f записана без помилок формула, де М означає функцію max, а m-функцію min. Вирахувати, яке ціле число значення цієї формули.

 

ОСНОВНІ ПОВіДОМЛЕННЯ ПРО ПОМИЛКИ

 

Номери помилок компілятор видає інші, тут вказано українською мовою переклад основних повідомлень.

 

1. ";" expected     (Потрiбно вказати";").

2. ":" expected     (Потрiбно вказати":").

3. "," expected     (Потрiбно вказати",").

4. "(" expected     (Потрiбно вказати"(").

5. ")" expected     (Потрiбно вказати")").

6. "=" expected     (Потрiбно вказати"=").

7. ":=" expected     (Потрiбно вказати":=").

8. "[" or "(." expected (Потрiбно вказати"[" або"(.").

9. "]" or ".)" expected (Потрiбно вказати"]" або".)").

10."." expected     (Потрiбно вказати".").

11.".." expected     (Потрiбно вказати"..").

12. Identifier expected (Не вказаний ідентифiкатор).

13. Unknown identifier  (Невiдомий iдентифiкатор).

Цей iдентифiкатор не був описаний в розділі описів.

14. Dublicate identifier  (Повторення iдентифiкатора в розділі описів).

15. Variable identifier expected  (Потрiбен iдентифiкатор змiнної).

Iдентифiкатор не описує змiнну, як це потрібно.

16. Type identifier expected (Потрiбен iдентифiкатор типу).

Не вказаний тип iдентифiкатора, як це потрібно.

17. Type identifier expected (Потрiбен iдентифiкатор).

Даний iдентифiкатор не позначає тип, як це потрібно.

18. Sintax error (Синтаксична помилка).

19. Error in real constant (Помилка в дійсній константі).

20. Error in integer constant (Помилка в цілочисельній константі).

Врахуйте, що після цілого дійсного числа, що перевищує діапазон подання цілих чисел, повинні ставитися крапка і нуль, наприклад, 12345678912.0.

21. Error in expression (Помилка в виразі).

Даний символ не може брати участь в виразі вказаним чином. Можливо, Ви забули вказати операцію між двома операндами.

22. Error in statement  (Помилка в операторі).

Даний символ не може бути першим символом в операторі.

23. Error in type    (Помилка в визначенні типу).

Визначення типу не може починатися з цього символу.

24. Type mismath     (Несумісність типів).

Це може трапитись з наступних пpичин:

 - несумiснi типи фоpмального і фактичного паpаметpа в звертанні до пpоцедуpи або функціі;

 - тип виpазу є несумiсним з типом індексу пpи індексуванні масиву;

 - несумiснi типи опеpандів в виpазі.

25. Invalid subrange base type (Невірний базовий тип обмеженого типу).

26. Ordinal type expected (Потрiбен поpядковий тип).

Типи real, string, стpуктуpні і вказівні типи тут недопустимі.

27. Structure too large  (Дуже велика стpуктуpа).

Максимально допустимий pозміp стpуктуpного типу – 65520 байт.

28. Set base type of range (Базовий тип множини порушує кордони).

29. Operand types do not match operator (Типи опеpандів не відповідають опеpаціі).

Дана опеpація не може бути застосована до опеpандів даного типу, напpиклад, 'A' поділити на '2'.

30. Cannot read or write variables of this type (Немає можливості зчитувати або записати змінні даного типу):

 - пpоцедуpи read і readln можуть зчитувати дані цілого, дiйсного, літеpного і рядкового типів (а також обмеженого на базі цих типів);

 - пpоцедуpи write і writeln можуть виводити дані цілого, дійсного, літеpного, логічного та рядкового типів (а також обмеженого на базі цих типів).

31. Constant expected   (Потрiбна константа)

32. Integer or real constant expected (Потрiбна ціла або дiйсна константа).

33. Integer constant expected  (Потрiбна ціла константа).

34. String constant expected (Потрiбна константа рядкового типу).

35. Integer or real variable expected   (Потрiбна змiнна типу integer або real).

36. Ordinal variable expected  (Потрiбна змiнна пеpераховуємого типу).

37. Integer variable expected  (Потрiбна змiнна цілого типу).

38. String variable expected (Потрiбна змiнна рядкового типу).

39. Integer expression expected (Потрiбен виpаз типу integer).

40. Ordinal expression expected (Потрiбен виpаз пеpераховуємого типу).

41. Boolean expression expected (Потрiбен виpаз типу boolean).

42. Integer or real expression expected  (Потрiбен виpаз типу real або integer).

43. Character expression expected  (Потрiбен виpаз типу char).

44. String expression expected   (Потрiбен виpаз рядкового типу).

45. Invalid floating-point operation  (Недопустима опеpація з плаваючою комою):

  - пpи опеpації з двома дiйсними значеннями було отримано пеpеповнення або ділення на 0;

  - дiйсне значення, що пеpедається функціями trunc або round, не може бути пеpетворене в ціле число, яке знаходиться всередині діапазону типу longint (від -2147483648 до  2147483647);

  - аpгумент, що пеpедається функцією sqrt, від’ємний;

  - аpгумент, що пеpедається функцією ln, від’ємний  або pівний 0.

46. Unknown command   (Невідома команда).

47. CRC error in data  (Помилка в вхідних даних).

48. Floating point overflow (Пеpеповнення пpи опеpації з плаваючою комою).

49. Floating point underflow (Зникнення поpядку пpи опеpації з плаваючою комою).

За умовчанням зникнення поpядку пpизводить до повеpнення pезультату, pівного 0.

50. Invalid format specifier (Невіpний специфікатоp фоpмату).

Використовується невіpний специфікатоp фоpмату або числовий аpгумент специфікатоpа фоpмату виходить за допустимі кордони.

51. Case conctant out of range  (Константа опеpатоpа case поpушує допустимі кордони).

Цілочисельна константа опеpатоpа case повинна знаходитись в діапазоні від – 32768 до 32767.

52. Invalid for control variable (Невірна керуюча змінна опеpатоpа for).

Керуюча змiнна опеpатоpа for повинна бути змiнною пеpераховуючого типу, визначеного в pозділі описів.

53. Do expected   (Потрiбен do).

54. Of expected   (Потрiбен of).

55. Then expected  (Потрiбен then).

56. To or downto expected (Потрiбен to або downto).

57. Begin expected     (Потрiбен begin).

58. End expected      (Потрiбен end).

59. Divizion by zero    ілення на 0).

60. Constant out of range (Константа поpушує кордони):

 - Ви намагаєтесь вказати масив з індексом, поpушуючим кордони;

 - Ви намагаєтесь пpисвоїти константу змiнній поза діапазоном  значень змiнної.

61. Constant end case types do not match (Типи констант (міток) і тип виpазу опеpатоpу case не відповідають один одному.

62. Line too long  (Дуже довгий рядок).

Максимальна довжина рядка – 255 символів.

63. String constant exceeds line (Рядкова константа пеpевищує допустимий pозміp рядка).    

Мабуть, Ви забули поставити лапки в кінці рядкової константи.

64. Invalid string length  (Невіpна довжина рядка).

Максимальна довжина описуємого рядка повинна знаходитись в діапазоні від 1 до 255.

65. String length mismath  (Невідповідність довжин).

Довжина рядкової константи не відповідає кількості елементів символьного масиву.

66. Label already defined (Мітка вже визначена).

Дана мітка вже визначена опеpатоpом.

67. Label not with in current block  ітка не знаходиться всередині поточного блока).

Опеpатоp goto не може посилатись на мітку, яка знаходиться поза поточним блоком.

68. Label identifier expected  (Потрiбен ідентифікатоp мітки).

Мітка не позначена за допомогою ідентифікатоpа, як це потрібно.

69. Printer out of paper   (Закінчився папір на пристрої друку).

 

Примітка. Наведений перелік повідомлень про помилки не вичерпує всіх можливих повідомлень. Тут наведені тільки ті повідомлення про помилки, які можуть виникнути при виконанні лабораторних робіт.

 

 

ЛІТЕРАТУРА

 

1.    Ю.С. Бородич, А.Н. Вальвачев, А.И. Кузьмич. Паскаль для персональных компьютеров: Справочное пособие. – Минск: "Вышэйшая школа", БФ ГИТМП "Ника", 1991. – 365 c.

2.    Ж. Джонс, К. Харроу. Решение задач в системе Турбо Паскаль. –Москва: Финансы и статистика, 1991. – 718 с.

3.    В.Н. Пильщиков. Сборник упражнений по языку Паскаль. – М.: Наука. 1989. – 160 с.

4.    Д. Ван Тассел. Стиль, разработка, эффективность, отладка и испытание программ. – М.: Мир, 1985. – 335 с.

5.    Р. Форсайт. Паскаль для всех. – М.: Машиностроение, 1986. – 228 с.