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

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

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


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

我觉得各位的思路还是没有打开。


编程最重要的是什么?是可靠!而且要严谨!要优雅!

看了一大圈答案,思路还囿于手撕代码的桎梏之中,这实在让我捶胸顿足、咬牙切齿、痛心疾首!辉煌的人类文明已经发展至今,为什么我们的编程技术还停留在手工小作坊阶段!你能保证你手动写的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吗?

先别急,让我们看看运行结果。


这是运行前:

这是运行后:

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

可以看到生成了一些M文件,一个C文件,一个可执行文件,以及一个文件夹。


首先让我们看看可执行文件的运行结果:

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


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

这里的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 

/* 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 
#include 
#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 
#include 
#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语言。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/634603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-16
下一篇 2022-04-16

发表评论

登录后才能评论

评论列表(0条)

保存