怎么输出心形呢?小猫想,在纸上先画一个心形,然后再写成代码,这应该是最简单的方案了。但是这样就是一行一行的写printf,感觉很没技术含量啊。

能不能用一个表达式,一次性输出呢?小猫又想,先找一个心形曲线的数学方程,然后将它的内部填上字符‘*’,应该就可以了。小猫先搜索了一下心形曲线的数学方程,找到一个看起来比较好实现的:

另一个问题是:怎么控制心形的大小呢?虽然可以在编程过程中边试边调整,但事先能大概确定心形大小会更好一点。小猫看了一下这个图形的坐标,横坐标范围大概在-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 <stdio.h>
#include <stdlib.h>
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('\n');
    }
    system("pause");
    return 0;
}

运行一下,看看结果:

怎么倒过来了?原来是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) //这样才会正常

运行结果:

如果将x的步长变小,那么横向方向上会输出更多的字符,这样心形会被拉宽。如果将y的步长变小,那么纵向方向上会输出更多的字符,这样心形会被拉长。如将y的步长从0.1变为0.05时输出的心形是这样:

如果将代码里面的输出空格改为其他可见字符,例如‘-’字符,就可以看到整个图形的背景啦。

#include <stdio.h>
#include <stdlib.h>
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('\n');
    }
    system("pause");
    return 0;
}

运行结果:

这样就能更好的理解这段代码的原理啦。不知道用这个表白有没有用呢?如果对你有用,就拿去吧。

更多推荐

C语言学习日记(9)——用C语言写一个爱心