If litera in a then write(litera);

Writeln;

write(‘set b = ’);

for litera:=’A’ to ‘Z’ do

If litera in b then write(litera);

Readln

End.

4) Тестовий приклад:

До перетворення множина a складається з елементів-літер F, I, R, S, T; множина b складається з елементів-літер S, E, C, O, N, D.

Після перетворення маємо a = {S, E, C, O, N, D}, b = {F, I, R, S, T}.

5) Робочий розрахунок:

Програма вивела такі результати роботи

set a = SECOND

set b = FIRST

 

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

1. Для інтервалу (1,255) побудувати множину чисел, кратних 3, використовуючи відому властивість: якщо сума цифр числа кратна 3, тоді все число ділиться на 3.

2. Вхідними даними для програми є текст - слова з рядкових російських літер, розділені комою. Побудувати множину, що містить усі гласні літери, які входять до кожного слова.

3. Для проміжку [1,255] побудувати множину чисел, кратних 11, використовуючи таку властивість: якщо суми цифр, що знаходяться на парних і на непарних місцях числа однакові, тоді все число ділиться на 11.

4. Побудувати множину, що складається з усіх цілих чисел діапазону 1..255, що можуть бути подані у виді суми квадратів натуральних чисел n і m.

5. Для інтервалу від 1 до 255 побудувати множину чисел, кратних 5, використовуючи властивість подільності на 5: якщо в числі остання цифра 0 або 5, тоді все число ділиться на 5.

6. Скласти множину всіх пар простих чисел інтервалу від 1 до 255. Пара простих чисел - це два простих числа, різниця між якими дорівнює 2 (наприклад, 3 і 5).

7. Для інтервалу від 1 до 255 побудувати множину чисел, кратних 9, використовуючи властивість подільності на 9: якщо в числі сума цифр ділиться на 9, тоді все число ділиться на 9.

8. Арифметична прогресія задана натуральними числами a1 і d. Побудувати множину, що складається з усіхелементів цієї прогресії, що входять у діапазон [0, 255].

9. Для інтервалу від 1 до 255 побудувати множину чисел, кратних 4, використовуючи властивість подільності на 4: якщо число, утворене двома останніми цифрами ділиться на 4, тоді все число ділиться на 4.

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

11. Побудувати множину, що складається з спільних дільників двох чисел А та В (А, B=1,…,255).

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

13. Заповнити множину цифрами чисел Каталана < 256. Числа Каталана визначаються формулами , .

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

15. Побудувати множину, що складається з досконалих чисел в інтервалі від 1 до 255. Досконалим називається таке число, що дорівнює сумі усіх своїх дільників, за винятком самого числа, наприклад, 28=1+2+4+7+14.

16. Три множини заповнені n випадковими натуральними числами з діапазону 1..200. Знайти мінімальне із середніх арифметичних елементів цих множин.

17. Побудувати множину двозначних чисел, сума цифр яких дорівнює числу N.

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

19. Побудувати множину, що складається з дружніх чисел в інтервалі від 1 до 255. Дружніми числами називається така пара натуральних чисел M і N, для яких сума всіх дільників числа M (крім самого числа M) дорівнює числу N, а сума всіх дільників числа N (крім самого числа N) дорівнює числу M.

20. Побудувати множину, що включає спільні кратні двох чисел А та В із діапазону 1,…,255.

21. Множина складається з n випадкових натуральних чисел із діапазону 1..255. Знайти найближчий до середнього арифметичного елемент множини.

22. Дві множини заповнені випадковою кількістю випадкових натуральних чисел < 100. Обчислити середнє геометричне максимальних елементів цих множин.

23. Вхідною інформацією для програми є n випадкових чисел з діапазону 1000..10000. Заповнити множину числами, що визначають кількість одиниць у двійковому представленні випадкових чисел.

24. Заповнити множину числами Мерсенна < 256. Число Мерсенна - це просте число, що може бути отримане за формулою 2n-1, де n теж просте число.

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

 

Запитання для контролю та самоконтролю

 

1. Що таке множина у математичному розумінні?

2. У чому полягає специфіка множинного типу даних?

3. Які операції є можливими над множинами у мові програмування Turbo Pascal?

4. Які обмеження заважають цьому типу даних бути універсальним та дійовим інструментом при розв’язанні задач?

5. Як організувати введення та виведення елементів множини?


