Задача. От клавиатурата се въвеждат данни за 10 правоъгълника в равнината със страни, успоредни на координатните оси. Да се намери лицето на сечението на всички правоъгълници.

С тази задача целим да демонстрираме обектният подход и принципа на "черната кутия", дори и в някои случаи това да води до привидно усложнение на решението.

Да дефинираме клас Point с необходимите член-данни, контруктори и методи. Реализирайки класа да се стремим, там където е възможно, да спазваме максимално принципа на абстракцията - т.е. методите да работят коректно независимо от конкретната реализиация на точката - дали точката е например в декартови или полярни координати, дали е двумерна или повече-мерна и т.н. Освен страндартни методи като distanceTo, translate, getX, getY, да дефинираме и един метод Point heel (const Point&, const Point&), който ще използваме по-късно, намиращ "пета" на правоъгълен тригълник, за който двете точки са краища на хипотенузата, т.е. третия връх на триъгълника, ако катетите му са успоредни на осите.

Да дефинираме сега клас Rectangle с две точки, които го определят - горна лява и долна дясна. Да дефинираме методи translate, Rectangle intersect (const Rectangle&), union, double surface(), double perimeter(). Макар че не винаги е възможно да следваме стриктно обектния подход, да се опитаме да го направим за методите surface и perimeter. При тяхната реализация, вместо да "смятаме ръчно" дължините на страните, нека използваме методите distanceTo и heel на Point. По този начин си осигуряваме, че тези методи ще работят независимо от реализацията на точката, т.е. дали е в декартови или полярни координати, тъй като постигането на такава общност е целта на нашето упражнение.

При дефинирането на класовете се грижим да създаден удобни коснтруктори. Хубаво е да си зададем въпроса какво ще стане, ако за клас Rect не дефинираме конструктор без параметри, а само такъв с някакви параметри - напр. две точки, и след това се опитаме да създадем масив от правоъгълници. Кога можем да разчитаме на конструктора по подразбиране и кога не? Важи ли същото за конструктора за копиране?
Последно модифициране: събота, 12 ноември 2011, 17:38