总羡慕别人的勇气,喜欢一个人就大胆表白。玫瑰和蜡烛围成的美丽的心形,就像此时主角的内心,浪漫而又炽热,不管成功与否,都一样美好。
![8177bde2cc968e09da91fbc4f408bfd2.png](https://i-blog.csdnimg.cn/blog_migrate/b241c2b023d5f005ba06d9d717422420.jpeg)
爱的符号
而像小猫这种不善于表达的人,平时除了埋头看书,看上去好像没有喜欢的人。其实,小猫心里面也希望自己能勇敢一些。但鲜花,蜡烛的心形是不敢摆出来了,要不然话都说不出来了。那就用C语言来输出一个心形吧。
怎么输出心形呢?小猫想,在纸上先画一个心形,然后再写成代码,这应该是最简单的方案了。但是这样就是一行一行的写printf,感觉很没技术含量啊。
能不能用一个表达式,一次性输出呢?小猫又想,先找一个心形曲线的数学方程,然后将它的内部填上字符‘*’,应该就可以了。小猫先搜索了一下心形曲线的数学方程,找到一个看起来比较好实现的:
![b1d436e13eaeda0f7c8e3e1b8691a5d8.png](https://i-blog.csdnimg.cn/blog_migrate/bf19a7d9712ea1e4480787742d4796ce.jpeg)
一种心形曲线及其数学方程
另一个问题是:怎么控制心形的大小呢?虽然可以在编程过程中边试边调整,但事先能大概确定心形大小会更好一点。小猫看了一下这个图形的坐标,横坐标范围大概在-1.5到1.5之间,纵坐标范围大概在-1.0到1.5之间。小猫想:让横坐标x和纵坐标y都从-1.5到1.5按一定的步长增长,比如横坐标步长设为0.05,纵坐标步长设为0.1,设置两层循环,每次循环就将x,y代入方程,如果小于等于0,就说明这个点在心形内,此时输出‘*’字符,如果大于0,就说明这个点在心形外,此时输出空格(或者不做任何动作)。这样横向方向最多可以输出3.0/0.05=60个字符,纵向方向最多可以输出30个字符,即最多30行60列。小猫觉得大小应该合适了,不行再调整步长吧。代码如下:
#include #include int main(){ for (float y = -1.5f; y < 1.5f; y += 0.1f) //让y从-1.5变道1.5,y代表纵坐标 { for (float x = -1.5f; x < 1.5f; x += 0.05f) //让x从-1.5变道1.5,x代表横坐标 { float a = x * x + y * y - 1; //将x,y代入方程,先计算第一个括号的值 putchar(a * a * a - x * x * y * y * y <= 0.0f ? '*' : ' '); //计算整个方程的值,与0比较决定输出什么字符 } putchar(''); } system("pause"); return 0;}
运行一下,看看结果:
![37b18ccc8327c966f604f811ab868ef6.png](https://i-blog.csdnimg.cn/blog_migrate/523499f351692f34a29957f031d12fea.jpeg)
输出倒过来的心形
怎么倒过来了?原来是y不应该从-1.5到1.5,这样会将纵坐标上下颠倒,导致图形也颠倒。稍微改一下就可以了:
将这一行 for (float y = -1.5f; y < 1.5f; y += 0.1f) //这样会导致图形上下颠倒改为 for (float y = 1.5f; y > -1.5f; y -= 0.1f) //这样才会正常
运行结果:
![0b1390305904470b7ba4b10a6420df5d.png](https://i-blog.csdnimg.cn/blog_migrate/fd6deaac7cb3cad8e7a35a12d762714f.jpeg)
调整后的心形
如果将x的步长变小,那么横向方向上会输出更多的字符,这样心形会被拉宽。如果将y的步长变小,那么纵向方向上会输出更多的字符,这样心形会被拉长。如将y的步长从0.1变为0.05时输出的心形是这样:
![8a1c116bce0f6ffb9a658d85a10c1a35.png](https://i-blog.csdnimg.cn/blog_migrate/4f360fdaa1a68b2b29d645614d07d6bc.jpeg)
减小y的步长心形被拉长
如果将代码里面的输出空格改为其他可见字符,例如‘-’字符,就可以看到整个图形的背景啦。
#include #include int main(){ for (float y = 1.5f; y > -1.5f; y -= 0.1f) { for (float x = -1.5f; x < 1.5f; x += 0.05f) { float a = x * x + y * y - 1; putchar(a * a * a - x * x * y * y * y <= 0.0f ? '*' : '-'); //在这里改一下 } putchar(''); } system("pause"); return 0;}
运行结果:
![fca45c17dc54aa74e926618ad44869d0.png](https://i-blog.csdnimg.cn/blog_migrate/01a55ab462b505942b3a271dcb6f8de3.jpeg)
将周围的地方也显示出来
这样就能更好的理解这段代码的原理啦。不知道用这个表白有没有用呢?如果对你有用,就拿去吧。
就到这里啦。开心。
![72c733a6ebc7f034a43ff790a889500a.png](https://i-blog.csdnimg.cn/blog_migrate/b81ba2a36a7bd0119a294c11202e9c67.jpeg)
C语言学习日记