Rachel Sugg
Rachel Sugg

Reputation: 89

issue with while loops

#include <iostream>
#include <math.h>
using namespace std;

int main() {
   int arrowBaseHeight = 0;
   int arrowBaseWidth  = 0;
   int arrowHeadWidth  = 0;
   int i = 0;
   int j = 0;

   cout << "Enter arrow base height:" << endl;
   cin >> arrowBaseHeight;

   cout << "Enter arrow base width:" << endl;
   cin >> arrowBaseWidth;

   cout << "Enter arrow head width:" << endl;
   cin >> arrowHeadWidth;
   cout << endl;

   // Draw arrow base 

   while (i <= arrowBaseHeight){
      while (j <= arrowBaseWidth){
         cout << "*";
         j++;
      }
      cout << endl;
      j = 0;
      i++;
   }

   // Draw arrow head (width = 4)


   return 0;
}

I am trying to write a simple program that takes 3 user entered integers and assigns them to arrowBaseHeight, arrowBaseWidth, and arrowHeadWidth. The output should be a series of asterisks (*) that print out like:

**
**
**
****
***
**
*

to create an image of an arrow.

I have been trying to figure out the best way to print out the base portion of the arrow using nested loops (I have been using while but if for is better, let me know). I have tried multiple different ways and I have yet to figure one out that doesn't throw back an error. I have yet to get to the arrow head portion but if anyone wants to point me in the right direction, it would be helpful!

Upvotes: 0

Views: 410

Answers (3)

Bizzu
Bizzu

Reputation: 459

All you need to do is to add a new variable which could indicate what are you need to print right now. The rule is :

If: up to half of "arrowBaseHeight" iteration you need to print the base

Else: print the head and after that decrease in 1

In addition finger rule - if you are using "while" and you need to increase an iterator it always indicate that you need to use For

#include <iostream>
#include <math.h>
using namespace std;

int main() {
   int arrowBaseHeight = 0;
   int arrowBaseWidth  = 0;
   int arrowHeadWidth  = 0;
   int newArrowBaseWidth=0;

   cout << "Enter arrow base height:" << endl;
   cin >> arrowBaseHeight;

   cout << "Enter arrow base width:" << endl;
   cin >> arrowBaseWidth;

   cout << "Enter arrow head width:" << endl;
   cin >> arrowHeadWidth;

   cout << endl;

   // Draw arrow base 
   for(int i=0; i < arrowBaseHeight; i++){
      newArrowBaseWidth= i < arrowBaseHeight/2 ? arrowBaseWidth : arrowHeadWidth--;
      for(int j=0; j < newArrowBaseWidth; j++){
         cout << "*";
      }
      cout << endl;
   }

   // Draw arrow head (width = 4)


   return 0;
}

Another thing is if you want to iterate n time you need to change the condition from =< that here mean - n+1 time, to <

Upvotes: 0

Bob__
Bob__

Reputation: 12749

You were close, but if you want for a loop to be executed exactly n times, starting your counter i at 0, the condition should be i < n, not i <= n.

About the head, you just have to decrement the number of characters printed in every line, starting from the inputted width.

#include <iostream>

int main()
{
    using std::cout;
    using std::cin;

    int arrowBaseHeight = 0;
    cout << "Enter arrow base height:\n";
    cin >> arrowBaseHeight;

    int arrowBaseWidth  = 0;
    cout << "Enter arrow base width:\n";
    cin >> arrowBaseWidth;

    int arrowHeadWidth  = 0;
    cout << "Enter arrow head width:\n";
    cin >> arrowHeadWidth;
    cout << '\n';

    // Draw arrow base  
    for ( int i = 0; i < arrowBaseHeight; ++i )
    {
        for ( int j = 0; j < arrowBaseWidth; ++j )
        {
            cout << '*';
        }
        cout << '\n';
    }

    // Draw arrow head
    for ( int i = 0, width = arrowHeadWidth; i < arrowHeadWidth; ++i, --width )
    {
        for ( int j = 0; j < width; ++j )
        {
            cout << '*';
        }
        cout << '\n';
    }

    return 0;
}

You can see a lot of repeated code, consider refactoring it using some custom functions, instead.

Upvotes: 1

User987123
User987123

Reputation: 97

You should change the condition of the while loops to:

while (i < arrowBaseHeight) and while (j < arrowBaseWidth).

And for the arrowHeadWidth you could try to get the middle of the arrowBaseHeight. Maybe like this

int r = 0;
if(i == arrowBaseHeight / 2)
{
 while(r < arrowHeadWidth)
 {
   cout << "*";
   r++;
 }
}

I haven't tested it. I hope it helps.

Upvotes: 0

Related Questions