C语言坐标法打印菱形,菱形的打印方法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

很多人,打印菱形在控制台的思路是,把菱形上下拆分,分两段很接近的代码来打印,

其实这样代码很不好看,并且不好阅读

我们知道,要打印的图案是这种:

*

***

*****

***

*

满足上下对称,左右对称,那么,你能不能也弄一个二重循环,同样是对称的?

很简单,首先我们要抛开习惯性思维,for循环不一定要在0开始或者0结束

我们可以让循环从 -c 到 c ,这样不就轻松产生一个对称的吗?(只要取个绝对值)

我们把菱形的中心看成是坐标0,0,那么,会输出星号的坐标,是 |x| + |y| <= c 的点

由此可得

#include

#define IABS(x) ( (x) >= 0 ? (x) : -(x) ) //定义一个计算绝对值的宏

void print(int size) // size是这个菱形的半径,直径会是size * 2 + 1

{

int x, y;

for (y = -size; y <= size; y++)

{

for (x = -size; x <= size; x++)

{

if ( IABS(x) + IABS(y) <= size ) //x和y各自的绝对值的和,即 |x| + |y| <= size

putchar('*');

else

putchar(' ');

}

putchar('\n');

}

}

int main()

{

print(5); //输出一个半径为5的菱形

getchar();

return 0;

}

如果我需要得到空心菱形呢?非常非常简单,因为菱形边界上的点,满足的是|x| + |y| == c

所以,我们只要把那个if里的小于等于号,改成双等于号 == 就可以了

再类似地,如果我不要*号,我要最外层是字母A,然后里一层是B这样呢?即:

A

ABA

ABCBA

ABA

A

那么,我们只要在putchar那里做一个字符计算:

void print(int size) // size是这个菱形的半径,直径会是size * 2 + 1

{

int x, y;

for (y = -size; y <= size; y++)

{

for (x = -size; x <= size; x++)

{

if ( IABS(x) + IABS(y) <= size ) //x和y各自的绝对值的和,即 |x| + |y| <= size

putchar( 'A' + (size - IABS(x) - IABS(y)) ); //留意这里的计算方法

else

putchar(' ');

}

putchar('\n');

}

}

类似地,如果我们要打印的是X形:

* *

* *

*

* *

* *

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值