Shape Rule
i stars on row i
Row 1 prints *, row 2 prints **, up to rows stars on the last line.

The right-angled triangle star pattern is the classic first console pattern: nested loops, cout << "*" vs cout << "\n", and a clear visual result. This tutorial covers the shape rule, loop structure, a live preview, algorithm steps, worked C++ examples, edge cases, and complexity.
i stars on row i
Row 1 prints *, row 2 prints **, up to rows stars on the last line.
Rows
for (i = 1; i <= rows; i++) walks each line of the triangle.
Stars
for (j = 1; j <= i; j++) prints exactly i stars on that row.
Same line / next line
Stars use cout << "*"; end each row with cout << "\n".
1–20 rows
Pick a row count and draw the triangle instantly in the browser.
Complexity
Total stars = n(n+1)/2; extra memory stays O(1).
A right-angled triangle star pattern grows by one * on each new line. With the right angle on the left, the console output looks like a staircase of stars.
In C++ you usually solve it with two nested for loops: the outer loop picks the row, the inner loop prints stars on that row, then cout << "\n" moves to the next line.
It is the standard first pattern exercise in C++ courses. Once nested loops and cout / endl click, pyramids, diamonds, and hollow shapes become much easier.
On row i, print exactly i stars.
Outer controls rows; inner prints characters.
cout << "*" in the inner loop; cout << "\n" after.
Gateway to inverted, pyramid, and hollow patterns.
In short: for each row i from 1 to rows, print i stars with cout << "*", then call cout << "\n".
Given a positive integer rows, print a left-aligned right-angled triangle of * characters with rows lines.
// First 5 rows (conceptual shape)
// *
// **
// ***
// ****
// ***** | Item | Type | Description |
|---|---|---|
rows | int | Number of triangle lines to print (typically ≥ 1). |
| Printed output | text | Left-aligned rows of *; row i has i stars. |
for i from 1 to rows:
for j from 1 to i:
print "*" (no newline)
print newline | Approach | Idea | Best for |
|---|---|---|
| Nested loops | Outer rows + inner stars | Learning and interviews |
string(i, '*') | Build a whole row in one call | Shorter production-style demos |
| Goal | Pattern |
|---|---|
| Walk each row | for (i = 1; i <= rows; i++) |
Print i stars | for (j = 1; j <= i; j++) cout << "*"; |
| End the row | cout << "\n"; |
| One-line row shortcut | cout << "\n"(string(i, '*')); |
| Invert later | for (i = rows; i >= 1; i--) (see Program 2) |
Same triangle — different ways to emit characters.
same linePrints a star without moving to the next line
new lineEnds the current row after all stars are printed
whole rowBuilds i stars at once — skip the inner loop
loops firstMaster nested loops before the string shortcut
Reach for this triangle when teaching or testing nested-loop basics.
Most C++ pattern series start here before pyramids and diamonds.
Outer/inner bound practice with an immediate visual check.
Combine loops with cin for a flexible row count.
Invert, center, hollow, or swap * for digits/letters next.
This is a console teaching pattern — not how you build modern app screens.
Key benefit: one small program that locks in nested loops, output sequencing, and O(n²) thinking.
Choose a row count between 1 and 20 and draw the right-angled triangle in the browser.
Three complete C++ programs — fixed row count, console input, and a string(i, '*') shortcut. Click View Output to reveal sample console results.
Print five rows with classic nested loops.
rows = 5Hard-coded height — ideal for first demos and screenshots.
#include <iostream>
using namespace std;
int main() {
int rows = 5;
int i, j;
for (i = 1; i <= rows; ++i) {
for (j = 1; j <= i; ++j) {
cout << "*";
}
cout << "\n";
}
return 0;
} When i = 1, the inner loop runs once and prints *. When i = 2, it prints **, and so on until i = rows. cout << "\n" after the inner loop starts the next row.
Let the user choose the height at runtime.
Read the row count with cin >> rows (check cin.fail() in real apps).
#include <iostream>
using namespace std;
int main() {
int rows;
int i, j;
cout << "Enter the number of rows: ";
cin >> rows;
for (i = 1; i <= rows; ++i) {
for (j = 1; j <= i; ++j) {
cout << "*";
}
cout << "\n";
}
return 0;
} Same nested-loop core as Example 1; only the source of rows changes. Non-numeric input sets cin’s fail bit if you ignore errors — always validate in safer labs.
Same shape without an explicit inner star loop.
string(i, '*')Build each row in one call, then print it.
#include <iostream>
#include <string>
using namespace std;
int main() {
int rows = 5;
for (int i = 1; i <= rows; ++i) {
cout << string(i, '*') << "\n";
}
return 0;
} string(i, '*') creates a string of length i filled with stars. Great once you understand the nested-loop idea; keep the two-loop version for exams that ask you to show both bounds.
#include <iostream> brings in cout / cin. Set rows (fixed or from input).
for (i = 1; i <= rows; i++) selects the current line.
for (j = 1; j <= i; j++) prints exactly i stars with cout << "*".
cout << "\n" ends the row so the next outer iteration starts fresh.
Total stars: 1+2+…+n = n(n+1)/2 — O(n²) time, O(1) extra memory.
rows = 4Trace each outer-loop value of i and count how many times the inner loop runs.
i | Inner j range | Printed row | Stars this row |
|---|---|---|---|
1 | 1..1 | * | 1 |
2 | 1..2 | ** | 2 |
3 | 1..3 | *** | 3 |
4 | 1..4 | **** | 4 |
Total star prints: 1 + 2 + 3 + 4 = 10 = 4×5/2.
Where this tiny pattern (and its loop structure) shows up beyond the homework prompt.
Clearest visual proof that outer and inner bounds interact.
Example: change j <= i and watch the shape change.
Foundation for inverted, pyramid, diamond, and hollow variants.
Example: Program 2 only reverses the outer loop.
Practice cout << "*" vs cout << "\n" without complex math.
Example: put cout << "\n" inside the inner loop by mistake.
Swap * for digits, letters, or emoji once the loop works.
Example: print i instead of * for a number triangle.
Triangular totals make O(n²) concrete for beginners.
Example: count printed stars for n = 10 → 55.
Pair the pattern with cin validation and positive-row checks.
Example: reject rows <= 0 and re-prompt.
Pro Tip: when an interviewer asks for patterns, explain the outer/inner roles first — then write the loops. The story matters as much as the code.
Why this pattern earns a permanent spot in beginner C++ courses.
Wrong bounds show up immediately as a broken staircase.
Only loops and console output — no arrays or math libraries.
Invert, center, hollow, or change the fill character with small edits.
Streaming output needs no storage beyond loop counters.
Pro Tip: learn the nested-loop version first; treat string(i, '*') as a polish shortcut afterward.
Small habits that keep star-pattern code clean.
Use rows (or n) and keep i/j for row/column — or rename to row/col.
cin validationAvoid crashes when the user types letters instead of a number.
Only call cout << "\n" after the inner loop finishes the row.
1..rows with j <= i matches “row i has i stars” naturally.
Trace rows = 3 on paper before coding larger demos.
Pro Tip: if the output is a vertical list of single stars, you almost certainly put cout << "\n" inside the inner loop.
Mistakes that commonly break right-angled star patterns.
Each star lands on its own line — you get a column, not a triangle.
→ Use cout << "*" for stars; cout << "\n" only after the inner loop.
j <= rows prints a rectangle; j < i drops a star each row.
→ For this shape, keep j <= i.
Omitting cout << "\n" glues every star onto one endless line.
→ Always end the row after the inner loop.
Bad input leaves cin in a failed state until cleared.
→ Check cin.fail() and re-prompt on failure.
Switching to i = 0 without adjusting the inner bound prints an empty first row or wrong counts.
→ If 0-based, print i + 1 stars (e.g. j <= i + 1).
Check these inputs before calling the solution done.
Output is just * on one line.
Outer loop never runs — print nothing or show a message.
rows < 0Treat as invalid; re-prompt instead of silent empty output.
Output grows as n²/2 characters — fine for labs, noisy for huge n.
Failed cin sets the fail bit — validate input.
*Same loops work with #, digits, or letters.
Try these variations to lock in the pattern.
rows down to 1* with j or icin validation until rows >= 1* only on borders; spaces insiden(n+1)/2 — hence O(n²) time.cout << stays on the line; cout << "\n" advances — mix them carefully.rows > 0 for interactive programs; rows = 1 should print a single star.Quick Takeaway: outer loop picks the row, inner loop prints i stars, then break the line — that is the whole pattern.
| Program | Time | Extra space |
|---|---|---|
| Nested loops (Examples 1–2) | O(rows²) | O(1) |
string(i, '*') (Example 3) | O(rows²) | O(rows) per row string (temporary) |
The right-angled triangle star pattern is a small nested-loop exercise with lasting payoff: row/column thinking, cout vs cout << "\n", and O(n²) intuition. Master the classic two-loop version, then optionally shorten rows with string(i, '*').
Practice the three examples above, then continue to the inverted triangle for reverse outer-loop practice.
Row i has i stars — keep cout for stars and cout << "\n" for the break, and validate row counts when reading input.
cout << for stars and cout << "\n" after each rowrows ≥ 1 for interactive programscin.fail() over bare cincout << "\n" inside the inner star loopj <= rows when you meant a growing trianglerows = 1 edge casePrint the triangle the beginner-friendly way.
Row i has i stars
DefinitionControls each row
CodePrints stars with cout
Ends each row
I/OO(n²) time
AnalysisRow i prints exactly i stars. Total stars for n rows is the triangular number n(n+1)/2 — the same count that makes this pattern O(n²).
Flip the outer loop and print an upside-down right-angled star pattern.
12 people found this page helpful