Умова задачі аналітичної геометрії Знайти мінімальне та максимальні відстань від з точок на

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

скачати

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

Зміст:
1. Теоретичний матеріал
2. Вхідні дані для програми.
3. Лістинг програми
4. Екранні форми.

Теоретичний матеріал
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. Виходячи з умови задачі вхідні дані для програми:
а) Координати точок на площині (x: y);
b) Коефіцієнти a, b, c рівняння прямої;
Так як кількість і тип даних чітко визначений як файли для введення вихідних даних будемо використовувати типізовані файли, компоненти яких мають жорстку структуру і до них можливий прямий доступ.
Для введення і зберігання параметрів прямий створимо типізований файл line.dat, який буде складатися з трьох компонентів: коефіцієнти a, b, c. Коефіцієнти a, b, c прямий будуть визначені як цілі числа, які можуть приймати як позитивне і негативне значення, тому для них вибрали тип integer. Таким чином опис файлу коефіцієнтів прямих:
LineFile: file of integer;
Для введення параметрів задають прямокутник будемо використовувати типізований файл point.dat з масивом елементів типу запис:
PointType = record
x: integer;
y: integer;
end;
Таким чином кожен компонент файлу складається з координат x і y точок на площині і масив точок і файл будуть описуватися:
PointAr: array [1 .. 2] of PointType;
PointFile: file of PointType;
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, ReadInt, ReadWord, PrintInData, PrintHead, CalcDist.

