From 0c2d77569ade22f22ec5dfb89f7c052f3fd1ab65 Mon Sep 17 00:00:00 2001 From: Dan Cojocaru Date: Sun, 13 Mar 2022 17:08:26 +0200 Subject: [PATCH] Solved Lab1 Slide17 --- .gitignore | 2 + .vscode/settings.json | 3 + Lab1/README.md | 11 +++ Lab1/shape_start.cpp | 95 +++++++++++++++++++++ Lab1/shape_start_sol.cpp | 173 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 284 insertions(+) create mode 100644 .gitignore create mode 100644 Lab1/shape_start.cpp create mode 100644 Lab1/shape_start_sol.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4729cad --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +a.exe +a.out \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index a520273..0e423c0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,8 @@ "MD024": { "siblings_only": true } + }, + "files.associations": { + "ostream": "cpp" } } \ No newline at end of file diff --git a/Lab1/README.md b/Lab1/README.md index 1e22008..1952fe7 100644 --- a/Lab1/README.md +++ b/Lab1/README.md @@ -63,3 +63,14 @@ public: }; ``` +## Slide 17 + +### Problem + +Write a program that implements a class hierarchy that can be used to model geometric shapes, based on the following structure: + +[shape_start.cpp](./shape_start.cpp) + +### Solution + +See [shape_start_sol.cpp](./shape_start_sol.cpp). diff --git a/Lab1/shape_start.cpp b/Lab1/shape_start.cpp new file mode 100644 index 0000000..1612260 --- /dev/null +++ b/Lab1/shape_start.cpp @@ -0,0 +1,95 @@ +#include +#include + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +using namespace std; + +enum BOOL { FALSE, TRUE }; + +class GeneralShape +{ + public: + GeneralShape(){}; + ~GeneralShape(){}; + virtual long GetArea() = 0; + virtual long GetPerim()= 0; + virtual void Draw() = 0; +}; + +void GeneralShape::Draw() +{ + cout << "drawing mechanism!" << endl; +} + +class Circle : public GeneralShape +{ + public: + Circle(int radius):itsRadius(radius){} + ~Circle(){} + + private: + int itsRadius; + int itsCircumference; +}; + +class Rectangle : public GeneralShape +{ + public: + Rectangle(int len, int width): + itsLength(len), itsWidth(width){} + ~Rectangle(){} + virtual int GetLength() { return itsLength; } + virtual int GetWidth() { return itsWidth; } + + private: + int itsWidth; + int itsLength; +}; + +class Square : public Rectangle +{ + public: + Square(int len); + Square(int len, int width); + ~Square(){} + long GetPerim() {return 4 * GetLength();} +}; + +Square::Square(int len): +Rectangle(len,len) +{} + +Square::Square(int len, int width): +Rectangle(len,width) +{ + if (GetLength() != GetWidth()) + cout << "Error, not a square... a Rectangle??\n"; +} + +int main() +{ + int choice; + BOOL quit = FALSE; + GeneralShape *sp; + + while (1) + { + cout << "(1)Circle (2)Rectangle (3)Square (0)Quit: "; + cin >> choice; + + switch (choice) + { + default: quit = TRUE; + break; + } + + if (quit) break; + + cout << endl; + } + + return 0; +} diff --git a/Lab1/shape_start_sol.cpp b/Lab1/shape_start_sol.cpp new file mode 100644 index 0000000..6329861 --- /dev/null +++ b/Lab1/shape_start_sol.cpp @@ -0,0 +1,173 @@ +#include +#include + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +using namespace std; + +enum BOOL { FALSE, TRUE }; + +class GeneralShape { + public: + GeneralShape(){}; + ~GeneralShape(){}; + virtual long GetArea() = 0; + virtual long GetPerim()= 0; + virtual void Draw() = 0; +}; + +void GeneralShape::Draw() { + cout << "drawing mechanism!" << endl; +} + +class Circle : public GeneralShape { + public: + Circle(int radius):itsRadius(radius), itsCircumference(2*M_PI*radius){} + ~Circle(){} + virtual long GetArea(); + virtual long GetPerim(); + virtual void Draw(); + + private: + int itsRadius; + int itsCircumference; +}; + +long Circle::GetArea() { + return M_PI * itsRadius * itsRadius; +} + +long Circle::GetPerim() { + return itsCircumference; +} + +void Circle::Draw() { + cout << "Drawing circle with r=" << itsRadius << ", area=" << GetArea() << ", perim=" << GetPerim() << endl; +} + +class Rectangle : public GeneralShape { + public: + Rectangle(int len, int width): + itsLength(len), itsWidth(width){} + ~Rectangle(){} + virtual int GetLength() { return itsLength; } + virtual int GetWidth() { return itsWidth; } + virtual long GetArea(); + virtual long GetPerim(); + virtual void Draw(); + + private: + int itsWidth; + int itsLength; +}; + +long Rectangle::GetArea() { + return itsLength * itsWidth; +} + +long Rectangle::GetPerim() { + return (itsLength + itsWidth) * 2; +} + +void Rectangle::Draw() { + cout << "Drawing rectangle with W=" << itsWidth << ", H=" << itsLength << ", area=" << GetArea() << ", perim=" << GetPerim() << endl; +} + +class Square : public Rectangle { + public: + Square(int len); + Square(int len, int width); + ~Square(){} + long GetPerim() {return 4 * GetLength();} + virtual void Draw(); +}; + +Square::Square(int len): Rectangle(len,len) {} + +Square::Square(int len, int width): Rectangle(len,width) { + if (GetLength() != GetWidth()) { + cout << "Error, not a square... a Rectangle??\n"; + } +} + +void Square::Draw() { + cout << "Drawing square with L=" << GetLength() << ", area=" << GetArea() << ", perim=" << GetPerim() << endl; +} + +void shapeMenu(GeneralShape& shape) { + bool stop {false}; + int choice {}; + while (1) { + cout << "(1)Draw (2)Get Perimeter (3)Get Area (0)Back: "; + cin >> choice; + switch (choice) { + case 1: + shape.Draw(); + break; + case 2: + cout << shape.GetPerim() << endl; + break; + case 3: + cout << shape.GetArea() << endl; + break; + default: + stop = true; + } + if (stop) break; + cout << endl; + } +} + +void circleMenu() { + int radius; + cout << "Radius? "; + cin >> radius; + Circle c {radius}; + shapeMenu(c); +} + +void rectMenu() { + int width, height; + cout << "Width? "; + cin >> width; + cout << "Height? "; + cin >> height; + Rectangle r {height, width}; + shapeMenu(r); +} + +void squareMenu() { + int length; + cout << "Side Length? "; + cin >> length; + Square s {length}; + shapeMenu(s); +} + +int main() { + int choice; + BOOL quit = FALSE; + GeneralShape *sp; + while (1) { + cout << "(1)Circle (2)Rectangle (3)Square (0)Quit: "; + cin >> choice; + switch (choice) { + case 1: + circleMenu(); + break; + case 2: + rectMenu(); + break; + case 3: + squareMenu(); + break; + default: quit = TRUE; + break; + } + if (quit) break; + cout << endl; + } + return 0; +}