C++ 直角三角形图案打印:双重循环详解与多方向扩展
好的,这是一个非常适合新手练习循环结构的经典编程题目。下面我将为你提供一个**清晰、高效、符合最佳实践**的C++解答,并附带详细的解析。 ## 🎯 问题分析 题目要求根据输入的行数 `n`,打印一个**直角在左下角**的直角三角形(行号 = 该行的`#`数量)。 * **输入**:一个正整数 `n`。 * **输出**:`n` 行,第 `i` 行打印 `i` 个 `#`。 ## 💻 代码实现 ```cpp #include <iostream> using namespace std; int main() { int n; // 读取用户输入的行数 cin >> n; // 外层循环:控制行数,从第1行到第n行 for (int i = 1; i <= n; i++) { // 内层循环:控制每行打印的'#'数量,与当前行号i相等 for (int j = 1; j <= i; j++) { cout << '#'; } // 每打印完一行后换行 cout << endl; } return 0; } ``` ## 📖 代码详细解析 1. **头文件与命名空间** * `#include <iostream>`:引入输入输出流库,用于`cin`和`cout`。 * `using namespace std;`:简化代码,避免每次写`std::cin`。 2. **变量定义** * `int n;`:存储用户输入的行数。 3. **双重循环结构 (核心逻辑)** * **外层循环**:`for (int i = 1; i <= n; i++)` * `int i = 1`:从第1行开始计数。 * `i <= n`:循环条件,共执行 `n` 次,每次对应一行。 * `i++`:每次循环后行号加1。 * **内层循环**:`for (int j = 1; j <= i; j++)` * `int j = 1`:从每行的第1个字符开始。 * `j <= i`:循环条件,**关键点**:每行打印的 `#` 数量等于当前行号 `i`。 * `j++`:打印完一个字符后计数。 * `cout << endl;`:每完成一行内层循环后,输出换行符,开始新的一行。 ## 🚀 进阶与扩展 ### 1️⃣ 打印其他方向的直角三角形 * **直角在右下角** (右对齐): ```cpp for (int i = 1; i <= n; i++) { // 先打印 i-1 个空格 for (int j = 1; j <= n - i; j++) { cout << ' '; } // 再打印 i 个 # for (int j = 1; j <= i; j++) { cout << '#'; } cout << endl; } // 输出效果 (n=3): // # // ## // ### ``` * **直角在左上角** (倒置): ```cpp for (int i = n; i >= 1; i--) { for (int j = 1; j <= i; j++) { cout << '#'; } cout << endl; } // 输出效果 (n=3): // ### // ## // # ``` ### 2️⃣ 打印等腰三角形 (金字塔) ```cpp for (int i = 1; i <= n; i++) { // 打印空格 (居中) for (int j = 1; j <= n - i; j++) { cout << ' '; } // 打印 # (数量为 2*i - 1) for (int j = 1; j <= 2 * i - 1; j++) { cout << '#'; } cout << endl; } // 输出效果 (n=3): // # // ### // ##### ``` ## 💡 开发建议 1. **使用有意义的变量名**:虽然`i`和`j`是循环变量名的行业惯例,但可以适当注释说明其含义。 2. **注意数据范围**:如果`n`可能很大(例如大于1000),请使用`long long`类型存储和循环变量,但这道题`n`通常较小。 3. **测试边界**:测试`n = 1`(只有一行),`n = 0`(无输出),确保程序健壮性。 4. **代码风格**: * 始终使用大括号 `{}` 包裹循环体,即使是单行,避免未来修改时出错。 * 合理使用缩进,保持代码层次清晰。 ## ❓ 常见问题 (FAQ) **Q:为什么内层循环的终止条件是 `j <= i`?** A:因为第 `i` 行需要打印 `i` 个 `#`。当 `j` 从 1 增加到 `i` 时,刚好打印了 `i` 次,循环结束。 **Q:如果要求打印其他字符,例如 `*`,如何修改?** A:只需要将 `cout << '#';` 改为 `cout << '*';` 即可,循环逻辑不变。 **Q:有没有不使用嵌套循环的巧妙写法?** A:有,例如使用 `string` 的构造函数: ```cpp #include <iostream> #include <string> using namespace std; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { // string(count, char) 会生成一个包含count个char的字符串 cout << string(i, '#') << endl; } return 0; } ``` 这种方法更简洁,但理解双重循环对初学者打好基础很重要。 ## 🔗 学习资源 * **官方文档**:[C++ 教程 - cplusplus.com](https://cplusplus.com/doc/tutorial/control/) * **推荐书籍**:《C++ Primer (第5版)》第1章 ~ 第3章 希望这个解答能帮助你彻底掌握这道题!如果有任何疑问,欢迎继续提问。 ######[AI写代码神器 | 1436点数解答 | 2026-05-28 21:02:58]
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)267
- Python 实现:打印 -n 到 n 范围内所有整数的代码及详解(字节豆包 | 232点数解答 | 2025-12-07 12:30:06)107
- Python代码:轻松打印 0 到输入整数之间的所有整数(字节豆包 | 126点数解答 | 2025-12-12 18:21:54)71
- C++实现:输入整数打印 0 到该整数间所有整数及代码详解(字节豆包 | 228点数解答 | 2025-12-12 18:22:24)78
- Python实现:打印0到输入整数间所有整数的代码解析(字节豆包 | 264点数解答 | 2025-12-12 19:37:01)67
- Python 实现:打印 -n 到 n 范围内所有整数的代码及详解(字节豆包 | 214点数解答 | 2025-12-12 19:40:30)71
- Python实现:打印 0 到 n 之间所有整数的高效方法(讯飞星火 | 569点数解答 | 2025-12-17 12:23:47)84
- Python实现:打印从 -n 到 n 范围内所有整数的代码详解(讯飞星火 | 660点数解答 | 2025-12-17 17:30:53)55
- 解密iOS开发:Category、Extension与继承的区别大揭秘(阿里通义 | 292点数解答 | 2023-11-08 00:38:19)245
- iOS开发大揭秘:Category、Extension与继承的区别详解 (百度文心 | 316点数解答 | 2023-11-09 17:40:23)232
- Python 实现 DES 加密算法编程实验:从原理到单步调试全解析(字节豆包 | 4096点数解答 | 2025-11-09 22:06:30)98
- C语言:输入三边求三角形面积,区分普通、直角、等边及非三角形情况 (字节豆包 | 314点数解答 | 2024-10-26 09:13:03)261