图案代码(下)

 

                        f10e556aee4d499e9ab518ae3bbb1bea.webp

前言:

在往期文章中(有趣的图案代码-CSDN博客),我们掌握了金字塔以及他的衍生图案菱形,今天我们来认识一下其他的有趣图案!

如果有其他图案以及方法,可以在评论区谈谈你的看法!

1.空心正方形:

b9f1c757c43541e7a652929c72a5d541.png

可以发现,这个图案与前面的金字塔换汤不换药,只是在原代码的基础上更改了打印效果。

#include <stdio.h>
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)//当输入不为空时,不结束代码
    {
        int i = 0;
        int j = 0;
        for (i = 0; i < n; i++)//行数
        {
            for (j = 0; j < n; j++)
            {
                if (i == 0 || i == n - 1)//首末两行打印图案
                    printf("* ");
                else if (j == 0 || j == n - 1)//其余行只在头尾输出图案
                    printf("* ");
                else
                    printf("  ");
            }
            printf("\n");
        }
    }
    return 0;
}

2.X形图案:

7d3ecca995864c41912fc5b1d3774414.png

法一:

对称轴打印!是一个较快的方法,通过观察发现,i=j以及i+j=n-1的位置刚好形成一个x形,且是一个矩形的对称轴。

#include <stdio.h>

int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;
        int j = 0;
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                if (i == j)//左边对称轴打印图案
                    printf("*");
                else if (i + j == n - 1)//因为行和列是从0开始的,右边对称轴
                    printf("*");
                else
                    printf(" ");//其余位置空格
            }
            printf("\n");
        }
    }
    return 0;
}

法二:

这是小编刚遇到这题的思路,比较繁琐,但是套用了金字塔的基本思路,麻烦就是需要判断输入的行数是奇数还是偶数,分两种情况打印,因为奇数型最中间一行只有一个“*”。

思路:偶数型上方打印一个空心空底倒金字塔,下方打印一个行数一样正金字塔。奇数型下方正金字塔要比上方少一行。

int main() {
	int a;
	int i, j;
	scanf("%d", &a);
	if (a % 2 == 0)//偶数型 
	{
		for (i = a / 2; i >= 1; i--)//偶数型上下行数一样
		{
			for (j = 1; j <= a / 2 - i; j++)
			{
				printf(" ");
			}
			for (j = 1; j <= 2 * i; j++)
			{
				if (j == 1 || j == 2 * i)
				{
					printf("*");
				}
				else
					printf(" ");
			}
			printf("\n");
		}
		for (i = 1; i <= a / 2; i++)//下方
		{
			for (j = 1; j <= a / 2 - i; j++)
			{
				printf(" ");
			}
			for (j = 1; j <= 2 * i; j++)
			{
				if (j == 1 || j == 2 * i)
				{
					printf("*");
				}
				else
					printf(" ");
			}
			printf("\n");
		}
	}
	else if (a % 2 == 1)//奇数型 
	{
		for (i = a / 2 + 1; i >= 1; i--)//奇数型上方比下方多一层
		{
			for (j = 1; j <= a / 2 - i + 1; j++)
			{
				printf(" ");
			}
			for (j = 1; j <= 2 * i - 1; j++)
			{
				if (j == 1 || j == 2 * i - 1)
				{
					printf("*");
				}
				else
					printf(" ");
			}
			printf("\n");
		}
		for (i = 1; i <= a / 2; i++)//下方
		{
			for (j = 1; j <= a / 2 - i; j++)
			{
				printf(" ");
			}
			for (j = 1; j <= 2 * i + 1; j++)//所以点数要多一位
			{
				if (j == 1 || j == 2 * i + 1)
				{
					printf("*");
				}
				else
					printf(" ");
			}
			printf("\n");
		}
	}
	return 0;
}

3.如下图案:

1f1405b014254269a186811881a4d7ac.png

许多小伙伴在看到这种题时可能会有点慌张,但是别忘了我们上期以及掌握了菱形,只需要改变一下打印的效果!

思路打印到中间时,我们要逆序输出了,所以我们先循环打印到中间位置,再逆序输出。

int main()
{
    int i, j;
    char c;
    int n;
    scanf("%d", &n);
    for (i = 1; i <= n; i++)//上半
    {
        for (j = 1; j <= n - i; j++)
            printf(" ");
        c = 'A';
        for (j = 1; j <= i; j++)
            printf("%c", c++);//先打印再自增
        c = c - 2;//循环完重新定义c,因为c结束循环时自增了,所以要减2
        for (j = 1; j < i; j++)
            printf("%c", c--);//先打印再自减
        printf("\n");
    }
    for (i = n - 1; i >= 1; i--) //下半同理
    {
        for (j = 1; j <= n - i; j++)
            printf(" ");
        c = 'A';
        for (j = 1; j <= i; j++)
            printf("%c", c++);
        c = c - 2;
        for (j = 1; j < i; j++)
            printf("%c", c--);
        printf("\n");
        
    }
        return 0;
}

还有一些衍生的图案如下:

