- •“Розробка програмного забезпечення”
- •Організація програм
- •Інтегроване середовище turbo pascal
- •File (файл) – дії з файлами, вихід з системи
- •Save as - Використовується для збереження тексту програми в іншому місці або з іншим ім’ям.
- •Compile - компілює програму або модуль ;
- •Breakpoints - дозволяє передивитись всі контрольні точки та вилучити всі чи потрібну;
- •Title - розміщення вікон так, щоб вони мали однакові розміри;
- •Елементи мови програмування pascal
- •Елементи мови
- •Оператори реалізації розгалужених алгоритмів
- •1. Опис свого типу даних.
- •2. Використання безтипових змінних.
- •3. Масиви і рядки невизначеної довжини.
- •Дії, які можна виконувати над файлами всіх типів:
- •Процедури та функції для текстових файлів
- •Процедури та функції для прямого доступу:
- •Елементи мови
Процедури та функції для прямого доступу:
Процедури або функції |
Д і я |
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.
Завдання для самоперевірки.
Скільки елементів може бути у файла?
Елементи файла повинні бути однаковими чи можуть бути різними?
Які типи доступу можуть бути до файлу?
Які дії необхідно виконати щоб дописати дані в текстовий файл?
Які дії необхідно виконати щоб дописати дані в компонентний файл?
Яким чином можна скопіювати вміст файлу в інший файл?
Що означає прямий доступ до файлу.
Яким чином система виконує запис даних до файлу.
Яким буде вміст файлу після виконання процедури Rewrite(f);
Розробити програму яка в текстовому файлі в початок кожного рядку вставляє номер цього рядку.
Розробити програму яка в текстовому файлі зчитує рядок вказаного номеру і виводить відповідне сповіщення якщо рядку з таким номером немає.
В текстовому файлі знайти найдовший рядок.
Розробити програму формування текстового файлу з 9 рядків, де в першому рядку буде записано одну літеру „1”, в другому - дві літери „2”, ..., в девятому - девять літер „9”.
Файл містить дані про студентів. По кожному студенту вказується ПІБ, курс, група, оцінки по трьом екзаменам. Надрукувати дані про студентів, що мають двійки з екзаменів.
Маємо два файли, що містять цілі числа, впорядковані по зростанню. Створити третій файл, обєднавши дані з двох заданих таким чином, щоб в ньому дані теж були впорядковані по зростанню.
Посилання. Динамічні структури
Визначення.
Операція роз’іменування.
Використання „кучі”.
Змінні, розглянуті раніше, називаються статичними, тому, що память для них відводиться в процесі трансляції програми. Всі змінні, що обявляються в програмі, розміщуються в одній неперервній області памяті, яка називається сегментом даних. Розмір сегменту обмежений. Це може не дозволити обробляти великі масиви даних. Для рішення цього питання використовується динамічна память.
Динамічна память - це оперативна память, яка відводиться програмі під час її роботи за виключенням сегменту даних, стеку і тіла програми. Динамічне розміщення даних означає використання динамічної памяті для розміщення даних під час роботи програми.
За допомогою динамічної памяті можна формувати динамічні структури даних. Динамічними структурами даних вважаються такі, розмір яких в процесі роботи попередньо не відомий або змінюється і для яких місце в пам’яті комп’ютера відводиться під час виконання програми.
Основний механізм організації динамічних даних - виділення в спеціальній області пам’яті, "кучі", безперервної ділянки потрібного розміру і зберігання адреси початку цієї ділянки в спеціальній змінній. Такі змінні мають посилальний тип і називаються посиланнями.
Формат визначення типу:
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 |
Функція, повертає суму всіх просторів в кучі |
Розробка програм з використанням посилань
Приклад 1. Знайти суму елементів квадратної матриці 3*3, розмістивши її в динамічній памяті.
program suma;
type
TM= ^array[1..3,1..3] of real;
var
matr:TM;
i,k:word;
s:real;
begin
new (matr);
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);
dispоse (matr);
end.
Завдання для самоперевірки
Що таке статичні структури даних.
Що таке динамічні структури даних.
Яка різниця між статичними і динамічними структурами даних.
Який сенс в використанні динамічних структур?
Що міститься в змінній посилального типу.
Яку дію необхідно виконати щоб отримати значення, на яке вказує посилання.
Що є основним механізмом організації динамічних даних.
Описати посилальну змінну на дійсне значення.
Описати посилальну змінну на масив 10-ти цілих значень.
Маємо опис
VAR
i: ^integer;
Виконати всі необхідні дії для збереження значення 25.
Використовуючи динамічну структуру, побудувати масив даних про студентів групи і вивести відомості про одружених студентів.
ОРГАНІЗАЦІЯ ПРОГРАМ НА МОВІ С++
Історія розвитку мови.
Синтаксис мови.
Структура програми.
Елементи мови.
Операції.
Типи даних. Модифікатори.
Елементарний ввід-вивід.
Оператори мови.
Структуровані типи даних.
Функції.
Указники.
Файли і потоки.
Класи.
Історія розвитку мови
С++ розвинувся із С, який був створений Денісом Рітчи на основі мов BCРL і В.
BCРL в 1967 році створений Мартіном Річардом як мова для написання компіляторів і ОС. В - дублікат BCPL.
С розроблений Денісом Рітчи в1972 р. Став широко відомим після розробки ОС INIХ
До кінця 70-х років С розвинувся в ту, що тепер відносять до класичного С або „С Кернігана і Рітча”.
Широке розповсюдження С привело до тому, що з'явилися варіації мови досить схожі, але не сумісні один з одним. Була потрібна стандартна версія мови С. Цей стандарт був затверджений в 1989г. американським національним комітетом стандартів ANSI. Цей комітет скооперувався з міжнародною організацією стандартів ISO щоб стандартизувати С у світовому масштабі. Цей стандарт був опублікований в 1990 р. С – стандартизована, апаратно- незалежна мова.
С++ – розширення С – був розроблений Вьєрном Строуструпом на початку 80-х р.
С++ приводить в порядок С і, головне, забезпечує можливість об'єктно-орієнтованого програмування.
С++ гібридна мова, він передбачає можливість програмувати і в процедурному стилі і в об'єктно-орієнтованому стилі.
Зараз існують більше 2000 мов програмування високого рівня. Одним з головних стимулів для розробки нової мови є потреба в розробці складних додатків.
Основні синтаксичні правила мови
Прописні і рядкові букви вважаються різними символами.
В тексті програми можуть використовуватись коментарі. Багаторядкові коментарі обмежуються символами / * і */ . Однорядкові визначаються символами // на початку.
Кожне речення закінчується символом ( ; )
В рядку можна розміщувати декілька операторів .
Тіло функції або складний оператор заключаються в фігурні скобки { }. Їх можна вважати операторними скобками
Все типы, поіменовані константи, переменные, функции повинні бути объявлены до их первого использования. Обяви можуть зустрічатись в довільному місці програми.
Всі підрограми є функції.
Структура програми
Структура програми
Препроцесор.
Структура програми
Програма на С++ може складатися з великого числа висхідних файлів, які можуть містити описи типів, функцій, змінних і констант. Один з файлів містить головну функцію, ім'я якої main
Структура файла головної функції:
<директиви процесора>
<тип результата> main ([список формальних параметрів>])
{
< oписи >
< оператори >
< директиви препроцесора >
}
Як правило, головна функція не повертає результат. Його можна опустити або вказати порожній тип void
Список параметрів також відсутній, Його можна опустити або описати як тип void
<oписи> не обовязково повинні бути на початку тіла функції . Але для зручності рекомендується їх поміщати на початку.
Препроцессор
Директиви препроцесора.
Заголовочні файли
Обробка програми препроцесором відбувається перед її компіляцією. Основна ціль препроцесора - закінчити формування початкового тексту програми.
На цьому етапі можна виконувати наступні дії :
- включити в компілюючий файл інші файли ;
- визначити символічні константи і макроси ;
- задати режим умовної компіляції і умовного виконання директив препроцесора.
Всі директиви препроцесора починаються з символу # .
В кінці директив не ставиться символ ” ; ”
Директиви препроцесора
#include
Застосовується для включення копії вказаного в директиві файла в те місце, де знаходиться ця директива.
Формат
#include < «ім'я файла» > | “ «ім'я файла»” | «ідентифікатор макроса»
Відмінність між двома першими формами директиви полягає в методі пошуку препроцесором файла що включається:
перша форма використовується для підключення заголовних файлів системних бібліотек або указує пошук файлів що підключаються в каталогах, заданими як каталоги в настройках середовища .
в другому випадку послідовність пошуку наступна:
- каталог, де збережений поточні файли
- каталог, де зберігаються вже підключені файли
- поточний каталог
Ім'я файла може бути вказано з шляхом . В цьому випадку інші каталоги не є видимими .
2) #dеfine
Створює символічні константи і макроси.
Формат визначення:
#dеfine «ідентифікатор» «заміщаючий текст»
Якщо заміщаючий текст довгий, то його можна перенести на наступний рядок, використовуючи символ «/».
Приклад визначення символічної константи: #dеfine PI 3.14
Макрос – символічне ім'я деяких операцій.
Макрос може бути. без параметра і з параметрами.
Приклад визначення макроса без параметра:
#define V 2*PI
Приклад визначення макроса з параметром:
#define V_CIRCLE (x) (PI*(x)*(x))
#undef
Відміняє дію відповідних символічних констант і макросів.
Формат:
#undef «ідентифікатор»
Наприклад, #undef РІ
Заголовочні файли
Заголовні файли мають розширення .h і містять оголошення і визначення, які є загальними для різних програмних файлів.
Як такі обявлення і визначення виступають класи, структури, обєднання, перелічення і прототипи функцій.
Питання для самоперевірки
Призначення препроцесору.
З якої функції починає роботу програма на мові С++.
Чим характеризується змінна.
Які імена змінних є вірними:
a) Massa b) Progr.c c) 12Ge
d) Line5 e) _cong f) massa_
Якими символами обмежується тіло функції.
Імена numder i Number посилаються на одну змінну? Відповідь пояснити.
Використовуючи директиви препроцесору описати підключення системної бібліотеки iostream.h і файлу MyFile.cpp.
Визначити символічну константу g=9,8
Оголосити іменовану константу.
Що містить пустий рядок.
Записати у вигляді рядка фразу.
Записати числову константу в десятковій, восьмирічній і шістнадцятирічній формі.
