牛客网刷题 | BC105 菱形图案

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

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

感谢阅读!

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


 描述

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

输入描述:

多组输入,一个整数(2~20)。

输出描述:

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


思路 :

可以分成两个部分来看 上面是n行 下面是n+1行

for(j=0;j<n-i;j++)

//如果这里要打印四个空格 4-0=4 三个空格4-1=3 两个空格4-2=2

for(j=0;j<=i;j++)

//因为这里j都是每次从0开始的

//当i为0的时候打印零个 为1的时候打印一个 为2的时候打印两个

//......

//i随着变化而变化

 for(j=0;j<i;j++)

//打印空格

//当i为0的时候不打印 当i为1的时候打印一个空格

//当i为2的时候打印两个 ......

for(j=0;j<n+1-i;j++)

//这里是因为是n+1行 所以要写成n+1

//这里是5的时候 i为0 就打印五个

//为4的时候 i为1 打印四个

//为3的时候 i为2 打印三个

//......


1. 理解菱形图案的结构

菱形图案由两部分组成:上半部分和下半部分。上半部分从中间的1个星号开始,每行递增一个星号,直到达到最宽行(星号数量等于输入的整数)。下半部分则从最宽行开始,每行递减一个星号,直到回到中间的1个星号。

2. 输入处理

程序需要读取用户输入的整数(2~20),这个整数代表菱形最宽行的星号数量。由于可能有多次输入,所以使用while循环结合scanf函数来持续读取输入,直到遇到文件结束符EOF。

3. 打印上半部分

  • 初始化行数变量i为0。
  • 使用for循环,从0开始递增,直到达到最宽行(i < n)。
  • 在每行开始,首先打印空格,空格数量为n - i - 1。这是因为菱形是中心对称的,需要在星号两侧留出相应的空格以保持图案居中。
  • 接着打印星号,星号数量为i + 1,使用内层for循环实现,每打印一个星号后跟一个空格。
  • 每行结束后打印换行符\n

4. 打印下半部分

  • 下半部分的打印逻辑与上半部分类似,但是行数递减,星号数量也随之递减。
  • 使用另一个for循环,从n - 1开始递减,直到1(i > 0)。
  • 同样首先打印空格,空格数量为i - 1
  • 然后打印星号,星号数量为n - i,使用内层for循环实现,每打印一个星号后跟一个空格。
  • 每行结束后打印换行符\n

代码 1 :

/*思路 : 可以分成两个部分来看 上面是n行 下面是n+1行
for(j=0;j<n-i;j++)
//如果这里要打印四个空格 4-0=4 三个空格4-1=3 两个空格4-2=2
for(j=0;j<=i;j++)
//因为这里j都是每次从0开始的 
//当i为0的时候打印零个 为1的时候打印一个 为2的时候打印两个
//......
//i随着变化而变化
 for(j=0;j<i;j++)
//打印空格
//当i为0的时候不打印 当i为1的时候打印一个空格
//当i为2的时候打印两个 ......
for(j=0;j<n+1-i;j++)
//这里是因为是n+1行 所以要写成n+1
//这里是5的时候 i为0 就打印五个
//为4的时候 i为1 打印四个
//为3的时候 i为2 打印三个
//......
*/
# 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=0;j<n-i;j++)
        //如果这里要打印四个空格 4-0=4 三个空格4-1=3 两个空格4-2=2
        //......
        {
            printf(" ");
        }
        //接下来打印 空格+星号
        for(j=0;j<=i;j++)
        //因为这里j都是每次从0开始的 
        //当i为0的时候打印零个 为1的时候打印一个 为2的时候打印两个
        //......
        //i随着变化而变化
        {
            printf("* ");
        }
        printf("\n");
    }
        //下半部分
        //n+1 行
        //依旧是有空格加型号组成的
        for(i=0;i<n+1;i++)
        {
            int j = 0;
            for(j=0;j<i;j++)
            //打印空格
            //当i为0的时候不打印 当i为1的时候打印一个空格
            //当i为2的时候打印两个 ......
            {
                printf(" ");
            }
            for(j=0;j<n+1-i;j++)
            //这里是因为是n+1行 所以要写成n+1
            //这里是5的时候 i为0 就打印五个
            //为4的时候 i为1 打印四个
            //为3的时候 i为2 打印三个
            //......
            {
                printf("* ");
            }
            printf("\n");
        }
        
    }

    return 0;
}

 代码 2 :

#include <stdio.h>

int main() {
    int n;
    // 处理多组输入直到EOF
    while (scanf("%d", &n) != EOF) {
        int i, j; // 定义循环变量i和j

        // 打印菱形的上半部分
        for (i = 0; i < n; i++) {
            // 打印空格
            for (j = 0; j < n - i - 1; j++) {
                printf(" ");
            }
            // 打印星号和空格
            for (j = 0; j <= i; j++) {
                printf("* ");
            }
            printf("\n"); // 换行
        }

        // 打印菱形的下半部分
        for (i = n - 1; i > 0; i--) {
            // 打印空格
            for (j = 0; j < i - 1; j++) {
                printf(" ");
            }
            // 打印星号和空格
            for (j = 0; j < n - i; j++) {
                printf("* ");
            }
            printf("\n"); // 换行
        }
    }
    return 0; // 程序结束
}

这段代码首先包含了stdio.h头文件,定义了主函数main

然后,程序使用while循环来读取输入直到EOF。

外层for循环首先控制打印菱形的上半部分,内层两个for循环分别用来打印空格和星号。接着,另一个外层for循环控制打印菱形的下半部分。

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

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

代码 3 :

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

int main() // 主函数开始
{
    int n = 0; // 定义一个整型变量n,用于存储用户输入的菱形最宽处的星号数量
    while(scanf("%d",&n) != EOF) // 使用while循环处理多组输入直到文件结束符EOF
    {
        // 打印菱形的上半部分,包括中间行
        for (int i = 0; i < n + 1; i++) // 循环从0到n,包括n,打印上半部分和中间行
        {
            // 打印前面的空格,使星号居中
            for (int j = 0; j < n - i; j++)
            {
                printf(" ");
            }
            // 打印星号,星号数量从0开始递增,等于当前行号i
            for (int j = 0; j <= i; j++)
            {
                printf("* ");
            }
            printf("\n"); // 每行结束后换行
        }
        
        // 打印菱形的下半部分
        for (int i = 0; i < n; i++) // 循环从0开始到n-1,打印下半部分
        {
            // 打印前面的空格,使星号居中
            for(int j = 0; j <= i; j++)
            {
                printf(" ");
            }
            // 打印星号,星号数量从n-1开始递减,等于n-i-1
            for (int j = 0; j < n - i - 1; j++) // 这里j的初始值应为0,因为星号数量从n-i-1开始
            {
                printf("* ");
            }
            printf("\n"); // 每行结束后换行
        }
    }
    
    return 0; // 主函数结束,返回0表示程序正常退出
}

  

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值