putchar(".:-=+*#%@"[(int)(d * 5.0f)])

前两天在玩知乎时候见到有个用C语言画心的小代码感觉还是蛮好玩的,不过,里面有行代码看了好久才懂: putchar(".:-=+*#%@"[(int)(d * 5.0f)]); ,先来看看putchar这个函数,用man查看一下其原型: int putchar(int c) 

然后我们写个例程看看:

1 #include <stdio.h>
2 int main(int argc, char const *argv[])
3 {
4     /*int putchar(int c)等价于int putc(int c, FILE *stream)*/
5     putchar(".:-=+*#%@"[8]);
6     return 0;
7 }

输出是下面这样的,就只有一个@这个字符

再多写几行把那串字符串里的'@'这个字符改一下再输出:

 1 #include <stdio.h>
 2 int main(int argc, char const *argv[])
 3 {
 4     /*int putchar(int c)等价于int putc(int c, FILE *stream)*/
 5     putchar(".:-=+*#%@"[8]);
 6     putchar(".:-=+*#%3"[8]);
 7     putchar(".:-=+*#%s"[8]);
 8     putchar(".:-=+*#%h"[8]);
 9     return 0;
10 }

输出:

仔细看看貌似输出的字符都是我们改过来的,我们再数数发现那个'@'字符正好是".:-=+*#%@"这个字符串的第9个元素……

我天,这其实就相当于str[8]嘛……真的是蠢到家!!!

 最后把原始代码贴出来吧,知乎在这里:如何用 C 语言画「心形」?

 1 #include <stdio.h>
 2 #include <math.h>
 3 
 4 float f(float x, float y, float z)
 5 {
 6     float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;
 7     return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
 8 }
 9 
10 float h(float x, float z)
11 {
12     for (float y = 1.0f; y >= 0.0f; y -= 0.001f)
13         if(f(x, y, z) <= 0.0f)
14             return y;
15     return 0.0f;
16 }
17 
18 int main(int argc, char const *argv[])
19 {
20     for (float z = 1.5f; z > -1.5f; z -= 0.05f)
21     {
22         for (float x = -1.5f; x < 1.5f; x += 0.025f)
23         {
24             float v = f(x, 0.0f, z);
25             if(v <= 0.0f)
26             {
27                 float y0 = h(x, z);
28                 float ny = 0.01f;
29                 float nx = h(x + ny, z) - y0;
30                 float nz = h(x, ny + z) - y0;
31                 float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);
32                 float d = (nx + ny - nz) * nd * 0.5f + 0.5f;
33                 putchar(".:-=+*#%@"[(int)(d * 5.0f)]);
34             }
35             else
36             {
37                 putchar(' ');
38             }
39         }
40         putchar('
');
41     }
42     return 0;
43 }
原文地址:https://www.cnblogs.com/fallenmoon/p/7587423.html