-
Notifications
You must be signed in to change notification settings - Fork 0
/
Menu.cpp
155 lines (153 loc) · 5.71 KB
/
Menu.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* Assignment C++: 3
Author: Ron Zilber
*/
#include "Menu.h"
Menu::Menu() : mainState(0), shapesState(0), shapePointersList(nullptr){} // Default Constructor
Menu::~Menu(){
try {
Shape *shapePointer = shapePointersList->getTop(); // Delete the dynamic memory that has been allocated in the menu
while(shapePointer){ // While list isn't empty
delete shapePointer; // Delete the actual shape from the data field of the node
shapePointersList->deleteNode(); // After there is no data in the node - delete that node itself
shapePointer = shapePointersList->getTop();
}
}
catch(const char * msg){}
delete shapePointersList; // After all node has been deleted - delete the list itself
}
void Menu::mainMenu(){ /// Final State Machine for the main menu
shapePointersList = new LinkedList<Shape*>; // Create an empty linked list of pointers to shapes
bool flag = false;
do{ // The flag get 'true' value when the user want to go out from this menu
cout << "=======================================\n"
"<1> Add element to the list\n"
"<2> Remove the last shape from list\n"
"<3> Print the last shape\n"
"<4> Exit\n"
"=======================================\n";
cin >> mainState; // Get the desired option from the user
switch (mainState) {
case 1:{ // Add element to the list
shapesMenu();
break;
}
case 2:{ // Remove the last shape from list
try{
delete shapePointersList->getTop();
shapePointersList->deleteNode();
}
catch(const char* msg){ // Catch an 'empty list' error
cout << msg << endl;
cout << "please try again" << endl;
}
break;
}
case 3:{ // Print the last shape
try{
cout << endl;
cout << *(shapePointersList->getTop());
cout << endl;
}
catch(const char* msg){ // Catch an 'empty list' error
cout << msg << endl;
cout << endl; // There is also double endl in original exe file
}
break;
}
case 4:{
cout << "goodbye!";
flag = true;
break;
}
default:{
cout << "Invalid selection." << endl;
break;
}
}
}
while(!flag);
}
void Menu::shapesMenu() {
cout << "Choose 1 for Square, 2 for Circle, 3 for Triangle:";
cin >> shapesState;
switch (shapesState) {
case 1: {
insertShape("square");
break;
}
case 2: {
insertShape("circle");
break;
}
case 3: {
insertShape("triangle");
break;
}
default: {
cout << "Invalid choice" << endl;
}
}
}
void Menu::insertShape(const char * shape) {
char colorBasket[20]; bool validShapeParameters = false;
if(strcmp(shape,"square") == 0) {
double edge;
Square * squarePointer;
while(!validShapeParameters){
cout << "Enter square's color: ";
cin >> colorBasket;
cout << "Enter square's side length: ";
cin >> edge;
try {
squarePointer = new Square(colorBasket, edge);
validShapeParameters = true;
}
catch (const char *msg) {
cout << msg << endl;
cout << "please try again" << endl;
}
catch(...){cout << "unknown error occurred" << endl;}
}
shapePointersList->insert(squarePointer);
}
else if(strcmp(shape,"circle") == 0){
double radius;
Circle * circlePointer;
while(!validShapeParameters){
cout << "Enter circle's color: ";
cin >> colorBasket;
cout << "Enter circle's radius: ";
cin >> radius;
try {
circlePointer = new Circle(colorBasket, radius);
validShapeParameters = true;
}
catch (const char *msg) {
cout << msg << endl;
cout << "please try again" << endl;
}
catch(...){cout << "unknown error occurred" << endl;}
}
shapePointersList->insert(circlePointer);
}
else if(strcmp(shape,"triangle") == 0){
double side;
OrthogonalTriangle * trianglePointer;
while(!validShapeParameters){
cout << "Enter Triangle's color: ";
cin >> colorBasket;
cout << "Enter Triangle's side: ";
cin >> side;
try {
trianglePointer = new OrthogonalTriangle(colorBasket, side);
validShapeParameters = true;
}
catch (const char *msg) {
cout << msg << endl;
cout << "please try again" << endl;
}
catch(...){cout << "unknown error occurred" << endl;}
}
shapePointersList->insert(trianglePointer);
}
}