牛客网刷题 | BC103 金字塔图案

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的金字塔图案。

输入描述:

多组输入,一个整数(2~20),表示金字塔边的长度,即“*”的数量,,也表示输出行数。

输出描述:

针对每行输入,输出用“*”组成的金字塔,每个“*”后面有一个空格。


思路 :

首先可以想到这个由普通的直角三角形进行添加空格的操作

然后变成金字塔的形状 也是先打印空格 然后再打印星号加空格

*

**

***

****

*****

.......

由上面的直角三角形变形而来

先在星号后面加空格

然后在空格和星号前面加空格

 


  1. 理解问题:首先,要清楚题目要求打印一个等腰三角形图案,该三角形由星号(*)组成,且星号后面跟着一个空格。

  2. 确定输入:题目要求输入一个整数(2~20),这个整数表示金字塔一边的星号数量,同时也决定了打印的行数。

  3. 确定输出格式:每行的星号数量从1开始递增,直到达到最底层的n个星号。每行星号之间用空格分隔,星号后面也要跟一个空格。空格的数量需要根据当前行的位置来确定,以保证星号居中对齐。

  4. 设计算法

    • 使用一个外部循环(for循环)来控制行数,循环变量i从1遍历到n。
    • 对于每一行,首先需要打印一定数量的空格,使得星号能够居中。空格的数量可以通过(n - i) * 2来计算,因为除了最中间的星号外,每增加一行,两边都会多出一个空格。
    • 接着,使用一个内部循环(另一个for循环)来打印星号。每行的星号数量为2 * i - 1,这是因为除了第一行和最后一行外,其他每行的星号数量都是奇数,并且随着行数的增加,星号数量线性增加。
    • 每行打印完成后,使用printf("\n")输出一个换行符,以便开始打印下一行。
  5. 编写代码:根据上述算法设计,编写C语言代码实现功能。

  6. 处理多组输入:题目中提到有多组输入,因此使用while循环结合scanf函数来持续读取输入,直到EOF(文件结束符)。


代码 1 :

/*思路 : 首先可以想到这个由普通的直角三角形进行添加空格的操作
然后变成金字塔的形状 也是先打印空格 然后再打印星号加空格
*
**
***
****
*****
.......
由上面的直角三角形变形而来 
先在星号后面加空格
然后在空格和星号前面加空格
*/

# include <stdio.h>
int main ()

