А тепер — перше завдання квесту.
Вам дано конкретну задачу з аналітичної геометрії. Насправді завдання звучить так: "Написати для бібліотеки Geometry фунцію, яка буде розв'язувати БУДЬ-ЯКУ задачу такого типу, незалежно від конкретних чисел, що стоять в умові задачі для прикладу.
Категоричними умовами, яких треба дотримуватися, є таке. У біблітеці, яку ми всі пишемо, вже прийнято певні рішення щодо програмної реалізації основних понять геометрії у вигляді певних структур даних (typedef struct). Це означає, що Ваша функція повинна приймати вхідну інформацію і повертати результат у термінах цих типів даних. Тобто, якщо Ваше завдання звучить так: "Записати рівняння прямої лінії, яка...", то Ви маєте написати функцію, що як значення має повертати змінну типу TLine або TLine * (посилання на ...) і, відповідно, вхідні параметри мають бути саме змінними типів, відповідних поняттям геометрії. Якщо сказано "Записати рівняння прямої лінії, яка проходить через таку-то точку та такі-то пряму та площину", то КАТЕГОРИЧНО вхідними даними мають бути саме змінні типу TPoint, TLine та TPlane або, ще краще, посилання на них — TPoint *, TLine *, TPlane * -- ті, що їх реалізовано у Вашій версії бібліотеки.
На етапі проектування псувати саму бібліотеку Geometry не варто. Ви маєте здійснити ТРИфайловий проект.
1. Бібліотека Geometry, яку не МОЖНА міняти текстуально.
2. Модуль C++, що може бути ДВОфайловим (MyLab1.h та MyLab1.cpp), або ОДНОфайловим (тільки MyLab1.h).
У разі двофайлового варіанту у файлі-заголовку пишемо:
// Це, напр., файл MyLab1.h
#include
#include "geometry.h"
...
TLine * SmthIsDoing(TPlane *p, TPoint *M, TLine *L, int &RC);
// А це -- файл MyLab1.cpp
#include
#include "geometry.h"
#include "MyLab1.h"
...
TLine * SmthIsDoing(TPlane *p, TPoint *M, TLine *L, int &RC)
{
// Тут пишемо реалізацію
};
3. Ваша головна програма:
#include
#include
#include "geometry.h"
#include "MyLab1.h"
int main()
{
tPlane *p;
tPoint *M;
tLine *L, L2;
int RC; // Ретурн коде! :)
// tMyLab1 for Geometry. V1.0 (C) Ipsayenko Vovchyk, 2011
cout << "tMyLine for Geometry. V1.0 (C) Ipsayenko Vovchyk, 2011" << endl;
// Тут треба задати початкові значення для вхідних величин
L2 = SmthIsDoing(TPlane *p, TPoint *M, TLine *L, int RС)
if ((L2 == NULL) && (RC!=0))
... // все пропало...
else {
... // нє, ще не все!
}
}
Ретельна перевірка коректності вхідних даних — ще одна хороша думка, що прийшла була колись в голову бігбосу на етапі розробки специфікацій. Який мануал не пиши, а дурний користувач обов'язково спроможеться передати до Вашої функції некоректні дані. Коректна реакція на некоректні дані користувача — це гречно, шляхетно та кошерно. А якщо програма на помилкові вхідні дані реагує "злітанням" та "вивалюванням" в операційну систему, це просто ознака непрофесійності авторів розробки. Випишіть всі варіанти некоректностей, що можуть трапитися через фантазії користувача. А може, й через ляпи ваших колег, що працюють поруч. Всі ці перевірки треба буде реалізувати у вашій функції.
Чи є у Вашої задачі варіанти наборів коректних вхідних даних, що їх доведеться обробляти за різними алгоритмами? Чи не забули Ви реалізувати їх всі? А реалізувавши, чи відтестували?
Функція main() Вашого проекту пишеться лише з метою продемонструвати роботу Вашої функції або процедури. Тому до інтерфейсу (діалогу з користувачем) вимог аж ніяких. Зате є жорстка вимога щодо ВІДСУТНОСТІ виведення куди-небудь усередені тієї функції, що її Вам замовлено. Спілкуватися "зі світом широким" Ваша "фуця" має через список параметрів, а не засобами введення-виведення, які є різними у різних середовищах та у різних користувачів, а ми тут пишемо пакет з претензією на універсальність.
Ось це все бігбос Тарас і висловив нашому герою, розвалившись у своєму фотелі, закинувши ноги на приставний столик, явно копіюючи своїх американських замовників, і потягуючи каву з горнятка.
За другим разом Вовчик все зробив як слід, роботу здав. Випробувальний термін минув, і тепер він — у штаті.
А Ви?
|