954,480 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Creating a rectangle C++

I'm trying to write a method that draws a rectangle. If the user enters height = 4, and width = 8, and the print of character " * ", then the left rectangle is drawn on the left if the filled flag is true. If the flag is false, then version on the right is drawn which would be an empty rectangle.

* * * * * * * * ||||| * * * * * * * *
* * * * * * * * ||||| *e m p t y *
* * * * * * * * ||||| *e m p t y *
* * * * * * * * ||||| * * * * * * * *


I've written the below so far, where am I going wrong?:

rec()
{
if (filled == true)
{
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
cout << "*";
}
cout << endl;

}
}
else // this is the empty rectangle
{
for (int row = 0 ; row < height; row++)
{
for (int col = 0; col < width; col++)
{
cout << "*" << setw(width-1) << "*";
}
cout << endl;
}
}

stan2000
Newbie Poster
6 posts since Mar 2011
Reputation Points: 7
Solved Threads: 0
 

Welcome to DaniWeb! To allow us to help most effectively, please use code tags when you post code. Also, you should always comment code as much as you can. When you post code that isn't working, you should also show the incorrect output (or any errors that occur). I also suggest that you make a fully compilable example that demonstrates the problem (i.e. include main(), and hardcode values rather than taking user input).

Good luck,

David

daviddoria
Posting Virtuoso
1,996 posts since Feb 2008
Reputation Points: 437
Solved Threads: 204
 

I would put an if statement in your second for loop for the empty rectangle and check to see if you are not on the top or the bottom of the rectangle. If you are not on the top or bottom then only place an Astrix on the ends otherwise place all Astrix.

NathanOliver
Veteran Poster
1,084 posts since Apr 2009
Reputation Points: 215
Solved Threads: 189
 

try this

void rec(int &right,int&left){
	for(int x =0;x<right;x++){
		for(int i=0;i<left;i++){
			cout <<"*";
		}
		cout <<"*\n";
	}

}
int main(){
int l=10,r=20;
rec(l,r);
return 0;
}
richieking
Master Poster
764 posts since Jun 2009
Reputation Points: 61
Solved Threads: 152
 

@ richieking He already has the algorithm to make a solid rectangle he is trying to make an empty one. Also what you have puts an extra Astrix on each line so your rectangle would be 10x21.

NathanOliver
Veteran Poster
1,084 posts since Apr 2009
Reputation Points: 215
Solved Threads: 189
 

i might as well write up all the code, so that you get the bigger picture:

class Rec
{
      pri:
              int height;
              int width;
              char c;
              bool filled;
              
      pub:
             Rect ()
             {
                       height = 0;
                       width = 0;
                       filled = true;
             }
                       
             
             Rec (int h, int w, char c, bool f)
             {
                       height = h;
                       width = w;
                       ch = c;
                       filled = f;
             }
            
                       
             void set (int h, int w, char c)
             {
                       height = h;
                       width = w;
                       ch = c;
                       
             }
             
             void flip () // swapping height with width and viceversa
             { 
                  int height, h , width, w;
                  
                  height = h;
                  width = w;
                  width = height;
                  width = h;
                  height = w;
                       
             }
                            
             
             void toggle () //????????????????????????????????
             {
                       if (filled)
                       {
                           filled = false;
                       }
                       else
                       {
                           filled = true;
                       }
             }
                       
             int getHeight()
             {
                       return height;
             }
             int getWidth()
             {
                       return width;
             }
             int getArea ()
             {
                       return (height * width);
             }
              
              void drawrec();       
};

