Розробка програм з використанням множин
Приклад 1. Вводиться послідовність символів. Введення закінчується крапкою. Необхідно вивести за абеткою всі малі латинські літери.
Для рішення таких задач зручно використовувати множини: при вводі формувати множину всіх введених малих латинських літер. Для виводу необхідно переглянути всю латинську абетку, перевіряючи входження кожної літери в сформовану множину. Якщо літери міститься в множині, то вона виводиться.
|
Приклад 2. Вводиться послідовність символів, що складається з послідовності слів, розділених комою. В кінці рядка крапка. Необхідно визначити голосні букви, що входять в кожне слово. Надрукувати їх.
|
Завдання для самоперевірки.
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 році.
Завдання для самоперевірки.
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).
8. Маємо опис
Type
Tmebel=record
Name:string[30];
Cina:real;
Rozmir:record
dl,shir,visota:word;
end;
virobnic:string[60];
end;
Описати структуру для зберігання даних про 50 видів меблів.
Записати оператори, за допомогою яких задається розмір меблі для першого виду в списку.
9. Які операції допускається виконувати над записами?
10. Чим відрізняється масив від запису?
Типізовані константи
В програмі можна задавати стартові значення для змінних. Для цього вони повинні бути описані як типізовані константи, тобто в розділі опису констант описуються змінні з вказівкою їх типу і задаються їх значення як для констант.
Формат опису типізованих констант:
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;
Описати типізовану константу для масиву трьох записів цього типу.
6. Маємо опис
Type
TStudent=record
FIO:string[20];
Pol:char;
Data_R:array[1..3] of word;
end;
Описати типізовану константу для масиву двох записів цього типу.
7. Маємо опис
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).
Дії, які можна виконувати над файлами всіх типів:
Процедури або функції | Д і я |
ASSIGN (F,<ім'я файлу>) | Зв’язує файлову змінну -F- з вказаним ім’ям фізичного файлу |
REWRITE (F) | Створює файл з логічним ім’ям -F- для запису, якщо цей файл не існує. Якщо існує - вся інформація у файлі знищується |
RESET (F) | Відкриває файл з логічним ім’ям -F- для читання або позиціонує відкритий файл на його початок |
CLOSE (F) | Зачиняє файл з логічним ім’ям -F-. |
RENAME (F,<нове ім’я файлу>) | Перейменовує фізичний файл, раніше зв’язаний з файловою змінною -F- в указане ім’я. Застосовується тільки для зачинених файлів. |
ERASE (F) | Знищує фізичний файл, зв’язаний з файловою змінною -F-. Застосовується тільки для зачинених файлів. |
EOF (F) | Функція повертає. TRUE, якщо досягнуто кінця файлу -F-. Інакше FALSE. |
Текстові файли містять дані в строковому форматі і складаються з кодів символів, що включають розширені коди та коди управління. Текстові файли організуються по рядкам. Кожен рядок закінчується спеціальним кодом „кінець рядку”.
При запису в файл вся числова інформація перетворюється в строкову, а при читанні із файла - в числову. При запису можна використовувати форматування.
Формат опису файлової змінної:
F:TEXT;
Процедури та функції для текстових файлів
Процедури або функції | Д і я |
SetTextBuf ( F,< буфер>) | Встановлення розміру буферу вводу -виводу по умовчанню |
Append (F) | Відкрити файл для доповнення. Файл відкривається і файловий вказівник встановлюється після останнього елементу файлу. |
Flush (F) | Вивід вмісту буфера вводу-виводу в файл |
Eoln (F) | =true якщо досягнуто кінця рядка |
SeekEoln (F) | =true якщо досягнуто кінця рядка або файлу або перед ними стоять лише пропуски та табуляція |
SeekEof (F) | =true якщо досягнуто кінця файлу або перед ним стоять символи кінця рядка, пропуски або табуляція |
Операції введення -виведення:
Для зчитування даних з текстового файлу використовуються процедури
READ | READLN (F,<список вводу>);
Елементами списку вводу можуть бути тільки змінні. Елементи списку вводу розділяються комами. При використанні форми READLN після задовільнення списку вводу здійснюється перехід на наступний рядок, не залежно від того, чи досягнуто кінця рядку. Процедура READLN(F); здійснює перехід до наступного рядку.
Для запису даних в файл використовуються процедури
WRITE | WRITELN (F,<список виводу>);
Елементами списку виводу можуть бути константи, змінні, вирази. Елементи списку вводу розділяються комами. Можна вказувати формат виводу. Тип змінних списку вводу-виводу може бути тільки цілим, дійсним, символьним, строковим, логічним. Структуровані типи можуть бути введено-виведено тільки по елементам. При використанні форми WRITELN після запису всіх елементів виводу формується код кінця рядку.
При запису в файл необхідно подбати про розділовий знак між елементами виводу при розміщенні в файлі. Таким знаком є символ „проміжок” для всіх типів, крім строкового. Строкові дані необхідно записувати по одному в рядок. Таким чином, запис в файл трьох чисел буде виглядати:
writeln (F,24,’ ’,35,’ ’,67);
Процедура WRITELN (F); формує код кінця рядку.
Компонентні файлискладаються з послідовності компонент однієї структури. Інформація в цих файлах зберігається в машинних кодах. Компонентами можуть бути довільні типи даних.
Формат опису файлової змінної:
F : File of <тип компоненти>;
Компоненти називають записами файлу. Розмір всіх записів однаковий.
Наприклад:
var F:file of integer; F1:file of real; f5:file of string[30];
Type TM =array[1..10] of real; var F3:file of TM;
Type Tz =record
a,b,c:byte;
end;
var f6:file of Tz;
Операції введення -виведення:
Зчитування даних з файлу і запис даних в файл виконується тільки по компонентам.
Для зчитування даних з файлу використовується процедура
READ (F,<ім’я змінної типу компоненту>);
Для запису даних в файл використовується процедура
WRITE (F,<ім’я змінної типу компоненту>);
Послідовний та прямий доступ до файлів
Послідовний доступ означає, що кожний наступний елемент файлу може бути прочитаним тільки після читання попереднього. Послідовний доступ є природнім для всіх типів файлів.
Прямий доступ визначає можливість позиціонувати в файлі на довільний запис.
Послідовний доступ може бути використано для файлів довільного типу. Прямий - тільки для типізованих та безтипових файлів. Це зв¢язано з тим, що в текстових файлах, організованих по рядках, довжина рядка може бути довільною і прочитати, наприклад, третій рядок неможливо не прочитавши два попередні. В компонентних та безтипових файлах розмір кожного елементу (запису) має визначений розмір. Тому можна завжди підрахувати положення конкретного N-го запису. Для цього потрібно розмір запису помножити на кількість записів, що передують даному (N-1)
Нумерація записів починається з 0.
Процедури та функції для прямого доступу:
Процедури або функції | Д і я |
FileSize (F) | Повертає число записів в файлі |
FilePos (F) | Повертає номер поточного запису |
Seek (F,<номер запису>) | Встановлює поточним вказаний запис |
Truncate (F) | Відсікає частину файлу, починаючи з поточного запису до кінця файлу |
Щоб дописати дані в файл, необхідно встановити файловий указник після останнього запису. Для цього потрібно виконати процедуру Seek(f,FilePos(f));
Розробка програм з використанням файлів.
При читанні файлу завжди необхідно використовувати цикл тільки
While not eof(f) do
Приклад 1.Сформувати текстовий файл з довільних рядків. Завершити введення вводом символу *. Вивести вміст файлу, пропускаючи пусті рядки, і підрахувати кількість пустих рядків.
Program TFile;
var
F:text;
k:integer;
s:string;
begin
assign (f,'File.txt');
rewrite (f);
writeln (’Введіть рядки’);
Repeat
Readln (S);
Writeln (F,s);
Until S=’*’;
Flush (f);
Reset (f);
k:=0;
while not eof(f) do
begin
readln (f,S);
if S<>’’ then writeln (S)
else inc(k);
end;
writeln (’В файлі ’,k,’ пустих рядків’);
close (f);
end.
Приклад 2.Висхідний файл вміщує текст, розбитий на рядки довільної довжини. Створити новий файл, який буде вміщувати той же текст, але рядки будуть довжиною 20 символів.
Program TextFile;
var
F,N:text; {файлові змінні}
ch:char;
k:integer; {кількість символів}
s:string;
begin
assign (f,'old.txt');
{відкриття існуючого файлу}
reset (f);
assign (n,'new.txt');
{файл не існує, або існуючий очищуємо}
rewrite (n);
k:=0; {}
while not eof(f) do
begin
read (f,ch);
if eoln(f) then
readln (f); {якщо символ „кінець рядку”, то
читаємо інший символ}
inc(k);
if k>20 then
begin
writeln(n);
k:=1;
end;
write (n,ch);
end;
flush (n);
reset (n);
while not eof (n) do
begin
readln (n,s);
writeln (s);
end;
close (f);
close (n);
end.
Вмістиме файлу old.txt:
Good day, my dear Masha!
Haw do you do? My name is Unknown.
Good by!
Вмістиме файлу new.txt:
Good day, my dear Ma
sha!Haw do you do? M
y name is Unknown.Go
od by!
Приклад 3.Розробити програму реєстрації пасажирів аеропорту. Вивести дані про пасажирів, що зареєструвались на вказаний рейс та мають багаж не більше 30 кг.
В даному прикладі необхідно використати компонентний файл тому, що дані про кожного пасажира складаються з декількох значень. Для опису таких даних зручно використати тип даних „запис”.
Program Reyses;
type
TPas=record
Fio:string[20];
NReys:word;
Massa_bag:real;
Data:record
d,m,g:word;
end;
end;
var
F: file of TPas;
Pas:Tpas;
N:word;
begin
assign (f,'Passagir.dat');
rewrite (f);
writeln ('Реєстрація пасажирів:');
REPEAT
WRITE ('Введіть ПІБ (Для завершення вводу *)');
READLN(Pas.fio);
if Pas.Fio<>'*' then
begin
write ('Введіть рейс ');
readln (Pas.NReys);
write ('Введіть масу багажу ');
readln (Pas.massa_bag);
write ('Введіть дату вильоту (d m g)');
with Pas.Data do
readln (d,m,g);
write (f,Pas);
end;
until Pas.Fio='*';
close (f);
reset (f);
write ('Введіть номер рейсу для виводу даних ');
readln (N);
writeln (‘Список пасажирів, зареєстрованих на рейс ’,n);
while not eof (f) do
begin
read (f,Pas);
if (Pas.NReys=N) and (Pas.massa_bag<30) then
Writeln (Pas.Fio);
end;
close (f);
end.
Протокол роботи програми:
Реєстрація пасажирів:
Введіть ПІБ (Для завершення вводу *) Ivanov
Введіть рейс 123
Введіть масу багажу 25
Введіть дату вильоту (d m g)12 09 2004
Введіть ПІБ (Для завершення вводу *) Petrov
Введіть рейс 123
Введіть масу багажу 35
Введіть дату вильоту (d m g)13 09 2004
Введіть ПІБ (Для завершення вводу *) Cidorov
Введіть рейс 234
Введіть масу багажу 15
Введіть дату вильоту (d m g)13 09 2004
Введіть ПІБ (Для завершення вводу *) *
Введіть номер рейсу для виводу даних 123
Список пасажирів, зареєстрованих на рейс 123
Ivanov
Приклад 4.В файлі, що містить дані реєстрації пасажирів аеропорту, замінити номер вказаного рейсу на інший. Нові дані надрукувати.
Program KorReyses;
type
TPas=record
Fio:string[20];
NReys:word;
Massa_bag:real;
Data:record
d,m,g:word;
end;
end;
var
F: file of TPas;
T:Text;
Pas:Tpas;
N,New:word;
begin
assign (f,'Passagir.dat');
reset (f);
write ('Введіть номер рейсу, який потрібно замінити');
readln (N);
write ('Введіть новий номер рейсу);
readln (New);
while not eof (f) do
begin
read (f,Pas);
if Pas.NReys=N then
begin
Pas.NReys:=New;
seek(f,filepos(f)-1);
write (f,Pas);
end;
end;
close (f);
reset (f);
assign (T,’PRN’);
rewrite (T);
writeln (‘Список пасажирів’);
while not eof (f) do
begin
read (f,Pas);
Writeln (T,Pas.NReys,Pas.Data.d:4, Pas.Data.m:2,
Pas.Data.g);
Writeln (T,Pas.Fio);
end;
close (f);
end.
Приклад 5.З файлу, що містить дані реєстрації пасажирів аеропорту, вилучити всі дані про пасажирів, що зареєструвались на вказаний рейс.
Program DelReyses;
type
TPas=record
Fio:string[20];
NReys:word;
Massa_bag:real;
Data:record
d,m,g:word;
end;
end;
var
F: file of TPas;
T:Text;
Pas:Tpas;
N,Nz:word;
begin
assign (f,'Passagir.dat');
reset (f);
write ('Введіть номер рейсу, дані по якому потрібно вилучити');
readln (N);
while not eof (f) do
begin
read (f,Pas);
if Pas.NReys=N then
begin
Nz:=FilePos(f)-1;
while not eof (f) do
begin
read (f,Pos);
seek(f,filepos(f)-1);
write (f,Pas);
seek(f,filepos(f)+1);
end;
seek (fileSize(f)-1);
truncate (f);
seek (f,Nz);
end;
end;
close (f);
reset (f);
assign (T,’PRN’);
rewrite (T);
writeln (’Список пасажирів’);
while not eof (f) do
begin
read (f,Pas);
Writeln (T,Pas.NReys,Pas.Data.d:4, Pas.Data.m:2,
Pas.Data.g);
Writeln (T,Pas.Fio);
end;
close (f);
end.
Завдання для самоперевірки.
2. Скільки елементів може бути у файла?
3. Елементи файла повинні бути однаковими чи можуть бути різними?
4. Які типи доступу можуть бути до файлу?
5. Які дії необхідно виконати щоб дописати дані в текстовий файл?
6. Які дії необхідно виконати щоб дописати дані в компонентний файл?
7. Яким чином можна скопіювати вміст файлу в інший файл?
8. Що означає прямий доступ до файлу.
9. Яким чином система виконує запис даних до файлу.
10. Яким буде вміст файлу після виконання процедури Rewrite(f);
11. Розробити програму яка в текстовому файлі в початок кожного рядку вставляє номер цього рядку.
12. Розробити програму яка в текстовому файлі зчитує рядок вказаного номеру і виводить відповідне сповіщення якщо рядку з таким номером немає.
13. В текстовому файлі знайти найдовший рядок.
14. Розробити програму формування текстового файлу з 9 рядків, де в першому рядку буде записано одну літеру „1”, в другому - дві літери „2”, ..., в дев¢ятому - дев¢ять літер „9”.
15. Файл містить дані про студентів. По кожному студенту вказується ПІБ, курс, група, оцінки по трьом екзаменам. Надрукувати дані про студентів, що мають двійки з екзаменів.
16. Маємо два файли, що містять цілі числа, впорядковані по зростанню. Створити третій файл, об¢єднавши дані з двох заданих таким чином, щоб в ньому дані теж були впорядковані по зростанню.
Посилання. Динамічні структури
1) Визначення.
2) Операція роз’іменування.
3) Використання „кучі”.
Змінні, розглянуті раніше, називаються статичними, тому, що пам¢ять для них відводиться в процесі трансляції програми. Всі змінні, що об¢являються в програмі, розміщуються в одній неперервній області пам¢яті, яка називається сегментом даних. Розмір сегменту обмежений. Це може не дозволити обробляти великі масиви даних. Для рішення цього питання використовується динамічна пам¢ять.
Динамічна пам¢ять - це оперативна пам¢ять, яка відводиться програмі під час її роботи за виключенням сегменту даних, стеку і тіла програми. Динамічне розміщення даних означає використання динамічної пам¢яті для розміщення даних під час роботи програми.
За допомогою динамічної пам¢яті можна формувати динамічні структури даних. Динамічними структурами даних вважаються такі, розмір яких в процесі роботи попередньо не відомий або змінюється і для яких місце в пам’яті комп’ютера відводиться під час виконання програми.
Основний механізм організації динамічних даних - виділення в спеціальній області пам’яті, "кучі", безперервної ділянки потрібного розміру і зберігання адреси початку цієї ділянки в спеціальній змінній. Такі змінні мають посилальний тип і називаються посиланнями.
Формат визначення типу:
TYPE
< ім’я посилального типу>=^<ім’я барового типу>;
Формат визначення посилальної змінної:
<ім’я змінної>:^<ім’я базового типу>;
<ім’я змінної>:<ім’я посилального типу>;
Наприклад:
TYPE
TM=array [1..50] of real;
TZ=record
A,b,c:real;
End;
TPi=^integer;
TPr=^real;
TPm=^TM;
TPz=^TZ;
Відповідні змінні:
VAR
i:TPi;
r:TPr;
mas:TPm;
z:TPz;
b:^byte;
Всі посилальні змінні мають однаковий розмір, рівний 4 байтам, і містять адресу початку ділянки оперативної пам’яті, в якій розміщується динамічна структура даних.
Щоб посилання ні на що не вказувало, змінній присвоюється значення NIL.
Операція роз’іменування
Щоб отримати значення, на яке вказує посилання, потрібно виконати операцію роз’іменування.
Ця операція позначається символом " ^ " який записується після імені посилальної змінної.
Якщо J - посилальна змінна, то J^ - значення, на яке вказувало посилання.
Посилання можуть зрівнюватись між собою.
Посилання на структури індексуються для масивів і поділяються на поля для записів та об’єктів.
MAS^[і] - доступ до і-го елементу динамічного масиву.
REC^.<ім’я поля> - доступ до поля запису або об’єкту.
Після об’яви в програмі посилання, його значення не визначено і містить випадкову адресу.
Використання „кучі”
Для роботи з динамічними змінними їх завжди необхідно спочатку розмістити в пам’яті. Для розміщення динамічних змінних використовується "куча". Місце для даних в "кучі" відводиться тільки під час роботи програм.
Програма на TP може сама призначати розмір "кучі" для своєї роботи .
Для цього використовується директива компілятора
{$M<розмiр стеку>,<min кучі>,<max кучі>}
Якщо директива $M не вказана , то використовується вся вільна пам’ять.
Процедури керування кучею:
Процедура або функція | Дія |
NEW(P) | Відводить місце для динамічної змінної P^ і присвоює її адресу посиланню P |
NEW(<тип посилання>) | Функція створює динамічну змінну заданого базового типу. |
DISPОSE(P) | Знищує зв’язок між посиланням P та областю пам’яті на яку вона вказувала |
GETMЕМ(P,<розмір>) | Відводить місце вказаного розміру в кучі і його адресу присвоює P. |
FREEMEM(P,<розмір>) | Звільняє пам’ять вказаного розміру, починаючи з адреси, вказаної в P |
MARK(P) | Запам’ятовує в P поточний стан кучі |
RELEASE(P) | Повертає кучу в стан, що був запам’ятований в MARK |
MaxAvail | Функція, повертає розмір в байтах самого більшого простору в кучі |
MemAvail | Функція, повертає суму всіх просторів в кучі |
Дата добавления: 2015-08-26; просмотров: 901;