这个版本的主要更新如下
1.带代码编码检测功能,常见的编码都能自动检测分析出来,中文不再悲剧
2.带代码编码选择功能,机器也会出错,万一检测出错,还可以手动选择编码,双保险
3.支持更多代码文件,基本上常见不常见的代码都能高亮,而且无序保证代码后缀名,直接自动探测代码语言
然后就感谢以下开源项目带来的帮助:
http://code.google.com/p/google-code-prettify
http://cpdetector.sourceforge.net/
详情请查看官方更新页面
安静的做技术,宁静的搞摄影,平静的写文章
这个版本的主要更新如下
1.带代码编码检测功能,常见的编码都能自动检测分析出来,中文不再悲剧
2.带代码编码选择功能,机器也会出错,万一检测出错,还可以手动选择编码,双保险
3.支持更多代码文件,基本上常见不常见的代码都能高亮,而且无序保证代码后缀名,直接自动探测代码语言
然后就感谢以下开源项目带来的帮助:
http://code.google.com/p/google-code-prettify
http://cpdetector.sourceforge.net/
详情请查看官方更新页面
52 views
在写下这篇文章的时候,一开始写的是“今日小事”,突然抬头一看,居然已经是凌晨1点多了,于是就翩然改为“昨日小事”。
昨天一天过的算是值得在记忆中留下一笔,昨天去了同学会,这是我高中毕业第二次参加同学会。依然是吃饭唱歌做游戏神马的。有的人变化很大,有的人几乎没变化,比如我。当然,不同的人不同的气质倒是在过了那么一些年后更加明显,也算是一种凝聚吧。金老师生了个女儿,挺好的,蛮有趣的一个小孩子。好吧同学会就略过吧,想说的我都说了,不想说的么,那就不说了。
晚上回来,继续开发那个胶片摄影小助手,把景深计算器的功能加上去了,然后版本更新到了0.3beta,发布在这里
http://www.zerob13.in/photographyhelper/
还有一个发布的地方是N多市场,地址在下面:
http://www.nduoa.com/
这里我要吐槽一下国内的几个android市场了,n多算是做的比较晚,但是比较好的一家,安智和安卓都是rom起家的论坛,所以在rom里面绑定,赚了不少用户。但是安卓的审核真tmd慢,安智的审核是脑残。n多的就比较好,有问题没问题都会主动联系你,比较有人情味,而且方便,很多事情你和人交流就好的多。安智的那个兼职脑残的我无语。我一个看源代码的软件放上去,这个明显是只能打开代码文件的么,他去打开其他的可执行文件之类的东西,然后说我fc还是无法显示就是bug,不通过。我说,你拿看pdf的东西去打开avi试试?太脑残了。
好吧,吐槽完毕,希望大家多支持胶片摄影小助手,这个软件还会不断完善:)
27 views
发布页地址:http://www.zerob13.in/photographyhelper/
这是一个帮助那些玩胶片的摄影师的一个实用的小工具
通过输入现场的数据,计算出较适合的快门速度,方便摄影师估测曝光
洗胶片的时候总是把握不好时间,有了这个小小的定时器,这些都不是问题了:)
正在开发中的功能:
57 views

