等腰三角形每行空格数为总行数减i减1、星号数为2乘i加1,i从0开始;5行示例:1个、3个、5个、7个、9个*,逐行居中对齐。

用 for 循环打印等腰三角形(星号版)
最常见需求是用 * 打印一个顶点朝上的等腰三角形,比如 5 行高。关键不是“怎么循环”,而是每行要打几个空格、几个星号——空格控制居中,星号数按行递增。
第 i 行(i 从 0 开始):空格数 = 总行数 - i - 1,星号数 = 2 * i + 1
示例(5 行):
*
***
*****
*******
*********
实操建议:
- 外层
for (int i = 0; i 控制行数 - 内层两个独立
for:先打rows - i - 1个' ',再打2*i + 1个'*' - 别用
std::string拼接再输出——小规模没问题,但初学时容易混淆索引和长度,直接循环更直观 - 注意换行:每行末尾必须写
std::cout ,否则全挤在一行
用 while 循环实现左对齐直角三角形
如果只要求左对齐(不居中),while 更贴近“逐行累加”的直觉。每行星号数等于当前行号(从 1 开始),适合理解循环变量与输出量的映射关系。
常见错误现象:while (i 写成 <code> 导致少打最后一行;或忘记在循环体内更新 <code>i,导致死循环
实操建议:
- 初始化
int i = 1;,条件用i - 每轮循环内:用
for (int j = 0; j 打 <code>i个*,然后++i - 避免混用
i++和++i在同一表达式里——这里纯增量,选哪个都行,但保持统一 - 如果用
std::string(i, '*')构造,要注意i不能为负,否则行为未定义
输入行数后校验再打印(防崩溃)
用户输个 -3 或 abc,程序直接崩或打出乱码,就不是“能用”,而是“会出事”。C++ 的 std::cin >> 遇到非数字会失败,且后续输入流卡住。
实操建议:
- 用
if (!(std::cin >> rows))判断输入失败 - 失败后必须调用
std::cin.clear()清错误标志,再用std::cin.ignore(...)清缓冲区残留字符 - 加范围检查:
if (rows 50),避免打印几千行星号卡死终端 - 不要用
using namespace std;后直接写cin——虽然省事,但在头文件混用时可能引发命名冲突,显式写std::cin更稳妥
用 setw 和 setfill 替代手动空格(仅限等宽字体环境)
有人想用 <iomanip></iomanip> 的 std::setw 和 std::setfill 居中,这确实可行,但有个硬前提:终端/IDE 输出窗口必须用等宽字体(如 Consolas、Fira Code),否则空格和星号宽度不一致,三角形歪斜。
实操建议:
- 每行先算总宽度(比如最大星号数 =
2 * rows - 1),当前行星号数 =2 * i + 1 - 用
std::cout - 注意
std::setfill是持久的,下一行若不重置,可能影响其他输出;建议每行开头重设std::setfill(' ') - 比纯循环多两步:算宽度、控填充——简单图案没必要,但若后续要支持多种填充字符(如
#、o),这种解耦更易扩展
真正麻烦的不是嵌套几层循环,而是空格数算错一行,整个三角形就偏了;还有人把行号从 1 开始却用 i ,结果永远差一行——这些细节比语法本身更容易卡住人。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











