• 如何优雅地用MATLAB生成C语言从1打印到100再打印到1


    结论:C语言从1打印到100再打印到1根本用不着C语言。

    谁说没有枪头就捅不死人C语言从1打印到100再打印到1必须手写C语言的?

    我觉得各位的思路还是没有打开。编程最重要的是什么?是可靠!而且要严谨!要优雅!

    image

    看了一大圈答案,思路还囿于手撕代码的桎梏之中,这实在让我捶胸顿足、咬牙切齿、痛心疾首!辉煌的人类文明已经发展至今,为什么我们的编程技术还停留在手工小作坊阶段!你能保证你手动写的C代码没bug吗?这样写出来的代码一点都不可靠!不严谨!不优雅!接下来我将展示一种生成C代码的方法!真的一行C都不用写!

    多说无益,直接放码过来:

    tic
    clear;clc;close all;
    %%
    numMax=100;
    global idx;
    idx=1;
    %%
    for kk1=1:numMax
        fid = fopen(['cCodeOrigin',num2str(kk1),'.m'],'w+');
        fprintf(fid,['function cCodeOrigin',num2str(kk1),'()\n']);
        fprintf(fid,['fprintf(''',num2str(kk1),' '')\n']);
        fprintf(fid,'end');
        fclose(fid);
    end
    %%
    fid = fopen('main.c','w+');
    fprintf(fid,'#include <stdio.h>\n#include <stdlib.h>');
    
    bigFuckingString=repmat("\n#include ""cCodeOriginPLACEHOLDER.h""",1,numMax);
    bigFuckingString = arrayfun(@replaceThePLACEHOLDEROfBigFuckingString,bigFuckingString);
    fprintf(fid,char(bigFuckingString));
    
    fprintf(fid,'\n\nint main()\n{\n');
    for kk1=[1:numMax,numMax-1:-1:1]
        fprintf(fid,['\tcCodeOrigin',num2str(kk1),'();\n']);
    end
    
    fprintf(fid,'\n\tputs("\\nPress enter to quit:");\n\tgetchar();\n\n\treturn 0;\n}');
    fclose(fid);
    %%
    cfg=coder.config('exe')
    cfg.CustomSource='main.c'
    bigFuckingStringPlusUltraMaxPro=repmat("cCodeOriginPLACEHOLDER ",1,numMax);
    idx=1;
    bigFuckingStringPlusUltraMaxPro = arrayfun(@replaceThePLACEHOLDEROfBigFuckingString,bigFuckingStringPlusUltraMaxPro);
    eval(['codegen -config cfg ',reshape(char(bigFuckingStringPlusUltraMaxPro),1,[])])
    toc
    %%
    function newStr=replaceThePLACEHOLDEROfBigFuckingString(bigFuckingString)
    global idx;
    newStr=replace(bigFuckingString,"PLACEHOLDER",num2str(idx));
    idx=idx+1;
    end
    

    有些小同志可能要疑惑了:你这不是MATLAB吗?

    先别急,让我们看看运行结果。这是运行前:

    image

    这是运行后:

    image

    查看一下都生成了什么东西:

    image

    可以看到生成了一些M文件,一个C文件,一个可执行文件,以及一个文件夹。首先让我们看看可执行文件的运行结果:

    image

    可靠、严谨、优雅打印了从1到100再到1的数字。

    image

    让我们看看文件夹里都有什么:

    image

    这里的C文件是这样的:

    /*
     * File: cCodeOrigin42.c
     *
     * MATLAB Coder version            : 5.0
     * C/C++ source code generated on  : 13-Apr-2022 14:09:22
     */
    
    /* Include Files */
    #include "cCodeOrigin42.h"
    #include "cCodeOrigin1.h"
    #include "cCodeOrigin10.h"
    #include "cCodeOrigin100.h"
    #include "cCodeOrigin11.h"
    #include "cCodeOrigin12.h"
    #include "cCodeOrigin13.h"
    #include "cCodeOrigin14.h"
    #include "cCodeOrigin15.h"
    #include "cCodeOrigin16.h"
    #include "cCodeOrigin17.h"
    #include "cCodeOrigin18.h"
    #include "cCodeOrigin19.h"
    #include "cCodeOrigin2.h"
    #include "cCodeOrigin20.h"
    #include "cCodeOrigin21.h"
    #include "cCodeOrigin22.h"
    #include "cCodeOrigin23.h"
    #include "cCodeOrigin24.h"
    #include "cCodeOrigin25.h"
    #include "cCodeOrigin26.h"
    #include "cCodeOrigin27.h"
    #include "cCodeOrigin28.h"
    #include "cCodeOrigin29.h"
    #include "cCodeOrigin3.h"
    #include "cCodeOrigin30.h"
    #include "cCodeOrigin31.h"
    #include "cCodeOrigin32.h"
    #include "cCodeOrigin33.h"
    #include "cCodeOrigin34.h"
    #include "cCodeOrigin35.h"
    #include "cCodeOrigin36.h"
    #include "cCodeOrigin37.h"
    #include "cCodeOrigin38.h"
    #include "cCodeOrigin39.h"
    #include "cCodeOrigin4.h"
    #include "cCodeOrigin40.h"
    #include "cCodeOrigin41.h"
    #include "cCodeOrigin43.h"
    #include "cCodeOrigin44.h"
    #include "cCodeOrigin45.h"
    #include "cCodeOrigin46.h"
    #include "cCodeOrigin47.h"
    #include "cCodeOrigin48.h"
    #include "cCodeOrigin49.h"
    #include "cCodeOrigin5.h"
    #include "cCodeOrigin50.h"
    #include "cCodeOrigin51.h"
    #include "cCodeOrigin52.h"
    #include "cCodeOrigin53.h"
    #include "cCodeOrigin54.h"
    #include "cCodeOrigin55.h"
    #include "cCodeOrigin56.h"
    #include "cCodeOrigin57.h"
    #include "cCodeOrigin58.h"
    #include "cCodeOrigin59.h"
    #include "cCodeOrigin6.h"
    #include "cCodeOrigin60.h"
    #include "cCodeOrigin61.h"
    #include "cCodeOrigin62.h"
    #include "cCodeOrigin63.h"
    #include "cCodeOrigin64.h"
    #include "cCodeOrigin65.h"
    #include "cCodeOrigin66.h"
    #include "cCodeOrigin67.h"
    #include "cCodeOrigin68.h"
    #include "cCodeOrigin69.h"
    #include "cCodeOrigin7.h"
    #include "cCodeOrigin70.h"
    #include "cCodeOrigin71.h"
    #include "cCodeOrigin72.h"
    #include "cCodeOrigin73.h"
    #include "cCodeOrigin74.h"
    #include "cCodeOrigin75.h"
    #include "cCodeOrigin76.h"
    #include "cCodeOrigin77.h"
    #include "cCodeOrigin78.h"
    #include "cCodeOrigin79.h"
    #include "cCodeOrigin8.h"
    #include "cCodeOrigin80.h"
    #include "cCodeOrigin81.h"
    #include "cCodeOrigin82.h"
    #include "cCodeOrigin83.h"
    #include "cCodeOrigin84.h"
    #include "cCodeOrigin85.h"
    #include "cCodeOrigin86.h"
    #include "cCodeOrigin87.h"
    #include "cCodeOrigin88.h"
    #include "cCodeOrigin89.h"
    #include "cCodeOrigin9.h"
    #include "cCodeOrigin90.h"
    #include "cCodeOrigin91.h"
    #include "cCodeOrigin92.h"
    #include "cCodeOrigin93.h"
    #include "cCodeOrigin94.h"
    #include "cCodeOrigin95.h"
    #include "cCodeOrigin96.h"
    #include "cCodeOrigin97.h"
    #include "cCodeOrigin98.h"
    #include "cCodeOrigin99.h"
    #include <stdio.h>
    
    /* Function Definitions */
    
    /*
     * Arguments    : void
     * Return Type  : void
     */
    void cCodeOrigin42(void)
    {
      printf("42 ");
      fflush(stdout);
    }
    
    /*
     * File trailer for cCodeOrigin42.c
     *
     * [EOF]
     */
    
    

    注意!它清空了输出缓冲区!看看手撕代码的,有多少人能想起来做这个!什么叫可靠、严谨、优雅!再看看头文件:

    /*
     * File: cCodeOrigin42.h
     *
     * MATLAB Coder version            : 5.0
     * C/C++ source code generated on  : 13-Apr-2022 14:09:22
     */
    
    #ifndef CCODEORIGIN42_H
    #define CCODEORIGIN42_H
    
    /* Include Files */
    #include <stddef.h>
    #include <stdlib.h>
    #include "rtwtypes.h"
    #include "cCodeOrigin1_types.h"
    
    /* Function Declarations */
    extern void cCodeOrigin42(void);
    
    #endif
    
    /*
     * File trailer for cCodeOrigin42.h
     *
     * [EOF]
     */
    
    

    其中有个rtwtypes.h,我不讲解了,你们自己感受一下其中的可靠性、严谨性、优雅性:

    /*
     * File: rtwtypes.h
     *
     * MATLAB Coder version            : 5.0
     * C/C++ source code generated on  : 13-Apr-2022 14:09:22
     */
    
    #ifndef RTWTYPES_H
    #define RTWTYPES_H
    
    /*=======================================================================*
     * Fixed width word size data types:                                     *
     *   int64_T                      - signed 64 bit integers               *
     *   uint64_T                     - unsigned 64 bit integers             *
     *=======================================================================*/
    #if defined(__APPLE__)
    # ifndef INT64_T
    #  define INT64_T                      long
    #  define FMT64                        "l"
    #  if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG)
    #    define INT_TYPE_64_IS_LONG
    #  endif
    # endif
    #endif
    
    #if defined(__APPLE__)
    # ifndef UINT64_T
    #  define UINT64_T                     unsigned long
    #  define FMT64                        "l"
    #  if defined(__LP64__) && !defined(INT_TYPE_64_IS_LONG)
    #    define INT_TYPE_64_IS_LONG
    #  endif
    # endif
    #endif
    
    #include "tmwtypes.h"
    #endif
    
    /*
     * File trailer for rtwtypes.h
     *
     * [EOF]
     */
    
    

    最后看看生成的main.c:

    #include <stdio.h>
    #include <stdlib.h>
    #include "cCodeOrigin1.h"  
    #include "cCodeOrigin2.h"  
    #include "cCodeOrigin3.h"  
    #include "cCodeOrigin4.h"  
    #include "cCodeOrigin5.h"  
    #include "cCodeOrigin6.h"  
    #include "cCodeOrigin7.h"  
    #include "cCodeOrigin8.h"  
    #include "cCodeOrigin9.h"  
    #include "cCodeOrigin10.h" 
    #include "cCodeOrigin11.h" 
    #include "cCodeOrigin12.h" 
    #include "cCodeOrigin13.h" 
    #include "cCodeOrigin14.h" 
    #include "cCodeOrigin15.h" 
    #include "cCodeOrigin16.h" 
    #include "cCodeOrigin17.h" 
    #include "cCodeOrigin18.h" 
    #include "cCodeOrigin19.h" 
    #include "cCodeOrigin20.h" 
    #include "cCodeOrigin21.h" 
    #include "cCodeOrigin22.h" 
    #include "cCodeOrigin23.h" 
    #include "cCodeOrigin24.h" 
    #include "cCodeOrigin25.h" 
    #include "cCodeOrigin26.h" 
    #include "cCodeOrigin27.h" 
    #include "cCodeOrigin28.h" 
    #include "cCodeOrigin29.h" 
    #include "cCodeOrigin30.h" 
    #include "cCodeOrigin31.h" 
    #include "cCodeOrigin32.h" 
    #include "cCodeOrigin33.h" 
    #include "cCodeOrigin34.h" 
    #include "cCodeOrigin35.h" 
    #include "cCodeOrigin36.h" 
    #include "cCodeOrigin37.h" 
    #include "cCodeOrigin38.h" 
    #include "cCodeOrigin39.h" 
    #include "cCodeOrigin40.h" 
    #include "cCodeOrigin41.h" 
    #include "cCodeOrigin42.h" 
    #include "cCodeOrigin43.h" 
    #include "cCodeOrigin44.h" 
    #include "cCodeOrigin45.h" 
    #include "cCodeOrigin46.h" 
    #include "cCodeOrigin47.h" 
    #include "cCodeOrigin48.h" 
    #include "cCodeOrigin49.h" 
    #include "cCodeOrigin50.h" 
    #include "cCodeOrigin51.h" 
    #include "cCodeOrigin52.h" 
    #include "cCodeOrigin53.h" 
    #include "cCodeOrigin54.h" 
    #include "cCodeOrigin55.h" 
    #include "cCodeOrigin56.h" 
    #include "cCodeOrigin57.h" 
    #include "cCodeOrigin58.h" 
    #include "cCodeOrigin59.h" 
    #include "cCodeOrigin60.h" 
    #include "cCodeOrigin61.h" 
    #include "cCodeOrigin62.h" 
    #include "cCodeOrigin63.h" 
    #include "cCodeOrigin64.h" 
    #include "cCodeOrigin65.h" 
    #include "cCodeOrigin66.h" 
    #include "cCodeOrigin67.h" 
    #include "cCodeOrigin68.h" 
    #include "cCodeOrigin69.h" 
    #include "cCodeOrigin70.h" 
    #include "cCodeOrigin71.h" 
    #include "cCodeOrigin72.h" 
    #include "cCodeOrigin73.h" 
    #include "cCodeOrigin74.h" 
    #include "cCodeOrigin75.h" 
    #include "cCodeOrigin76.h" 
    #include "cCodeOrigin77.h" 
    #include "cCodeOrigin78.h" 
    #include "cCodeOrigin79.h" 
    #include "cCodeOrigin80.h" 
    #include "cCodeOrigin81.h" 
    #include "cCodeOrigin82.h" 
    #include "cCodeOrigin83.h" 
    #include "cCodeOrigin84.h" 
    #include "cCodeOrigin85.h" 
    #include "cCodeOrigin86.h" 
    #include "cCodeOrigin87.h" 
    #include "cCodeOrigin88.h" 
    #include "cCodeOrigin89.h" 
    #include "cCodeOrigin90.h" 
    #include "cCodeOrigin91.h" 
    #include "cCodeOrigin92.h" 
    #include "cCodeOrigin93.h" 
    #include "cCodeOrigin94.h" 
    #include "cCodeOrigin95.h" 
    #include "cCodeOrigin96.h" 
    #include "cCodeOrigin97.h" 
    #include "cCodeOrigin98.h" 
    #include "cCodeOrigin99.h" 
    #include "cCodeOrigin100.h"
    
    int main()
    {
    	cCodeOrigin1();
    	cCodeOrigin2();
    	cCodeOrigin3();
    	cCodeOrigin4();
    	cCodeOrigin5();
    	cCodeOrigin6();
    	cCodeOrigin7();
    	cCodeOrigin8();
    	cCodeOrigin9();
    	cCodeOrigin10();
    	cCodeOrigin11();
    	cCodeOrigin12();
    	cCodeOrigin13();
    	cCodeOrigin14();
    	cCodeOrigin15();
    	cCodeOrigin16();
    	cCodeOrigin17();
    	cCodeOrigin18();
    	cCodeOrigin19();
    	cCodeOrigin20();
    	cCodeOrigin21();
    	cCodeOrigin22();
    	cCodeOrigin23();
    	cCodeOrigin24();
    	cCodeOrigin25();
    	cCodeOrigin26();
    	cCodeOrigin27();
    	cCodeOrigin28();
    	cCodeOrigin29();
    	cCodeOrigin30();
    	cCodeOrigin31();
    	cCodeOrigin32();
    	cCodeOrigin33();
    	cCodeOrigin34();
    	cCodeOrigin35();
    	cCodeOrigin36();
    	cCodeOrigin37();
    	cCodeOrigin38();
    	cCodeOrigin39();
    	cCodeOrigin40();
    	cCodeOrigin41();
    	cCodeOrigin42();
    	cCodeOrigin43();
    	cCodeOrigin44();
    	cCodeOrigin45();
    	cCodeOrigin46();
    	cCodeOrigin47();
    	cCodeOrigin48();
    	cCodeOrigin49();
    	cCodeOrigin50();
    	cCodeOrigin51();
    	cCodeOrigin52();
    	cCodeOrigin53();
    	cCodeOrigin54();
    	cCodeOrigin55();
    	cCodeOrigin56();
    	cCodeOrigin57();
    	cCodeOrigin58();
    	cCodeOrigin59();
    	cCodeOrigin60();
    	cCodeOrigin61();
    	cCodeOrigin62();
    	cCodeOrigin63();
    	cCodeOrigin64();
    	cCodeOrigin65();
    	cCodeOrigin66();
    	cCodeOrigin67();
    	cCodeOrigin68();
    	cCodeOrigin69();
    	cCodeOrigin70();
    	cCodeOrigin71();
    	cCodeOrigin72();
    	cCodeOrigin73();
    	cCodeOrigin74();
    	cCodeOrigin75();
    	cCodeOrigin76();
    	cCodeOrigin77();
    	cCodeOrigin78();
    	cCodeOrigin79();
    	cCodeOrigin80();
    	cCodeOrigin81();
    	cCodeOrigin82();
    	cCodeOrigin83();
    	cCodeOrigin84();
    	cCodeOrigin85();
    	cCodeOrigin86();
    	cCodeOrigin87();
    	cCodeOrigin88();
    	cCodeOrigin89();
    	cCodeOrigin90();
    	cCodeOrigin91();
    	cCodeOrigin92();
    	cCodeOrigin93();
    	cCodeOrigin94();
    	cCodeOrigin95();
    	cCodeOrigin96();
    	cCodeOrigin97();
    	cCodeOrigin98();
    	cCodeOrigin99();
    	cCodeOrigin100();
    	cCodeOrigin99();
    	cCodeOrigin98();
    	cCodeOrigin97();
    	cCodeOrigin96();
    	cCodeOrigin95();
    	cCodeOrigin94();
    	cCodeOrigin93();
    	cCodeOrigin92();
    	cCodeOrigin91();
    	cCodeOrigin90();
    	cCodeOrigin89();
    	cCodeOrigin88();
    	cCodeOrigin87();
    	cCodeOrigin86();
    	cCodeOrigin85();
    	cCodeOrigin84();
    	cCodeOrigin83();
    	cCodeOrigin82();
    	cCodeOrigin81();
    	cCodeOrigin80();
    	cCodeOrigin79();
    	cCodeOrigin78();
    	cCodeOrigin77();
    	cCodeOrigin76();
    	cCodeOrigin75();
    	cCodeOrigin74();
    	cCodeOrigin73();
    	cCodeOrigin72();
    	cCodeOrigin71();
    	cCodeOrigin70();
    	cCodeOrigin69();
    	cCodeOrigin68();
    	cCodeOrigin67();
    	cCodeOrigin66();
    	cCodeOrigin65();
    	cCodeOrigin64();
    	cCodeOrigin63();
    	cCodeOrigin62();
    	cCodeOrigin61();
    	cCodeOrigin60();
    	cCodeOrigin59();
    	cCodeOrigin58();
    	cCodeOrigin57();
    	cCodeOrigin56();
    	cCodeOrigin55();
    	cCodeOrigin54();
    	cCodeOrigin53();
    	cCodeOrigin52();
    	cCodeOrigin51();
    	cCodeOrigin50();
    	cCodeOrigin49();
    	cCodeOrigin48();
    	cCodeOrigin47();
    	cCodeOrigin46();
    	cCodeOrigin45();
    	cCodeOrigin44();
    	cCodeOrigin43();
    	cCodeOrigin42();
    	cCodeOrigin41();
    	cCodeOrigin40();
    	cCodeOrigin39();
    	cCodeOrigin38();
    	cCodeOrigin37();
    	cCodeOrigin36();
    	cCodeOrigin35();
    	cCodeOrigin34();
    	cCodeOrigin33();
    	cCodeOrigin32();
    	cCodeOrigin31();
    	cCodeOrigin30();
    	cCodeOrigin29();
    	cCodeOrigin28();
    	cCodeOrigin27();
    	cCodeOrigin26();
    	cCodeOrigin25();
    	cCodeOrigin24();
    	cCodeOrigin23();
    	cCodeOrigin22();
    	cCodeOrigin21();
    	cCodeOrigin20();
    	cCodeOrigin19();
    	cCodeOrigin18();
    	cCodeOrigin17();
    	cCodeOrigin16();
    	cCodeOrigin15();
    	cCodeOrigin14();
    	cCodeOrigin13();
    	cCodeOrigin12();
    	cCodeOrigin11();
    	cCodeOrigin10();
    	cCodeOrigin9();
    	cCodeOrigin8();
    	cCodeOrigin7();
    	cCodeOrigin6();
    	cCodeOrigin5();
    	cCodeOrigin4();
    	cCodeOrigin3();
    	cCodeOrigin2();
    	cCodeOrigin1();
    
    	puts("\nPress enter to quit:");
    	getchar();
    
    	return 0;
    }
    

    多么可靠!多么严谨!多么优雅!主函数中大多数子函数都只打印一个数字和一个空格,时间空间复杂度小到极致,完美体现了Make each program do one thing well的设计哲学!

    实际上codegen文件夹里还有很多更加有趣的东西,比如codegen\exe\cCodeOrigin1\examples里还有一个main.c,你们自己生成一下看看吧。

    结论:C语言从1打印到100再打印到1根本用不着C语言。

    image

  • 相关阅读:
    Vue父子组件传值$parent , ref,$refs,props大总结
    Vue-axios
    tensorflow2知识总结(杂)---1、安装tensorflow
    线性回归和逻辑回归的区别
    %matplotlib inline的含义
    王阳明的心学到底是啥
    Windows Anaconda 修改为国内源
    Reporting Services Single Sign On (SSO) Authentication
    .NET
    WebForms UnobtrusiveValidationMode requires a ScriptResourceMapping for 'jquery'. Please add a ScriptResourceMapping named jquery(case-sensitive)
  • 原文地址:https://www.cnblogs.com/WanZhiQiu/p/16140766.html
Copyright © 2020-2023  润新知