Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Konspekt_lektsy_Pascal_C.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.85 Mб
Скачать

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.

Завдання для самоперевірки.

  1. Чим вiдрiзняється процедура вiд функцiї

  2. Записати заголовок для функцiї, що приймає 2 аргументи цiлого типу i повертає результат дійсного типу

  3. Записати заголовок для функцiї, що приймає масив 10 елементiв цiлого типу i повертає результат цілого типу

  4. Записати заголовок для функцiї, яка отримує в якостi параметра 2 цiлих значення і повертає значення цілого типу

  5. Записати заголовок процедури, яка отримує в якостi параметра 2 цiлих значення і повертає значення цілого типу

  6. Перелічити типи формальних параметрiв.

  7. Розробити програму, яка формує три масиви різного розміру (але не більше 50 елементів) цілих значень. Знайти середнє арифметичне всіх значень з 3-х масивів.

  8. Розробити програму, яка формує два строкових масиви даних різного розміру (але не більше 30 елементів) і знаходить найдовше значення.

Модулі Pascal

    1. Визначення модуля

    2. Структура модуля

    3. Створення модуля.

    4. Підключення модуля.

    5. Модуль CRT

    6. Модуль 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.

Створення модуля.

    1. Створити текстовий файл в середовищі Turbo Pascal, що вміщує текст модуля.

    2. Зберегти його з тим же ім’ям, яке записано в заголовку модуля. Отримаємо текстовий файл з розширенням pas.

    3. По умовчанню скомпільовані файли знаходяться в оперативній пам’яті. Файл модуля необхідно зберегти на диску. Для цього необхідно скористатись пунктом меню Options + Linker. В стопчику Link buffer відмітити Disk в необхідному рядку.

    4. Скомпілювати модуль. (Alt+ F9). Отримаємо двійковий файл з розширенням tpu. Щоб знати де розміститься цей файл, необхідно відкрити вікно призначення каталогів. Для цього необхідно скористатись пунктом меню Options + Directory. Відкриється вікно в якому видно призначення каталогів. В першому рядку з назвою „EXE & TPU directory” повинно бути записано шлях до каталогу в якому зберігаються модулі. Якщо рядок пустий, то файл модуля збережеться в поточному каталозі. Файл модуля буде мати те ж ім’я, що і текстовий файл модуля і розширення tpu.

Підключення модуля

  1. Відкрити новий файл в середовищі Turbo Pascal для введення тексту програми яка буде використовувати створений модуль.

  2. Записати заголовок програми.

  3. В другому рядку за допомогою директиви USES підключити модуль.

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

Розробка програм з використанням власних бібліотек(модулів)

Приклад 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.

Завдання для самоперевірки.

  1. Який сенс в використанні модулів.

  2. Яким чином підключається модуль до програми.

  3. Призначення розділу обяв.

  4. Призначення розділу реалізацій.

  5. Призначення розділу ініціалізації.

Модуль 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 (<тип лінії>, <шаблон>, <товщина>).

44’ЁЄ «ч­чщ4444:

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

Складні типи даних

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

Складні типи можна поділити на структуровані, посилання і процедурні типи.

Структуровані типи даних

  1. Масиви

  2. Строкові дані

  3. Множини

  4. Записи

  5. Типізовані константи

  6. Файли

  7. Об’єкти

Масиви

  1. Одновимірні масиви.

  2. Багатовимірні масиви. Двовимірні масиви (матриці).

Масив - це обмежена послідовність елементів одного типу.

Кожний елемент в масиві має свій порядковий номер. Елементи масиву можна перерахувати (проіндексувати). Індексом може бути довільний перелічувальний тип.

Масив характеризується іменем, розміром і типом елементів.

Масиви можуть бути одновимірні і багатовимірні.

Одновимірні масиви

Формат опису типу "масив" для одновимірних масивів:

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

Завдання для самоперевірки.

    1. Маємо опис

Type

Vector=array [1..30] of real;

Var

Dan:Vector;

Скільки елементів в масиві Dan?

Назвати перший і останній елементи масиву.

    1. Маємо опис

Type

day=(yesterday, today, tomorrow);

Var

Dan:array [day] of 0..24;

Скільки елементів в масиві Dan?

Які значення може приймати індекс?

Назвати перший і останній елементи масиву.