288 views
首先么,这是个人风格,完全不是权威之说。
第二,记录下来只是感觉自己这样蛮舒服,分享而已。
第三,别拿某为谭姓叫兽的文章来说事情,不解释。
第四,这里的 C 语言不是狭义的指 C 这门语言,也包括 C++,object-c,甚至 Java 等类似与 C语法的语言
────────────────────────────────
好了,下面进入正文。比较琐碎,所以就想到什么讲什么了。
先说说一个判断 0 的问题吧,或者称为判断空值。一般空值常规的来思考分那么几种,NULL,0,0.0 以及 false(可能还有别的,但是常规就这些了,所以就讲这些)。那么这些分别有什么区别呢?
首先说说,写判 0 的风格是为了什么,因为 C 语言可以直接用这么一句话来表示几乎所有的空值
if(!a){}
那么,我要把判 0 的语句分开写,就是为了区别变量的类型,方便阅读代码
倒过来讲,先解释 false 的变量,一般这个变量都是布尔型的变量,那么这个变量就两个值,真或者假。所以我一般选择上面那种
if(!a){}
的方式来表示这个变量为假的时候执行什么。理由吧,个人偏好,也有一点认为,!作为一个逻辑运算符,而布尔是逻辑变量,所以凑在一起刚刚好。
然后是 0.0,这一般指 float 或者 double 的变量,这种变量的一个特点就是不精确。如果你直接用
if(a==0.0){}
之类的方法来表述,可能会出现不可意料的问题。所以这里我也选择一种比较流行的处理方法,就是让一个实型变量和一个极小的误差值 EPS 做比较。比如如下代码:
#define EPS 1e-9
if(fabs(a-0.0)
就是这种方式,对于一个实型变量,最好把相等的比较转化成为大于小于的比较,原因么,不赘述了,学过组成原理就知道了。
整数变量不多说,最常规的方法
if(a==0)
{}
然后是指针一类的,空值为 NULL 的,大家都知道 NULL 就是 0,但是书写的时候,还是最好把 NULL 写上了,这样可读性大大的增加。例:
if(a==NULL)
{}
判断0的问题大约就想到那么一些,然后说说几个小点。
第一个是一个规范问题,一般很多人都喜欢把函数声明和实现都放在一起。特别是类的成员函数,别的函数也一样。其实这个习惯不是很好,C语言也好,C++ 也好,都分为 .h 和 .c(.cpp) 两种文件,一般 .h 文件里面放声明,.c 文件里面放实现,包括成员函数。这个主要是方便别的利用你代码的人方便,不需要繁杂的翻看你的整个实现,只要看 .h 文件就可以对你的函数如何使用一目了然。
第二个是一个小细节,就是 void 参数的使用,这里说的不是
void main()
个人是很反对这种写法的,因为 main() 函数作为系统直接调用的函数,你如果不返回一个值给系统,系统怎么知道你的程序是正常还是不正常的结束的?个人感觉,我很反感用 void 来声明 main() 函数。
那么,这里的 void 指什么呢?就是指没有参数表的函数,希望在函数的参数表里面填写一个 void 原因吧,难说,这样写的确我说不上特别的好处,但是感觉会舒服很多,可能就是一个个人偏好吧。,原因是,加了void后,这个函数就被限制成为不能传入任何参数的函数了,如果你强行传入参数,编译会失败。如果不加在 C语言会认为这个函数可以传入任何参数的函数,区别还是很大的。(感谢蔡大牛提醒)。
int GetOne(void)
{
return 1;
}
第三点 就是解释一下 char* strcpy(char*,char*); 这个函数的返回值,然后抛砖引玉的来说说返回值的重要性。这里也许有些朋友会费解,明明 strcpy 的返回值已经给了第一个参数了,为什么还要最后 return 回来?这个不是“脱了裤子放屁──多此一举”么。其实不然,我们看如下代码就明白为什么了。
int length =strlen (strcpy(str,"zerob13"));
这个返回值就是为了这样的灵活性而考虑设计的,所以设计一个好的返回值对于一个好的函数也是非常重要的。
第四点,也是介绍一个神气的东西,叫做空循环。也许很多人学了c语言后一直不理解,为什么还要有个 do-while 循环,感觉有 while 不是已经够了么,这个东西似乎有点多此一举,其实不然。大家都知道,C语言是为了系统而出现的语言,这个 do-while 也自然和这个挂钩了。比如,你总是能够在 linux 的内核里面看到类似如下的宏。
#define DUMP_WRITE(addr,nr) do{memcpy(bufp,addr,nr);bufp+=nr;}while(0)
总所周知,do-while 是先执行后判断循环,这里的while(0)也就是这个代码等价于:
#define DUMP_WRITE(addr,nr) memcpy(bufp,addr,nr);bufp+=nr;
那么,我们为什么要套上这么一个 do-while 空循环呢?显然不行,一个小例子就可以说明,比如这个
if(OK)
DUMP_WRITE(addr,nr);
else
break;
如果,没有空循环,代码会变成这样子。
if(OK)
memcpy(bufp,addr,nr);
bufp+=nr;;
else
break;
然后,就悲剧了。但是,当你加上了 do-while 空循环的时候,整个循环被当作单独的一句语句,这样就可以达到正确的效果,如下:
if(OK)
do{
memcpy(bufp,addr,nr);
bufp+=nr;
}while(0);
else
break;
56 views
今天下午没课,正好想起一个比较蛋疼的事情可以做,就是玩c语言的main函数递归。
首先还是说一下我的编译环境,哪些用m$的c语言编译器的朋友可以忽略这个文章了,放心吧,正常情况下是编译不通过的。。。
我的gcc版本是4.2.1。
先贴上代码~
1 2 3 4 5 6 7 8 9 | #include<stdio.h> #define ____ int #define _o_ double #define _O_(x) printf("%c",x) #define ___(x) 1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0 main(____ __) { _o_ _;if(!__)main(1);else if(__==6)return;else{_=___(__);_O_((____)(_+0.5));main(__+1);} } |
跑出来就是一个不换行的Hello
哈哈,这个代码看着很恶心吧。好吧,让我给你翻译一下~如果我把上述代码的define还有一些变量整理一下,那就是这样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include<stdio.h> int main(int argc) { int x; double ans; if(argc==0) main(1); else{ x=argc; if(x==6) return; else{ ans=1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0; printf("%c",(int)(ans+0.5)); main(x+1); } } } |
现在看明白了么?
关键就是这句
ans=1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0;
这个通项正是有穷数列72,101,108,108,111的通项。那么我是如何得到这个表达式的呢?
很简单,用多项式的拉格朗日插值公式就可以解决这个问题。
先把公式贴上来。

至于这个公式是怎么推导出来的,你可以看看这篇论文,讲解的很详细,这里就不复制过来了,哈哈
http://www.lw23.com/pdf_d659df85-fb38-47e6-ac02-147a12d2bab3/lunwen.pdf
有了这个通项就简单了,只要不断递归main函数,理论上可以答应出任意的函数出来。
ps:我求通项的时候用Mathematica来计算的,毕竟当数据多了,展开是个很麻烦的事情。。。然后又先用python写了个函数验证了通项正确后才改写成c的本身递归模式。囧
165 views
考虑到python的流行,于是乎我也开始凑热闹的玩起了python。
第一次写,写了一个最简单的递归八皇后~算是基础语法训练
贴代码,欢迎高手为我指出问题,不胜感激
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | # _*_ coding: utf-8 _*_ ''' Created on Aug 22, 2010 @author: yanglingfeng ''' import math a=[[0 for column in range(8)] for row in range(8)] hash1=[0 for x in range(0,8)] hash2=[0 for x in range(0,16)] hash3=[0 for x in range(0,16)] co=0 def dfs(line): global co if line>=8: str="" co=co+1 for i in range(0,8): for j in range(0,8): if a[i][j]==1: str=str+'@' else: str=str+'*' str=str+'\n' print str return else: i=0 for i in range(0,8): if (hash1[i]==1 or hash2[i+line]==1 or hash3[i-line+8]==1): continue else: hash1[i]=1 hash2[i+line]=1 hash3[i-line+8]=1 a[line][i]=1 dfs(line+1) hash1[i]=0 hash2[i+line]=0 hash3[i-line+8]=0 a[line][i]=0 return if __name__ == '__main__': dfs(0) print "共计",co,"种解" |
147 views
380 views
首届Google暑期大学生博客分享大赛——2010 Andriod篇
支持大约20种语言的高亮了
终于支持多种语言的高亮了~
再次重新写了整个结构~
昨天的全部推翻。
用了开源项目
http://google-code-prettify.googlecode.com/
的代码,瞬间解决了各种高亮问题。。。
先上图


基本上可以当个程序使用了~
欢迎大家试用下载
猛击这里下载
437 views
1,038 views