
- •“Розробка програмного забезпечення”
- •Організація програм
- •Інтегроване середовище turbo pascal
- •File (файл) – дії з файлами, вихід з системи
- •Save as - Використовується для збереження тексту програми в іншому місці або з іншим ім’ям.
- •Compile - компілює програму або модуль ;
- •Breakpoints - дозволяє передивитись всі контрольні точки та вилучити всі чи потрібну;
- •Title - розміщення вікон так, щоб вони мали однакові розміри;
- •Елементи мови програмування pascal
- •Елементи мови
- •Оператори реалізації розгалужених алгоритмів
- •1. Опис свого типу даних.
- •2. Використання безтипових змінних.
- •3. Масиви і рядки невизначеної довжини.
- •Дії, які можна виконувати над файлами всіх типів:
- •Процедури та функції для текстових файлів
- •Процедури та функції для прямого доступу:
- •Елементи мови
1. Опис свого типу даних.
В основній програмі в розділі опису типів описується структурований тип. Змінні в основній програмі і відповідний формальний параметр в заголовку підпрограми повинні бути змінними цього типу.
Type
тm = array [1....10] оf real;
var
mas: тм;
prоcedure prоc (var mass: тm); {заголовок п/п}
:
:
end;
begin
:
Prоc (mas); {Виклик п/п}
:
end.
2. Використання безтипових змінних.
В заголовку підпрограми не вказується тип параметру-змінної. В підпрограмі в розділі опису типів описується відповідний тип до якого буде приведено безтиповий параметр. Цей тип повинен бути сумісним з типом відповідного переданого параметру.
Var
b1: array [1. .100] оf byte;
b2: array [‘a’. .’z’] оf byte;
prоcedure pr (var b);
type
Tb = array [1....32500] оf byte;
:
:
{Звернення до масиву b в п/п: ТВ(b)[I]}
Tb(b)[i]:=34;
End;
Begin
:
pr(b1);
:
end.
3. Масиви і рядки невизначеної довжини.
В заголовку підпрограми при описі параметру вказується його тип але не вказується його розмір. При використанні масивів значення розміру масиву можна отримати за допомогою функції High(<Ім’я масиву>). Нумерація елементів в масиві буде починатись з 0 (нуля) і закінчуватись значенням функції High(<Ім’я масиву>)-1
Function Sum(var X: array of Real): Real;
Var
I: Word;
S: Real;
Begin
S := 0;
For I := 0 to High(X)-1 do
S := S + X[I];
Sum := S;
End;
Розробка програм з використанням підпрограм.
Приклад 1. Для трьох введених цілих чисел знайти їх середнє арифметичне. Знаходження середнього арифметичного оформити у вигляді процедури.
В процедурі повинно визначатись значення і повертатись в програму, що викликала процедуру. Це значення повертається за допомогою формального параметру- змінної.
Program
PAR;
Var
a,b:
integer;
S:
real;
Procedure
avrg(x,y:integer;
VAR
S:real);
Begin
S:=
(x+y)/2;
End;
Begin
write
(‘введи два числа’);
readln
(a,b);
avrg
(a,b,s);
writeln
(‘середнє арифметичне чисел’,
а:5,b:5,’дорівнює’,
S:10:2);
End.
Приклад 2. Для трьох введених цілих чисел знайти їх середнє арифметичне. Знаходження середнього арифметичного оформити у вигляді функції.
Program
PAR;
Var
a,b:
integer;
S:
real;
Function
avrg(x,y:integer):real;
Begin
avrg:=
(x+y)/2;
End;
Begin
write
(‘введи два числа’);
readln
(a,b);
avrg
(a,b,s);
writeln
(‘середнє арифметичне чисел’,
а:5,b:5,’дорівнює’,
avrg (a,b,s):10:2);
End.
Приклад 1 і приклад 2 демонструють використання процедури і функції для одного завдання для порівняння. В даному випадку ефективніше використовувати функцію.
Приклад 3. Знайти кількість сполучень з використанням функції:
Сполучення
обчислюються за формулою
Очевидно,
що визначення факторіалу повторюється,
тому його визначення необхідно винести
в підпрограму, а саме функцію тому, що
результатом буде одне просте значення.
program
komb;
var
c,n,m:
word;
functiїn
fakt (n: word): word;
var
i:
word; f:longint;
begin
f:=
1;
for
i:= 1 to n do
f:=
f*i;
fakt:=
f;
end;
begin
writeln
(‘введи m,n’);
readln
(m,n);
c:=
fakt (n) div (fakt(m) + fakt(n-m));
writeln
(‘кількість сполучень ’,n:3,‘по’,
m:3,‘=’,c:7);
end.
Завдання для самоперевірки.
Чим вiдрiзняється процедура вiд функцiї
Записати заголовок для функцiї, що приймає 2 аргументи цiлого типу i повертає результат дійсного типу
Записати заголовок для функцiї, що приймає масив 10 елементiв цiлого типу i повертає результат цілого типу
Записати заголовок для функцiї, яка отримує в якостi параметра 2 цiлих значення і повертає значення цілого типу
Записати заголовок процедури, яка отримує в якостi параметра 2 цiлих значення і повертає значення цілого типу
Перелічити типи формальних параметрiв.
Розробити програму, яка формує три масиви різного розміру (але не більше 50 елементів) цілих значень. Знайти середнє арифметичне всіх значень з 3-х масивів.
Розробити програму, яка формує два строкових масиви даних різного розміру (але не більше 30 елементів) і знаходить найдовше значення.
Модулі Pascal
Визначення модуля
Структура модуля
Створення модуля.
Підключення модуля.
Модуль CRT
Модуль DOS
Модульність - це властивість системи, яка може бути поділена незалежні частини. Кожна з частин призначена для виконання конкретної дії.
Модуль не може самостійно виконуватись, він тільки підключається до програм для використання.
Модуль компілюється незалежно від програми. Модуль має розширення .tpu. Ім’я модуля завжди повинно співпадати з ім’ям файлу, в якому він знаходиться.
Щоб підключити модуль до програми використовується директива USES, в якій вказується ім’я модуля.
Структура модуля складається з 4 частин:
- заголовок модуля (UNIT <ім’я модуля>;).
- розділ оголошень (INTERFACE)
- розділ реалізацій (IMPLEMENTATION)
- розділ ініціалізації ([begin].....end.)
Заголовок модуля
Визначає імя по якому модуль буде підключатись до програм.
Формат заголовку
Unit <імя модуля>;
<імя модуля> обовязково повинно співпадати з імям фізичного файлу, в якому буде збережено текст модуля.
Розділ оголошень.
Розділ оголошень може включати модулі, що підключаються, опис типів, констант, змінних, які будуть привноситись в програму при підключенні модуля. Тут також, описуються заголовки підпрограм, що складають бібліотеку. Все, що описано в цьому розділі буде доступно програмам, що підключають модуль.
Формат розділу
INTERFACE
[Uses ...]
[Const ...]
[Type ...]
[Var ...]
procedure ...;
function ...;
...
Розділ реалізації
Розділ реалізації складається з тіл процедур та функцій, що об’явлені в розділі оголошень. В розділі можуть бути оголошені модулі, свої типи, константи, змінні, які будуть глобальними тільки для підпрограм цього розділу.
Формат розділу
IMPLEMENTATION
[Uses ...]
[Const ...]
[Type ...]
[Var ...]
procedure ...;
begin ... end;
...
function ...;
begin ...end;
Розділ ініціалізації.
Розділ ініціалізації може включати діє, які потрібно виконати один раз при підключенні модуля. Якщо цей розділ відсутній - ставиться тільки слово – end..
Формат розділу
[begin
... ]
end.
Приклад .
unit mоd;
interface
type
tx = array [1...32500] оf byte;
procedure fr (a,d:real);
function fn (x:real):real;
implementation
uses crt, dos;
procedure pr;
begin
:
end;
function fn(x:real):real;
begin
:
end;
end.
Створення модуля.
Створити текстовий файл в середовищі Turbo Pascal, що вміщує текст модуля.
Зберегти його з тим же ім’ям, яке записано в заголовку модуля. Отримаємо текстовий файл з розширенням pas.
По умовчанню скомпільовані файли знаходяться в оперативній пам’яті. Файл модуля необхідно зберегти на диску. Для цього необхідно скористатись пунктом меню Options + Linker. В стопчику Link buffer відмітити Disk в необхідному рядку.
Скомпілювати модуль. (Alt+ F9). Отримаємо двійковий файл з розширенням tpu. Щоб знати де розміститься цей файл, необхідно відкрити вікно призначення каталогів. Для цього необхідно скористатись пунктом меню Options + Directory. Відкриється вікно в якому видно призначення каталогів. В першому рядку з назвою „EXE & TPU directory” повинно бути записано шлях до каталогу в якому зберігаються модулі. Якщо рядок пустий, то файл модуля збережеться в поточному каталозі. Файл модуля буде мати те ж ім’я, що і текстовий файл модуля і розширення tpu.
Підключення модуля
Відкрити новий файл в середовищі Turbo Pascal для введення тексту програми яка буде використовувати створений модуль.
Записати заголовок програми.
В другому рядку за допомогою директиви USES підключити модуль.
В тексті програми можна використовувати звернення до підпрограм модуля в відповідності з їх об’явами.
Розробка програм з використанням власних бібліотек(модулів)
Приклад 1. Створити модуль, що містить процедуру вводу даних в масив дійсних чисел довільного розміру (але не більше 50 елементів), функцію визначення суми елементів масиву, функцію визначення найбільшого елементу масиву, процедуру виведення елементів масиву довільного розміру.
UNIT ObrMas;
INTERFACE
Type
TM=array [1..50] of real;
Procedure VVOD (var M:TM;var n:word);
Procedure VIVOD (var M:TM;n:word);
Function Summa (var M:TM;n:word):real;
Function max (var M:TM;n:word):real;
IMPLEMENTATION
Procedure VVOD;
var
i:word;
begin
repeat
writeln (‘Введіть розмір масиву (не більше 50)’);
readln (n);
until n<=50;
for i:1 to n do
begin
write (‘Введіть наступний елeмент’);
readln (M[i]);
end;
end;
procedure VIVOD;
var
i:word;
begin
writeln (‘Вміст масиву’);
for i:=1 to n do
write (M[i]:7:2);
writeln;
end;
Function Summa (var M:TM;n:word):real;
Var
i:word;
S:real;
Begin
S:=0;
For i:=1 to n do
S:=S+M[i];
Summa:=S;
End;
Function max (var M:TM;n:word):real;
Var
i:word;
mx:real;
Begin
mx:=M[1];
For i:=1 to n do
If M[i]> mx then
Mx:=M[i];
max:=mx;
End;
End.
Приклад 2. Розробити програму що формує масив 30 дійсних елементів, знаходить суму його елементів, мах елементі вивести вміст масиву.
Program PR;
Uses ObrMas;
Var
A:TM;
K:word;
Begin
VVOD (A,k);
Writeln (‘Сума елементів масиву =’,Summa(A,k):7:2 );
Writeln (‘Максимальний елемент масиву =’,max(A,k):7:2);
VIVOD (A,k);
End.
Завдання для самоперевірки.
Який сенс в використанні модулів.
Яким чином підключається модуль до програми.
Призначення розділу обяв.
Призначення розділу реалізацій.
Призначення розділу ініціалізації.
Модуль CRT
Модуль призначений для роботи з екраном і клавіатурою.
Робота з екраном.
Робота з екраном виконується в текстовому режимі. Екран розглядається як послідовність рядків. По умовчанню їх 25. Кожний рядок містить 80 позицій - колонок. Кожна позиція характеризується координатами <номер рядка, номер колонки>. Початок координат знаходиться в лівому верхньому куті екрану і має координати (1,1).
1,1
80,25
Поточні координати завжди можна взнати, використовуючи функції
WHEREX, WHEREY.
Для переміщення курсору в позицію використовується процедура
GOTOXY (<x>,<y>);
На екрані можна створювати вікна. Вікно - це прямокутна область екрану. Для створення вікна використовується процедура
WINDOW (<x1>,<y1>,<x2>,<y2>);, де
x1,y1 - координати лівого верхнього кута
x2,y2 - координати правого нижнього кута
Після виконання цієї процедури система координат переноситься в лівий верхній кут цього вікна, координати будуть відраховуватись в рамках цього вікна і всі дії будуть відноситись до цього вікна. Якщо координати задано некоректно, то ніяких дій не буде виконано.
Завжди можна взнати координати поточного вікна, використовуючи змінні WINDMAX і WINDMIN. В кожній змінній зберігається значення Х і У в молодшому і старшому файлі. Отримати ці значення можна використовуючи функції LO і HI.
x: = LO (WINDMIN) + 1; x2: = LO (WINDMAX) + 1;
y: = HI (WINDMIN) + 1; y2: = HI (WINDMAX) + 1;
Для очищення поточного вікна використовується процедура
CLRSCR;
. При цьому вікно заливається кольором поточного фону. Курсор встановлюється в позицію (1,1).
Робота з кольором
Кольорова гама складається з двох кольорів: кольору фону і кольору символів.
Таблиця кольорів
-
Константа кольору
Числове значення кольору
Колір
BLACK
0
чорний
BLUE
1
синій
GREEN
2
зелений
CYAN
3
голубий
RED
4
червоний
MAGENTA
5
фіолетовий
BROWN
6
коричньовий
LIGHTGRAY
7
яскраво-сірий
DARKGRAY
8
темно-сірий
LIGHBLUE
9
яскраво-синій
LIGHTGREEN
10
яскраво-зелений
LIGHTCYAN
11
яскраво-голубий
LIGHTRED
12
яскраво-червоний
LIGHTMAGENTA
13
яскраво-фіолетовий
YELLOW
14
жовтий
WHITE
15
білий
BLINK
128
Мерехтіння
Для встановлення кольору символів використовується процедура
TEXTCOLOR (<колір>);
Для встановлення кольору фону використовується процедура
TEXTBACKGROUND (<колір>);
Для кольору фону використовуються тільки перші 8 кольорів (0 .. 7).
Задати кольори можна використовуючи системну константу TEXTATTR таким чином:
TEXTATTR: = <колір символів> + 16*<колір фону>[+128];
HIGHRIDEO; - включення яскравості кольору символів
LOWVIDEO; - виключення яскравості кольору символів
NORMVIDEO; - повернення кольорового режиму, що був на початок роботи програми
Використання звуку
Можна використовувати вбудовані динаміки для подачі звукових сигналів.
Включення звуку виконується за допомогою процедури
SOUND (<частота в ГЦ>);
Нормальні значення частоти від 32 гц до 8 кгц.
Звучання не закінчиться до тих пір, поки не виконається процедура виключення звуку
NOSOUND;
Щоб затримати виконання програми використовується процедура
DELAY (<мл.сек.>);
Наприклад, цикл для озвучення сирени можна записати цикл
For i:=32 to 1000 do
Begin
Sound (i);
Delay (100);
NoSound;
end;
Робота з клавіатурою
При введенні даних з клавіатури спочатку коди всіх натиснутих клавіш заносяться в спеціальний буфер клавіатури і уже з нього можуть бути зчитані в структури програми за допомогою різних засобів. Буфер побудовано по типу черги: нове значення дописується в кінець, а зчитується значення перше. Після зчитування вся черга посувається вперед на один символ. Буфер очищується при використанні процедур вводу алгоритмічних мов.
Можна працювати з самим буфером Для цього використовується дві спеціальні функції:
KEYPRESSED - логічна функція для аналізу натиснення клавіш.
= TRUE, якщо в буфері клавіатури присутній хоча б один символ.
= FALSE, якщо буфер пустий.
READKEY - зчитування одного символу з буферу клавіатури. Функція повертає символьне значення коду, що є на цей момент в буфері клавіатури першим. Якщо буфер пустий, то програма припиняється до натиснення довільної клавіші. Символи натиснутих клавіш не відображаються на екрані.
Клавіші Ctrl, Shift, Alt, NumLock, CapsLock не дають коду символу.
При роботі з буфером клавіатури корисно на початку програми його почистити:
WHILE Keypressed do CH:= ReadKey;
Використання клавіш в регістрі Alt, функціональних клавіш і клавіш управління курсором посилають у буфер 2 символи, перший з них 0, другий - код клавіші.
Для перевірки клавіш в регістрі Ctrl використовується символ " ^ " .
C IN [ ^F, ^P, ^S].
UpCase (<символ>); - перевід символу в верхній регістр.
Можна отримати в тексті програми "образ" будь-якої управляючої функціональної клавіші, якщо натиснути комбінацію клавіш Ctrl+P, а потім саму клавішу.
Коди службових клавіш:
Tab-9; Enter-13; Esc-27
Коди функціональних клавіш:
F1 - 0 59
F2 - 0 60
.........
F10 - 0 68
F11 - 0 133
F12 - 0 134
-
0, 75; - 0, 80; - 0, 76; - 0, 82;
Для створення світлового меню враховується, що один з пунктів повинен бути виділений в порівнянні з іншими. Тобто перед його виводом колір фону встановлюється іншими.
Для формування вертикального меню обробляється натиск на клавіші - стрілка вгору, стрілка вниз, Enter, Esc. Для горизонтального - стрілка вправо, стрілка вліво, Enter, Esc.
Натиск всіх інших ігнорується. Розглянемо вертикальне меню. При натиску на клавішу "стрілка вгору" номер поточного пункту меню повинен зменшитися на 1. Якщо при зменшенні номер стане рівним 0, то встановлюємо номер виділеного пункту - останній. З останнього пункту організується перехід на перший.
При виборі Esc - вихід з меню.
При виборі Enter - виклик процедури обробки відповідного пункту меню.
Розробка програм з використанням модуля CRT
Приклад 1.
Приклад обробки функціональних клавіш.
program pr;
uses crt;
var
ch: char;
begin
while keypressed do ch:= readkey;
writeln (‘натисніть функціональну клавішу’);
repeat
ch:=readkey;
if ch = #0
then
ch: redkey;
until ch in {#59....#68};
case ch of
# 59: .........
# 60: .........
end;
end.
Модуль DOS
Модуль призначається для роботи з таймером, файлами та папками.
FSearch (<імя файлу>,<перелік каталогів, де необхідно шукати файл >); - функція, використовується для перевірки наявності вказаного файлу. Функція повертає значення строкового типу, а саме повне імя знайденого файлу. Якщо файл не знайдено - функція повертає пустий рядок. Перелік каталогів розділяється символом „;”. Якщо пошук повинен здійснюватись у поточному каталозі, то вказується пустий рядок. Наприклад,
If FSearch (‘MyFile.txt’,’’)<>’’ then
<опратори, що виконуються якщо файл знайдено>
else ... ;
GETDATE (<рік>, <місяць>, <число>, <день>); - зчитування системної дати.
SETDATE (<рік>, <місяць>, <число>); - встановлює поточну дату.
GETTIME (<час>, <хвилина>, <сек>, <мл сек>); - зчитування поточного часу
SETTIME (<час>, <хвилина>, <сек>, <мл сек>); - встановлює поточний час.
Розробка програм з використанням таймеру
Приклад 1. Визначити день тижня, який припадає на 8 березня 2004 року.
.
.
.
Модуль GRAPH
Щоб працювати з графічним режимом потрібно його ініціалізувати. Для цього використовується процедура
InitGraph (<тип адаптера>,<режим графіки>,<шлях до драйвера дисплею>); <тип адаптера> краще вибрати detect, що значить, що тип буде вибрано по автовизначенню найвищий.
Результат ініціалізації повертається в параметр GraphDriver, або результатом функції GraphResult.
Нормальне завершення операції, якщо GraphResult=0. В графічному режимі екран являє собою масив адресуємих крапок і довільне зображення на ньому утворюється як композиція пікселів, що світяться і не світяться.
Піксел - мінімальний елемент зображення.
Кількість адресуємих пікселей на екрані визначає дозволяючу здібність екрану.
Координати пікселя визначаються в системі координат з початком в верхньому лівому куті екрану.
0 ≤ х ≤ GetMaxX;
0 ≤ y ≤ GetMaxY.
Курсор в графічному режимі невидимий, але ним можна управляти.
Його положення можна взнати, використовуючи функції GetX, GetY.
Процедура |
Пояснення |
ClearDevice |
очищення графічного екрану |
MoveTo(x,y) |
переміщення курсора в (х,у). |
MoveRel(dx, dy) |
переміщення в (х+dx, y+dy) |
Line (x1,y1,x2,y2) |
відрізок лінії з абсолютними координатами |
LineTo (x,y) |
відрізок від поточної точки в m(x,y). |
LineReс (dx,dy) |
відрізок від поточної точки в m(x+dx, y+dy). |
SetLineStyle (<тип лінії>, <шаблон>, <товщина>). |
0 - бгжч«м «ччп; 1 - в®зҐз «ччп; 2 - иваЁеЄгЄвЁа ; 3 - ЄгЄвЁа ; 4 - вЁЄ § ¤ ® и І«®®¬. Для типу ліні• 0-3 шаблон 0. <Товщина>: 1 - в 1 піксел, 3 - в 3 пікселі |
Circle (x,y,R) |
коло |
Arc (x,y,<початковий кут>, <кінцевий кут>, R) |
дуга |
Ellipse (x,y,<початковий кут>, <кінцевий кут>, XR, YR) |
еліптична дуга |
Rectange (x1,y1,x2,y2) |
прямокутник; |
DrawPoly (<кількість точок>,<масив точок>) |
ломана |
SetFillStyle (<шаблон>, <колір>) |
визначення шаблону заливки <шаблон>: 0 - суцільна заливка кольором фона; 1 - " ; 2 - ============ ; 3 - //////////// ; 4 - жирні //////// ; 5 - " \\\\\\\\\\\\ ; 6 - тонкі \\\\\\\\\ ; 7 - рідкий штрих ; 8 - густий штрих |
Bar (x1,y1,x2,y2) |
прямокутник, залитий по поточному шаблону |
Bar3D(x1,y1,x2,y2,<глибина>,<тип відображення верхньої площини(true, false)>) |
паралелепіпед |
Sector (x,y,<початковий кут>, <кінцевий кут>, XR, YR) |
сектор еліпса залитий по шаблону |
PieSlice (x,y,<початковий кут>,<кінцевий кут>, R) |
сектор кола, залитий по шаблону |
FloodFill (x,y,<колір лінії межі >) |
заливає область навкіл (х,у), обмеженої лінією заданого кольору |
SetColor (<колір>) |
установка кольору пера |
SetBkColor (<колір>) |
установка кольору фону |
PutPixel (x,y, <колір>) |
установка кольору пікселу |
SetViewPort (x1,y1,x2,y2, <режим відсічення>,: boolean) |
графічне вікно |
ClearViewPort |
очищення вікна |
SetTextStyle (<номер шрифта>,<положення текста>,<розмір символів>) |
вибір шрифта <номер шрифта>: 0 - матричний 8х8; 1 - полужирний ; 2 - тонкий ; 3 - рублений; 4 - готичний. <положення текста>: 0 - горизонтальне, зліва - направо; 1 - вертикальне знизу-вверх; 2 - букви повернуто на 90, але вивід горизонтальний. <розмір символів> - 0.....10 |
OutText (<текст>) |
вивід тексту з поточної точки |
OutTextXY (x,y, <текст>) |
вивід тексту з точки .(х,у) |
Організація даних в мові PASCAL
Складні типи даних
Складні типи мають внутрішню структуру, яка складається з сукупності простих типів. До складних типів відносяться масиви, множини, записи, файли, об’єкти, посилання і процедурний тип.
Складні типи можна поділити на структуровані, посилання і процедурні типи.
Структуровані типи даних
Масиви
Строкові дані
Множини
Записи
Типізовані константи
Файли
Об’єкти
Масиви
Одновимірні масиви.
Багатовимірні масиви. Двовимірні масиви (матриці).
Масив - це обмежена послідовність елементів одного типу.
Кожний елемент в масиві має свій порядковий номер. Елементи масиву можна перерахувати (проіндексувати). Індексом може бути довільний перелічувальний тип.
Масив характеризується іменем, розміром і типом елементів.
Масиви можуть бути одновимірні і багатовимірні.
Одновимірні масиви
Формат опису типу "масив" для одновимірних масивів:
type
<ім’я типу> = ARRAY <[<диапазон індексу>]> OF <тип елементів>;
<диапазон індексу> - діапазон довільного перелічувального типу. Якщо діапазон охоплює всі елементи типу, то замість діапазону можна вказувати ім’я типу, наприклад, BYTE, CHAR.
Наприклад:
type
Tmas = array [1..10] of real;
Tmas1= array [10..100] of char;
Tmas2= array [‘a’..’k’] of integer;
Tmas3= array [byte] of string[30];
Для використання масиву в програмі необхідно об’явити змінні типу „масив”:
Var
mas: Tmas;
mas1: Tmas1;
mas2: Tmas2;
mas3: Tmas3;
mas4: array [1..10] of word;
Кожний елемент масиву характеризується іменем масиву і індексом. Наприклад, mas1[11], mas3[2]. Такі змінні називають індексованими змінними.
Область допустимих значень для масиву визначається типом елементів масиву.
Операції над масивами: не визначені, тобто не допускаються ніякі операції. Але для однотипних масивів можна виконувати оператор присвоєння. Наприклад, якщо маємо опис
Var
mas5,mas6: Tmas;
то можна виконати mas5:=mas6; В результаті вміст масиву mas5 буде таким же, як і вміст масиву mas6.
Щоб обробити масив(ввести, вивести, змінити), необхідно звернутись до кожного елементу масиву, тобто, для обробки масивів використовуються оператори циклу.
Розробка програм з використанням одновимірних масивів
Приклад 1. Для заданого масиву з 10 дійсних значень знайти суму позитивних значень.
PROGRAM
suma; {Знаходження
суми позитивних значень в масиві з 10
дійсних чисел.}
var
M:array
[1..10] of real;
s:real;
i:byte; {M
– масив значеннь s
- сума введених значень i
- змінна циклу}
begin
s:=0;
for
i:=1 to 10 do
begin
write
('введи число');
readln(M[i]); end;
for
i:=1 to 10 do if
M[i]>0 then
s:=s+
M[i];
writeln
('S = ',s:10:2);
end.
Приклад 2. В заданому масиві з 10 дійсних значень кожне негативне значення зменшити в разів.
PROGRAM masiv;
{Заміна негативних позитивних значень в масиві з 10 дійсних чисел на значення в 5 разів збільшене.}
var
M:array [1..10] of real;
i:byte;
{M – масив значень
i - змінна циклу}
begin
for i:=1 to 10 do
begin
write ('введи число');
readln(M[i]);
end;
for i:=1 to 10 do
if M[i]< 0 then
M[i]:=5*M[i];
writeln ('Новий вміст масиву’);
for i:=1 to 10 do
write (M[i]);
writeln;
end.
Приклад 3. Маємо 2 масиви цілих елементів розміром по 5 елементів. Порахувати кількість пар відповідних елементів масивів, сума яких не більше 15. Індекс цих пар записати в третій масив.
Program masiv;
var
mas1,mas2,mas3:array [1..5] of integer;
i,k:word;
begin
for i:=1 to 10 do
begin
write ('Введи пару чисел');
readln(маі1[i], маі2[i]);
end;
k:=0;
for i:=1 to 5 do
if mas1[i]+mas2[i]<=15 then
begin
inc(k);
mas3[k]:=i;
end;
writeln ('Кількість пар ',k:4);
writeln ('Результуючий масив:');
for i:=1 to k do
write (mas3[i]:5);
writeln;
end.
Приклад 4. Вводиться послідовність символів. Необхідно підрахувати скільки разів введено кожну малу букву латинського алфавіту. Завершення вводу - введення символу *.
В цьому прикладі використаємо масив для зберігання кількості кожного введеного символу. Індексом цього масиву визначимо символи буков.
Program simbol;
var
K:array [‘a’..’z’] of integer; {Масив кількостей кожного символа}
c:char;
begin
{Очистка масиву кількостей, тобто кількість кожного символу встановлюється
рівною нулю}
for c:=’a’ to ’z’ do
K[c]:=0;
{Цикл по обробці введених символів}
repeat
write (‘Введи символ’);
readln (c);
if ( c>=’a’) and (c<=’z’) then
K[c]:= K[c]+1;
Until c=’*’;
writeln ('Кількість букв ‘);
{Цикл виведення результатів}
for c:=’a’ to ’z’ do
write (c,’=’,K[c]:2);
writeln;
readln;
end.
Приклад 5. Визначити, чи елементи заданого масиву 10 дійсних значень розташовані в зростаючому порядку. Перегляд масиву припинити при порушенні порядку.
В таких задачах цикл може припинитись в двох випадках; якщо переглянуто всі елементи і якщо знайдено порушення. В такому разі не можна використовувати цикл з параметром, хоча кількість членів масиву відома. Невизначеність повторів вносить умова порушення порядку. В таких випадках доцільно ввести логічну змінну, яка змінює своє значення на протилежне при визначенні порушення порядку розташування членів масиву. Індекс масиву необхідно рахувати окремо.
По завершенні циклу по значенню цієї змінної можна визначити чи було порушення.
PROGRAM posled;
{Визначення, чи елементи масиву розташовані в зростаючому порядку.}
var
M:array [1..10] of real;
i:byte;
b:Boolean;
{M – масив значень
i - змінна циклу
b - =true, якщо елементи в зростаючому порядку, false - якщо ні }
begin
for i:=1 to 10 do
begin
write ('введи число');
readln(M[i]);
end;
b:=true;
i:=1;
while (i<10) and b do
begin
if M[i+1]< M[i] then
b:=false;
i:=i+1;
end;
if b then
writeln ('Елементи масиву зростають’)
else
write ('Елементи не масиву зростають’);
readln;
end.
Приклад 6. Визначити значення виразу:
В даному прикладі необхідно знайти суму, елементами якої є вираз, елементами якого є два масиви A і B. Розмір масивів можна визначити з знаку суми, де вказано, що треба скласти 15 елементів.
Щоб знайти значення цього виразу необхідно заповнити значеннями масиви і , крім того, ввести значення для змінної m.
PROGRAM suma;
{Визначення значення виразу з сумою.}
var
A,B:array [1..15] of real;
k:byte;
S:real;
{A,B – масиви значень
k - змінна циклу
S - сума}
begin
for k:=1 to 15 do
begin
write ('Введіть 2 числа');
readln(A[k],B[k]);
end;
write ('Введіть значення m');
readln(m);
S:=0;
for k:=1 to 15 do
S:=S+(A[k]+B[k])/(k+5);
S:=15*m+7*S;
writeln (‘S=’,S:8:3);
readln;
end.
Багатовимірні масиви
Для багатовимірних масивів вказуються діапазони для кожного індексу, перелічені через кому. Індексом може бути будь-який перелічений тип.
Найчастіше використовуються двовимірні масиві, які називають матрицями.
Формат опису типу "масив" для двовимірних масивів:
type
<ім’я типу> = ARRAY <[<диапазон індексу 1>,<диапазон індексу 2>]> OF
<тип елементів>;
Наприклад:
type
Tmatr= array [1..10,1..10] of word;
Tmatr1= array ['a'..'z',1..100] of integer;
Var
matr: Tmatr;
matr1: Tmatr1;
Елемент матриці характеризується іменем матриці і двома індексами. Наприклад, matr[2,3].
Деякі відомості про матриці:
М
атриця
має вигляд
a
11
a12
a13
a21 a22 a23
a31 a32 a33
Матриця складається з рядків і стовпців. Перший індекс вказує на номер рядка, а другий - на номер стовпця. Розмір матриці визначається добутком кількості рядків на кількість стовпців.
Якщо кількість рядків дорівнює кількості стовпців, то матриця називається квадратною.
Елементи матриці, які мають однакові індекси, складають головну діагональ матриці. В нашому прикладі це елементи (a11, a22, a33). Елементи, що лежать над головною діагоналлю - (a12, a13, a23). Можна помітити, що у цих елементів другий індекс більше першого. Елементи, що лежать під головною діагоналлю - (a21, a31, a32). У цих елементів другий індекс менше першого.
Матрицю можна розглядати як масив рядків, де кожний рядок є масив. Тобто опис
mas= array [1..10,1..10] of word; і опис
mas2= array [1..10] of array [1..10] оf word; є ідентичними.
Можна звертатись до рядка, як до масиву, наприклад, mas[3].
Розробка програм з використанням двовимірних масивів.
Приклад 1. Знайти суму елементів квадратної матриці 3*3.
program suma;
var
matr:array[1..3,1..3] of real;
i,k:word;
s:real;
begin
writeln (‘ Введiть матрицю у виглядi матриці’);
for i:=1 to 3 do
begin
for k:=1 to 3 do
read (matr[I,k];
readln;
end;
s:=0;
for i:=1 to 3 do
for k:=1 to 3 do
s:=s+matr[i,k];
writeln ('Сума елементів матриці=',s:6:2);
end.
Приклад 2. В матриці 5*4 знайти суму елементів кожного рядка.
program rd;
var
matr:array[1..5,1..4] of real;
i,k:word;
s:real;
begin
writeln (‘ Введiть матрицю у виглядi матриці’);
for i:=1 to 5 do
begin
for k:=1 to 4 do
read (matr[I,k];
readln;
end;
for i:=1 to 5 do
begin
s:=0;
for k:=1 to 4 do
s:=s+matr[i,k];
writeln ('Сума елементів',i:3,'рядка',s:6:2);
end;
end.
Приклад 3. В матриці 5*3 поміняти місцями 2 і 4 рядки.
program zamina;
type
TM = array[1..3] of real;
var
M: array[1..5] of TM;
C:TM;
i,k:word;
begin
writeln (‘ Введiть матрицю у виглядi матриці’);
for i:=1 to 5 do
begin
for k:=1 to 3 do
read (M[I,k];
readln;
end;
C:=M[2];
M[2]:=M[4];
M[4]:=C;
Writeln (‘Нова матриця’);
for i:=1 to 5 do
begin
for k:=1 to 3 do
write (M[I,k]:6:2);
writeln;
end;
end.
Приклад 4. Вивести на екран матрицю у вигляді
1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9
0
0 1 2 3 4 5 6 7 8
0 0 0 1 2 3 4 5 6 7
. . . . . . . . . . . . . . .
0 0 0 0 0 0 0 0 0 1
program
UpAngle; var
i,k:word; begin for
i:=1 to 10 do
begin
for
k:=1 to 10 do
if
i>k then
write
('0':3)
else
write(k-i+1:3)
;
writeln;
end;
readln; end.
Результати
виконання
1 2 3
4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8
9
0 0 1 2 3 4 5 6 7
8
0 0 0 1 2 3 4 5 6
7
0 0 0 0 1 2 3 4 5
6
0 0 0 0 0 1 2 3 4
5
0 0 0 0 0 0 1 2 3
4
0 0 0 0 0 0 0 1 2
3
0 0 0 0 0 0 0 0 1
2
0 0 0 0 0 0 0 0 0
1
Приклад 5. Вивести на екран матрицю у вигляді
1 0 0 0 0 0 0 0 0 0
2 1 0 0 0 0 0 0 0 0
3
2 1 0 0 0 0 0 0 0
4 3 2 1 0 0 0 0 0 0
. . . . . . . . . . . . . . .
10 9 8 7 6 5 4 3 2 1
program
DownAngle; var
i,k:word; begin for
i:=1 to 10 do
begin
for
k:=0 to 9 do
if
i<k then
write
('0':3)
else
write(i-k:3)
;
writeln;
end;
readln; end.
Результати
виконання
1 0 0
0 0 0 0 0 0 0
2 1 0 0 0 0 0 0 0
0
3 2 1 0 0 0 0 0 0
0
4 3 2 1 0 0 0 0 0
0
5 4 3 2 1 0 0 0 0
0
6 5 4 3 2 1 0 0 0
0
7 6 5 4 3 2 1 0 0
0
8 7 6 5 4 3 2 1 0
0
9 8 7 6 5 4 3 2 1
0
10 9 8 7 6 5 4 3 2
1
Завдання для самоперевірки.
Маємо опис
Type
Vector=array [1..30] of real;
Var
Dan:Vector;
Скільки елементів в масиві Dan?
Назвати перший і останній елементи масиву.
Маємо опис
Type
day=(yesterday, today, tomorrow);
Var
Dan:array [day] of 0..24;
Скільки елементів в масиві Dan?
Які значення може приймати індекс?
Назвати перший і останній елементи масиву.
Які значення можуть приймати елементи масиву?
Описати масив, елементами якого є натуральні числа, а індексами довільні символи.
Чи можна в процесі виконання програми змінити розмір масиву?
Масив може складатись з одного елементу? Описати його.
Описати масив розміром 10 елементів, значеннями яких може бути true або false.
Маємо опис
Type
TMas=array of [1..15,’a’..’z’] of real ;
Var
A,B:TMas;
Які з вказаних дій допустимі в мові Pascal:
A=B; A:=B; A:=A+B; read(A); A[1}:=B[2]; A[3]:=A[4]; A[5,’a’]:=B[6,’d’]; A<>B;
Маємо опис
Type
TMas=array of [1..5,1..5] of real ;
Var
A,B:TMas;
Скільки елементів містить масив А?
Назвати перший і останній елементи масиву.
Назвати елемент масиву, що знаходиться в третьому рядку і четвертому стовпці.
Визначити кількість нульових елементів в заданому масиві.
Задано 20 чисел. Визначити, скільки серед них чисел, що дорівнюють останньому.
Задано масив з 10 символів. Вивести символи в зворотному порядку.
Задано масив з 30 цифрами. Визначити, яка цифра в ньому зустрічається найчастіше.
Задано масив 20 символів. Визначити, чи порядок символів з початку масиву до кінця і навпаки однаковий. Наприклад, абвгддгвба.
Знайти суму всіх елементів матриці 5х5.
Підрахувати суму додатних елементів в кожному рядку матриці 5х6.
М
асив розміром 12х31 містить дані про температуру в місті. Визначити дні, коли була найвища і найнижча температура.
Розробити програму формування матриці за зразком: 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 0 0
0 0 0 3 0 0 0 0 0 0
. . . . . . . . . . . . . . .
0 0 0 0 0 0 0 0 0 9
Робота з строковим типом даних
Строкову змiнну можна розглядати, як масив символiв., тобто
a: string[10]; можна iнтерпретувати, як a: array[1...10] of char;
Для вводу значень змiнних типу string використовуеться оператор readln, а не read. Одним оператором можна ввести тiльки один рядок.
Розробка програм з використанням строкових даних.
Приклад 1. Підрахувати кількість речень в заданому тексті. Вивести кожне речення з нового рядка. Речення можуть закінчуватись крапкою, запитальним знаком або окличним знаком.
В даному прикладі необхідно переглядати текст по символам. Щоб мати можливість вивести кожне речення окремо, необхідно формувати текст речення по символам, тобто кожний символ заносити в масив символів для речення. Зустріч символів . ? ! вважається кінцем речення. Кількість символів в тексті можна визначити за допомогою функції length. Для перегляду тексту можна використати цикл від першого символу тексту до ос таннього (1.. length).
program
tekst; var
S,R:string;
k,i:integer; {S
– введений текст, R
– текст речення, K
– кількість речень} begin
writeln('Введи
текст');
readln(S);
k:=0;
R:=’’; for
i:=1 to length(S) do
begin
R:=R+S[i];
case
S[i] of
’.’,’?’,’!’:
begin
writeln
(R); k:=k+1; R:=’’;
end;
end;
end;
writeln(‘Кількість
речень=’,k:5); end.
Приклад 3. Вводиться послідовність слів по символам. В кінці крапка. Слова розділяються комами. Знайти найдовше слово. Підрахувати кількість введених слів.
В цьому прикладі слова повинні формуватись по мірі їх введення. Введення символів закінчується при вводі символу крапка. Так як необхідно шукати найдовше слово, то спочатку це слово визначаємо пустим. Також пустим буде слово, яке буде вводитись. Кожний введений символ (крім крапки і коми) додається до слова, що формується при вводі. Введення символу крапка або кома означає кінець введеного слова. В цьому разі необхідно зрівняти введене слово з максимальним, збільшити кількість введених слів і встановити слово, що буде формуватись, пустим.
Program slova;
var
Slovo,Smax:string;
k:integer;
c:char;
begin
k:=0;
Slovo:='';
Smax:='';
writeln ('Введи
слова через кому. В кінці крапка:');
repeat
read (c);
case c of
',','.': begin
inc(k);
if length(Slovo)>length(Smax) then
Smax:=Slovo;
Slovo:='';
end
else
Slovo:=Slovo+c;
end;
until c='.';
readln;
writeln ('Кількість
введених слів= ',k:5);
writeln ('Найдовше слово:
',Smax);
readln;
end.
Приклад 4. Рядок містить послідовність символів, які являють собою запис числа в 16-річній системі числення. Необхідно перевести задане число в 10-річну систему числення.
Знаками, з яких складаються числа в 16-річній системі числення, є цифри 0 . . 9 і букви A,B,C,D,E,F. Кожна буква має відповідне десяткове значення: 10, 11, 12, 13, 14, 15.
Для переводу числа з довільної системи числення в 10-річну використовується правило: число в довільній системі числення необхідно представити у вигляді поліному an-1xn-1 + an-2xn-2 +...+a1x + a0, де ai цифри числа, х – основа системи числення, n - кількість цифр в числі. Дії виконувати в десятковій системі числення.
Наприклад, число 40783 в десятковій системі числення можна представити як: 4∙104+0∙103+7∙102+8∙101+3∙100.
Число 71261 в 8-річній системі числення буде представлено 7∙84+1∙83+2∙82+6∙81+1∙80.Виконавши дії, отримаємо значення в десятковій системі: 29361.
Число 5937 в 16-річній системі числення - 5∙163+9∙162+3∙161+7∙160. Виконавши дії, отримаємо значення в десятковій системі: 22839.
Число 4A7CE в 16-річній системі числення - 4∙164+10∙163+7∙162+12∙161+14∙160. Виконавши дії, отримаємо значення в десятковій системі: 305102.
var
s:string;
i:integer;
m:longint;
{s – 16-річне
число в строковому форматі
m - задане
число в десятковій системі в
числовому форматі}
begin
write ('Введіть
число в 16-річній системі
');
readln(s);
m:=0;
for i:=1 to length(s) do
case s[i] of
'0'..'9': m:=m*16+ ord(s[i])-ord('0');
'A'..'F','a'..'f':begin
s[i]:=upcase(s[i]);
m:=m*16+ord(s[i])-ord('A')+10;
end;
end;
writeln(m);
readln;
end.
Завдання для самоперевірки.
Записати оператор який змінній sign присвоює третє слово з рядка „Люби діло – майстром будеш”.
Записати оператор який змінній n присвоює номер символу „ , ” в рядку „Яка пряха, така на ній і рубаха”.
Записати оператор який з рядку „Золотые руки у того, кто обучался очень хорошо” вилучає слово „очень”.
Записати оператор який вставляє слово „топором” перед словом „тяпать” в рядку „Без ума ни тяпать, ни ковырять лапоть”.
Дано рядок, який складається з двох слів, розділених комою. Вивести ці слова за абеткою.
Вилучити з заданого рядку всі входження заданого слова.
Дано текст, що складається з послідовності слів, розділених комою. Текст закінчується крапкою. Підрахувати кількість введених слів і знайти найбільше слово в лексикографічному значенні.
Підрахувати, скільки раз в заданому тексті зустрічається вказане слово.
Множини
Множина – це не обмежена сукупність даних одного перелічувального типу.
Не обмежена в тому сенсі, що наперед не встановлюється кількість елементів в множині, але розмір сукупності обмежений. Максимальна кількість елементів множини - 256.
Тип визначається:
type
<ім’я типу множини> = set of <базовий тип>;
В якості базового типу може бути тип, кількість елементів якого не перевершує 256 і значення позитивні. Таким типом може бути стандартний тип char, byte. Для інших стандартних типів можна вказувати тільки діапазон в межах 0..255.
Наприклад
Type
Tmn = set of char;
Tnm1 = set of 1..120;
Tmn2 = set of ’d’..’k’;
Var
mn : Tmn;
mn1 : Tmn1;
mn2 : Tmn2;
mn3 : set of 10..200;
Правила використання множин.
Множина задається у вигляді списку елементів, взятих у квадратні дужки. Елементи розділяються комами. Наприклад: ['a','o','e','j'], [2,4,7,24,89].
Пуста множина задається як квадратні дужки, розташовані поряд: []. Наприклад, задати пусту множину: mn:=[];
Елементами множини можуть бути константи, змінні, вирази, діапазони відповідного базового типу. Наприклад, якщо маємо
Var
X:byte;
Можна записати множину [2,17,X,2*X+37,5..25].
Множина не має елементів, що повторюються. Тобто, багаторазове вміщення елементу до множини ідентичне його одноразовому вміщенню.
Порядок розміщення елементів в множині не має значення. Наприклад, множини [4,8,23] i [8,23,4] будуть однаковими.
Операції над множинами
Для демонстрації прикладів, будемо вважати, що маємо множини S1 і S2 одного типу.
Операція |
Запис операції |
Дія |
Опис результату |
= |
S1 = S2 |
Перевірка на рівність. |
Результат true, якщо множини складаються з однакових елементів, незалежно від їх порядку. |
<> |
S1 <> S2 |
Перевірка на нерівність |
Результат true, якщо множини відрізняються хоча б одним елементом |
<= |
S1 <= S2 |
Перевірка на підмножину |
Результат true, якщо всі елементи множини S1 містяться в множині S2. |
>= |
S1 >= S2 |
Перевірка на надмножину |
Результат true, якщо всі елементи множини S2 містяться в множині S1. |
IN |
eл. IN S1 |
Перевірка входження елемента в множину |
Результат true, якщо вказаний елемент міститься у вказаній множині. Результат операції 5 in [6,9,5] є true. |
+ |
S1 + S2 |
Об’єднання множин |
Результатом буде множина, яка буде містити всі елементи обох множин без повторень. Наприклад, [4,7,9] + [8,4,10,32] = [4,7,9,8,10,32]
|
– |
S1 – S2 |
Різниця множин |
Результатом буде множина, яка буде містити ті елементи множини S1, які не входять до множини S2. Наприклад, [5,8,9,3,78] – [4,7,5,3] = [8,9,78] |
* |
S1 * S2 |
Пересічення множин |
Результатом буде множина, яка буде містити ті елементи, які містяться в обох множинах одночасно. Наприклад, [6,8,4,3] * [8,12,4,78] = [8,4] |
Множини не можна вводити і виводити однією дією. Введення і виведення множин виконується поелементно.
До множини не можна додати елемент, але можна скласти дві множини, одна з яких складається з одного елементу. Наприклад, необхідно до множини mn:=[6,7,3]; додати елемент 12. Маємо записати mn:=mn+[12]; Вміст множини mn - [6,7,3б12].
Розробка програм з використанням множин
Приклад 1. Вводиться послідовність символів. Введення закінчується крапкою. Необхідно вивести за абеткою всі малі латинські літери.
Для рішення таких задач зручно використовувати множини: при вводі формувати множину всіх введених малих латинських літер. Для виводу необхідно переглянути всю латинську абетку, перевіряючи входження кожної літери в сформовану множину. Якщо літери міститься в множині, то вона виводиться.
program
mn; var
m:set
of char;
ch:char;
begin
m:=[];
writeln
(‘Введіть послідовність літер’);
repeat
readln
(ch);
case
ch of
’a’..’z’:
m:=m
+ [ch];
end;
until
ch='.';
writeln
('Латинські літери:');
for
ch:='a' to 'z'
do
if
ch in m then
write
(ch:3);
writeln;
readln;
end.
Приклад 2. Вводиться послідовність символів, що складається з послідовності слів, розділених комою. В кінці рядка крапка. Необхідно визначити голосні букви, що входять в кожне слово. Надрукувати їх.
program
mnog; var
m,m_word:set
of char;
ch:char;
begin
m:=['a','о','е','у','і','и','є','ю','я'];
m_word:=[];
writeln
(‘Введіть посимвольно
послідовність
слів, розділених
комою
з крапкою в кінці’);
repeat
readln
(ch);
case
ch of
’,’,’.’:
begin
m:=m* m_word;
m_word:=[];
end; else
m_word:=
m_word+[ch];
end;
until
ch='.';
writeln
('Голосні букви, які входять в
кожне
слово:');
for
ch:='a' to 'я' do
if
ch in m then
write
(ch:3);
writeln;
readln;
end.
Завдання для самоперевірки.
Визначити [‘a’,’p’,’k’,’s’]+[‘h’,’k’,’f’,’p’]
Визначити [‘h’,’k’,’f’,’p’][‘u’,’f’,’h’]
Змінній присвоїти множину голосних літер.
Змінній присвоїти множину приголосних літер.
Змінній присвоїти множину всіх цифр.
Змінній присвоїти множину літер, які більше ‘г’, але менше ‘л’.
Визначити значення [3,6..8] <= [2..7,9]
Визначити значення [5,8,4]=[8,5,4]
Визначити значення 5 in [8,9,4].
Змінній В присвоїти множину, яка отримана з множини А за допомогою додавання елемента х.
Змінній В присвоїти множину, яка отримана з множини А за допомогою віднімання елемента х.
Розробити програму: З заданого тексту вибрати всі голосні літери, які в ньому зустрічаються, і вивести їх.
Розробити програму: Сформувати множину, яка складається з чисел, вибраних з проміжку [1..200] випадковим чином.
Розробити програму: З заданого тексту вибрати всі літери, які в ньому зустрічаються більше одного разу, і вивести їх.
Розробити програму: Дано масив, елементами якого є множини типу byte. Вивести ті числа, які зустрічаються в кожному елементі масиву і перелік всіх використаних чисел.
Записи
Запис - структура даних, що складається з фіксованого числа компонент, що називаються полями. Поля можуть бути різних типів. Поля характеризуються іменем і типом.
Означення типу має формат:
type
<ім’я типу>= record
<ім’я змінної 1>: <тип>;
<ім’я змінної 2>: <тип>;
.
.
<ім’я змінної N>: <тип>;
end;
Змінні описаного типу описуються в розділі VAR.
Наприклад,
type
gruppa=record
fio : string[20];
rik_vst:word;
data_r:array [1..3] of word; {день, місяць, рік}
end;
var
gr:gruppa;
Доступ до компоненти запису здійснюється за допомогою складених імен, які складаються з імені запису і імені поля, розділених крапкою. Наприклад,
gr.fio, gr.data_r[1], rik_vst
Для скорочення складених імен використовується оператор приєднування:
WITH <частина, що приєднується> DO <оператор>;
Наприклад:
with gr do
begin
fio:='Іванов І.І.';
rik _vst:=1997;
data_r[3]:=1982;
end;
Можна використовувати вкладені записи. Наприклад,
type
gruppa=record
fio : string[20];
rik_vst:word;
data_r:record
d,m,g:word; {день, місяць, рік}
end;
end;
var
gr:gruppa;
В цьому разі ім’я поля буде складатись з послідовності імен записів і імені поля, розділених крапкою. Наприклад, gr.data_r.d
Для двох записів одного типу можна виконувати оператор присвоювання.
Розробка програм з використанням записів
Приклад 1. Сформувати масив даних про студентів групи. По кожному студенту необхідно мати дані: ПІБ, дата народження, стать. Вивести перелік юнаків, що народились в 1988 році.
Program
student;
type
TStudent=record
FIO:string[20];
pol:char;
Data_r:record
d,m,g:word;
end;
end;
var
st:array[1..35]
of TStudent;
i,k:word;
begin
k:=0;
writeln
('Введення
даних про студентів');
repeat
k;=k+1;
writeln
('Введіть
ПІБ студента (* для
завершення
вводу) ');
readln
(st[k].FIO);
if
st[k].FIO<>'*' then
begin
write
('Введіть
стать (ч/ж): ');
readln
(st[k].pol);
write
('Введіть
дату народження (день, місяць, рік)');
with
st[k].Data_r do
readln
(d,m,g);
end;
until
(st[k].FIO=’*’) or {k=35) ;
writeln
('Дані
про юнаків 1989 року народження:');
for
i:=1 to k-1 do
if
(st[i].pol in ['ч','Ч'])
and
((
st[i].Data_r.g=1988)
or
(st[i].Data_r.g=88))
then
writeln
(st[i].FIO);
end.
Завдання для самоперевірки.
Описати тип даних для опису книги. Для книги повинно бути вказано: назву, автор, видавництво, рік видання, кількість сторінок.
Описати тип для представлення часу в годинах, хвилинах і секундах.
Чи вірно, що поля запису повинні бути різних типів?
Чому при опису запису поля можуть перелічуватись в довільному порядку?
Імена полів запису можуть співпадати з іменами змінних?
Імена полів одного запису можуть співпадати з іменами полів другого запису?
Маємо опис
Type
TKolo=record
Radius:real;
Centr:record
X,Y:real;
end;
End;
Var
Kolo:TKolo;
Необхідно сформувати змінну Kolo таким чином, щоб описати коло з радіусом 2.5 і з центром в точці (2, 6.8).
Маємо опис
Type
Tmebel=record
Name:string[30];
Cina:real;
Rozmir:record
dl,shir,visota:word;
end;
virobnic:string[60];
end;
Описати структуру для зберігання даних про 50 видів меблів.
Записати оператори, за допомогою яких задається розмір меблі для першого виду в списку.
Які операції допускається виконувати над записами?
Чим відрізняється масив від запису?
Типізовані константи
В програмі можна задавати стартові значення для змінних. Для цього вони повинні бути описані як типізовані константи, тобто в розділі опису констант описуються змінні з вказівкою їх типу і задаються їх значення як для констант.
Формат опису типізованих констант:
Const
<імя змінної>:<тип змінної>=<значення змінної>;
Запис значень для змінної залежить від типу змінної.
Запис значень для змінних простих типів.
Значення записується згідно синтаксису мови. Наприклад :
Const
massa:real=456.7;
Name:string=’Марія’;
Kod:char=’g’;
Запис значень для одновимірних масивів.
Значення обмежується круглими дужками, елементи розділяються комами. Формат:
Const
<імя масиву>:array[1..N] of <тип елементів>=
(<значення 1-го елементу>,<значення 2-го елементу>,…<значення N-го елементу>);
Наприклад:
Const
Mas:array[1..3] of real=(6.8,-0.76,2.89);
MName:array[1..3} of string[10]=( ’Саша’,’Маша’,’Даша’);
MSimbol:array[1..4] of char=(’d’,’t’,’s’,’f’);
Запис значень для двовимірних масивів.
Двовимірний масив можна розглядати як одновимірний масив рядків, а рядок, в свою чергу, є також одновимірним масивом. Запис значень для кожного масиву підпорядковується вище описаним правилам, тобто: все значення обмежується круглими дужками в яких, розділяючись комами, в круглих дужках перелічуються через кому елементи кожного рядку.
Const
<імя масиву>:array[1..N,1..M] of <тип елементів>=
((<знач. 1-го ел. 1-го рядку>,<знач. 2-го ел. 1-го рядку>,…<знач. M-го ел. 1-го рядку>),
(<знач. 1-го ел. 2-го рядку>,<знач. 2-го ел. 2-го рядку>,…<знач. M-го ел. 2-го рядку>),
...,
(<знач. 1-го ел. N-го рядку>,<знач. 2-го ел. N-го рядку>,…<знач. M-го ел. N-го рядку>));
Наприклад:
Const
Matr:array[1..3,1..3] of real=((6.8,-0.76,2.89),
(-4.7,45.98,-7.9),
(4.9,-8.77,9.0));
MName:array[1..3,1..2} of string[10]=((’Саша’,’Маша’),
(’Даша’,’Микола’),
(’Світлана’,’Данило’));
MSimb:array[1..2,1..4] of char=((’d’,’t’,’s’,’f’),
(’9’,’r’,’/’,’d’));
Запис значень для множин.
Значення для множини записується як константа типу множини. Формат:
Const
<імя змінної>:set of <тип елементів>=[<список значень>];
Наприклад:
Const
Mn=set of byte=[7,9,4,7,56,88];
Ms=set of char[[‘r’,’y,’,q’,’s’];
Запис значень для записів.
Все значення для запису обмежується круглими дужками в яких записуються значення для полів запису. Значення полів відокремлюються один від одного символом „крапка з комою”. Для кожного поля вказується його імя і значення, між яким и ставиться символ двокрапки. Формат:
Const
<імя змінної>:<тип запису>=(<імя поля 1>:<значення>;
<імя поля 2>:<значення>; … <імя поля N>:<значення>);
Наприклад:
Type
Tz=record
Name:string[20];
Pol:char;
God:word;
end;
Const
z:Tz=(Name:’Іванов Іван’; Pol:’ж’; God:1989);
Завдання для самоперевірки.
Описати типізовану константу для надання початкового значення року народження.
Описати типізовану константу для множини голосних літер.
Описати типізовану константу для масиву трьох цілих значень.
Описати типізовану константу для масиву чотирьох логічних значень.
Маємо опис
Type
TStudent=record
FIO:string[20];
Pol:char;
God:word;
end;
Описати типізовану константу для масиву трьох записів цього типу.
Маємо опис
Type
TStudent=record
FIO:string[20];
Pol:char;
Data_R:array[1..3] of word;
end;
Описати типізовану константу для масиву двох записів цього типу.
Маємо опис
Type
TStudent=record
FIO:string[20];
Pol:char;
Data_R:record
D,m,g:word;
end;
end;
Описати типізовану константу для масиву двох записів цього типу.
Файли
Визначення файлу. Типи файлів. Фізичні і логічні файли.
Організація процесу запису даних на зовнішні носії і зчитування з них.
Процедури і функції для всіх типів файлів.
Текстові файли.
Компонентні файли.
Послідовний та прямий доступ до файлів.
Файл – це поіменована необмежена впорядкована сукупність даних, що мають внутрішню структуру.
Pascal дозволяє працювати з файлами трьох типів :
текстові
компонентні (типізовані)
безтипові
Pascal розрізняє фізичні і логічні файли. Фізичні файли – це файли в поняттях операційної системи. Логічний файл – це файлова змінна одного з файлових типів. Тобто, фізичний файл – це файл, який існує фізично на диску і характеризується шляхом до нього, іменем, розширенням, датою створення, розміром, типом. В програмі для позначення об’єктів використовуються змінні. Для роботи з файлами також необхідно використовувати змінну. Така змінна повинна представляти фізичний файл у програмі і тому вона називається логічним файлом. Щоб працювати з файлом в програмі необхідно зв’язати файлову змінну з фізичним файлом. Для цього використовується спеціальна процедура
ASSIGN (<файлова змінна>,<специфікація фізичного файлу>);
Після цього файл необхідно створити або відкрити і тільки потім з ним працювати.
Кожен файл закінчується спеціальним кодом „кінець файлу”.
При роботі з файлами використовується файловий вказівник, який вказує на елемент файлу, з яким будуть виконуватись дії. При відкритті файлу він встановлюється на початок файлу, тобто на перший елемент файлу. При зчитуванні або запису елементу він переміщується на наступний.
До стандартних пристроїв можна звертатись як до текстових файлів. Стандартне імя для виводу на екран або вводу з клавіатури CON. Для виводу на друк - PRN.
Організація процесу запису даних на зовнішні носії і зчитування з них.
Для запису даних на зовнішні носії або зчитування з них використовується спеціальний буфер вводу-виводу. Розмір буферу встановлюється системою. Використання буферу повязано з тим, що обмін даними з зовнішньою памяттю довше ніж з оперативною. На організацію звязку з зовнішньою памяттю також потрібен час. Щоб зменшити кількість звернень до зовнішньої памяті при виводі, дані спочатку накопичуються в буфері вводу-виводу, а потім дані з буферу записуються на зовнішній носій за один сеанс звязку. При зчитуванні даних з зовнішнього носія, дані заносяться в буфер, а потім записуються в структури даних програми.
Якщо програма працює з файлом, тобто заносить в нього дані і зчитує дані, то при запису даних в файл необхідно примусово записати дані з буферу вводу-виводу в файл, щоб в разі зчитування мати в файлі всі записані в нього дані. Дію по примусовому запису буферу вводу-виводу в файл виконує процедура закриття файлу CLOSE(F).