Need help with minor issues.

So here is my code:
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
/*
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Point
{
private:
	double px;
	double py;

public:
	void setX(const double x);
	void setY(const double y);
	double getX() const;
	double getY() const;
};

class Rectangle
{
private:
	string name;
	Point blPoint;
	double length, height;

public:
	void setName(const string & inName);
	void setBottomLeft(const double x, const double y);
	void setDimensions(const double inLength, const double inHeight);

	string getName() const;
	Point getBottomLeft() const;
	double getLength() const;
	double getHeight() const;

	double area() const;
	double perimeter() const;
	Point midPoint() const;
	void scaleBy2();
	void display() const;
};

void welcome();
bool read_rec(const string promptName, const string errorInvalid, const string errorUsed, string & inName, vector<Rectangle> & list);
void read_coord(const string promptPoint, double & x, double & y);
void read_length(const string promptLength, double & inLength, double & inHeight);
void add_rec(const string Name, double x, double y, double inLength, double inHeight, vector<Rectangle> & list);

int main()
{
	// Define your local variables, e.g. a vector of class Rectangle
    Rectangle rec;
    vector<Rectangle> list;
    string prompt1stName = "Enter the name of the first rectangle: ";
    string promptName = "Enter the name of the next rectangle: ";
    string errorInvalid = "Invalid input. Type 'rec' following by the name or 'stop' if done.";
    string errorUsed = "This name is already being used!";
    string inName;
    string Name;
    
	// Display welcome banner
welcome();

	/* Prompt user for first rectangle or 'stop' */
	bool read = read_rec(prompt1stName, errorInvalid, errorUsed, inName, list);
	
	// WHILE user input is invalid
	while (read == false)
    {
        
		// Display "Try again! "
 cout << "Try again! " << endl;
        bool read = read_rec(prompt1stName, errorInvalid, errorUsed, inName, list);
    }
    
	// IF user input is not 'stop'
	    if (inName != "stop")
    {
		// Extract rectangle name from user input
		        int a = inName.length() - 4;
        Name = inName.substr(4, a);
        
		// Prompt for bottom left point
		        double x, y;
        string promptPoint = "Enter " + Name + "'s bottom left x and y coords: ";
        read_coord(promptPoint, x, y);
        
		// Prompt for length and height
		        double inLength, inHeight;
        string promptLength = "Enter " + Name + "'s length and height: ";
        read_length(promptLength, inLength, inHeight);
        
		// Add rectangle to the rectangle list
        add_rec(Name, x, y, inLength, inHeight, list);
    }
	/* Prompt user for next rectangle or 'stop' */
	// WHILE user input not 'stop'
	    while (inName != "stop")
    {
		// Display "Thank you! "
cout << "Thank you! ";
bool read = read_rec(promptName, errorInvalid, errorUsed, inName, list);
		
		// WHILE user input is invalid while (read == false)
        {
		
			// Display "Try again! "
			            cout << "Try again! " << endl;
            read = read_rec(promptName, errorInvalid, errorUsed, inName, list);
        }
        
			// IF user input is not 'stop'
			        if (inName != "stop")
        {
            
				// Extract rectangle name from user input
				            int a = inName.length() - 4;
            Name = inName.substr(4, a);
            
				// Prompt for bottom left point
				            double x, y;
            string promptPoint = "Enter " + Name + "'s bottom left x and y coords: ";
            read_coord(promptPoint, x, y);
            
				// Prompt for length and height
				            double inLength, inHeight;
            string promptLength = "Enter " + Name + "'s length and height: ";
            read_length(promptLength, inLength, inHeight);


				// Add rectangle to the rectangle list
            add_rec(Name, x, y, inLength, inHeight, list);
        }
    }
    
	// IF the rectangle list is not empty
	    if (list.size() != 0)
    {
		// Display all rectangles in the rectangle list
		        for (int i = 0; i < list.size(); i++)
        {
            cout << "Rectangle '" << list[i].getName() << "' : ";
            list[i].display();
            list[i].scaleBy2();
            cout << "     After scale by 2: ";
            list[i].display();
            cout << endl;
        }
    }

	// ELSE
	else 
        {
		// Display that no rectangles are in the list
		        cout << "You have no rectangles in your list." << endl;
    }   

  return 0;
}

