2009年1月25日星期日

C++三大基础之复习

一、表达式与基本语句

1、顺序:
如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。
例如:
word = (high <<>2、复合表达式
允许复合表达式存在的理由是:(1)书写简洁;(2)可以提高编译效率。
要求:
(1)不要编写太复杂或者多用途的复合表达式。
(2)不要把程序中的复合表达式与“真正的数学表达式”混淆。
例如:
if (a <>3、if语句

1)布尔逻辑语句
定义布尔变量名字为flag
if (flag) // 表示flag为真
if (!flag) // 表示flag为假
2)整形变量与零值比较
if (value == 0)
if (value != 0) //不要仿布尔逻辑语句。
3)浮点变量与零值比较
无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。 假设浮点变量的名字为x,应当将 if (x == 0.0) // 隐含错误的比较 转化为 if ((x>=-EPSINON) && (x<=EPSINON)) 其中EPSINON是允许的误差(即精度)。 4)指针变量与零值比较
应当将指针变量用“==”或“!=”与NULL比较。
假设指针变量的名字为p,它与零值比较的标准if语句如下:
if (p == NULL) // p与NULL显式比较,强调p是指针变量
if (p != NULL)
5)补充
(1)可能会看到 if (NULL == p) 这样古怪的格式。不是程序写错了,是程序员为了防止将 if (p == NULL) 误写成 if (p = NULL),而有意把p和NULL颠倒。编译器认为 if (p = NULL) 是合法的,但是会指出 if (NULL = p)是错误的,因为NULL不能被赋值。
(2)标准风格:
if (condition)
{
return x;
}
else
{
return y;
}
或者改写成更加简练的
return (condition ? x : y);
4、循环语句
1)在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。——效率
2)如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。如果N非常小,两者效率差别并不明显。

3)不可在for 循环体内修改循环变量,防止for 循环失去控制。for语句的循环控制变量的取值采用“半开半闭区间”写法。即x值属于半开半闭区间“[0,N)"。
5、switch语句
switch语句的基本格式是:
switch (variable)
{
case value1 : …
break;
case value2 : …
break;

default : …
break;
}
不要忘记break;不要忘记default分支。
6、goto语句
goto 语句至少有一处可显神通,它能从多重循环体中咻地一下子跳到外面,用不着写很多次的break语句。
二、变量与常量


三、函数设计

2008年11月24日星期一

高质量编程II——程序书法

写好的程序,就像写一个好书法。写字追求一个韵味;书法却讲求简洁高效
程序书法为的就是:让看你程序的人,能看懂,乐于看。

程序书法涉及以下几个方面:
1、空格。
2、空行和代码行。
3、对齐。
4、长行拆分。
5、修饰符位置——避免误解。
6、注释。
7、类的结构。
8、命名规则。
下面逐个进行学习分析。

一、空行与代码行。
空行起着分隔程序段落的作用。因此,合理利用空行,能够让程序结构清晰。
【规则2-1-1】在每个类声明之后、每个函数定义结束之后都要加空行。
【规则2-1-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
简而言之,当一个比较完整的个体开始/完成的时候,最好添加空行分割开来。

代码行:
【规则2-1-3】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
【规则2-1-4】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。
【建议】尽可能在定义变量的同时初始化该变量(就近原则)。
int width = 10; // 定义并初绐化width
int height = 10; // 定义并初绐化height
int depth = 10; // 定义并初绐化depth

x = a + b;
y = c + d;
z = e + f;

if (width < height)
{
dosomething();
}

for (initialization; condition; update)
{
dosomething();
}
// 空行
other();

示例 风格良好的代码行

二、空格
【规则2-2-1】关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。——突出关键字。
【规则2-2-2】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
【规则2-2-3】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。
【规则2-2-4】‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update)。
【规则2-2-5】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“”、“<<”,“^”等二元操作符的前后应当加空格
【规则2-2-6】一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。
【规则2-2-7】象“[]”、“.”、“->”这类操作符前后不加空格。
【建议】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格。
for (i=0; i<10; i++)和if ((a<=b) && (c<=d))