Лістинг програми
Program Lab2;
uses Crt;
Const Nmax = 100;
Type
PointType = record
x: integer;
y: integer;
End;
Var
LineFile: file of integer;
PointAr: array [1 .. Nmax] of PointType;
PointFile: file of PointType;
ResultFile: text;
a: integer; {коефіцієнт а рівняння задає пряму на площині}
b: integer; {коефіцієнт b рівняння задає пряму на площині}
c: integer; {коефіцієнт b рівняння задає пряму на площині}
Dmin: real; {мінімальна відстань від точки до прямої}
Dmax: real; {максимальна відстань від точки до прямої}
D: real; {Проміжна змінна для обчислень відстані}
Xmin: byte; {координата X точки з мінімальним відстанню}
Xmax: byte; {координата Y точки з мінімальним відстанню}
Ymin: byte; {координата X точки з максимальною відстанню}
Ymax: byte; {координата Y точки з максимальною відстанню}
n: word; {Кількість точок для перевірки}
i: byte; {параметр циклу}
ch: char;
size: longint;
{------------------------------------------------- -----------}
Procedure FrazaReadError (k: integer);
{Повідомлення про неправильному форматі вводиться числа з подачею}
{Звукового сигналу}
Begin
If k <> 0 then
Begin
Writeln (# 7'Неправільний формат числа ');
Writeln ('Ще раз введіть');
End;
End {FrazaReadError};
{------------------------------------------------- -----------}
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 ReadWord (Var Number: word);
{Введення з клавіатури і перевірка формату змінної типу word}
Var k: word;
Begin
Repeat
{$ I-} Read (Number); {$ I +}
k: = IOResult;
FrazaReadError (k);
Until k = 0;
End {ReadWord};
{------------------------------------------------- -----------}
Procedure PrintInData;
Var i: byte;
Begin
Writeln ('Вихідні дані');
Writeln ('Точки на площині:');
For i: = 1 to n do
Begin
Write (i ,':','(', PointAr [i]. X ,':', PointAr [i]. Y ,')','; ');
End;
Writeln;
Writeln ('Коефіцієнти прямої:');
Writeln ('a =', a);
Writeln ('b =', b);
Writeln ('c =', c);
End {PrintInData};
{------------------------------------------------- -----------}
Procedure PrintHead;
Begin
ClrScr;
Writeln ('▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒');
Writeln ('▒ Лабораторна робота № 2 ▒');
Writeln ('▒ студента гр. ▒');
Writeln ('▒ ▒');
Writeln ('▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒');
Writeln ('▒ Умова задачі з аналітичної геометрії: ▒');
Writeln ('▒ Знайти мінімальне та максимальне відстань ▒');
Writeln ('▒ від точок до прямої на площині. ▒');
Writeln ('▒ ▒');
Writeln ('▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒');
End {ReadInt};
{------------------------------------------------- -----------}
Function CalcDist (Var a, b, c, x, y: integer): real;
Begin
CalcDist: = abs (a * X + b * Y + c) / sqrt (a * a + b * b);
End {CalcDist};
{------------------------------------------------- -----------}
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 (PointAr [i]. X);
Write ('y ='); ReadInt (PointAr [i]. Y);
End;
Writeln ('Введіть коефіцієнти прямої:');
Write ('a ='); ReadInt (a);
Write ('b ='); ReadInt (b);
Write ('c ='); ReadInt (c);
PrintHead;
PrintInData;
Writeln ('Записати введені дані у файли вхідних даних?');
Writeln ('(y - Так, n - Ні)');
Repeat
ch: = ReadKey;
Until ((ch = 'y') or (ch = 'n'));
if (ch = 'y') then
Begin
Assign (PointFile, 'point.dat'); Rewrite (PointFile);
Assign (LineFile, 'line.dat'); Rewrite (LineFile);
For i: = 1 to n do
Write (PointFile, PointAr [i]);
Writeln ('Файл point.dat перезаписаний! Поточний розмір', size, 'компонент.');
Write (LineFile, a);
Write (LineFile, b);
Write (LineFile, c);
Writeln ('Файл line.dat перезаписаний !!!');
Close (PointFile); Close (LineFile);
End;
End
else
Begin
Assign (PointFile, 'point.dat'); Reset (PointFile);
Assign (LineFile, 'line.dat'); Reset (LineFile);
size: = FileSize (PointFile);
n: = size;
For i: = 1 to n do
Read (PointFile, PointAr [i]);
Read (LineFile, a);
Read (LineFile, b);
Read (LineFile, c);
Close (PointFile); Close (LineFile);
Writeln ('Дані з вхідних файлів завантажені !!!');
PrintInData;
End;
{Уствновка початкових значень змінних}
Xmin: = PointAr [1]. X;
Xmax: = PointAr [1]. X;
Ymin: = PointAr [1]. Y;
Ymax: = PointAr [1]. Y;
Dmin: = CalcDist (a, b, c, PointAr [1]. X, PointAr [1]. Y);
Dmax: = Dmin;
{Цикл обчислення}
For i: = 2 to n do
Begin
D: = CalcDist (a, b, c, PointAr [i]. X, PointAr [i]. Y);
if D> Dmax then
Begin
Xmax: = PointAr [i]. X;
Ymax: = PointAr [i]. Y;
Dmax: = D
End
Else
Begin
if D <Dmin then
Begin
Xmin: = PointAr [i]. X;
Ymin: = PointAr [i]. Y;
Dmin: = D
End
End
End;
Writeln ('Мінімальна відстань до точки (', Xmin ,';', Ymin, ') Dmin =', Dmin: 8:5);
Writeln ('Максимальна відстань до точки (', Xmax ,';', Ymax, ') Dmax =', Dmax: 8:5);
Assign (ResultFile, 'result.txt');
Rewrite (ResultFile);
Writeln (ResultFile, 'Мінімальна відстань до точки (', Xmin ,';', Ymin, ') Dmin =', Dmin: 8:5);
Write (ResultFile, 'Максимальна відстань до точки (', Xmax ,';', Ymax, ') Dmax =', Dmax: 8:5);
Close (ResultFile);
Readln;
End.
Екранні форми:

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

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

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


Схожі роботи:
Задачі з геометрії
Перші досліди з передачі електрики на відстань
Знайти звук
Фінансові пастки як їх знайти і знешкодити
Знайти Бога і самого себе
Твори на вільну тему - Допоможіть знайти
Про чудесних ліках яких не знайти в аптеці
Знайти найдовше спільне слово двох заданих пропозицій
Геометрія місця точок на площині
© Усі права захищені
написати до нас