Розробка форматів зберігання даних програми Структурування

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Лабораторна робота № 2.
Розробка форматів зберігання даних програми. Структуризація.

Мета: 1. Вивчити можливість роботи з файлами на мові Pascal. Отримати навички розробки формату зберігання даних на прикладі розв'язання задач аналітичної геометрії.
2. Освоїти прийоми структурування програм.
Завдання:
1. Вивчити процедури і функції мови Pascal для роботи з файлами прямого і послідовно доступу.
2. Згідно заданому варіанту розробити формат і структуру у файлах прямого доступу.
3. Реалізувати можливість введення даних з клавіатури або з файлу.
4. Вихідні дані вивести на екран і зберегти в текстовий файл.
5. При написанні програми використати контроль введених даних, використовуючи функцію IOResult.
6. Умова задачі з реквізитами виконавця повинні бути надані на екрані при запуску програми.
7. Структурувати програму з використанням процедур і функцій.
Умова задачі аналітичної геометрії:
Знайти кількість кіл на площині мають перетин з прямокутником сторони якого паралельні осям координат.

Зміст
1. Теоретична частина
2. Алгоритм програми
3. Лістинг програми
4. Екранні форми

1. Теоретична частина
1. За методом доступу до компонентів файли поділяються на послідовні і прямі. У послідовному файлі читання і запис компонент може бути тільки послідовною, починаючи з першої частини. У прямому файлі можна прочитати або записати будь-яку компоненту, вказавши її номер у файлі. При цьому перебір попередніх компонент не потрібно. По напрямку передачі даних файли поділяються на вхідні і вихідні.
Також існують три типи файлів:
1) типізовані, компоненти яких мають жорстку структуру;
2) текстові, що складаються із символів і рядків;
3) нетипізовані, що розглядаються як послідовність байтів.
У Турбо-Паскалі можна відкрити файл лише для читання, тільки для запису, а також для читання і запису одночасно. Для цього використовуються процедури Reset, Rewrite, Append.
Reset (F) - відкриття існуючого файлу. Якщо це текстовий файл, то допускається тільки читання з файлу; для типізованого файлу припустимі як читання, так і запис інформації. В останньому випадку можна легко реалізувати оновлення компонент файлу. Якщо файл F вже був відкритий, то при виконанні процедури Reset цей файл спочатку закривається, а потім відкривається. При цьому покажчик файлу встановлюється в початкову позицію файлу.
Rewrite (F) - відкриття нового файлу. Якщо це текстовий файл, то допускається тільки запис у файл; для типізованого файлу припустимі як читання, так і запис інформації. Якщо файл F вже існує, то при спрацьовуванні процедури Rewrite файл F знищується.
Append (F) - відкриття текстового файлу для додавання нових компонентів в кінець файлу. Якщо файл вже був відкритий раніше за допомогою процедур Reset або Rewrite, то процедура Append спочатку закриває даний файл, а потім його відкриває для додавання нових компонентів.
Існують процедури і функції для файлів будь-якого типу:
Процедура Close (F). Виконується закриття файлу F. Якщо буфер виведення заповнений не повністю, то його вміст переноситься в файл F, після чого з оперативної пам'яті видаляється службова інформація про фото F.
Процедура Rename (F, newname). Зовнішньому файлу, пов'язаного з файлової змінної F, присвоюється нове ім'я, задане в рядку.
Процедура Erase (F). Файл F знищується. Процедура Erase застосовна тільки для закритих файлів.
Функція Eof (F): boolean. Функція повертає значення true, якщо досягнуто кінець файлу, в іншому випадку вихідне значення одно false.
Функція IOResult: word (Input-Output-Result). Повертає умовний ознака останньої операції введення-виведення. Результат дорівнює нулю, якщо операція введення-виведення завершилася успішно.
Процедура Truncate (F). Файл буде скорочуватися за поточною позиції покажчика. У цю позицію записується ознака eof.
Для виконання операцій введення-виведення в текстових файлах використовуються процедури Read, Readln, Write, Writeln.
Також для текстових файлів можуть використовуватися три предопісанние функції, непридатні для файлів іншого типу: Eoln, SeekEoln і SeekEof.
Функція Eoln (F): boolean повертає значення true, якщо у вхідному потоці досягнуть маркер кінця рядка eol.
Функція SeekEoln (F): boolean пропускає всі прогалини і знаки табуляції до маркера кінця рядка eol або до першого значущого символу і повертає значення true, якщо такий маркер виявлено.
Функція SeekEof (F): boolean пропускає всі прогалини, знаки табуляції та маркери кінця рядка аж до маркера кінця файлу eof або до першого значущого символу і повертає значення true, якщо такий маркер виявлено.
Всі компоненти типізованого файлу, на відміну від текстового файлу, мають одну і ту ж довжину. Це дозволяє програмі визначити місце розташування будь-компоненти файлу за його номером і здійснити прямий доступ до цієї компоненті. Компоненти типізованого файлу нумеруються натуральним рядом чисел 0,1,2,3, ... При відкритті типізованого файлу його покажчик встановлюється на нульову компоненту. Після виконання кожної операціічтенія або запису покажчик зсувається на наступну компоненту.
Для операцій читання і запису в типизированном файлі використовуються процедури Read і Write (але не Readln, Writeln).
Для типізованих файлів визначені також предопісанние процедура Seek і функції FileSize, FilePos.
Процедура Seek (F, k) переміщує покажчик файлу F на компоненту з номером k. Змінна k повинна мати тип longint.
Функція FileSize (F): longint повертає поточний розмір файлу F (кількість компонент файла).
Функція FilePos (F): longint повертає номер поточної позиції файлу F.
Нетипізовані файли застосовуються головним чином для високошвидкісного обміну даними між диском і пам'яттю. Для цих файлів замість процедур Read і Write використовуються процедури BlockRead і BlockWrite.
2. Виходячи з умови задачі вхідні дані для програми:
а) Координати точки центру кола;
b) Довжина радіусу кола;
c) Координати лівої верхньої і нижньої правої точки прямокутника, однозначно задають його на площині.
Так як кількість і тип даних чітко визначений як файли для введення вихідних даних будемо використовувати типізовані файли, компоненти яких мають жорстку структуру і до них можливий прямий доступ.
Для зберігання параметрів кола створимо типізований файл circle.dat, який буде складатися з масиву складових компонент мають три параметри: координати x і y центру кола і R - радіус кола. Тип компоненти визначимо як запис, тому що в записі можна об'єднати компоненти різних типів:
CircleType = record
x: integer;
y: integer;
R: word
end;
Координати центру кола x і y будуть визначені як цілі числа, які можуть приймати позитивне і негативне значення, тому для них вибрали тип integer. Радіус кола R не може бути негативним для нього вибрали тип word - ціле без знака, межі зміни 0 .. 65535.
Таким чином масив кіл буде описуватися:
CircleAr: array [1 .. Nmax] of CircleType;
Опис файлу:
CircleFile: file of CircleType;
Для введення параметрів задають прямокутник будемо використовувати типізований файл rectangle.dat з двома елементами типу запис:
RectangleType = record
x: integer;
y: integer;
end;
Таким чином кожен компонент файлу складається з координат x і y кутових точок прямокутника, масив точок прямокутника і файл будуть описуватися:
RectangleAr: array [1 .. 2] of RectangleType;
RectangleFile: file of RectangleType;
3. У програмі реалізована можливість введення вихідних даних з файлу або клавіатури. Після запуску програми видається запит про направлення введення "Звідки зробити введення вихідних даних? f - файл, k-клавіатура ". Відповідно, натиснувши клавішу здійснюється перехід до вводу даних.
4. Результати виконання програми виводяться на екран і в текстовий файл result.txt, створюваний у каталозі з якого запущена програма.
5. У програмі здійснюється контроль даних, що вводяться:
При введенні числового відповіді з клавіатури існує певна ймовірність помилкового набору (наприклад, буква замість цифри). При введенні відповіді за допомогою оператора Read це викликало б переривання програми і, як наслідок, необхідність її повторного запуску. Щоб блокувати таке переривання, введення змінної проводиться за допомогою процедури ReadInt, ReadWord в яких за допомогою стандартної процедури IOResult здійснює контроль формату вводиться числа. При неправильному форматі введення процедура ReadInt, ReadWord видає на екран повідомлення про помилку і пропонує користувачеві повторити введення.
6. При запуску програми на екрані в першу чергу представлені умови задачі і реквізити виконавця, реалізовані наступним ділянкою коду:
ClrScr;
Writeln ('▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒');
Writeln ('▒ Лабораторна робота № 2 ▒');
Writeln ('▒ студента гр. ▒');
Writeln ('▒ ▒');
Writeln ('▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒');
Writeln ('▒ Умова задачі з аналітичної геометрії: ▒');
Writeln ('▒ Знайти кількість кіл на площині ▒');
Writeln ('▒ мають перетин з прямокутником боку ▒');
Writeln ('▒ якого паралельні осям координат. ▒');
Writeln ('▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒');
8. У програмі використовуються наступні процедури і функції, які структурують програму: FrazaReadError, ReadWord, ReadInt, PrintInData, Cross1, Cross2, PrintHead.
2. Лістинг програми
Program Lab2;
uses Crt;
label ExitFromCalc;
Const Nmax = 100;
Type
CircleType = record
x: integer;
y: integer;
R: word
end;
RectangleType = record
x: integer;
y: integer;
end;
Var
CircleAr: array [1 .. Nmax] of CircleType;
CircleFile: file of CircleType;
RectangleAr: array [1 .. 2] of RectangleType;
RectangleFile: file of RectangleType;
ResultFile: text;
n: word; {Кількість кіл для перевірки}
i: byte; {параметр циклу}
S: byte; {лічильник перетинань кіл з прямокутником}
ch: char;
size: longint;
{------------------------------------------------- -----------}
Procedure FrazaReadError (k: integer);
{Повідомлення про неправильному форматі вводиться числа з подачею}
{Звукового сигналу}
Begin
If k <> 0 then
Begin
Writeln (# 7'Неправільний формат числа ');
Writeln ('Ще раз введіть');
End;
End {FrazaReadError};
{------------------------------------------------- -----------}
Procedure ReadWord (Var Number: word);
{Введення з клавіатури і перевірка формату змінної типу word}
Var k: word;
Begin
Repeat
{$ I-} Read (Number); {$ I +}
k: = IOResult;
FrazaReadError (k);
Until k = 0;
End {ReadWord};
{------------------------------------------------- -----------}
Procedure ReadInt (Var Number: integer);
{Введення з клавіатури і перевірка формату змінної типу integer}
Var k: integer;
Begin
Repeat
{$ I-} Read (Number); {$ I +}
k: = IOResult;
FrazaReadError (k);
Until k = 0;
End {ReadInt};
{------------------------------------------------- -----------}
Procedure PrintInData;
Var i: byte;
Begin
Writeln ('Вихідні дані');
Writeln ('Окружності:');
For i: = 1 to n do
Begin
Write (i ,':',' R = ', CircleAr [i]. R,' (', CircleAr [i]. X ,':', CircleAr [i]. X ,')',';') ;
End;
Writeln;
Writeln ('Прямокутник:');
Writeln ('Верхня права точка: (", RectangleAr [1]. X ,':', RectangleAr [1]. Y ,')');
Writeln ('Верхня права точка: (", RectangleAr [2]. X ,':', RectangleAr [2]. Y ,')');
End {PrintInData};
{------------------------------------------------- -----------}
Function Cross1 (Var R: word; P, C: integer): boolean;
Begin
Cross1: = false;
if (R * R-(PC * C))> = 0 then Cross1: = true;
End {Cross1};
{------------------------------------------------- -----------}
Function Cross2 (Var Inter1, Inter2: integer; R: word; P, C1, C2: integer): boolean;
Var Buf: real;
Begin
Cross2: = false;
Buf: = sqrt (R * R-(P-C1 * C1)) + C2;
if Buf <= Inter2 then
if Buf> = Inter1 then Cross2: = true;
End {Cross2};
{------------------------------------------------- -----------}
Procedure PrintHead;
Begin
ClrScr;
Writeln ('▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ');
Writeln ('▒ Лабораторна робота № 2 ▒');
Writeln ('▒ студента гр ▒');
Writeln ('▒ ▒');
Writeln ('▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ');
Writeln ('▒ Умова задачі з аналітичної геометрії: ▒');
Writeln ('▒ Знайти кількість кіл на площині ▒');
Writeln ('▒ мають перетин з прямокутником боку ▒');
Writeln ('▒ якого паралельні осям координат. ▒');
Writeln ('▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ');
End {ReadInt};
{------------------------------------------------- -----------}
Begin
PrintHead;
Writeln ('Звідки зробити введення вихідних даних?');
Writeln ('f - файл, k-клавіатура');
Repeat
ch: = ReadKey;
Until ((ch = 'k') or (ch = 'f'));
if (ch = 'k') then
Begin
Writeln ('Набір параметрів завершуйте натисканням клавіші Enter');
Write ('Введіть кількість кіл:'); ReadWord (n);
For i: = 1 to n do
Begin
Writeln ('Введіть кордінати центру', i, 'окружності.');
Write ('x ='); ReadInt (CircleAr [i]. X);
Write ('y ='); ReadInt (CircleAr [i]. Y);
Writeln ('Введіть радіус', i, 'окружності.');
Write ('R ='); ReadWord (CircleAr [i]. R);
End;
For i: = 1 to 2 do
Begin
Writeln ('Введіть кордінати', i, 'точки прямокутника');
Write ('x ='); ReadInt (RectangleAr [i]. X);
Write ('y ='); ReadInt (RectangleAr [i]. Y);
End;
PrintHead;
PrintInData;
Writeln ('Записати введені дані у файли вхідних даних?');
Writeln ('(y - Так, n - Ні)');
Repeat
ch: = ReadKey;
Until ((ch = 'y') or (ch = 'n'));
if (ch = 'y') then
Begin
Assign (CircleFile, 'circle.dat'); Rewrite (CircleFile);
Assign (RectangleFile, 'rectangl.dat'); Rewrite (RectangleFile);
For i: = 1 to n do
Write (CircleFile, CircleAr [i]);
size: = FileSize (CircleFile);
Writeln ('Файл circle.dat перезаписаний! Поточний розмір', size, 'компонент.');
For i: = 1 to 2 do
Write (RectangleFile, RectangleAr [i]);
Writeln ('Файл rectangle.dat перезаписаний !!!');
Close (RectangleFile); Close (CircleFile);
End;
End
else
Begin
Assign (CircleFile, 'circle.dat'); Reset (CircleFile);
Assign (RectangleFile, 'rectangl.dat'); Reset (RectangleFile);
size: = FileSize (CircleFile);
n: = size;
For i: = 1 to n do
Read (CircleFile, CircleAr [i]);
For i: = 1 to 2 do
Read (RectangleFile, RectangleAr [i]);
Close (RectangleFile); Close (CircleFile);
Writeln ('Дані з вхідних файлів завантажені !!!');
PrintInData;
End;
S: = 0;
{Цикл перевірки}
For i: = 1 to n do
Begin
if Cross1 (CircleAr [i]. R, RectangleAr [1]. y, CircleAr [i]. y) then
Begin
if Cross2 (RectangleAr [1]. x, RectangleAr [2]. x, CircleAr [i]. R, RectangleAr [1]. y, CircleAr [i]. y, CircleAr [i]. x) then
Begin
S: = S +1; GoTo ExitFromCalc;
End
End;
if Cross1 (CircleAr [i]. R, RectangleAr [2]. y, CircleAr [i]. y) then
Begin
if Cross2 (RectangleAr [1]. x, RectangleAr [2]. x, CircleAr [i]. R, RectangleAr [2]. y, CircleAr [i]. y, CircleAr [i]. x) then
Begin
S: = S +1; GoTo ExitFromCalc;
End
End;
if Cross1 (CircleAr [i]. R, RectangleAr [1]. x, CircleAr [i]. x) then
Begin
if Cross2 (RectangleAr [1]. y, RectangleAr [2]. y, CircleAr [i]. R, RectangleAr [1]. x, CircleAr [i]. x, CircleAr [i]. y) then
Begin
S: = S +1; GoTo ExitFromCalc;
End
End;
if Cross1 (CircleAr [i]. R, RectangleAr [2]. x, CircleAr [i]. x) then
Begin
if Cross2 (RectangleAr [1]. y, RectangleAr [2]. y, CircleAr [i]. R, RectangleAr [2]. x, CircleAr [i]. x, CircleAr [i]. y) then
Begin
S: = S +1; GoTo ExitFromCalc;
End
End;
ExitFromCalc:
End;
{Кінець циклу перевірки}
Writeln ('З прямокутником перетинаються', S, 'окружності (ів) з', n ,'.');
Assign (ResultFile, 'result.txt');
Rewrite (ResultFile);
Write (ResultFile, 'З прямокутником перетинаються', S, 'окружності (ів) з', n ,'.');
Close (ResultFile);
Readln;
End.

4. Екранні форми:

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Лабораторна робота
27.9кб. | скачати


Схожі роботи:
Розробка форматів зберігання програм Структурування
Розробка формату зберігання даних програм і вирішення завдань
Розробка бази даних для програми Радіодеталі
Розробка програми генерації тестів з бази даних на мові РНР
Розробка програми представлення табличних даних у вигляді діаграми прямокутників
Розробка навчальної програми підтримуючої вивчення теми Структури даних
Розробка програми передачі даних через послідовний порт мікроконтролера
Досвід використання ADO для доступу до баз даних форматів MS Access xBase і Paradox
Структурування таблиці Опис методів структурування таблиці в Excel
© Усі права захищені
написати до нас