如何优雅地用MATLAB生成C语言从1打印到100再打印到1
结论:C语言从1打印到100再打印到1根本用不着C语言。
谁说没有枪头就捅不死人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 <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语言。