Shape Rule
Continuous k++
Row 1 prints 1, row 2 prints 2 3, row 3 prints 4 5 6, and so on without restarting.

The continuous number triangle uses a running counter k so digits keep increasing across rows — a natural step after the fill-with-5 pattern in Program 19. This tutorial covers the shape rule, counter logic, a live preview, algorithm steps, worked PHP examples, edge cases, and complexity.
Continuous k++
Row 1 prints 1, row 2 prints 2 3, row 3 prints 4 5 6, and so on without restarting.
1..rows
for ($i = 1; $i <= $rows; $i++) makes row i print i numbers.
k++ each print
echo $k++ . " " prints k then increments — value carries to the next row.
Same line / next line
Numbers use echo $k++ . " "; end each row with echo PHP_EOL.
1–15 rows
Pick a row count and draw the continuous counter triangle instantly in the browser.
Complexity
Total prints = rows(rows+1)/2; extra memory stays O(1).
A continuous number triangle prints an ascending counter across rows — numbers never restart at 1 on each new line. With rows = 4, the output is 1, 2 3, 4 5 6, 7 8 9 10.
In PHP you declare $k = 1 once, print $k++ in the inner loop for i iterations per row, then echo PHP_EOL ends each row.
It introduces a running counter variable — a key step after Program 19 and before jump-number patterns.
Declare $k = 1 once before both loops.
Print then increment — sequence continues across rows.
echo $k++ . " " in the inner loop; echo PHP_EOL after.
Follow Program 19; continue to Program 21 (jump number triangle).
In short: set k = 1 once, for each row i print k++ for i numbers, then call echo PHP_EOL.
Given a positive integer rows, print a continuous number triangle: row i prints i numbers from a running counter k that starts at 1 and increments with k++ on every print.
// rows = 4 (conceptual shape)
// 1
// 2 3
// 4 5 6
// 7 8 9 10 | Item | Type | Description |
|---|---|---|
rows | int | Number of triangle lines to print (typically ≥ 1). |
$k | int | Running counter — declared once, incremented each print. |
| Printed output | text | Row i has i spaced numbers — continuous sequence. |
k = 1
for i from 1 to rows:
for j from 1 to i:
print k then k++
print newline | Approach | Idea | Best for |
|---|---|---|
| Running counter k++ | 1, 2 3, 4 5 6, … | Learning and interviews |
| User-input rows | (int) trim(fgets(STDIN)); | Flexible console programs |
| Custom start k | $k = 10 before loops | Shift the whole sequence |
| Goal | Pattern |
|---|---|
| Walk each row | for ($i = 1; $i <= $rows; $i++) |
| Init counter | int k = 1; before both loops |
| Print and step | echo $k++ . " "; |
| End the row | echo PHP_EOL; |
| Custom start | int k = 10; to shift sequence |
| User input | (int) trim(fgets(STDIN)); |
Same continuous triangle — different ways to control the counter.
counterPrint k then increment — sequence continues
$k = 1Before both loops — not inside outer loop
$k = 10Shift start value in Example 3
no resetDo not reset k each row for continuous output
Reach for this pattern when teaching running counters and continuous sequences inside nested loops.
Natural follow-up after Program 19 — introduces a single running counter.
Outer/inner bound practice with an immediate visual check.
Combine loops with fgets(STDIN) for a flexible row count.
Compare Program 19 (fill-with-5) and Program 21 (jump number triangle) 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 15 and draw the continuous number triangle in the browser.
Three complete PHP programs — fixed row count, user input, and custom start value for $k. Click View Output to reveal sample console results.
Print four rows of the continuous counter triangle with k++.
rows = 4Hard-coded height — ideal for first demos and screenshots.
<?php
$rows = 4;
$k = 1;
for ($i = 1; $i <= $rows; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo $k++ . " ";
}
echo PHP_EOL;
} When i = 1, $k prints once as 1. When i = 2, $k prints 2 then 3. When i = 4, $k runs from 7 to 10 — the counter never resets. echo PHP_EOL after the inner loop starts the next row.
Read the row count with fgets(STDIN) instead of hard-coding 4.
Read rows with (int) trim(fgets(STDIN)); $k still starts at 1.
<?php
echo "Enter the number of rows: ";
$rows = (int) trim(fgets(STDIN));
$k = 1;
for ($i = 1; $i <= $rows; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo $k++ . " ";
}
echo PHP_EOL;
} Same nested-loop core as Example 1; only the source of rows changes. $k is still declared once before the loops. Non-numeric input leaves rows unset if you ignore fgets(STDIN)’s return value — always check it in safer labs.
Start the counter from a value other than 1.
k = 10Shift the whole sequence by starting k at 10 instead of 1.
<?php
$rows = 4;
$k = 10;
for ($i = 1; $i <= $rows; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo $k++ . " ";
}
echo PHP_EOL;
} Change only the initial value of k — the inner loop and k++ logic stay the same. The sequence continues from 10 instead of 1.
Set $rows = 4; and use fgets(STDIN) when reading input. Set rows (fixed or from input) and $k = 1.
for ($i = 1; $i <= $rows; $i++) makes row i print i numbers.
echo $k++ . " " prints k then increments — value carries to the next row.
echo PHP_EOL ends the row so the next outer iteration starts fresh.
Total prints: rows(rows+1)/2 — O(n²) time, O(1) extra memory.
rows = 4Trace each outer-loop value of i, the starting k, and the numbers printed on each row.
i | Start k | Numbers printed | Row output |
|---|---|---|---|
1 | 1 | 1 | 1 |
2 | 2 | 2, 3 | 2 3 |
3 | 4 | 4, 5, 6 | 4 5 6 |
4 | 7 | 7, 8, 9, 10 | 7 8 9 10 |
Total number 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: use (i + j) % 2 for row+column parity grids.
Practice echo vs row newline without complex math.
Example: put echo PHP_EOL inside the inner loop by mistake.
Swap digits for letters, stars, or spaced output once the loop works.
Example: print j + " " for spaced digits on each row.
Triangular totals make O(n²) concrete for beginners.
Example: count printed digits for n = 10 still → 55.
Pair the pattern with fgets(STDIN) return checks 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 k = 1 before the loops first; compare with custom start in Example 3.
Small habits that keep number-pattern code clean.
Declare k once before both loops — not inside the outer loop.
is_numeric()Call is_numeric(trim($line)) so bad input does not leave rows uninitialized.
Only call echo PHP_EOL after the inner loop finishes the row.
Write row i, start $k, and each $k++ step before coding.
Trace rows = 4 on paper before coding larger demos.
Pro Tip: if the output is a vertical list of single digits per line, you almost certainly put echo PHP_EOL inside the inner loop.
Mistakes that commonly break continuous number patterns.
Each digit lands on its own line — you get a column, not a triangle.
→ Use echo $k++ . " "; echo PHP_EOL only after the inner loop.
$k resets each row and the sequence restarts at 1.
→ Declare int k = 1; once before both loops.
Incrementing in the wrong place skips or duplicates numbers.
→ Use post-increment inside echo $k++ . " ".
Omitting echo PHP_EOL glues every number onto one endless line.
→ Always end the row after the inner loop.
Letters or empty input leave rows uninitialized.
→ Prefer is_numeric(trim($line)) and re-prompt on failure.
Check these inputs before calling the solution done.
Output is just 1 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² characters — fine for labs, noisy for huge n.
Unchecked fgets(STDIN) leaves rows unset — call is_numeric(trim($line)) first.
Declaring $k inside the outer loop restarts the sequence — not continuous.
Without $k++, the same number prints repeatedly on each row.
Try these variations to lock in the pattern.
rows(rows+1)/2 — O(n²) for n rows.echo $k++ . " " stays on the line; echo PHP_EOL advances — mix them carefully.rows > 0 for interactive programs; rows = 1 should print a single 1.Quick Takeaway: declare $k = 1 once, print k++ for i numbers per row, then break the line.
| Program | Time | Extra space |
|---|---|---|
| Nested loops (Examples 1–2) | O(rows²) | O(1) |
| Custom start (Example 3) | O(rows²) | O(1) |
The continuous number triangle is a compact lesson in running counters: declare $k once, print k++ in the inner loop, and let the sequence continue across rows. Master the fixed-rows version, then try user input and a custom start value.
Practice the three examples above, then continue to Program 21 for the jump number triangle.
Keep $k outside the outer loop — use k++ inside echo $k++ . " " and validate rows when reading input.
$k = 1 before both loopsecho $k++ . " " in the inner looprows ≥ 1 for interactive programsis_numeric(trim($line)) before using rowsecho PHP_EOL inside the inner digit loop$k++ after each printrows = 1 edge casePrint the pattern the beginner-friendly way.
k++ continuous
DefinitionOnce before loops
CodePrint then increment
CodeRow i prints i nums
ShapeO(n²) time
AnalysisA single counter k starts at 1 and increments with k++ on every print — numbers continue across rows instead of restarting. Total prints still equal n(n+1)/2 for n rows.
Move on to the jump number triangle in the PHP number-pattern series.
12 people found this page helpful