1.

ce18f60831744900a13b87ff9f7efc1b.png

#include <stdio.h>

int main() 
{
    int i, j;
    char c;
    int n ;
    scanf("%d", &n);
    // 打印上半部分,包括中间的最长行
    for (i = 1; i <= n; i++) {
        // 打印前导空格
        for (j = i; j < n; j++) {
            printf(" ");
        }
        // 打印字母
        for (j = 1; j <= 2 * i - 1; j++) {
            printf("%c", 'A' + i - 1);
        }
        printf("\n");
    }
    // 打印下半部分
    for (i = n - 1; i >= 1; i--) {
        // 打印前导空格
        for (j = n - i; j > 0; j--) {
            printf(" ");
        }
        // 打印字母
        for (j = 1; j <= 2 * i - 1; j++) {
            printf("%c", 'A' + i - 1);
        }
        printf("\n");
    }
    return 0;
}

2. 1

de96fd7e11cc43c8946cc1f4d8525ead.png

#include <stdio.h>

int main() {
    int i, j;
    char c;
    int n ;
    scanf("%d",&n);
    // 打印上半部分,包括中间的最长行
    for (i = 1; i <= n; i++) {
        // 打印前导空格
        for (j = i; j < n; j++) {
            printf(" ");
        }
        // 打印星号和空格
        for (j = 1; j <= 2 * i - 1; j++) {
            if (j == 1 || j == 2 * i - 1)
                printf("%c", 'A' + i - 1);
            else
                printf(" ");
        }
        printf("\n");
    }

    // 打印下半部分
    for (i = n - 1; i >= 1; i--) {
        // 打印前导空格
        for (j = n - i; j > 0; j--) {
            printf(" ");
        }
        // 打印星号和空格
        for (j = 1; j <= 2 * i - 1; j++) {
            if (j == 1 || j == 2 * i - 1)
                printf("%c", 'A' + i - 1);
            else
                printf(" ");
        }
        printf("\n");
    }

    return 0;
}

2.2 

39cc765dfd6a41d4a516b7a3fa2b5c3a.png

#include<stdio.h>
int main()
{
    int n;
    char a;
    scanf("%c %d",&a,&n);
    for(int i=0;i<=n/2;i++)
    {
        for(int j=0;j<n/2-i;j++)
            printf(" ");
        for(int k=0;k<2*i+1;k++)
        {
            if(k==0 || k==2*i)
                printf("%c",a);
            else
                printf(" ");
        }
        printf("\n");
        a++;
    }
    a--;
    for(int m=0;m<n/2;m++)
    {
        a--;
        for(int o=0;o<m+1;o++)
            printf(" ");
        for(int p=0;p<n-2*m-2;p++)
        {
            if(p==0 || p==n-2*m-2-1)
                printf("%c",a);
            else
                printf(" ");
        }
        printf("\n");
    }
    return 0;
}

3. 

d4dd5b149cce4abe843707037e8c2188.png

#include <stdio.h>

int main() {
    int i, j;
    char c;
    int n ; 
    scanf("%d",&n);
    // 打印上半部分(包括中间的最长行)
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= n - i; j++) {
            printf(" "); // 打印空格
        }
        c = 'A'; // 每行的起始字符都是 'A'
        for (j = 1; j <= 2 * i - 1; j++) {
            printf("%c", c++);
        }
        printf("\n");
    }

    // 打印下半部分
    for (i = n - 1; i >= 1; i--) {
        for (j = n - i; j >= 1; j--) {
            printf(" "); // 打印空格
        }
        c = 'A'; // 每行的起始字符都是 'A'
        for (j = 1; j <= 2 * i - 1; j++) {
            printf("%c", c++);
        }
        printf("\n");
    }

    return 0;
}

 4.还有一些图案如打印两圈菱形,打印外圈和最内圈,打印隔圈菱形等,留给大家思考(´▽`)ノ♪

 

4.空心数字金字塔:

66c204402bc941a0a7c47f04a751447c.png

这题与上期的空心金字塔可以说是增加了数字而已,对大家来说应该是手拿把恰! 

#include <stdio.h>
void hollowPyramid(int n)
{
    if (n >= 1 && n <= 9)
    {
        for (int i = 1; i <= n; i++)
        {
            if (i < n)
            {
                for (int q = n - 1; q > i - 1; q--)
                {
                    printf(" ");
                }
                if (i > 1)
                    printf("%d", i);
                for (int x = 1; x <= 2 * i - 3; x++)
                {
                    printf(" ");
                }
                printf("%d", i);
            }
            else
            {
                for (int j = 1; j <= 2 * n - 1; j++) {
                    printf("%d", n);
                }
            }
            printf("\n");
        }
    }
}
    int main()
   {
       int n;
       scanf("%d", &n);
       hollowPyramid(n);
       return 0;
   }

 小结:由于时间关系,本次总结较为仓促,如果有解释不当或错误的地方希望谅解,同时可以在评论区指出!感谢观看,可以给小编点一个免费的关注吗?(´▽`)ノ♪

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值