Тема № 9 ОБРОБКА ЗАПИСІВ

 

Теоретичні відомості

 

Поряд із множинами та масивами існує ще один структурований тип даних - записи (record). Вони дозволяють зберігати разом значення змінних, різних за типом. Компоненти, що складають запис називаються його полями. Кількість полів, тип і ім'я кожного поля фіксується в описі того типу, до якого відноситься запис. Запис можна представити в наступному виді:

 

type Ім’я_типу = record

Ім’я _компоненти_1 : Тип_компоненти_1;

Ім’я _компоненти_2 : Тип_компоненти_2;

End;

var Ім’я_запису : Ім’я_типу;

або

var Ім’я_Запису = record

Ім’я _компоненти_1 : Тип_компоненти_1;

Ім’я _компоненти_2 : Тип_компоненти_2;

End;

Звертання до значень полів записів організується за допомогою ідентифікатора запису та ідентифікатора поля між якими ставиться крапка. Наприклад balans.debit або balans.credit, де balans - ідентифікатор запису, а debit та credit - ідентифікатори полів цього запису. Поле теж може бути записом і мати у своєму складі поля. Тоді конструкція звертання до значень кінцевих полів буде більш складна, довша, матиме більше крапок. Враховуючи, що у мові Turbo Pascal можна використовувати довгі ідентифікатори, програмування роботи з записами є достатньо трудомістким. У такому разі, а також при кількаразовому звертанні до однієї й тієї ж компоненти запису або до декількох компонент одного й того ж запису, зручно використовувати оператор приєднання with. Він спрощує написання програми.

ОПЕРАТОР ПРИЄДНАННЯмає наступну загальну форму запису: with Ім’я_запису do Оператор;

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

Зауваження: Turbo Pascal дозволяє використовувати записи з так званими варіантними полями, що задаються конструкцією case-of. Варіантна частина складається з кількох варіантів. Кожний варіант визначається константою вибору, за яким іде двокрапка та список полів, обмежений круглими дужками. У будь-якого запису може бути тільки одна варіантна частина, і, якщо вона є, вона повинна розташовуватися за усіма фіксованими полями.

Приклад

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

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

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

3) Алгоритм:

       
   
 
 

 

 
 

 

 


4) Типи даних вибираємо такі: pr, im - рядок; rik - ціла; st - символ. Перелічені змінні в якості полів складають тип people (запис). T - масив записів. N - кількість людей у групі, p_rik - поточний рік, m_age - вік найстаршого чоловіка, w_age - вік найстаршої жінки, i - параметр циклу - цілі.

5) Текст програми:

Program p9;

type people=

Record

pr:string;

im:string;

rik:integer;

st:char

End;

var t:array[1..25] of people;

n,p_rik,m_age,w_age,i:integer;

Begin

writeln('Введіть кількість людей у групі (від 1 до 25)');

Readln(n);

writeln('Введіть поточний рік (ХХХХ)');

Readln(p_rik);

for i:=1 to n do

Begin

writeln('Введіть прізвище, ім'я, рік народження (ХХХХ),

стать (ч/ж)');

readln(t[i].pr,t[i].im,t[i].rik,t[i].st);

End;

m_age:=0;

w_age:=0;

for i:=1 to n do

if (t[i].st='ч') and (p_rik-t[i].rik>m_age) then m_age:=p_rik-t[i].rik;

for i:=1 to n do

if (t[i].st='ж') and (p_rik-t[i].rik>w_age) then w_age:=p_rik-t[i].rik;

writeln('найстарші чоловіки:');

for i:=1 to n do

if (t[i].st='ч') and (p_rik-t[i].rik=m_age) then writeln(t[i].pr, ' ',t[i].im);

writeln('найстарші жінки:');

for i:=1 to n do

if (t[i].st='ж') and (p_rik-t[i].rik=w_age) then writeln(t[i].pr,' ',t[i].im);

writeln('різниця у віці = ', abs(m_age-w_age));

Readln

End.

4) Робоче обчислення:

Введіть кількість людей у групі (від 1 до 25)

Введіть поточний рік (ХХХХ)

Введіть прізвище, ім'я, рік народження (ХХХХ), стать (ч/ж)

Гайовий

Максим

ч

Введіть прізвище, ім'я, рік народження (ХХХХ), стать (ч/ж)

Коваленко

Ганна

ж

