小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-11-14 / 9 阅读
0
0

C语言打印等腰三角形思路踩坑及总结

题目:编写程序实现输出以下图形。

       *
     * * *
   * * * * *
 * * * * * * *

尝试第一次编写:

#include<stdio.h>
int main(){
    int x,y,z;
    for(x=1;x<=6;x++){
        for(z=6;z>x;z--){
             printf("  ");
        }
       for(y=1;y<=x;y++){
                printf("  *  ");
        }

        printf("\n");
  
    }
    return 0;   
}

结果:

            *  
          *    *
        *    *    *
      *    *    *    *
    *    *    *    *    *
  *    *    *    *    *    *

明显不符合题意。

分析当前程序结构:

首先这是个两层for循环嵌套。

其结构如下

for
|
|
for - for

第二层有两个并列的for循环

现在想象一个坐标系

————————————>Y
|
|
|
|
X

外层for循环用于控制y轴

内层第二个for循环用于控制x轴

int main(){
    int x,y,z;
    for(x=1;x<=6;x++){
       for(y=1;y<=x;y++){
                printf("  *  ");
        }

        printf("\n");
  
    }
    return 0;   
}

现在保持这种状态,以这种方式分析

最外层for循环x初始值为1,当x<=6的时候执行,执行完成后对变量x进行累加1操作

内层for循坏用于控制x轴,其y初始值为1,当y<=x的时候执行,执行完成后对变量y进行累加操作

x的最大值为6,y的最大值始终小于或者等于x

过程如下:
67358ef949cf5.gif

修改后

#include <stdio.h>

int main() {
    int x, y, z;

    for (x = 1; x <= 4; x++) { // 控制总行数
        // 打印前导空格
        for (z = 4; z > x; z--) {
            printf("  ");
        }

        // 打印星号
        for (y = 1; y <= (2 * x - 1); y++) {
            printf("*");
            if (y < (2 * x - 1)) { // 在非最后一个星号后面加空格
                printf(" ");
            }
        }

        printf("\n"); // 换到下一行
    }

    return 0;
}

这里的关键点在于:

x 控制行数,从1到4。
第一个内层循环(用变量z)用来打印前导空格,随着行数的增加,前导空格的数量减少。
第二个内层循环(用变量y)用来打印星号及其间的空格,每行的星号数量应该是 2 * x - 1,这样可以确保图案正确地扩展成一个等腰三角形。

标准答案

#include <stdio.h>

int main() {
    int i, j, rows = 4; // 定义行数为4

    for (i = 1; i <= rows; i++) { // 外层循环控制行
        // 打印前导空格
        for (j = i; j < rows; j++) {
            printf("  ");
        }
    
        // 打印星号
        for (j = 1; j <= (2 * i - 1); j++) {
            printf("*");
            if (j < (2 * i - 1)) { // 防止在最后一个星号后添加空格
                printf(" ");
            }
        }

        printf("\n"); // 换行
    }

    return 0;
}

评论