C语言循环练习题求助:实现宽n高2n-1的星号三角形输出函数
解决C语言三角形输出问题的思路与代码
嘿,我刚看到你在Wikibooks学C语言时卡在了这个三角形输出的练习上——我之前练基础循环的时候也折腾过类似的题,给你梳理下清晰的思路和可行的代码方案吧!
首先明确需求:当宽度为n时,三角形总高度是2n-1,也就是先从1个*递增到n个,再递减回1个*(比如n=3时,会输出5行:1个*、2个*、3个*、2个*、1个*)。
方案一:拆分两段循环(直观易懂)
最容易理解的方式是把三角形分成上升段和下降段,分别用两个外层循环处理:
#include <stdio.h> void printTriangle(int n) { // 上升段:从1个*到n个*,共n行 for (int i = 1; i <= n; i++) { // 内层循环输出当前行的* for (int j = 0; j < i; j++) { printf("*"); } printf("\n"); // 每行结束换行 } // 下降段:从n-1个*到1个*,共n-1行 for (int i = n-1; i >= 1; i--) { for (int j = 0; j < i; j++) { printf("*"); } printf("\n"); } } int main() { int n; printf("请输入三角形宽度n:"); scanf("%d", &n); printTriangle(n); return 0; }
代码解释:
- 第一个外层循环
i从1到n,控制上升段的行数,每行输出i个*; - 第二个外层循环
i从n-1递减到1,控制下降段的行数,每行输出i个*; - 两段循环的总行数是
n + (n-1) = 2n-1,完美符合高度要求。
方案二:单循环处理(更紧凑)
如果你想让代码更简洁,可以用一个外层循环覆盖所有2n-1行,通过判断当前行的位置来计算需要输出的*数量:
#include <stdio.h> void printTriangle(int n) { int totalRows = 2 * n - 1; for (int row = 0; row < totalRows; row++) { int starCount; // 前n行是上升段,后n-1行是下降段 if (row < n) { starCount = row + 1; } else { starCount = 2 * n - row - 1; } // 输出对应数量的* for (int j = 0; j < starCount; j++) { printf("*"); } printf("\n"); } } int main() { int n; printf("请输入三角形宽度n:"); scanf("%d", &n); printTriangle(n); return 0; }
常见坑点提醒
你之前遇到问题大概率是这几个原因:
- 总循环行数算错:比如只写了
n行,漏掉了后面的n-1行; - 下降段循环起始值错误:不小心从
n开始,导致重复输出一次n个*; - 内层循环的计数逻辑搞混:比如把输出
*的数量和行号的对应关系写错。
你可以对照上面的代码检查自己的实现,应该就能找到问题所在啦!
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