三、对齐
【规则2-3-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
【规则2-3-2】{ }之内的代码块在‘{’右边数格处左对齐。

四、长行拆分
【规则2-4-1】代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。
【规则2-4-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
if ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))
{
dosomething();
}

五、修饰符位置
修饰符 * 和 & 应该靠近数据类型还是该靠近变量名,是个有争议的活题。
若将修饰符 * 靠近数据类型,例如:int* x; 从语义上讲此写法比较直观,即x是int 类型的指针。
上述写法的弊端是容易引起误解,例如:int* x, y; 此处y容易被误解为指针变量。虽然将x和y分行定义可以避免误解,但并不是人人都愿意这样做。

【规则2-5-1】应当将修饰符 * 和 & 紧靠变量名
例如:
char *name;
int *x, y; // 此处y不会被误解为指针

六、注释
C++语言中,程序块的注释常采用“/*…*/”,行注释一般采用“//…”。注释通常用于:
(1)版本、版权声明;
(2)函数接口说明;
(3)重要的代码行或段落提示。
虽然注释有助于理解代码,但注意不可过多地使用注释。

【规则2-6-1】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
【规则2-6-2】注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。

七、类的版式
类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。
类提供关键字public、protected和private,分别用于声明哪些数据和函数是公有的、受保护的或者是私有的。这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。
类的版式主要有两种方式:
(1)将private类型的数据写在前面,而将public类型的函数写在后面,如示例8-3(a)。采用这种版式的程序员主张类的设计“以数据为中心”,重点关注类的内部结构。
(2)将public类型的函数写在前面,而将private类型的数据写在后面,如示例8.3(b)采用这种版式的程序员主张类的设计“以行为为中心”,重点关注的是类应该提供什么样的接口(或服务)。
建议采用“以行为为中心”的书写方式,即首先考虑类应该提供什么样的函数。这是很多人的经验——“这样做不仅让自己在设计类时思路清晰,而且方便别人阅读。因为用户最关心的是接口,谁愿意先看到一堆私有数据成员!”

八、命名规则
(一)共性规则
【规则2-8-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。切忌使用汉语拼音来命名。
【规则2-8-2】标识符的长度应当符合“min-length && max-information”原则。——适度把握,区别就行。
【规则2-8-3】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。
Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。
Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。
别把这两类风格混在一起用。
【规则2-8-4】程序中不要出现仅靠大小写区分的相似的标识符。
【规则2-8-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。
【规则2-8-6】变量的名字应当使用“名词”或者“形容词+名词”。float newValue;
【规则2-8-7】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。
例如:
DrawBox(); // 全局函数
box->Draw(); // 类的成员函数
【规则2-8-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
【建议】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。
(二)Windows下命名规则:
【规则2-8-9】类名和函数名用大写字母开头的单词组合而成。
【规则2-8-10】变量和参数用小写字母开头的单词组合而成。
【规则2-8-11】常量全用大写的字母,用下划线分割单词。
【规则2-8-12】静态变量加前缀s_(表示static)。
【规则2-8-13】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。
【规则2-8-14】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。
void Object::SetValue(int width, int height)
{
m_width = width;
m_height = height;
}
【规则2-8-15】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。

2008年11月22日星期六

Ubuntu下geany 配置

Get geany in website.

then write the first C++ program,but mostly you can't run it ritht now.

1、geany依赖于gcc and g++,他们是 GNU工程的CC++编译器

gcc
认为预处理后的文件(.i)C文件,并且设定C形式的连接.
g++
认为预处理后的文件(.i)C++文件,并且设定C++形式的连接.

刚装好的GCC什么都不能编译,因为没有一些必须的头文件,所以要安装build-essential,安装了这个包会安装上g++,libc6-dev,linux-libc-dev,libstdc++6-4.1-dev等好多必须的软件和头文件。
代码:
sudo apt-get install build-essential

2. gtk

安装GTK环境只要安装一个gnome-core-devel就可以了,里面集成了很多其他的包。除此之外还要转一些其他的东西,如libglib2.0 -doc、libgtk2.0-doc帮助文档,devhelp帮助文档查看,glade-gnome、glade-common、glade-doc图 形界面设计等。
代码:
sudo apt-get install gnome-devel——用此命令足矣。
sudo apt-get install gnome-core-devel
sudo apt-get install libglib2.0-doc libgtk2.0-doc
sudo apt-get install devhelp
sudo apt-get install glade-gnome glade-common glade-doc

在此配置基础上,已经可以在ubuntu上面运行geany的程序。
问题:
虚拟终端无法连接:
是因为文件夹没有创建或者说生成,因此不用点击编译,直接点生成,然后在执行即可。
至此,Linux下C++编程环境已经搞定。

目前网上有人推荐code block,一个好处就是可以夸平台运行:既可在windows,也可在Linux。有兴趣的话,可以尝试一下。

2008年10月31日星期五

回归I——基因测序相关问题

一、作用

现在基因测序越来越火,但还是得提醒一下:认清形势,务必注意高科技骗子。

基因与疾病密切相关,但大多数病是多基因病,只有很少一部分病是直接能够被基因决定性影响的。在关注自身健康的同时,基因检测是必须的,但是更重要的还在于自己的生活习惯,好的生活习惯加上比较健康的基因状态是身体长期健康的前提。

当然,必须的承认,癌症越来越多的威胁着人类健康。而且基因状态对于癌症的发生关系密切,但是,需要提出的是,诱因很大一个程度来自于环境。如果患了癌症,监控基因状态,进行基因治疗是一个非常好的思路;然而预防癌症,更要关注环境和生活习惯,资金充足的可以间隔一段时间进行基因体检,这也是比较好的选择。

因为基因在某种程度上参与这各种疾病,因此人类基因组测序必须完成,很高兴的是,已经结束了。但是,仍然有很多物种的基因组测序尚待完成。为了理解进化,理解物种多样性和理解基因的性格,我们需要检测各种物种的基因组,这也是生物多样性所要求的。

二、测序方法学

1、技术。从技术发展上来讲,如果明知技术发展有限,而且后续技术肯定有跨越式发展时,请不要做太多傻事。可能你很辛苦的做了大量工作,最后,技术改进了,发现你的结果都不能用的时候,你能坐在那里哭吗?生物技术,向来都是后来者居上,谁有最先进的技术,谁就走在最前沿,没有永恒的前沿。

2、测序方法:
链终止法测序——非常精妙而不利于大型操作的技术。
化学降解法测序——同上,剧毒物比较多。
自动化测序——加荧光标记,人类更轻松,仪器更繁忙,时间的问题。
非常规DNA测序

3、测序策略:

随机测序——鸟枪法。测序小片段,依重叠区域重建序列。

限制测序——水稻基因组测序所选策略。先进行各个BAC克隆的随机测序,再进行序列组装。

指导测序——构建基因组质粒文库,利用分子标记将大片段排成重叠的克隆群(Contig), 分别小片段测序后拼装.

重要区域优先测序,EST测序(mRNA-cDNA文库测序)等。