Які значення можуть приймати елементи масиву?

    1. Описати масив, елементами якого є натуральні числа, а індексами довільні символи.

    2. Чи можна в процесі виконання програми змінити розмір масиву?

    3. Масив може складатись з одного елементу? Описати його.

    4. Описати масив розміром 10 елементів, значеннями яких може бути true або false.

    5. Маємо опис

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;

    1. Маємо опис

Type

TMas=array of [1..5,1..5] of real ;

Var

A,B:TMas;

Скільки елементів містить масив А?

Назвати перший і останній елементи масиву.

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

    1. Визначити кількість нульових елементів в заданому масиві.

    2. Задано 20 чисел. Визначити, скільки серед них чисел, що дорівнюють останньому.

    3. Задано масив з 10 символів. Вивести символи в зворотному порядку.

    4. Задано масив з 30 цифрами. Визначити, яка цифра в ньому зустрічається найчастіше.

    5. Задано масив 20 символів. Визначити, чи порядок символів з початку масиву до кінця і навпаки однаковий. Наприклад, абвгддгвба.

    6. Знайти суму всіх елементів матриці 5х5.

    7. Підрахувати суму додатних елементів в кожному рядку матриці 5х6.

    8. М асив розміром 12х31 містить дані про температуру в місті. Визначити дні, коли була найвища і найнижча температура.

    9. Розробити програму формування матриці за зразком: 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.

Завдання для самоперевірки.

  1. Записати оператор який змінній sign присвоює третє слово з рядка „Люби діло – майстром будеш”.

  2. Записати оператор який змінній n присвоює номер символу „ , ” в рядку „Яка пряха, така на ній і рубаха”.

  3. Записати оператор який з рядку „Золотые руки у того, кто обучался очень хорошо” вилучає слово „очень”.

  4. Записати оператор який вставляє слово „топором” перед словом „тяпать” в рядку „Без ума ни тяпать, ни ковырять лапоть”.

  5. Дано рядок, який складається з двох слів, розділених комою. Вивести ці слова за абеткою.

  6. Вилучити з заданого рядку всі входження заданого слова.

  7. Дано текст, що складається з послідовності слів, розділених комою. Текст закінчується крапкою. Підрахувати кількість введених слів і знайти найбільше слово в лексикографічному значенні.

  8. Підрахувати, скільки раз в заданому тексті зустрічається вказане слово.

Множини

Множинаце не обмежена сукупність даних одного перелічувального типу.

Не обмежена в тому сенсі, що наперед не встановлюється кількість елементів в множині, але розмір сукупності обмежений. Максимальна кількість елементів множини - 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;

Правила використання множин.

    1. Множина задається у вигляді списку елементів, взятих у квадратні дужки. Елементи розділяються комами. Наприклад: ['a','o','e','j'], [2,4,7,24,89].

    2. Пуста множина задається як квадратні дужки, розташовані поряд: []. Наприклад, задати пусту множину: mn:=[];

    3. Елементами множини можуть бути константи, змінні, вирази, діапазони відповідного базового типу. Наприклад, якщо маємо

Var

X:byte;

Можна записати множину [2,17,X,2*X+37,5..25].

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

    2. Порядок розміщення елементів в множині не має значення. Наприклад, множини [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.

Завдання для самоперевірки.

  1. Визначити [‘a’,’p’,’k’,’s’]+[‘h’,’k’,’f’,’p’]

  2. Визначити [‘h’,’k’,’f’,’p’][‘u’,’f’,’h’]

  3. Змінній присвоїти множину голосних літер.

  4. Змінній присвоїти множину приголосних літер.

  5. Змінній присвоїти множину всіх цифр.

  6. Змінній присвоїти множину літер, які більше ‘г’, але менше ‘л’.

  7. Визначити значення [3,6..8] <= [2..7,9]

  8. Визначити значення [5,8,4]=[8,5,4]

  9. Визначити значення 5 in [8,9,4].

  10. Змінній В присвоїти множину, яка отримана з множини А за допомогою додавання елемента х.

  11. Змінній В присвоїти множину, яка отримана з множини А за допомогою віднімання елемента х.

  12. Розробити програму: З заданого тексту вибрати всі голосні літери, які в ньому зустрічаються, і вивести їх.

  13. Розробити програму: Сформувати множину, яка складається з чисел, вибраних з проміжку [1..200] випадковим чином.

  14. Розробити програму: З заданого тексту вибрати всі літери, які в ньому зустрічаються більше одного разу, і вивести їх.

  15. Розробити програму: Дано масив, елементами якого є множини типу 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.

Завдання для самоперевірки.

  1. Описати тип даних для опису книги. Для книги повинно бути вказано: назву, автор, видавництво, рік видання, кількість сторінок.

  2. Описати тип для представлення часу в годинах, хвилинах і секундах.

  3. Чи вірно, що поля запису повинні бути різних типів?

  4. Чому при опису запису поля можуть перелічуватись в довільному порядку?

  5. Імена полів запису можуть співпадати з іменами змінних?

  6. Імена полів одного запису можуть співпадати з іменами полів другого запису?

  7. Маємо опис

Type

TKolo=record

Radius:real;

Centr:record

X,Y:real;

end;

End;

Var

Kolo:TKolo;

Необхідно сформувати змінну Kolo таким чином, щоб описати коло з радіусом 2.5 і з центром в точці (2, 6.8).

  1. Маємо опис

Type

Tmebel=record

Name:string[30];

Cina:real;

Rozmir:record

dl,shir,visota:word;

end;

virobnic:string[60];

end;

Описати структуру для зберігання даних про 50 видів меблів.

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

  1. Які операції допускається виконувати над записами?

  2. Чим відрізняється масив від запису?

Типізовані константи

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

Формат опису типізованих констант:

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);

