对于我们学大数据专业来讲,c完全不需要学的很深,学c要深入可能是向linux嵌入式,单片机等等方向发展。所以说,这可能是最后一次搞这么大的工程了(大概几百行)。
由于c对数据类型的限制,所以搞了个list类型,可以装float和int。用的是顺序存储。
操作集
void appendixs(List*,int,int,…);
void show_int(List);
void show_float(List);
void delete_i(List*,int);
void insert(List*,int,int,…);
float sumform(List,int,…);
arrint evalinteger(arrint,int,…);
arrint evaldecimal(arrint,int,…);
float sumlist(List,arrint,…);
函数调用如下
int main()
{
List a=DEF(integer,5,1,2,3,4,5),b,c;
b=DEF(integer,4,-1,1,1,1);
c=DEF(integer,2,0,0);
List e=DEF(list,_from,a,1,4);
List f=DEF(decimal,3,5.0,9.8,2.6);
a.insert(&a,1,3,0,0,0);
a.delete_i(&a,1);
a.appendixs(&a,_list,2,b,c);
a.appendixs(&a,_digit,5,10,100,1000,10000,100000);
a.delete_i(&a,a.num);
a.delete_i(&a,a.num);
a.delete_i(&a,a.num);
type(a);
a.show(a);
e.show(e);
b.show(b);
c.show(c);
f.show(f);
sum(a,_print,_from,1,4);
sum(e,_print,_to,e.num);
return 0;
}
其中e继承a的数据,不同类型有不同操作集。用函数指针模拟类方法
显示如下
结构如下
struct array{
//P_int ress;
int num;
float sum;
int type;
arrint* address;
arrint (*eval)(List,int,...);
// void (*sum)();
void (*appendixs)(List*,int,int,...);
// void (*headix)(int);
void (*insert)(List*,int,int,...);
void (*delete_i)(List*,int);
// void (*chedex)(int);
void (*show)(List);
P_int ress;
P_flo fress;
};
宏与参数
#define _print 1
#define _return 0
#define _from -1
#define _to -2
#define _digit 0
#define _list 1
#define _int 1
#define _float 0
#define type(a)\
do{\
printf("<Type " # a":");\
if(a.type==1)\
{\
printf("int>\n");\
}\
else\
{\
printf("float>\n");\
}\
}while(0);
#define sum(a,format,num,...)\
do{\
float j ;\
arrint stru;stru.sum=num;\
if(num==-1)\
j=sumform(a,2,__VA_ARGS__);\
else if(num==-2)\
j=sumform(a,1,__VA_ARGS__);\
else\
j=sumlist(a,stru,__VA_ARGS__);\
if(format==1)\
printf("<" # a".sum:%.2f>\n",j);\
else;\
}while(0)
#define DEF(type,numic,...)\
({ List _a_; \
_a_=eval ## type(_a_,numic,__VA_ARGS__); \
_a_.address=&_a_;\
_a_.eval=eval ## type;\
_a_.insert=insert;_a_.delete_i=delete_i;\
_a_.appendixs=appendixs;\
(_a_);\
})
至于代码嘛。。有人看就贴,哪怕说我太low也行。。
尽头
又加了功能,支持数组导出和导入,生成函数等等,但是也就到此为止了。
用宏虽然能实现一系列奇技淫巧。但是用起来就是不方便。
1.c不能运算符重载,只能用函数来实现,麻烦
2.c不能函数私有,顶多不知道名字,但可以访问
3.每次都要传地址,不像py万物皆地址
4.函数参数必须说明个数
5.函数不能重载,没有默认参数(这也是用c调用windows里的api蛋疼的原因)
-------------------------end---------------------------
这一切,都指向专门oop的语言
也开启了py的历程