void Rec::drawrec() //
             {
                        if (filled == true) 
                       { 
                        for (int row = 0; row < height; row++)
                        { 
                            for (int col = 0; col < width; col++)
                            {
                                cout << "*";
                            }
                            cout << "*";
                            cout << endl;
                            
                         }
                         }
                         else //this is where i'm finding it confusing
                        {
                         for (int row = 0 ; row < height; row++)
                         {
                            for (int col = 0; col < width; col++)
                            {
                                
                               cout << "*" << setw(width-1) << "*";
                            }
                               cout << endl;  
                         }
                         }
}
int main ()
{
    char tempCh;
    int tempHeight, tempWidth;
    
    Rec rec1;
    
    cout << " Enter Height: " << endl;
    cin >> tempHeight;
    
    cout << " Enter Width: " << endl;
    cin >> tempWidth;
    
    cout << " Enter Character: " << endl;
    cin >> tempCh;
    
    rec1.set (tempHeight, tempWidth, tempCh);
    
    cout << " Display Height: " << rec1.getHeight() << endl;
    cout << " Display Width: " << rec1.getWidth() << endl;
    cout << " Display Area: " << rec1.getArea() << endl;
    
    rec1.flip (); // ????
             
                       
    rec1.drawrec();
    

    Rec rec2 (10 , 20, '*' , true); // ??????
    
    rec2.drawrec();    //i'm not sure i'm doing this correctly
    
    cout << " Enter Height: " << endl;
    cin >> tempHeight;
    
    cout << " Enter Width: " << endl;
    cin >> tempWidth;
    
    cout << " Enter Character: " << endl;
    cin >> tempCh;
    
    rec2.set (tempHeight, tempWidth, tempCh);
    
    cout << " Display Height: " << rec2.getHeight() << endl;
    cout << " Display Width: " << rec2.getWidth() << endl;
    cout << " Display Area: " << rec2.getArea() << endl;
    
    rec2.flip (); // ????
             
                       
    rec2.drawrec();
    
    system ("PAUSE");
    
    return 0;
}

stan2000
Newbie Poster
6 posts since Mar 2011
Reputation Points: 7
Solved Threads: 0
 
@ richieking He already has the algorithm to make a solid rectangle he is trying to make an empty one. Also what you have puts an extra Astrix on each line so your rectangle would be 10x21.

try and run it and see it first ok?

richieking
Master Poster
764 posts since Jun 2009
Reputation Points: 61
Solved Threads: 152
 

i have...runs successfully, but the unfilled square does not appear

stan2000
Newbie Poster
6 posts since Mar 2011
Reputation Points: 7
Solved Threads: 0
 

stan2000 plz put your code in the code tags

richieking
Master Poster
764 posts since Jun 2009
Reputation Points: 61
Solved Threads: 152
 

brute force here....

#include <iostream>



using namespace std;



void rec(int &right,int&left){
	if(right != left){
		cout <<" left and right must be the same int value";
		return;
	}
	for(int a=0;a<right+1;a++)
	{
		cout <<"* ";
	}
	cout<<endl;
	for(int x =0;x<right;x++){
		cout <<"*";
		for(int i=0;i<left;i++){
			cout <<"  ";

		}

		cout <<"*\n";
	}
	for(int a=0;a<right+1;a++)
		{
			cout <<"* ";
		}
}

int main(){
	int left,right;
	cout <<"Your width and height int values must be the same. \n";
	cout <<"Example width=30, height=30\n";
	cout <<"Enter the width\n";
	cin>> left;
	cout <<"Enter the height\n";
	cin>>right;
	rec(left,right);



	return 0;

}

######## output   ####
Your width and height int values must be the same. 
Example width=30, height=30
Enter the width
10
Enter the height
10
* * * * * * * * * * * 
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
* * * * * * * * * * *
richieking
Master Poster
764 posts since Jun 2009
Reputation Points: 61
Solved Threads: 152
 

updated.
on lines 16 and 30... do this

cout<<"**";


to both numbers.
It will produe a better draw.

==out put==

10
Enter the height
10
**********************
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
*                    *
**********************
richieking
Master Poster
764 posts since Jun 2009
Reputation Points: 61
Solved Threads: 152
 
That still didn't answer my question. I was hoping that an if statement would be inserted in the second else which would create an unfilled rectangle.


void Rectangle::drawrec() 
{
if (filled = true) 
{ 
for (int row = 0; row < height; row++)
{ 
for (int col = 0; col < width; col++)
{
cout << "*";
}

cout << endl;

}
}
else

{
for (int row = 0 ; row < height; row++)
{
for (int col = 0 ; col < width ; col++)

{
if (height != width)
cout << " * ";

}

}

}
stan2000
Newbie Poster
6 posts since Mar 2011
Reputation Points: 7
Solved Threads: 0
 

Well i just gave you an idea. carry on from there.
:)

richieking
Master Poster
764 posts since Jun 2009
Reputation Points: 61
Solved Threads: 152
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: