精华内容
下载资源
问答
  • 一个有趣C语言代码

    万次阅读 2013-03-20 16:14:58
    #include long x[]={1, 3,6,8,0,0,0,0, 32,32, 4,32, 1022,32,1020,36 ,32,1022, 34,508,32 , 32,509,34 , 508,32,36, 32,0,32,36,1022,508,80, 1023,
     #include                     <stdio.h>
         long x[]={1,             3,6,8,0,0,0,0, 32,32,
     4,32, 1022,32,1020,36        ,32,1022, 34,508,32 ,
     32,509,34 , 508,32,36,      32,0,32,36,1022,508,80,
            1023,               32,260              ,136,
       32,    32 ,   508 ,      260,32              , 32,
      0404,  514,   32,32       ,0,0,0              ,0x0,
      994 ,  0466,   0772,      47,548,950, 168, 296, 559,
     694,69  ,174,  0x228,      0x3B6 , 01646,0141,01744,
      01266  ,0124   ,2033
     ,142,   01666   ,1010    ,175, 149,566,67,168,708,1006,
     1018,  296,676  ,01055   ,66,548,788,812,66,100,0,0,00,
     0,698,  33856,  0,8466   ,16929,     33831,      64512,
     8466,   16930,  33824,0  ,56882,     19908,      39872,
    0};int   main(   int _1   ,char * *_2 ) { int _3,_4;(_3= 
     1<<2,   _1^2)   ?main    (_1^1L?--_1:((1L<<4)+(1L<<3)),
             _2):0            ;while      (_4=0,      _3 --)
             while            (putchar    (*(x+(      _1<<2)
             +_3)&            1<<_4?(1<<5)+(1<<2):1<<5),++_4
             <1<<             4); return putchar (1+2+3+4);}
    展开全文
  • 有趣的是,代码中还混了Python的语法 2.1 - 声明环境 #env "planet_engine"   从这一句就可以看出这段代码是伪代码,这里声明程序运行环境位于" 行星发动机 "内,于是程序中所有的API都应该来自 行星...


    代码千万条,注释第一条

      春节十二响这个梗出自《流浪地球》电影中一个名为李一一(不是横线,是一二三的一,还是两个)的程序员在最后修改发动机喷射形式的时候提到的内容,因为背景及现场气氛的共同作用,这个内容成为这部电影令人印象深刻的情节之一
      在电影播出后不久,由于电影中李一一程序员的身份,进而激起了现实众多程序员博主纷纷出动模拟春节十二响代码,其中一位博主在GitHub中开源了C语言伪代码,不能编译运行,但是目前得到了 180+star(在GitHub中获得别人的star是非常困难的),下面一起分析这个 spring12
    Alt

    01 - Spring12下载

      点击spring12-GitHub源码进入页面,点击clone or download就可以下载zip压缩包,解压后得到文件
    Alt
      因为是伪代码,所以只有一个.c程序,这个程序的名字很搞笑,还引来众多程序员一本正经地讨论,具体可以看issues

    02 - Spring12分析

      在查看spring12的时候,很多人都想去编译运行,但是发现编译器报出一堆错误,因为这个spring12只是伪代码,打开spring12 ,代码量非常少

    #env "planet_engine"
    
    int init() {
        set_engine_number_mask(ENGINE_ALL);
        set_funeral_level(FUNERAL_FULL);
        // 允许误差10秒以内
        if (unix_time() < make_unix_time(2082, 1, 28, 23, 59, 60-10)) return ERR_ENGIN_ENV;
        return engine_check_init(); // after compile and before real run
    }
    int main() {
        set_curve(CURVE_NATURAL); // 自然曲线耗费燃料最少
        for (int i :range(0, 12, 1)) {
            engine_start();
            wait_engine(ENGINE_STATE_CHAGNE);
            sleep(2000);
            engin_stop();
            wait_engine(ENGINE_STATE_CHAGNE);
            sleep(4000); // 这个时长在模拟器里听起来更像心跳
        }
        return 0;
    }
    int final() {
        engine_ensure_shutdown();
    }
    

      这位博主在必要的地方写了注释,整段代码看下来,更像是看了一篇短文一样:声明环境、初始化发动机、开启发动机12响、关闭发动机,有趣的是,代码中还混了Python的语法

    2.1 - 声明环境

    #env "planet_engine"
    

      从这一句就可以看出这段代码是伪代码,这里声明程序运行环境位于"行星发动机"内,于是程序中所有的API都应该来自行星发动机SDK,所以如果你想编译运行,就请先找到SDK(做梦吧)

    2.2 - 初始化发动机

    int init() {
        set_engine_number_mask(ENGINE_ALL);
        set_funeral_level(FUNERAL_FULL);
        // 允许误差10秒以内
        if (unix_time() < make_unix_time(2082, 1, 28, 23, 59, 60-10)) return ERR_ENGIN_ENV;
        return engine_check_init(); // after compile and before real run
    }
    

      程序并不是严格按照C语言风格从main()开始,而是按照Python从init()开始,因为main()中没有显式调用init(),所以接下来运行init(),进行的步骤有:

    • 设置发动机掩码,准备开启所有发动机
    • 设置危险级别,所有发送机危险级别置为最高
    • 检查当前时间,发动机将在2082年1月28日23小时59分钟第50~60秒内开启,当前时间的误差必须在此范围内
    • 检查发动机状态,即将开启发动机

    2.3 - 启动发动机12响

    int main() {
        set_curve(CURVE_NATURAL); // 自然曲线耗费燃料最少
        for (int i :range(0, 12, 1)) {
            engine_start();
            wait_engine(ENGINE_STATE_CHAGNE);
            sleep(2000);
            engin_stop();
            wait_engine(ENGINE_STATE_CHAGNE);
            sleep(4000); // 这个时长在模拟器里听起来更像心跳
        }
        return 0;
    }
    

      到C语言的main()函数了,先是设置燃料耗费曲线为自然曲线(这是外国一个超高效冷冻站控制系统设备的功耗曲线,确保效率最大的情况下功耗最低),接下来进行类似单片机LED灯的打开、延迟、关闭、延迟的闪烁操作,连续闪烁12次,就是模拟春节十二响了,只是代码中的开启停止还需要等待一段时间,延迟的时间分别是2s和4s,打开发动机2s,再停止发动机4s,一快一慢,就类似于心跳的频率

    2.4 - 关闭发动机

    int final() {
        engine_ensure_shutdown();
    }
    

      最后在行星环境SDK中调用API关闭所有发动机,春节十二响模拟完成

    03 - 总结

    开始
    init
    1-设置发动机掩码
    2-设置危险级别
    3-检查当前时间
    4-检查发动机状态
    main
    1-设置功耗曲线
    2-发动机闪烁12次
    final
    关闭发动机
    结束
    • 可以看得出,这位博主的知识领域应该涉及到C、Python、Unix && Linux以及数学领域
    • 虽然是简单的伪代码,但是提出了一个简易的框架,后面将会有扩展

    04 - Spring12扩展

      伪代码始终不能满足程序员的好奇心,于是基于此框架,在CSDN上的一位博主用C语言+windows库实现了春节十二响的CMD演示,【流浪地球】春节十二响程序开源代码,CMD效果如下,简直是1分钱特效…
    在这里插入图片描述
      这位博主的源码很简单,一堆的printf()以及格式控制,调用图形库变颜色闪烁,一股非主流风扑鼻而来,有兴趣的伙伴可以读这位博主的源码,虽然写得一般,但是有个1分钱效果还算可以了

    05 - 如何用Scratch动画显示Spring12

      CDM没有动画显示,想要简单的动画显示,可以用Scratch,小白将使用Scratch实现spring12的动画效果,期待后续

    展开全文
  • 如何在python中调用C语言代码

    万次阅读 2017-10-16 22:58:38
    CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypes,SWIG,Python/C API。每种方式也都有各自的利弊。 首先,我们要明确...

    1.使用C扩展

    CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码

    开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypesSWIGPython/C API。每种方式也都有各自的利弊。

    首先,我们要明确为什么要在Python中调用C?

    常见原因如下: - 你要提升代码的运行速度,而且你知道C要比Python快50倍以上 - C语言中有很多传统类库,而且有些正是你想要的,但你又不想用Python去重写它们 - 想对从内存到文件接口这样的底层资源进行访问 - 不需要理由,就是想这样做


    展开全文
  • c语言有趣的100个例子代码,一定要看呀。
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 ... 1.使用C扩展 CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在...
    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35636311/article/details/78255568

    1.使用C扩展

    CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码

    开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypesSWIGPython/C API。每种方式也都有各自的利弊。

    首先,我们要明确为什么要在Python中调用C?

    常见原因如下: - 你要提升代码的运行速度,而且你知道C要比Python快50倍以上 - C语言中有很多传统类库,而且有些正是你想要的,但你又不想用Python去重写它们 - 想对从内存到文件接口这样的底层资源进行访问 - 不需要理由,就是想这样做

    #include <stdio.h>

    int add_int(int, int);
    float add_float(float, float);

    int add_int(int num1, int num2){
    return num1 + num2;

    }

    float add_float(float num1, float num2){
    return num1 + num2;

    }

    接下来将C文件编译为.so文件(windows下为DLL)。下面操作会生成adder.so文件

    #For Linux
    $  gcc -shared -Wl,-soname,adder -o adder.so -fPIC add.c
    

    #For Mac
    $ gcc -shared -Wl,-install_name,adder.so -o adder.so -fPIC add.c

    现在在你的Python代码中来调用它

    from ctypes import *
    

    #load the shared object file
    adder = CDLL(’./adder.so’)

    #Find sum of integers
    res_int = adder.add_int(4,5)
    print "Sum of 4 and 5 = " + str(res_int)

    #Find sum of floats
    a = c_float(5.5)
    b = c_float(4.1)

    add_float = adder.add_float
    add_float.restype = c_float
    print "Sum of 5.5 and 4.1 = ", str(add_float(a, b))

    输出如下

    Sum of 4 and 5 = 9
    Sum of 5.5 and 4.1 =  9.60000038147
    

    在这个例子中,C文件是自解释的,它包含两个函数,分别实现了整形求和和浮点型求和。

    在Python文件中,一开始先导入ctypes模块,然后使用CDLL函数来加载我们创建的库文件。这样我们就可以通过变量adder来使用C类库中的函数了。当adder.add_int()被调用时,内部将发起一个对C函数add_int的调用。ctypes接口允许我们在调用C函数时使用原生Python中默认的字符串型和整型。

    而对于其他类似布尔型和浮点型这样的类型,必须要使用正确的ctype类型才可以。如向adder.add_float()函数传参时, 我们要先将Python中的十进制值转化为c_float类型,然后才能传送给C函数。这种方法虽然简单,清晰,但是却很受限。例如,并不能在C中对对象进行操作。

    3.SWIG

    SWIG是Simplified Wrapper and Interface Generator的缩写。是Python中调用C代码的另一种方法。在这个方法中,开发人员必须编写一个额外的接口文件来作为SWIG(终端工具)的入口。

    Python开发者一般不会采用这种方法,因为大多数情况它会带来不必要的复杂。而当你有一个C/C++代码库需要被多种语言调用时,这将是个非常不错的选择。

    示例如下(来自SWIG官网)

    example.c文件中的C代码包含了不同的变量和函数

    #include <time.h>
    double My_variable = 3.0;
    

    int fact(int n) {
    if (n <= 1) return 1;
    else return n*fact(n-1);

    }

    int my_mod(int x, int y) {
    return (x%y);

    }

    char *get_time()
    {
    time_t ltime;
    time(&ltime);
    return ctime(&ltime);

    }

    编译它

    unix % swig -python example.i
    unix % gcc -c example.c example_wrap.c \
        -I/usr/local/include/python2.1
    unix % ld -shared example.o example_wrap.o -o _example.so
    
    

    最后,Python的输出

    >>> import example
    >>> example.fact(5)
    120
    >>> example.my_mod(7,3)
    1
    >>> example.get_time()
    'Sun Feb 11 23:01:07 1996'
    >>>
    

    我们可以看到,使用SWIG确实达到了同样的效果,虽然下了更多的工夫,但如果你的目标是多语言还是很值得的。

    4.Python/C API

    Python/C API可能是被最广泛使用的方法。它不仅简单,而且可以在C代码中操作你的Python对象。

    这种方法需要以特定的方式来编写C代码以供Python去调用它。所有的Python对象都被表示为一种叫做PyObject的结构体,并且Python.h头文件中提供了各种操作它的函数。例如,如果PyObject表示为PyListType(列表类型)时,那么我们便可以使用PyList_Size()函数来获取该结构的长度,类似Python中的len(list)函数。大部分对Python原生对象的基础函数和操作在Python.h头文件中都能找到。

    示例

    编写一个C扩展,添加所有元素到一个Python列表(所有元素都是数字)

    来看一下我们要实现的效果,这里演示了用Python调用C扩展的代码

    #Though it looks like an ordinary python import, the addList module is implemented in C
    import addList
    

    l = [1,2,3,4,5]
    print "Sum of List - " + str(l) + " = " + str(addList.add(l))

    上面的代码和普通的Python文件并没有什么分别,导入并使用了另一个叫做addList的Python模块。唯一差别就是这个模块并不是用Python编写的,而是C。

    接下来我们看看如何用C编写addList模块,这可能看起来有点让人难以接受,但是一旦你了解了这之中的各种组成,你就可以一往无前了。

    //Python.h has all the required function definitions to manipulate the Python objects
    #include <Python.h>
    

    //This is the function that is called from your python code
    static PyObject* addList_add(PyObject* self, PyObject* args){

    PyObject * listObj;
    
    <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic;">//The input arguments come as a tuple, we parse the args to get the various variables</span>
    <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic;">//In this case it's only one list variable, which will now be referenced by listObj</span>
    <span class="hljs-keyword" style="font-weight:bold;">if</span> (! PyArg_ParseTuple( args, <span class="hljs-string" style="color:rgb(221,17,68);">"O"</span>, &amp;listObj ))
        <span class="hljs-keyword" style="font-weight:bold;">return</span> <span class="hljs-literal">NULL</span>;
    
    <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic;">//length of the list</span>
    <span class="hljs-keyword" style="font-weight:bold;">long</span> length = PyList_Size(listObj);
    
    <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic;">//iterate over all the elements</span>
    <span class="hljs-keyword" style="font-weight:bold;">int</span> i, sum =<span class="hljs-number" style="color:rgb(0,128,128);">0</span>;
    <span class="hljs-keyword" style="font-weight:bold;">for</span> (i = <span class="hljs-number" style="color:rgb(0,128,128);">0</span>; i &lt; length; i++) {
        <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic;">//get an element out of the list - the element is also a python objects</span>
        PyObject* temp = PyList_GetItem(listObj, i);
        <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic;">//we know that object represents an integer - so convert it into C long</span>
        <span class="hljs-keyword" style="font-weight:bold;">long</span> elem = PyInt_AsLong(temp);
        sum += elem;
    }
    
    <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic;">//value returned back to python code - another python object</span>
    <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic;">//build value here converts the C long to a python integer</span>
    <span class="hljs-keyword" style="font-weight:bold;">return</span> Py_BuildValue(<span class="hljs-string" style="color:rgb(221,17,68);">"i"</span>, sum);
    

    }

    //This is the docstring that corresponds to our ‘add’ function.
    static char addList_docs[] =
    “add( ): add all elements of the list\n”;

    /* This table contains the relavent info mapping -
    <function-name in python module>, <actual-function>,
    <type-of-args the function expects>, <docstring associated with the function>
    */

    static PyMethodDef addList_funcs[] = {
    {“add”, (PyCFunction)addList_add, METH_VARARGS, addList_docs},
    {NULL, NULL, 0, NULL}

    };

    /*
    addList is the module name, and this is the initialization block of the module.
    <desired module name>, <the-info-table>, <module’s-docstring>
    */

    PyMODINIT_FUNC initaddList(void){
    Py_InitModule3(“addList”, addList_funcs,
    “Add all ze lists”);

    }

    逐步解释 - Python.h头文件中包含了所有需要的类型(Python对象类型的表示)和函数定义(对Python对象的操作) - 接下来我们编写将要在Python调用的函数, 函数传统的命名方式由{模块名}_{函数名}组成,所以我们将其命名为addList_add 
    - 然后填写想在模块内实现函数的相关信息表,每行一个函数,以空行作为结束 - 最后的模块初始化块签名为PyMODINIT_FUNC init{模块名}

    函数addList_add接受的参数类型为PyObject类型结构(同时也表示为元组类型,因为Python中万物皆为对象,所以我们先用PyObject来定义)。传入的参数则通过PyArg_ParseTuple()来解析。第一个参数是被解析的参数变量。第二个参数是一个字符串,告诉我们如何去解析元组中每一个元素。字符串的第n个字母正是代表着元组中第n个参数的类型。例如,"i"代表整形,"s"代表字符串类型, "O"则代表一个Python对象。接下来的参数都是你想要通过PyArg_ParseTuple()函数解析并保存的元素。这样参数的数量和模块中函数期待得到的参数数量就可以保持一致,并保证了位置的完整性。例如,我们想传入一个字符串,一个整数和一个Python列表,可以这样去写

    int n;
    char *s;
    PyObject* list;
    PyArg_ParseTuple(args, "siO", &n, &s, &list);
    

    在这种情况下,我们只需要提取一个列表对象,并将它存储在listObj变量中。然后用列表对象中的PyList_Size()函数来获取它的长度。就像Python中调用len(list)

    现在我们通过循环列表,使用PyList_GetItem(list, index)函数来获取每个元素。这将返回一个PyObject*对象。既然Python对象也能表示PyIntType,我们只要使用PyInt_AsLong(PyObj *)函数便可获得我们所需要的值。我们对每个元素都这样处理,最后再得到它们的总和。

    总和将被转化为一个Python对象并通过Py_BuildValue()返回给Python代码,这里的i表示我们要返回一个Python整形对象。

    现在我们已经编写完C模块了。将下列代码保存为setup.py

    #build the modules
    

    from distutils.core import setup, Extension

    setup(name=‘addList’, version=‘1.0’,
    ext_modules=[Extension(‘addList’, [‘adder.c’])])

    并且运行

    python setup.py install
    

    现在应该已经将我们的C文件编译安装到我们的Python模块中了。

    在一番辛苦后,让我们来验证下我们的模块是否有效

    #module that talks to the C code
    import addList
    

    l = [1,2,3,4,5]
    print "Sum of List - " + str(l) + " = " + str(addList.add(l))

    输出结果如下

    Sum of List - [1, 2, 3, 4, 5] = 15
    

    如你所见,我们已经使用Python.h API成功开发出了我们第一个Python C扩展。这种方法看似复杂,但你一旦习惯,它将变的非常有效。

    Python调用C代码的另一种方式便是使用Cython让Python编译的更快。但是Cython和传统的Python比起来可以将它理解为另一种语言,所以我们就不在这里过多描述了。



    展开全文
  • 打开浏览器开始了搜索,零零碎碎的收集了一个简短的代码,贴出来分享~ 学以致用,用兴趣学习,嘻嘻嘻~~~ 一般查看IP地址的方法:(以windows 10为例) 1. 用win+R打开命令提示符 2. 输入cmd 3. 输入ipconfig ...
  • 有趣c语言

    千次阅读 2019-01-29 18:07:38
    写在前面 工作三年多,常听各位前辈讲: ...最近终于有时间,终于还是决定花点时间,把c语言掌握的清晰一点,选中了这本已经带领无数大神走向巅峰的神书《c专家编程》,打算通读一遍,空口无凭...
  • C语言的游戏代码

    2013-04-25 18:33:44
    有趣C语言代码集萃,可以用来编写游戏。
  • 利用c语言代码打印一个心形(带立体感)

    万次阅读 多人点赞 2016-01-26 17:16:26
    在我们IT行业每天面对的就是敲代码,所以很多人无法接受这份工作,因为很无聊也很枯燥,长期工作会使人情绪低落,其实我们编程很多时候也有有趣的地方,接下来我就用一个简单的c语言作图来缓解一下气氛。 源程序: ...
  • 程序代码c语言

    2015-10-30 16:38:57
    C语言程序设计很有趣,改编成是关于c语言的简单编写,方法无所谓,精神很重要!
  • 1.程序员测试其程序的最好办法是什么呢?是对其进行逐条的跟踪,对中间的结果进行认真的查看。不要等到出了错误再对程序进行... 习惯于对代码进行逐条跟踪会产生一个有趣的负反馈回路。例如,对代码进行逐条跟踪 ...
  • 12个有趣C语言问答

    2021-01-31 01:47:53
    Q:以下代码有个被隐藏住的问题,你能找到它吗?A:这个不显眼的问题就是使用了gets()方法。此方法接受一个string类型参数,但是却没有检测此数值是否有足够的空间来拷贝数据。所以这里我们一般用 fgets()方法将来的更...
  • 有趣c语言算法经典

    2011-05-11 09:36:21
    对于初学c语言不久的来说,这不失为一个很好的资料,里面给出了详细的源代码
  • c语言的源代码

    2013-05-25 02:34:25
    初学时的源代码,现在想起来真是很有趣,希望对大家的c语言学习有帮助
  • 有趣C语言问答

    2014-09-15 14:22:57
     Q:以下代码有个被隐藏住的问题,你能找到它吗? 1 2 3 4 5 6 7 8 9 10 11 12 13 #include   int main(void) {  char buff[10];...
  • 12个有趣C语言面试题~

    千次阅读 2013-05-30 12:15:12
    12个有趣C语言面试题 1.gets()函数问:请找出下面代码里的问题:#include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer entere .. 1.gets()函数...
  • 12个有趣C语言面试题 本文的12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,而且有趣,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题 #include int main(void) { ...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#include#include//数字雨typedef struct{int x, y;char ch;}STU;STU st[5000];//出现位置void gotoxy(int x, int y){HANDLE hout;COORD pos;...
  • C语言控制台贪吃蛇源代码,比较简单,值得入门学习,画图,以及数据结构,有趣
  • 有趣C语言面试题

    2017-08-10 16:07:31
    1、gets() 和 fgets()函数 ...问题:找出下面代码的问题 #include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer entered is [%s]\n",buff); r

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 613
精华内容 245
关键字:

有趣c语言代码

c语言 订阅