Завдання для самоперевірки.

  1. Описати типізовану константу для надання початкового значення року народження.

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

  3. Описати типізовану константу для масиву трьох цілих значень.

  4. Описати типізовану константу для масиву чотирьох логічних значень.

  5. Маємо опис

Type

TStudent=record

FIO:string[20];

Pol:char;

God:word;

end;

Описати типізовану константу для масиву трьох записів цього типу.

  1. Маємо опис

Type

TStudent=record

FIO:string[20];

Pol:char;

Data_R:array[1..3] of word;

end;

Описати типізовану константу для масиву двох записів цього типу.

  1. Маємо опис

Type

TStudent=record

FIO:string[20];

Pol:char;

Data_R:record

D,m,g:word;

end;

end;

Описати типізовану константу для масиву двох записів цього типу.

Файли

    1. Визначення файлу. Типи файлів. Фізичні і логічні файли.

    2. Організація процесу запису даних на зовнішні носії і зчитування з них.

    3. Процедури і функції для всіх типів файлів.

    4. Текстові файли.

    5. Компонентні файли.

    6. Послідовний та прямий доступ до файлів.

Файл – це поіменована необмежена впорядкована сукупність даних, що мають внутрішню структуру.

Pascal дозволяє працювати з файлами трьох типів :

  • текстові

  • компонентні (типізовані)

  • безтипові

Pascal розрізняє фізичні і логічні файли. Фізичні файли – це файли в поняттях операційної системи. Логічний файл – це файлова змінна одного з файлових типів. Тобто, фізичний файл – це файл, який існує фізично на диску і характеризується шляхом до нього, іменем, розширенням, датою створення, розміром, типом. В програмі для позначення об’єктів використовуються змінні. Для роботи з файлами також необхідно використовувати змінну. Така змінна повинна представляти фізичний файл у програмі і тому вона називається логічним файлом. Щоб працювати з файлом в програмі необхідно зв’язати файлову змінну з фізичним файлом. Для цього використовується спеціальна процедура

ASSIGN (<файлова змінна>,<специфікація фізичного файлу>);

Після цього файл необхідно створити або відкрити і тільки потім з ним працювати.

Кожен файл закінчується спеціальним кодом „кінець файлу”.

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

До стандартних пристроїв можна звертатись як до текстових файлів. Стандартне імя для виводу на екран або вводу з клавіатури CON. Для виводу на друк - PRN.

Організація процесу запису даних на зовнішні носії і зчитування з них.

Для запису даних на зовнішні носії або зчитування з них використовується спеціальний буфер вводу-виводу. Розмір буферу встановлюється системою. Використання буферу повязано з тим, що обмін даними з зовнішньою памяттю довше ніж з оперативною. На організацію звязку з зовнішньою памяттю також потрібен час. Щоб зменшити кількість звернень до зовнішньої памяті при виводі, дані спочатку накопичуються в буфері вводу-виводу, а потім дані з буферу записуються на зовнішній носій за один сеанс звязку. При зчитуванні даних з зовнішнього носія, дані заносяться в буфер, а потім записуються в структури даних програми.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]