你们都一直强调规范编码。但是这个世界上有个大师们娱乐的竞赛——国际乱码大赛。express
能写出来的都是对语言深刻了解的master。我从没想本身也能“恶搞”C,一直都是老老实实编码。就在前几天看了一篇帖子。ubuntu
感受把很是规范的代码变成乱码。很是有意思。因而决定动手试一试。
数组
我不得不说。。。我觉得看起来还简单的东西。搞了我一天,我去。函数
。。各类bug。。。post
只是也有很是大的收获。我没想到“把代码写乱”也能给我代码收获。编码
。。我想。这的确很是有意思。This blog will memory my work and process with the interesting skill.spa
感受hello world级别的改不出什么东西来,不够“炫酷”。挑了几个好玩的代码。因而选中了如下这块实验田:rest
/*
1
2 3
4 5 6
7 8 9 10
实现输出三角形数阵
*/
#include <stdio.h>
int main ()
{
int row=0,rank=0,num=0,blank=0;//row行,rank列变量,blank变量控制打印空格
int n[10];
for(num=1;num<=10;num++)//给数组赋初值,经过改动这一步获得你想要的数据
{
n[num-1]=num;//经过改动这一步获得你想要的数据。好比2*num-1
}
num=0;
for(row=1;row<=4;row++)//输出
{
for(blank=1;blank<=5-row;blank++)
printf(" ");
for(rank=1;rank<=row;rank++)
{
printf("%d ",n[num]);
num++;
if(rank==row)
printf("\n");
}
}
return 0;
}
新手可能有点别扭。只是我仍是比較喜欢这家伙,打印了一个三角形数字阵code
jasonleaster@ubuntu:~/Desktop$ ./a.out
1
2 3
4 5 6
7 8 9 10
blog
代码变乱第一步
将for循环改为while循环
void triangle(void) { int row = 0,rank = 0,num=0,blank=0;//row行,rank列变量,blank变量控制打印 空格 int n[10]; num = 1; while(num<=10)//给数组赋初值,经过改动这一步获得你想要的数据 { n[num-1]=num;//经过改动这一步获得你想要的数据,好比2*num-1 num++; } num=0; row = 1; while(row <= 4)//输出 { blank = 1; while(blank <= 5-row) { printf(" "); blank++; } rank = 1; while(rank<=row;) { printf("%d ",n[num]); num++; if(rank==row) printf("\n"); rank++; } row++ } return ; }
这样恶搞的全然尚未深度。
。
。但是。是个很是好的铺垫。
。
恶搞代码步骤二,把while循环变递归
。。
。。
/*
1
2 3
4 5 6
7 8 9 10
实现输出三角形数阵
*/
#include <stdio.h>
int n[10];//Attention. I change the "n" array into a global array
static int location = 0;
int triangle(int num,int row,int rank,int blank);
int main()
{
triangle(1,1,1,1);
return 0;
}
int triangle(int num,int row,int rank,int blank)
{
//-------------the first recursion block------------------------------
if(num<=10)
{
triangle(num+1,0,0,0);
n[num-1] = num;
if(num != 1)
{
return 0;
}
}
else if(num == 11)
{
return 0;
}
//------------------------------------------------------------------
//-------------------the fourth recursion block-------------
if(row <= 4)//输出
{
//--------------the second recursion block---------
if(blank <= 5-row)
{
printf(" ");
triangle(12,row,rank,blank+1);//num == 12 pass the first recursion block
if(blank != 1)
{
return 0;
}
}
else if(blank != 100)
{
return 0;//end the recursion
}
//----------------------------------------------
//-----------the third recursion block------------
if(rank <= row)
{
printf("%d ",n[location]);
location++;
if(rank==row)
printf("\n");
triangle(12,row,rank+1,100);//pass the first and the second recursion
if(rank != 1)
{
return 0;
}
}
else
{
return 0;
}
//---------------------------------------------
triangle(12,row+1,rank,blank);// pass the first recursion
}
return 0;
}
基本的要领就是经过return 适时的解释当前递归。(个人这样的策略还不是很是好。事实上可以改变代码的逻辑。消除return 让被调用函数本身主动的在适当的时候挂掉。。而不是经过return 主动杀死。。。
正因为这样,我后面花了很是多时间改代码的逻辑结构)
昨晚凌晨3点半的时候。放弃了,今天晚上8点多的时候调出来了。。
。
这里去掉了return 缘由嘛。就是为了 条件操做符作准备,把代码变的更难看
要知道
推断语句? return :0;
这类的语句是违法的,return 不是个expression,因此不能用在 选择操做符的右边。。。昨晚就是因为这个放弃继续恶搞的。改结构很是坑爹的说。很是锻炼逻辑的说。
//简直就是艰辛!~ /* 1 2 3 4 5 6 7 8 9 10 实现输出三角形数阵 */ #include <stdio.h> int n[10];//Attention. I change the "n" array into a global array static int location = 0; static int dead = 0; static int first_r = 1; static int second_r = 0; static int third_r = 0; static int fourth_r = 0; void triangle(int num,int row,int rank,int blank); int main() { triangle(1,1,1,1); return 0; } void triangle(int num,int row,int rank,int blank) { dead = 0; //-------------the first recursion block------------------------------ if (num<=10) { if(first_r !=0 && second_r != 1 && third_r != 1 && fourth_r != 1) { triangle(num+1,0,0,0); n[num-1] = num; first_r = 0; second_r = 1;//进行第二个递归 third_r = 0; fourth_r = 0; } if(num == 1) { if(row <= 4) { //--------------the second recursion block--------- if((blank <= 5-row) && (first_r != 1&& second_r != 0 && third_r != 1 && fourth_r != 1)) { printf(" "); if(first_r != 1&& second_r != 0 && third_r != 1 && fourth_r != 1) { triangle(1,row,rank,blank+1); first_r = 0; second_r =0; third_r = 1;//进行第三个递归 fourth_r = 0; if(blank != 1) { dead = 1; } else { dead = 0; } } } else { dead = 1; } if(blank == 1) { if(rank <= row) { printf("%d ",n[location]); location++; if(rank==row) { printf("\n"); dead = 0; } if(row != rank && (first_r != 1&& second_r != 1 && third_r != 0 && fourth_r != 1)) { triangle(1,row,rank+1,1);//pass the first and the second recursion first_r = 0; second_r = 0; third_r = 0; fourth_r = 1; dead = 1; } } } if(dead == 0) { first_r = 1; second_r= 0; third_r = 0; fourth_r= 0; triangle(1,row+1,1,1);// pass the first recursion } } } } }
我预计没人会去分析上面的代码了。各类递归,各类条件限制。
Now,it's time to show the shit!
如下那坨东西是可以执行的。
。
。
亲測。。。
/* 1 2 3 4 5 6 7 8 9 10 实现输出三角形数阵 */ #include <stdio.h> int n[10];//Attention. I change the "n" array into a global array static int location = 0; static int dead = 0; static int first_r = 1; static int second_r = 0; static int third_r = 0; static int fourth_r = 0; void triangle(int num,int row,int rank,int blank); int main() { triangle(1,1,1,1); return 0; } void triangle(int num,int row,int rank,int blank) { dead = 0; (num<=10) ? (((first_r !=0 && second_r != 1 && third_r != 1 && fourth_r != 1) ? \ ( triangle(num+1,0,0,0),n[num-1] = num,first_r = 0,second_r = 1,third_r = 0,fourth_r = 0):0),\ ((num == 1) ? ((row <= 4) ? (( ((blank <= 5-row) &&\ (first_r != 1&& second_r != 0 && third_r != 1 && fourth_r != 1)) ? \ ( printf(" "),(first_r != 1&& second_r != 0 && third_r != 1 && fourth_r != 1) ?\ (triangle(1,row,rank,blank+1),first_r = 0,second_r =0,third_r = 1,fourth_r = 0,((blank != 1) ?\ (dead = 1) :(dead = 0))) : 0) : (dead = 1) ),((blank == 1) ? ((rank <= row) ?\ ((printf("%d ",n[location]),location++),((rank==row) ? ( printf("\n"),dead = 0) : 0),\ ((row != rank && (first_r != 1&& second_r != 1 && third_r != 0 && fourth_r != 1)) ?\ ( triangle(1,row,rank+1,1),first_r = 0,second_r = 0,third_r = 0,fourth_r = 1,dead = 1) : 0)) : 0 ) : 0),\ ((dead == 0) ? (first_r = 1,second_r= 0,third_r = 0,fourth_r= 0,triangle(1,row+1,1,1)) : 0) ) : 0 ) : 0 )):0; }
仅仅是。。。我预计这是个很是蛋疼的工做。。
。
怎么把代码变的更操蛋?
第三步,糟糕的变量名
#include <stdio.h> int n[10]; static int _ = 0; static int __ = 0; static int ___ = 1; static int ____ = 0; static int ______ = 0; static int _______ = 0; void ____________(int ________,int _________,int __________,int ___________); int main() { ____________(1,1,1,1); return 0; } void ____________(int ________,int _________,int __________,int ___________) { __ = 0; (________<=10) ? (((___ !=0 && ____ != 1 && ______ != 1 && _______ != 1) ? \ ( ____________(________+1,0,0,0),n[________-1] = ________,___ = 0,____ = 1,______ = 0,_______ = 0):0),\ ((________ == 1) ? ((_________ <= 4) ? (( ((___________ <= 5-_________) &&\ (___ != 1&& ____ != 0 && ______ != 1 && _______ != 1)) ? \ ( printf(" "),(___ != 1&& ____ != 0 && ______ != 1 && _______ != 1) ?jasonleaster@ubuntu:~/Desktop$ ./a.out\ (____________(1,_________,__________,___________+1),___ = 0,____ =0,______ = 1,_______ = 0,((___________ != 1) ?\ (__ = 1) :(__ = 0))) : 0) : (__ = 1) ),((___________ == 1) ? ((__________ <= _________) ?\ ((printf("%d ",n[_]),_++),((__________==_________) ?
( printf("\n"),__ = 0) : 0),\ ((_________ != __________ && (___ != 1&& ____ != 1 && ______ != 0 && _______ != 1)) ?\ ( ____________(1,_________,__________+1,1),___ = 0,____ = 0,______ = 0,_______ = 1,__ = 1) : 0)) : 0 ) : 0),\ ((__ == 0) ? (___ = 1,____= 0,______ = 0,_______= 0,____________(1,_________+1,1,1)) : 0) ) : 0 ) : 0 )):0;}
它确实可以执行。
对于那些变量名乱用的programmer不要有包容心。切记。
经过"恶搞",事实上能更深的理解语言自己,能够更好的锻炼逻辑分析能力。
学会控制本身的逻辑,不要写本身也不知道的东西。
规范编码很是重要。
事实上恶搞过程当中,我领悟最深入的是两点
1。
代码逻辑的重构
2。普通循环和递归之间的转换
这两点是我最开心的领悟