Введіть прізвище, ім'я, рік народження (ХХХХ), стать (ч/ж)

Ткаченко

Микола

ч

Введіть прізвище, ім'я, рік народження (ХХХХ), стать (ч/ж)

Коломоєць

Софія

ж

Введіть прізвище, ім'я, рік народження (ХХХХ), стать (ч/ж)

Іваненко

Сергій

ч

Найстарші чоловіки:

Ткаченко Микола

Іваненко Сергій

Найстарші жінки:

Коваленко Ганна

різниця у віці = 19

 

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

 

1. Багаж пасажира характеризується кількістю речей і загальною вагою речей. Відомості про багаж кожного пасажира являють собою запис із двома полями: одне поле цілого типу (кількість речей) і одне - дійсне (вага в кілограмах). Знайти: багаж, у якому середня вага однієї речі відрізняється не більш ніж на 0.3 кг від загальної середньої ваги однієї речі; число пасажирів, що мають більш двох речей і число пасажирів, кількість речей яких перевершує середнє число речей.

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

3. Відомості про студентів факультету складаються з наступної інформації: прізвище, ім'я, по батькові, стать, вік, курс. У прізвищі, імені, по батькові не більш 12 літер, стать зазначена літерами М и Ж, вік від 16 до 35 років, курс - ціле число від 1 до 5. Визначити номер курсу, на якому чоловіків більше.

4. Відомостями про експортовані товари є: найменування товару, країна, що імпортує товар і об'єм партії у штуках. Скласти список країн, у які експортується даний товар і загальний об'єм його експорту.

5. Дані відомості про різні дати. Кожна дата - це число, місяць і рік. Знайти саму ранню дату.

6. Відомості про кубики складають: розмір кожного кубика (довжина ребра в сантиметрах), його колір (червоний, жовтий, зелений або синій) і матеріал (дерев'яний, металевий, картонний). Знайти кількість кубиків кожного з перелічених кольорів і їхній сумарний об'єм.

7. Початковими даними для програми є: назва держави, чисельність населення, що проживає на його території, площа території держави, число шкіл, вузів. Надрукувати дані про загальну кількість навчальних закладів у державі з максимальною щільністю населення.

8. Про речовини відомою є інформація: назва речовини, її питома вага і провідність (провідник, напівпровідник, ізолятор). Знайти питому вагу і назви всіх напівпровідників.

9. Відомостями про іграшки є: назва (конструктор, лялька і т.д.), вартість іграшки, вікові границі (від 2 до 5 років і т.д.). Одержати відомості про назви іграшок, вартість яких не перевершує 4 грн., і які підходять дітям 5 років.

10. Про кожного студента факультету є наступна інформація: прізвище, ім'я, по батькові, стать, вік, курс. Знайти та вивести найпоширеніші жіночі та чоловічі імена.

11. Відомостями про книгу є: прізвище автора, назва книги і рік видання. Знайти назви книг даного автора, виданих із 1960 року.

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

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

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

15. Застосувавши типи даних

Decart=record x, y:real end;

Polar=record r, fi:real end;

,

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

16. Відомі прізвища співробітників, ініціали, номера телефонів. Знайти номер телефону за прізвищем та ініціалами власника.

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

18. У базі телефонних розмов зберігається добова інформація виду: номер абонента, кількість хвилин розмови, вид контакту - місцевий, міжміський обласний, міжобласний, міждержавний. Обчислити загальну тривалість всіх видів телефонних контактів за добу.

19. Відомостями про книгу є: прізвище автора, назва книги і рік видання. Визначити, чи присутні в списку книги з назвою “Інформатика”. Якщо так, то повідомити прізвища авторів і роки видання.

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

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

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

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

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

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

 

Запитання для контролю та самоконтролю

 

1. Чим записи відрізняються від інших структурованих типів даних мови програмування Turbo Pascal?

2. Яким чином у програмі декларувати запис?

3. Як організувати обробку компонент записів?

4. В яких випадках та як можна оптимізувати обробку полів?

5. Що таке запис із варіантними полями?

 


Тема № 10 ОРГАНІЗАЦІЯ ОБРОБКИ ФАЙЛІВ

Теоретичні відомості

Файл - це послідовність компонент, що є об'єктами одного типу. Як правило, кількість компонент у файлі заздалегідь не відома, компоненти файлу не мають індексів. Використовують файли послідовного доступу (деяка компонента обробляється тільки після обробки всіх попередніх компонент) та прямого доступу (без попередньої підготовки можна обробити будь-яку компоненту). У мові Turbo Pascal використовуються три файлових типи: текстові файли, типизовані файли, безтипові файли. Змінні цих типів називають файловими змінними. Їх використовують для організації процесів обміну даними між програмою та зовнішнім файлом.

Обробка файлів ведеться кількома етапами:

· організація файлової змінної,

· підключення файлової змінної до конкретного файлу,

· відкриття доступу (підготовка до безпосередньої обробки),

· читання або запис,

· закриття доступу.

Коли файл підготували до роботи, вона не ведеться з файлом в цілому, а тільки з однією його компонентою, що зветься поточною. Спеціальний вказівник читання/запису (аналог курсору в текстовому режимі роботи екрану) на низькому рівні вказує на місце компоненти, яка в наступний момент часу може бути оброблена. Цю компоненту називають поточною. Після обробки цієї компоненти організується автоматичне переведення цього вказівника в наступне положення. Будь-який файл, якщо він вже існує, має в своєму складі хоча б одну компоненту - кінець файлу (EOF - End Of File).

Процедури та функції, що використовуються при обробці файлів будь-яких типів найчастіше такі (бібліотечний модуль system):

· процедура Assign(f,Name_of_file) зв'язує змінну f із деяким конкретним файлом (ім'я якого записується у виді рядкової константи або зберігається в змінній Name_of_file);