// FUNCTION DEFINITIONS GO HERE:
void welcome()
{
    cout << "Welcome! Create your own list of rectangles." << endl;
    cout << "You will be asked to provide information about each rectangle in your list by name." << endl;
    cout << "Type the word 'stop' for the rectangle name when you are done." << endl;
    cout << endl;
}

bool read_rec(const string promptName, const string errorInvalid, const string errorUsed, string & inName, vector<Rectangle> & list)
{
    cout << promptName;
    getline(cin, inName);
    
    if (inName == "stop")
    {
        return(true);
    }
    else if (inName.substr(0,4) != "rec ")
    {
        cout << errorInvalid;
        return(false);
    }
    else
    {
        int j = 0;
        for (int i = 0; i < list.size(); i++)
        {
            if (inName == "rec " + list[i].getName())
            {
                j = j+1;
            }
        }
        if (j == 0)
        {
            return(true);
        }
        if (j != 0)
        {
            cout << errorUsed;
            return(false);
        }
    }
}

void read_coord(const string promptPoint, double & x, double & y)
{
    cout << promptPoint;
    cin >> x;
    cin >> y;
    }

void read_length(const string promptLength, double & inLength, double & inHeight)
{
    cout << promptLength;
    cin >> inLength;
    cin >> inHeight;
    cout << endl;
    
    while (inLength <= 0 || inHeight <= 0)
    {
        cout << "Make length and height positive values. Try again.";
        cout << promptLength;
        cin >> inLength;
        cin >> inHeight;
        cout << endl;
    }
}

void add_rec(const string Name, double x, double y, double inLength, double inHeight, vector<Rectangle> & list)
{
    Rectangle rec;
    rec.setName(Name);
    rec.setBottomLeft(x, y);
    rec.setDimensions(inLength, inHeight);
    list.push_back(rec);
}

// CLASS MEMBER FUNCTION DEFINITINOS GO HERE:

void Point::setX(const double x)
{
	px = x;
}

void Point::setY(const double y)
{
	py = y;
}

double Point::getX() const
{
	return (px);
}

double Point::getY() const
{
	return (py);
}

void Rectangle::setName(const string & inName)
{
name = inName;
}

void Rectangle::setBottomLeft(const double x, const double y)
{
	blPoint.setX(x);
	blPoint.setY(y);
}

void Rectangle::setDimensions(const double inLength, const double inHeight)
{
	length = inLength;
	height = inHeight;
}

string Rectangle::getName() const
{
	return (name);
}

Point Rectangle::getBottomLeft() const
{
	return (blPoint);
}

double Rectangle::getLength() const
{
	return (length);
}

double Rectangle::getHeight() const
{
	return (height);
}

double Rectangle::area() const
{
    return(length * height);
}

double Rectangle::perimeter() const
{
    return(2 * (length + height));
}

Point Rectangle::midPoint() const
{
Point midPoint;
    double mx = blPoint.getX() + 0.5 * length;
    double my = blPoint.getY() + 0.5 * height;
    midPoint.setX(mx);
    midPoint.setY(my);
    return(midPoint); 
}

void Rectangle::scaleBy2()
{
		double midx = blPoint.getX() + 0.5 * length;
    double midy = blPoint.getY() + 0.5 * height;
    double newblPx = midx - length;
    double newblPy = midy - height;
    length = 2*length;
    height = 2*height;
    blPoint.setX(newblPx);
    blPoint.setY(newblPy);
}

void Rectangle::display() const
{
    cout << " Location is (" << blPoint.getX() << ", " << blPoint.getY() << "), length is " << length << ", height is " << height << "; Area is " << area() << "; perimeter is " << perimeter() << ", midpoint is located at (" << midPoint().getX() << ", " << midPoint().getY() << ")" << endl;
}


When ran it outputs the correct information but it also includes the line Invalid input. Type 'rec' following by the name or 'stop' if done. for a reason that i don't understand. The program also acts strangely after you put lets say fire instead of rec fire, after you enter fire it is supposed to say "Invalid input. Type 'rec' following by the name or 'stop' if done." and then you put in rec fire, however it won't accept anything as an input. and lastly i need it to output how many rectangles there are but i don't know which variable that corresponds to.
ANY HELP would be much appreciated!!
Last edited on
Topic archived. No new replies allowed.