三、对序列的认识:
1、重复性。有单一序列,也有中度重复序列和高度重复序列,如何分析其重复的价值有待分别考量。
2、内含子与外显子。EST测序可以检测表达的基因序列,而内含子序列的测定及其价值的考量也是问题。
对于基因:
1、相似基因。功能相同或可以相互替代时,成为基因家族(一群具有一致的或相似顺序的基因,有的还担负类似的生物学功能, 可以相互补偿)。分析此类基因,需要将序列变为矩阵。功能丧失或者完全改变时,称为假基因,可能因为某些核苷酸或片段重复、某些修饰或残缺而导致。
2、重叠基因。两个基因有重叠区域或者重叠序列。可以一个基因包含另一个,也可以交叉部分序列,即重叠部分有两个蛋白的信息。
四:序列问题
1、序列拼接问题。
全基因族鸟枪法测序带来的问题:数据量极大,大量重复序列造成拼接途径的不确定。
对新算法、软件的需求:
能充分利用正反向测序的配对信息, 避免重复序列造成的错误拼接。
能处理数以百万甚至千万计的数据:程序并行化,高效率比对,能逐步拼接。
数学问题:
消除测序错误。
识别重复序列——覆盖深度模型。
识别重叠区域以及拼接——图论等。
2、序列诠释问题。
1)基因识别——寻找基因。
(1)根据开放读码框预测基因:ORF预测软件
起始密码子ATG
Kozak规则:第一个ATG侧翼序列的碱基分布所满足的统计规律。
定义:A 1,T2,G3.
则: 第4位的偏好碱基为G;ATG的5’端约15bp范围的侧翼序列内不含碱基T;在-3,-6和-9位置,G是偏好碱基;除-3,-6和-9位,在整个侧翼序列区,C是偏好碱基。
可以进行信号肽分析:
首先证实含完整mRNA 5’端的Contig翻译为蛋白序列;
然后用SignalP软件对前50个氨基酸序列(从第一个ATG对应的甲硫氨酸Met开始)进行评估,如果SignalP分析给出正面结果,则测试序列有可能为信号肽; 假如在该测试序列的第一个Met 5’端存在终止密码子,该序列为信号肽的可能性更大。
终止密码子TAA TAG TGA
GC% = 50% 终止密码子每 64 bp出现一次;
GC% > 50% 终止密码子每100-200 bp 出现一次;
多数基因 ORF 均多于50个密码子,因此最可能的选择应该是 ORF 不少于100 个密码子。
3’端确认
主要根据Poly(A)尾序列。若测试Contig不含Poly(A)序列,则根据加尾信号序列“AATAAA”和BLAST同源性比较结果共同判断。
外显子-内含子边界
内含子的5‘端或称供体位(donor site)常见的顺序为 5’-AG↓GTTAAGT-3’;
3’端又称受体位(acceptor site), 多为5‘PyPyPyPyPyPyCAG-3’(“Py”嘧啶核苷酸,T或C);
上游控制顺序
几乎所有基因(或操纵子)上游都有调控序列,它们可与DNA结合蛋白作用,控制基因表达。CpG岛。
(2)mRNA的5’端即转录起始位点区
通过同源性比较来预测mRNA的5’端,最常用的与转录起始位点相关的数据库是真核启动子数据库(The TRADAT Project , Eukaryotic Promoter Database, EPD. www.epd.unil.ch/ )。
(3)同源查询
通过已存入数据库中的基因顺序与待查的基因组序列进行比较,从中查找可与之匹配的碱基顺序及其比例,用于界定基因的方法称为同源查询。
A DNA序列某些片段完全相同;
B 开放读码框(ORF)排列类似,如有长外显子;
C 开放读码框翻译成氨基酸序列的相似性;
D 模拟多肽高级结构相似
2)上游控制序列识别——序列比对。

谈生物信息学与生物医药学

兴趣在生物信息,上了药理学两年研究生,深深感受到人类密码对人类健康的重要意义。
问题:细胞是怎么运作的,简而言之,心肌细胞如何自己跳动?心肌细胞在损伤的时候,细胞如何响应?
这个问题,我无法回答。但是,有两个方面值得关注:
(1)神经系统控制着整个机体,在神经系统的影响下,心肌细胞的反应必然带有深深的神经烙印。我的研究表明,心肌细胞损伤的时候,神经受体表达显著发生改变,为什么?难道心肌细胞甘为神经系统的奴隶,希望让其控制?不是的!是基因,是基因让它这么做的!
(2)心肌细胞缺血受损的时候,其膜电位系统、钙信号系统、线粒体产能系统和基因表达都会发生各自的改变。对于这个网络的计算机重建已经开展了半个多世纪了,目前总算慢慢构建起详细而复杂的心肌细胞膜电位仿真模型,线粒体仿真虽然还没有完整的模型,但也近在咫尺。基因表达和钙信号系统仿真也逐渐开展开来,然而真正要建立一个虚拟细胞,尚需时日。任何一个方向我都感兴趣,因为我的目标在虚拟细胞。基因表达系统的计算机仿真是最困难的一个环节。而这个环节,也将是我最最关注的一个环节。
认识细胞,理解细胞行为,重建起细胞,那么人类距离解释生命密码的距离就非常近了,后面的大部分都是体力活。
在虚拟细胞的基础上,模拟病理模型,对于计算机辅助药物设计的作用是里程碑式的,虽然不能完全代替现实中的实验,但是,药物筛选效率将跨越式提高。
在虚拟细胞,虚拟组织以及虚拟人体的基础上,疾病诊断、新药研发、定量化和个体化治疗策略将呈现出崭新的面貌。
未来的人类社会,必然建立在信息的基础上。

