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

Процедури та функції для прямого доступу:

Процедури або функції

Д і я

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.

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

  1. Скільки елементів може бути у файла?

  2. Елементи файла повинні бути однаковими чи можуть бути різними?

  3. Які типи доступу можуть бути до файлу?

  4. Які дії необхідно виконати щоб дописати дані в текстовий файл?

  5. Які дії необхідно виконати щоб дописати дані в компонентний файл?

  6. Яким чином можна скопіювати вміст файлу в інший файл?

  7. Що означає прямий доступ до файлу.

  8. Яким чином система виконує запис даних до файлу.

  9. Яким буде вміст файлу після виконання процедури Rewrite(f);

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

  11. Розробити програму яка в текстовому файлі зчитує рядок вказаного номеру і виводить відповідне сповіщення якщо рядку з таким номером немає.

  12. В текстовому файлі знайти найдовший рядок.

  13. Розробити програму формування текстового файлу з 9 рядків, де в першому рядку буде записано одну літеру „1”, в другому - дві літери „2”, ..., в девятому - девять літер „9”.

  14. Файл містить дані про студентів. По кожному студенту вказується ПІБ, курс, група, оцінки по трьом екзаменам. Надрукувати дані про студентів, що мають двійки з екзаменів.

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

Посилання. Динамічні структури

    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

Функція, повертає суму всіх просторів в кучі

Розробка програм з використанням посилань

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

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

  1. Що таке статичні структури даних.

  2. Що таке динамічні структури даних.

  3. Яка різниця між статичними і динамічними структурами даних.

  4. Який сенс в використанні динамічних структур?

  5. Що міститься в змінній посилального типу.

  6. Яку дію необхідно виконати щоб отримати значення, на яке вказує посилання.

  7. Що є основним механізмом організації динамічних даних.

  8. Описати посилальну змінну на дійсне значення.

  9. Описати посилальну змінну на масив 10-ти цілих значень.

  10. Маємо опис

VAR

i: ^integer;

Виконати всі необхідні дії для збереження значення 25.

  1. Використовуючи динамічну структуру, побудувати масив даних про студентів групи і вивести відомості про одружених студентів.

ОРГАНІЗАЦІЯ ПРОГРАМ НА МОВІ С++

  1. Історія розвитку мови.

  2. Синтаксис мови.

  3. Структура програми.

  4. Елементи мови.

  5. Операції.

  6. Типи даних. Модифікатори.

  7. Елементарний ввід-вивід.

  8. Оператори мови.

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

  10. Функції.

  11. Указники.

  12. Файли і потоки.

  13. Класи.

Історія розвитку мови

С++ розвинувся із С, який був створений Денісом Рітчи на основі мов BCРL і В.

BCРL в 1967 році створений Мартіном Річардом як мова для написання компіляторів і ОС. В - дублікат BCPL.

С розроблений Денісом Рітчи в1972 р. Став широко відомим після розробки ОС INIХ

До кінця 70-х років С розвинувся в ту, що тепер відносять до класичного С або „С Кернігана і Рітча”.

Широке розповсюдження С привело до тому, що з'явилися варіації мови досить схожі, але не сумісні один з одним. Була потрібна стандартна версія мови С. Цей стандарт був затверджений в 1989г. американським національним комітетом стандартів ANSI. Цей комітет скооперувався з міжнародною організацією стандартів ISO щоб стандартизувати С у світовому масштабі. Цей стандарт був опублікований в 1990 р. С – стандартизована, апаратно- незалежна мова.

С++ – розширення С – був розроблений Вьєрном Строуструпом на початку 80-х р.

С++ приводить в порядок С і, головне, забезпечує можливість об'єктно-орієнтованого програмування.

С++ гібридна мова, він передбачає можливість програмувати і в процедурному стилі і в об'єктно-орієнтованому стилі.

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