· процедура Reset(f) веде підготовку файлу для читання (відкриває);

· процедура Rewrite(f) створює новий файл і відкриває його для запису (якщо f зв'язана з вже існуючим файлом, тоді вся інформація з нього буде знищена);

· функція EOF(f) перевіряє досягнення вказівником кінця файлу;

· процедура Close(f) закриває файл.

Інформацію, якщо файл підготований, можна читати з файлу та писати туди. Для цього використовуються стандартні процедури введення/виведення Read та Write. Тільки у разі, коли обробляється текстовий файл, можливе застосування процедур Readln та Writeln. Запис Read(f,a) означає скопіювати значення поточної компоненти файлу f у змінну a. Запис Write(f,b) означає скопіювати значення змінної b у поточну компоненту файла f.

Для позиціювання вказівника при обробці файлів прямого доступу використовується процедура Seek. Запис Seek(f,n) означає перевести вказівник на n-ту компоненту файлу f (n - належить типу Longint, тобто початкові компоненти мають номери 0, 1 і так далі).

Типизований файл - це файл з оголошеним типом його компонент (фіксована довжина компонент). Оголошення такого файлу має структуру: var f : file of Тип_елементів_файлу;

Текстові файли організуються по рядках (рядки скомпоновані з ASCII-символів, довжина рядка не фіксована) і об'являються в такий спосіб: var f : text;

Визначено декілька процедур і функцій, що працюють тільки з текстовими файлами: процедура Append(f), відкриває текстовий файл f для дозапису в кінець файлу; функція EOLn(f), перевіряє досягнення кінця поточного рядка файлу f.

Зауваження: Звісно кажучи, якщо у програмі є хоча б одне введення або виведення, це вказує на роботу з файлами. Введення даних з клавіатури організоване в мові Turbo Pascal через зв’язаний з буфером введення стандартний текстовий файл Input, а виведення на екран організоване через зв’язаний з буфером виведення стандартний текстовий файл Output. Це пояснює наявність у програмах на мові Pascal, наприклад, такого запису program main (Input, Output); у програмі на мові Turbo Pascal можна цей рядок взагалі не писати.

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

Приклад

Записати усі непарні компоненти текстового файлу в новий файл.

1) f, g - текстові файли: f - вхідний файл, g - результуючий файл.

2) Файл f зчитується по рядках, лічильник рядків iзбільшується на одиницю. Якщо i - непарне число, то цей рядок записується у файл g.


3) Алгоритм:

 

 


4) Вибираємо типи даних: f, g - текстові файли; s - рядок; i - ціла.

5) Текст програми:

Program p10;

var f,g:text;

s,file_name:string;

i:integer;

Begin

writeln('введіть ім'я файлу');

Readln(file_name);

assign(f,file_name');

Reset(f);

assign(g,'solution.txt');

Rewrite(g);

i:=0;

While not EOF(f) do

Begin

i:=i+1;

Readln(f,s);