{
    int n = 0;
    while(scanf("%d",&n)!=EOF)
    {
        int i = 0;
        for(i = 0; i<n; i++)//控制行
        {
            int j = 0;
            for(j=n-1;j>i;j--)//控制每行的空格 尤其要注意 j=n-1 
            //不能写成 j=n
            {
                printf(" ");
            }
            for(j=0;j<=i;j++)//这是打印星号和空格的循环
            {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}

-------------------------------------------------------------------
#include <stdio.h> // 包含标准输入输出库

int main() // 主函数的开始
{
    int n = 0; // 定义一个整型变量n,用于存储用户输入的金字塔一边的长度

    // 使用while循环来处理多组输入直到文件结束符EOF
    while(scanf("%d",&n)!=EOF)
    {
        int i = 0; // 定义一个整型变量i,用于控制外层循环,表示当前的行数

        // 外层循环,控制打印金字塔的每一行
        for(i = 0; i < n; i++) // 从第0行开始,直到第n-1行
        {
            int j = 0; // 定义一个整型变量j,用于控制内层循环

            // 内层第一个for循环,控制每行前面的空格数量
            // 空格的数量从最后一行的0个空格递增到第0行的n-1个空格
            for(j = n - 1; j > i; j--) // 从n-1开始递减到i,打印空格
            {
                printf(" "); // 打印一个空格
            }

            // 内层第二个for循环,控制每行打印星号和空格
            // 星号的数量随着行数的递增而递增,从第0行的1个星号到第n-1行的n个星号
            for(j = 0; j <= i; j++) // 从0开始递增,打印i+1个星号和空格
            {
                printf("* "); // 打印一个星号和一个空格
            }
            printf("\n"); // 每行结束后打印换行符,以便开始新一行的打印
        }
    }
    return 0; // 主函数结束,返回0表示程序正常结束
}

程序使用while循环来处理多组输入,直到遇到EOF。在每次循环中,首先读取用户输入的整数n,这个整数表示金字塔一边的长度。

外层for循环控制打印金字塔的行数,从第0行开始直到第n-1行。

对于每一行,首先是内层第一个for循环,用于打印空格,空格的数量从最后一行的0个递增到第0行的n-1个。

接着是内层第二个for循环,用于打印星号和空格,星号的数量从第0行的1个递增到第n-1行的n个。

每完成一行的打印后,使用printf("\n")来换行,准备打印下一行。当所有行都打印完毕后,while循环结束,程序返回0,表示正常退出。

代码 2 :

#include <stdio.h>

int main() {
    int n;
    // 使用while循环处理多组输入直到EOF
    while (scanf("%d", &n) != EOF) {
        // 外层循环控制打印的行数
        for (int i = 1; i <= n; i++) {
            // 打印空格,使星号居中
            for (int j = 0; j < (n - i) * 2; j++) {
                printf(" ");
            }
            
            // 打印星号,每行的星号数量为2*i - 1
            for (int k = 1; k <= 2 * i - 1; k++) {
                printf("* ");
            }
            
            // 每行结束后换行
            printf("\n");
        }
    }
    
    return 0; // 程序结束
}

代码 3 :

//对于有行有列的图形采用双循环,i控制行,j控制列
//对于这种金字塔,倒三角,我们可以先利用循环把空格打印出来,然后在相应的位置放上*.
#include<stdio.h>
int main()
{
    int i,j,n;
     while (scanf("%d", &n) != EOF) {
        for (int i = 0; i < n; i++) {  //行
            for (int j = 0; j <n - i-1; j++) {//列,观察列与行的关系
                printf(" ");
            }
            for (int j = 0; j<= i; j++) {
                printf("* ");
            }
            printf("\n");
        }
    }
}


-----------------------------------------------------------------------------

#include <stdio.h> // 引入标准输入输出库函数

int main() // 主函数开始
{
    int i, j, n; // 定义三个整型变量i, j, n,分别用于控制行数,列数和读取用户输入的金字塔边长

    // 使用while循环处理多组输入直到文件结束符EOF
    while (scanf("%d", &n) != EOF)
    {
        // 外层循环,控制金字塔的行数,从0到n-1
        for (int i = 0; i < n; i++)
        {
            // 内层第一个循环,控制每行前面的空格数量
            // 空格的数量为n - i - 1,随着行数增加,前面的空格减少
            for (int j = 0; j < n - i - 1; j++) // 列循环,打印空格
            {
                printf(" "); // 打印一个空格
            }

            // 内层第二个循环,控制每行打印星号的数量
            // 星号的数量为i + 1,随着行数增加,星号数量增加
            for (int j = 0; j <= i; j++) // 列循环,打印星号和空格
            {
                printf("* "); // 打印一个星号和一个空格
            }

            printf("\n"); // 每行结束后打印换行符,以便开始新一行的打印
        }
    }

    return 0; // 主函数结束,返回0表示程序正常退出
}

程序使用while循环来处理多组输入,直到遇到EOF。在每次循环中,首先读取用户输入的整数n,这个整数表示金字塔一边的长度。

外层for循环控制打印金字塔的行数,从第0行开始直到第n-1行。对于每一行,首先是内层第一个for循环,用于打印空格,空格的数量为n - i - 1

接着是内层第二个for循环,用于打印星号和空格,星号的数量为i + 1

每完成一行的打印后,使用printf("\n")来换行,准备打印下一行。

当所有行都打印完毕后,while循环结束,程序返回0,表示正常退出。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值