А тепер - перше завдання квесту.
Вам дано конкретну задачу з аналітичної геометрії. Насправді завдання звучить так: "Написати для бібліотеки Geometry фунцію, процедуру або метод певного об'єкту, конструктор тощо, залежно від конкретної задачі (надалі - модуль), яка буде розв'язувати БУДЬ-ЯКУ задачу такого типу, незалежно від конкретних чисел, що стоять в умові задачі для прикладу.
Категоричними умовами, яких треба дотримуватися, є таке. У біблітеці, яку ми всі пишемо, вже прийнято певні рішення щодо програмної реалізації основних понять геометрії у вигляді певних структур даних (object у Паскалі). Це означає, що Ваш модуль повинен приймати вхідну інформацію і повертати результат у термінах цих типів даних. Тобто, якщо Ваше завдання звучить так: "Записати рівняння прямої лінії (площини, конуса тощо), яка (який)...", то Ви маєте спадкувати відповідний об'єкт, утворити об'єкт-нащадок та написати конструктор цього об'єкту, що отримує вхідні параметри -- змінні типу об'єктів, що відповідають певним поняттям геометрії. Якщо сказано "Записати рівняння прямої лінії, яка проходить через таку-то точку та такі-то пряму та площину", то Вашою задачею є написання конструктора змінної-нащадка прямої типу tLine, вхідними даними якого КАТЕГОРИЧНО мають бути саме змінні типу pPoint, pLine та pPlane.
На етапі проектування псувати саму бібліотеку Geometry не варто. Для завдання типу "Записати рівняння прямої лінії, яка проходить через таку-то точку та такі-то пряму та площину" Ви, наприклад, маєте здійснити ТРИфайловий проект.
1. Бібліотека Geometry, яку НЕ МОЖНА міняти текстуально.
2. Модуль Паскаля, наприклад, такий:
unit MyLab1;
uses Geometry, Crt, ...
Interface
tMyLine = object(tLine) { спадкуємо об'єкт tMyLine від tLine
і дописуємо конструктор, що й розв'язує задачу }
constructor CreateLine(p: pPlane; M: pPoint;
var Res: pLine; var RC: Integer);
end;
Implementation
constructor tMyLine.CreateLine(p: pPlane; M: pPoint;
var Res: pLine; var RC: Integer);
begin
...........
end;
Begin
writeln('tMyLine for Geometry. V1.0 (C) Petryshyn Olesia, 2011');
End.
3. Ваша головна програма:
program Holovna;
uses Crt, MyLab1, Geometry;
var
p: pPlane;
M: pPoint;
L2: pLine;
RC: Integer; { Ретурн коде! :) }
L: pMyLine;
Begin
{
Тут треба задати початкові значення для вхідних величин,
}
New(L, CreateLine(p, M, L2, RC));
if L = Nil then ... { все пропало... }
else ... { нє, ще не все! }
End.
Ретельна перевірка коректності вхідних даних - ще одна хороша думка, що прийшла була колись в голову бігбосу на етапі розробки специфікацій. Який мануал не пиши, а дурний користувач обов'язково спроможеться передати до Вашого модуля некоректні дані. Коректна реакція на некоректні дані користувача - це гречно, шляхетно та кошерно. А якщо програма на помилкові вхідні дані реагує "злітанням" та "вивалюванням" в операційну систему, це просто ознака непрофесійності авторів розробки. Випишіть всі варіанти некоректностей, що можуть трапитися через фантазії користувача. А може, й через ляпи ваших колег, що працюють поруч. Всі ці перевірки треба буде реалізувати у вашому модулі.
Чи є у Вашої задачі варіанти наборів коректних вхідних даних, що їх доведеться обробляти за різними алгоритмами? Чи не забули Ви реалізувати їх всі? А реалізувавши, чи відтестували?
Головна програма Вашого проекту пишеться лише з метою продемонструвати роботу Вашої функції або процедури. Тому до інтерфейсу (діалогу з користувачем) вимог аж ніяких. Зате є жорстка вимога щодо ВІДСУТНОСТІ виведення куди-небудь усередені тієї процедури, що її Вам замовлено. Спілкуватися "зі світом широким" Ваша "проця" має через список параметрів, а не засобами введення-виведення, які є різними у різних середовищах та у різних користувачів, а ми тут пишемо пакет з претензією на універсальність.
Ось це все бігбос Тарас і висловив нашому герою, розвалившись у своєму фотелі, закинувши ноги на приставний столик, явно копіюючи своїх американських замовників, і потягуючи каву з горнятка.
За другим разом Вовчик все зробив як слід, роботу здав. Випробувальний термін минув, і тепер він - у штаті.
А Ви?
|