C语言:打印菱形总结

打印菱形总结

常见菱形

打印菱形问题中菱形都是对称的,上下左右(有时候会去掉某一部分),一些做法是先打印上半部分再打印下半部分,这样容易理解,但是代码会重复冗长,我们可以把对称作为突破点简化代码。
以下总结常见菱形:

  • 普通菱形
  • 空心菱形
  • 挖空菱形
  • 数字菱形

总结一个模板:(后面只截取核心部分)

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,j,k;                 
    int n;
    scanf("%d",&n);                  //打印n行菱形
    n=(n-1)/2;                       //利用对称(要结合题目要求)
    for (i=-n;i<=n;i++)              //打印行
    {
        for(j=-n;j<=n;j++)           //打印列
        {
            k=abs(i)+abs(j);    
            if ()                     //核心部分
                printf("*");          //有时候是数字
            else
                printf(" ");
        }
        printf("\n");                 //打印完一行后记得换行
    }
    return 0;
}

核心部分:分析打印“*”与空格时k值的规律

1.普通菱形
在这里插入图片描述

    n=(n-1)/2;
    for (i=-n;i<=n;i++)
    {
        for(j=-n;j<=n;j++)
        {
            k=abs(i)+abs(j);
            if (k<=n)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }

下面制作一个表格来分析核心部分k的条件,在平时的测试中可以采用小的数来测试。
在这里插入图片描述

2.空心菱形
在这里插入图片描述

    n=(n-1)/2;
    for (i=-n;i<=n;i++)
    {
        for(j=-n;j<=n;j++)
        {
            k=abs(i)+abs(j);
            if (k==n)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }

3.挖空菱形
在这里插入图片描述

    n=(n-1)/2;
    for (i=-n;i<=n;i++)
    {
        for(j=-n;j<=n;j++)
        {
            k=abs(i)+abs(j);
            if (k>=n)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }

4.数字菱形
在这里插入图片描述

    n=(n-1)/2;
    for (i=-n;i<=n;i++)
    {
        for(j=-n;j<=n;j++)
        {
            k=abs(i)+abs(j);
            if (k<=n)
                printf("%d",n-k+1);
            else
                printf(" ");
        }
        printf("\n");
    }

PS:要分析数字菱形打印出的数字与n,k的关系

菱形问题变形

1.打印三角

  • 侧三角
    在这里插入图片描述
    n=(n-1)/2;
    for (i=-n;i<=n;i++)
    {
        for(j=-n;j<=0;j++)
        {
            k=abs(i)+abs(j);
            if (k<=n)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }

  • 正三角
    在这里插入图片描述
    n=(n-1)/2;
    for (i=-n;i<=0;i++)
    {
        for(j=-n;j<=n;j++)
        {
            k=abs(i)+abs(j);
            if (k<=n)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }

2.特殊数字菱形

  • 打印的数字对称
    在这里插入图片描述
    n=(n-1)/2;
    for (i=-n;i<=n;i++)
    {
        for(j=-n;j<=n;j++)
        {
            k=abs(i)+abs(j);
            if (k<=n)
                printf("%d",k+1);
            else
                printf(" ");
        }
        printf("\n");
    }
  • 打印的数字不对称(将菱形分成两半)
    在这里插入图片描述
    int i,j,k;
    int n;
    scanf("%d",&n);     //此时输入的n对应最长行
    for (i=1;i<=n;i++)
    {
        for(j=1;j<=n-i;j++)
        {
            printf(" ");
        }
        for(k=1;k<=2*i-1;k++)
        {
            printf("%d",i);
        }
        printf("\n");
    }
    for (i=n-1;i>0;i--)
    {
        for(j=1;j<=n-i;j++)
        {
            printf(" ");
        }
        for(k=1;k<=2*i-1;k++)
        {
            printf("%d",i);
        }
        printf("\n");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Collapsar_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值