zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    关于matplotlib绘制直方图偏移的问题
    XP下 无法定位程序输入点WSAPoll于动态链接库ws2_32.dll 的解决办法
    Ubuntu 拨号上网及校园网开启IPV6
    php性能优化
    Mac OS X 10.11.6 重置root密码
    php 接口类与抽象类的实际作用
    Redis Cluster集群的搭建与实践
    nginx 反向代理 取得真实IP和域名
    mysql主从配置,出错
    mycat水平分片规则
  • 原文地址:https://www.cnblogs.com/fallenmoon/p/7587423.html
Copyright © 2011-2022 走看看