签到

06月21日
尚未签到

共有回帖数 0

    懂得生活的人

    等级:
    bf 语言的介绍 - 维基百科
    http://zh.wikipedia.org/wiki/Brainfuck

    建议用 32 位编译器编译,如用 tc 之类,请选 Large 或 Huge 模式。
    #include stdio.h
    #ifndef cellsize
    #define cellsize 30000
    #endif
    const char *s_name =
    "    bfi"
    #if cellsize != 30000
    "%d"
    #endif
    " - brainf*ck language interpreter 1.0.1 build - "__DATE__"n"
    #if cellsize != 30000
    "        **** Special version with %d cells in size ****n"
    #endif
    "           ----- copyright © 2005 by 8pm@baidu.cbarn";
    const char *s_license =
    " This program is free software; you can redistribute it and/or modifyn"
    " it under the terms of the GNU General Public License as published byn"
    " the Free Software Foundation; either version 2 of the License, orn"
    " (at your option) any later version.n"
    "n"
    " This program is distributed in the hope that it will be useful,n"
    " but WITHOUT ANY WARRANTY; without even the implied warranty ofn"
    " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See then"
    " GNU General Public License for more details.n"
    "n"
    " You should have received a copy of the GNU General Public Licensen"
    " along with this program; if not, write to then"
    " Free Software Foundation, Inc.,n"
    " 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.n"
    "n"
    " usage: $ %s [source code]n"
    "n";

    const char *s_err_open =
    "[] error: unable to open file %sn";
    const char *s_err_ovfl =
    "[] error: unable to run, program too large.n";
    const char *s_err_unmt =
    "[] error: unmatch [ and ] in source file.n";

    char a[cellsize], o[cellsize];
    int n=0,ip=0,dp=0;

    int main(int argc, char **argv)
    {
       FILE *fp = NULL;
       if (1 == argc) {
    #if cellsize != 30000
           fprintf(stderr, s_name, cellsize/1000, cellsize);
    #else
           fprintf(stderr, s_name);
    #endif
           fprintf(stderr, s_license, argv[0]);
           return 0;

      }
       if (NULL == (fp=fopen(argv[1],"r"))) {
           fprintf(stderr, s_err_open, argv[1]);
           return -1;
       }
       while(!feof(fp))
           switch(n=fgetc(fp)) {
           case '[':ip+=2;case ']':--ip;case '':
           case '':case '+':case '-':case '.':case ',':
               o[dp++]=n;
               if (dp==cellsize) {
                   fclose(fp);
                   fprintf(stderr, s_err_ovfl);
                   return -2;
               }
           }
       fclose(fp);
       if (ip) {
           fprintf(stderr, s_err_unmt);
           return -3;
       }
       n=ip=dp=0;
       do {
           n=1;
           switch (o[ip]) {
           case '':++dp==cellsize?dp=0:0;break;
           case '':--dp==-1?dp+=cellsize:0;break;
           case '+':a[dp]++;break;
           case '-':a[dp]--;break;
           case '.':putchar(a[dp]);fflush(stdout);break;
           case ',':a[dp]=getchar();break;
           case '[':
               if(!a[dp])
                   while(n)
                       switch(o[++ip]){
                       case '[':n++;break;
                       case ']':n--;break;
                       }
               break;
           case ']':
               if(a[dp])
                   while(n)
                       switch(o[--ip]){
                       case ']':n++;break;
                       case '[':n--;break;
                       }
               break;
           }
       } while(o[++ip]);
       return 0;
    }
    编译后可用以下程序试运行,如能正确输出,则编译成功。

    这个不用说了,学没一种语言几乎都是先写这个:
    Hello.b

    注意:因为在 bf 语言里,凡是不是八个指令符之外的字符都算作注释,譬如以下的代码两行 * 之间的东东,也包括这两行 * 和中文都可以直接放在源文件里。

    **********************************

    一个在屏幕上打印"Hello World!"的程序:
    ++++++++++[+++++++++++++++++++++-]
    ++.+.+++++++..+++.++.+++++++++++++++.
    .+++.------.--------.+..

    **********************************
    可以再试运行这个:

    #!/usr/local/bin/bfi
    上面这一行是告诉命令解释程序用哪一个程序来解释运行这个源代码
    只在 unix/linux 系统下有效 :)
    用 brainfuck 语言写的一个简单示范程序; 在屏幕上输出 "8pm"
    第一个单元用做循环计数器; 设为 10
    ++++++++++ [      循环 10 次
       +++++        第二单元的值加 5
       +++++++++++  第三单元的值加 11
       +++++++++++  第四单元的值加 11
       +            第五单元的值加 1
    -]
          现在前五个单元应该是这样的
    单元  |  第一  第二  第三  第四  第五
    内容  |   0    50   110   110   10
    ++++++ 加 6 到第二单元 = 56;  字符 '8' 的 ascii 编码值
    ++     加 2 到第三单元 = 112; 字符 'p' 的 ascii 编码值
    -      第四单元值减 1  = 109; 字符 'm' 的 ascii 编码值
           第五单元值是 10; 字符 '换行符' 'n' 的 ascii 值
        指针移回字符串的开始; 第二单元

    ....  输出字符串
       *** 程序结束 ***

    楼主 2016-03-03 17:59 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知