2008年10月26日星期日

基因研究方向再谈

任何一个科学领域都存在着:分久必合,合久必分的历史趋势。生物医学研究更是如此。然而值得一提的是,迅猛发展的生物信息学研究,必然面临着整合,因为改学科的终极目的就是:在服务器上能够模拟出一个广义的细胞。该细胞有如下功能:
在生物医学方面:
1、明确疾病特征,尤其是蛋白环节时,能够快速检测到相关蛋白及这些蛋白的有关病症;能够快速检测其基因以及基因状态,以及相关的疾病特征。
2、在明确基因的基础上,能够快速检测到存在改基因的相关物种(特别依据进化树位置判断),分析基因水平的改变以及改变导致的后果。
3、提出基因治疗和分子信号通路治疗方案。

而当前的基因研究的任务也在于:完成自己的使命。
使命一:完成尽可能多的序列测定任务。人的,大鼠的,大熊猫的,黄瓜的等等。当前的技术有限,测定比较慢;但在不久的将来肯定会有一种快速基因组测定方法,从而让人类可以快速检测各种物种的基因组,也可以快速检测各个个体的基因组。在这个领域,技术领先的人会永远走在最前面,而不一定是起步最早的人。因此,测序,要永远走在最前面,必须强化技术研发。
使命二:测序不是目的,目的是分析序列以及特异基因。进化分析或序列发生分析具有重大历史意义,而特异基因的分析更具有现实意义。依托大量的测序结果,有先天的优势,但这两个方向的选择与把握更具有长远的战略意义。尤其是特异基因研究不是近几十年能够完成的,必须成为一大优势。值得一提的是,进化分析也可用于发现特殊基因。
使命三:基因-蛋白-疾病主轴的建立是关键,在这三部曲中,改公司或者研究单位能做多少奉献,有赖于战略把握。但无论如何,不能忘记最终的目标:细胞内复杂信号网络的重建。

2008年10月25日星期六

基因发现——世纪大挑战

基因发现是人类基因组计划完成后首先要面对的一个重大问题。
从基因组序列研究发现基因,但是只能发现已知基因,尤其是已知序列及其蛋白的基因。这方面的研究,必须超前,尤其是技术超前。而且对生物信息学数据库的跨库分析要熟练,密切关注研究前沿。但存在一个问题:在遗传多态性分析、跨物种基因比对时,发现特异基因,检测到其已知蛋白,但功能上进一步研究就是各大生物信息学研究所难以消化的。这就需要一类跨专业人才,能够整合国内、国际各大研究所,检索相关蛋白研究领域,并提出研究课题,和该研究所联系,开展合作。基因组测序机构以及生物信息学机构必须加强这个方面,从而保证未来20年不落后。
从功能学研究发现蛋白的特殊作用,进而分析寻找其特异基因,然而发现特殊基因,这样的文章可以发表到Nature上,而且最近几期比较火。这表明两点:1)该方式是基因发现的重要途径,值得重视。2)目前尚处于发展早期,属推广阶段。各蛋白领域研究单位应积极拓展基因研究,而不是一味只攻蛋白。
基因与蛋白数据库发展迅猛,生物信息学从早期的序列操作到特殊基因发现,从基因蛋白关系到细胞内信号传导网络,进而到疾病机理,最终在本世纪中后期构建起完整的虚拟细胞,这将进一步加快基因发现和蛋白发现,医药学研究必将迅猛发展。