Основні синтаксичні правила мови

  1. Прописні і рядкові букви вважаються різними символами.

  2. В тексті програми можуть використовуватись коментарі. Багаторядкові коментарі обмежуються символами / * і */ . Однорядкові визначаються символами // на початку.

  3. Кожне речення закінчується символом ( ; )

  4. В рядку можна розміщувати декілька операторів .

  5. Тіло функції або складний оператор заключаються в фігурні скобки { }. Їх можна вважати операторними скобками

  6. Все типы, поіменовані константи, переменные, функции повинні бути объявлены до их первого использования. Обяви можуть зустрічатись в довільному місці програми.

  7. Всі підрограми є функції.

Структура програми

  1. Структура програми

  2. Препроцесор.

Структура програми

Програма на С++ може складатися з великого числа висхідних файлів, які можуть містити описи типів, функцій, змінних і констант. Один з файлів містить головну функцію, ім'я якої main

Структура файла головної функції:

<директиви процесора>

<тип результата> main ([список формальних параметрів>])

{

< oписи >

< оператори >

< директиви препроцесора >

}

Як правило, головна функція не повертає результат. Його можна опустити або вказати порожній тип void

Список параметрів також відсутній, Його можна опустити або описати як тип void

<oписи> не обовязково повинні бути на початку тіла функції . Але для зручності рекомендується їх поміщати на початку.

Препроцессор

  1. Директиви препроцесора.

  2. Заголовочні файли

Обробка програми препроцесором відбувається перед її компіляцією. Основна ціль препроцесора - закінчити формування початкового тексту програми.

На цьому етапі можна виконувати наступні дії :

- включити в компілюючий файл інші файли ;

- визначити символічні константи і макроси ;

- задати режим умовної компіляції і умовного виконання директив препроцесора.

Всі директиви препроцесора починаються з символу # .

В кінці директив не ставиться символ ” ; ”

Директиви препроцесора

  1. #include

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

Формат

#include < «ім'я файла» > | “ «ім'я файла»” | «ідентифікатор макроса»

Відмінність між двома першими формами директиви полягає в методі пошуку препроцесором файла що включається:

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

  • в другому випадку послідовність пошуку наступна:

- каталог, де збережений поточні файли

- каталог, де зберігаються вже підключені файли

- поточний каталог

Ім'я файла може бути вказано з шляхом . В цьому випадку інші каталоги не є видимими .

2) #dеfine

Створює символічні константи і макроси.

Формат визначення:

#dеfine «ідентифікатор» «заміщаючий текст»

Якщо заміщаючий текст довгий, то його можна перенести на наступний рядок, використовуючи символ «/».

Приклад визначення символічної константи: #dеfine PI 3.14

Макрос – символічне ім'я деяких операцій.

Макрос може бути. без параметра і з параметрами.

Приклад визначення макроса без параметра:

#define V 2*PI

Приклад визначення макроса з параметром:

#define V_CIRCLE (x) (PI*(x)*(x))

  1. #undef

Відміняє дію відповідних символічних констант і макросів.

Формат:

#undef «ідентифікатор»

Наприклад, #undef РІ

Заголовочні файли

Заголовні файли мають розширення .h і містять оголошення і визначення, які є загальними для різних програмних файлів.

Як такі обявлення і визначення виступають класи, структури, обєднання, перелічення і прототипи функцій.

Питання для самоперевірки

  1. Призначення препроцесору.

  2. З якої функції починає роботу програма на мові С++.

  3. Чим характеризується змінна.

  4. Які імена змінних є вірними:

a) Massa b) Progr.c c) 12Ge

d) Line5 e) _cong f) massa_

  1. Якими символами обмежується тіло функції.

  2. Імена numder i Number посилаються на одну змінну? Відповідь пояснити.

  3. Використовуючи директиви препроцесору описати підключення системної бібліотеки iostream.h і файлу MyFile.cpp.

  4. Визначити символічну константу g=9,8

  5. Оголосити іменовану константу.

  6. Що містить пустий рядок.

  7. Записати у вигляді рядка фразу.

  8. Записати числову константу в десятковій, восьмирічній і шістнадцятирічній формі.

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