用C语言实现输入一个奇数n,输出一个由*构成的n阶实心菱形

样图示例:

一.基本思路

该问题的主要难点时是如何使用循环通过人为输入的指定长度来确定空格和星号的输出,我的想法是将图形以中间最长的一条线分为上下部分,然后分别用不同的变量来表示空格和星号的输出,最后通过c语言来实现对图形颜色和闪烁的控制。

二.具体实现

1.上半部分

首先我们先实现上半部分图形的打印

- - - *
- - * * *
- * * * * *
* * * * * * *

首先我们先要有规律的打印出空格,我在上图中用下划线代替了空格,用变量 i 和变量 j 来分别表示输出的行数和列数,用变量 n 来表示图形的阶数,首先空格的个数由上往下依次是3,2,1,0,而空格的行数 i 从上往下依次是0,1,2,3,由此可知 i<n/2+1(因为想要输出第四行因此加一),空格的列数 j 由上往下则是3,2,1,0,因此由观察可得j<n/2-i。由此上半部分空格输出的代码实现为:

for(i=0;i<n/2+1;i++)
{ 
  for(j=0;j<n/2-i;j++)
    {
      printf("_ ");
    }
 printf("\n\n");
} 

为了图形美观于是我加入了两个换行符,而打印出的结果应该为:

- - -
- -
-

接下来着手打印星号,由第一个图可知由上往下星号的数量分别为1,3,5,7,与打印空格的逻辑一样只不过这里 j 的范围由观察可得j<2*i+1,由此可的代码如下:

for(i=0;i<n/2;i++)
{ 
  for(j=0;j<n/2-i;j++)
    {
      printf(" _");
    }
  for(j=0;j<2*i+1:j++)
    {
      printf(" *");
    }
  printf("\n\n");
}

其打印出来的效果应该该如下:

- - - *
- - * * *
- * * * * *
* * * * * * *

2.下半部分

然后我们开始下半部分的图形输出,还是先打印空格设空格由上至下依次为1,2,3,行数 i 依旧为i<n/2,列数 j 为1,2.,3,由观察可得j<i+1,由此可得代码如下:

​
for(i=0;i<n/2+1;i++)
{
  for(j=0;j<n/2-i;j++)
    {
      printf(" _");
    }
  for(j=0;j<2*i+1;j++)
    {
      printf(" *");
    }
  printf("\n\n");
}
for(i=0;i<n/2;i++)
{
   for(j=0;j<i+1;j++)
   {
     printf(" _");
   }
  printf("\n\n");
}

​

其输出的结果应该为:

- - - *
- - * * *
- * * * * *
* * * * * * *
-
- -
- - -

由图像可知星号由上至下依次为5,3,1,行数 i 的范围不变,j 的范围变为j<n-2-2*i,由此完整的代码应该为:


for(i=0;i<n/2;i++)
{
   for(j=0;j<i+1;j++)
   {
      printf(" _");
   }
   for(j=0;j<n-2-2*i)
   {
      printf(" *"):
   }
 printf("\n\n");
}

可的到的图形输出为:

- - - *
- - * * *
- * * * * *
* * * * * * *
- * * * * *
- - * * *
- - - *

3.对图形颜色和闪烁的控制

若要实现对图形我们就要使用到printf的设置属性的功能:

设置文本颜色(30~37)重置文本所有属性:\033[0m
黑色:\033[30m设置粗体:\033[1m
红色:\033[31m

设置斜体:\033[3m

绿色:\033[32m设置下划线:\033[4m
黄色:\033[33m设置闪烁\033[5m
蓝色:\033[34m设置反显:\033[7m

洋红:\033[35m

青色:\033[36m
白色:\033[37m

由此完整代码应该如下:

#include <stdio.h>
int main()
{
	int n ;
	scanf_s("%d", &n);
	int i, j;
	printf("\033[5m\033[36m");
	for (i = 0; i < n / 2 + 1; i++)
	{
		for (j = 0; j < n / 2 - i; j++)
		{
			printf("  "); 
		}
		for (j = 0; j < 2 * i + 1; j++)
		{
			printf(" *");
		}
		printf("\n\n");
	
	}
	for (i = 0; i < n / 2; i++)
	{
		for (j = 0; j < i + 1; j++)
		{
			printf("  ");
		}
		for (j = 0; j < n - 2 - 2 * i; j++)
		{
			printf(" *");
		}
		printf("\n\n");
	}
	printf("\033[0m");
	return 0;
}

注意在使用颜色控制和设置文本属性的时候最后一定要重置所用文本属性。

这就是我所分享的内容如有错误敬请指出

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

波风一凡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值