Gus Collier
Gus Collier

Reputation: 21

Printing a hollow right-triangle

I'm having issues with this c++ code. It is supposed to print a hollow right isosceles triangle, but instead just prints asterisks over and over, so the for loops seem to be stuck.

#include "pch.h"
#include <string>
#include <iostream>

int main() {
    int row;
    std::string s = "  ";
    std::string a = " *";
    int rows = 10;

    for (int i = 0; i < rows; i++) {

        if (i = 0) {
            std::cout << a << std::endl;
        }

        while (i > 2 && i < rows) {
            std::cout << a;

            for (int pos = 0; pos < i; pos++) {
                std::cout << s;
            }

            std::cout << a << std::endl;
        }

        std::cout << a << a << a << a << a << a << a << a << a << std::endl;

    }
}

Upvotes: 1

Views: 544

Answers (3)

Sid
Sid

Reputation: 43

Your while loop condition is the issue here, also you should use == instead of = inside if condition. Anyways,Here is a small fix in your solution..

void printTriangle() {
int row;
std::string s = "  ";
std::string a = " *";
int rows = 10;

for (int i = 1; i < rows-1; i++) {

    for (int j = 1; j <= i; ++j)
    {
        if (j == 1 || j == i)
            std::cout << a;
        else
            std::cout << s;
    }
    std::cout << std::endl;

}
for (int i = 1; i < rows; ++i)
    std::cout << a;

}

Upvotes: 0

Andrei V.
Andrei V.

Reputation: 63

Supposing that what you want to print is something of the following form: Eg. for rows = 5

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

Your code should have the following structure:

for (int i = 1; i <= rows; ++i)
{
    //special case for the first line
    if (i == 1)
        std::cout << asterisk << std::endl;

    //for each of the other lines print 2 asterisks and the rest spaces
    if (i > 1 && i <= rows - 1)
    {
        //one at the start of the line
        std::cout << asterisk;

        //print line - 2 spaces
        for (int j = 0; j < i - 2; ++j)
            std::cout << space;

        //one at the end of the line
        std::cout << asterisk << std::endl;
    }

    //special case for the last line
    if (i == rows)
    {
        for (int j = 1; j <= i; ++j )
            std::cout << asterisk;
        std::cout << endl;
    }
}

https://ideone.com/peGRUG

Upvotes: 0

grungegurunge
grungegurunge

Reputation: 891

your while loop condition will never become false, AND you need to use comparison (==) instead of assignment in this line:

        if (i = 0) {

Upvotes: 2

Related Questions