搜档网
当前位置:搜档网 › 序列比对——一种更简洁、更易懂的方法

序列比对——一种更简洁、更易懂的方法

//main.cpp
#include
#include
#include"header.h"
char cha[37]={'-','t','c','c','C','A','G','T','T','A','T','G','T','C','A','G','g','g','g','a','c','a','c','g','a','g','c','a','t','g','c','a','g',
'a','g','a','c'};
char chb[37]={'-','a','a','t','t','g','c','c','g','c','c','g','t','c','g','t','t','t','t','c','a','g','C','A','G','T','T','A','T','G','T','C','A',
'G','a','t','c'};
int sn[37][37];
void setsn()//将矩阵的第一行第一列值全初始化为0
{
for(int i=0;i<=37;i++)
{
sn[0][i]=0;
sn[i][0]=0;
}
}
int st(int i2,int j2)//查看sn[i2][j2]是怎么得到的
{
if(i2==0&&j2!=0)//sn[i2][j2]位于第一行
return 1;
else
{
if(i2!=0&&j2==0)//sn[i2][j2]位于第一列
return 2;
else
{
if(i2!=0&&j2!=0)//sn[i2][j2]既不位于第一行也不位于第一列
{
int numa=sn[i2-1][j2]+w(cha[i2],'*');
int numb=sn[i2][j2-1]+w('*',chb[j2]);
int numc=sn[i2-1][j2-1]+w(cha[i2],chb[j2]);
int maxnum=max(0,numa,numb,numc);
sn[i2][j2]=maxnum;
int maxn=sn[i2][j2];
if(maxn==numa)
return 3;//sn[i2][j2]是由上面的值得到的
if(maxn==numb)
return 4;//sn[i2][j2]是由左面的值得到的
if(maxn==numc)
return 5;//sn[i2][j2]是由左上角的值得到的
if(maxn==0)
return 6;//sn[i2][j2]的值不是由以上三个地方得到


}
}
}
}
void main()
{
setsn();
int i,j,ppp,pt;
int t1=0;
int t2=0;
char st1[100000];//存放比对后的cha数组
char st2[100000];//存放比对后的chb数组
int count1=0;
int count2=0;
int maxnumber=0;
for(i=1;i<37;i++)//求矩阵中的值
{
for(j=1;j<37;j++)
{
st(i,j);
}
}
for(i=0;i<37;i++)//找到最大的值
{
for(j=0;j<37;j++)
{
if(sn[i][j]>=maxnumber)
{
maxnumber=sn[i][j];
t1=i;
t2=j;
}
}
}
while(sn[t1][t2]!=0&&(t1!=0||t2!=0))//比对过程
{
int pp=st(t1,t2);
switch(pp){
case 1:
st1[count1++]='-';
st2[count2++]=chb[t2];
t2--;
break;
case 2:
st1[count1++]=cha[t1];
st2[count2++]='-';
t1--;
break;
case 3:
st1[count1++]=cha[t1];
st2[count2++]='-';
t1--;
break;
case 4:
st1[count1++]='-';
st2[count2++]=chb[t2];
t2--;
break;
case 5:
st1[count1++]=cha[t1];
st2[count2++]=chb[t2];
t1--;
t2--;
break;
case 6:
break;
}
}
if(sn[t1][t2]==0)
{
if(t1!=0)
{
if(t2!=0)
{
st1[count1++]=cha[t1];
st2[count2++]=chb[t2];
}
else
{
st1[count1++]=cha[t1];
st2[count2++]='-';
}
}
else
{
if(t2>0)
{
st1[count1++]='-';
st2[count2++]=chb[t2];
}
else
{
st1[count1++]='-';
st2[count2++]='-';
}
}
}
for(pt=count1-1;pt>=0;pt--)//输出比对后的局部cha数组st1数组
cout<cout<for(ppp=count2-1;ppp>=0;ppp--)//输出比对后的局部chb数组st2数


cout<cout<cout<<"最大的元素值:"</* float a,b,cc;
int c,d;
c=2;
d=3;
a=d-c;
b=d+c;
cc=(float)d/c;
cout<



}
//header.h
#ifndef HEADERH
#define HEADERH
int w(char x,char y);//比较x和y是否相同,并计算相应的得分
int max(int a,int b,int c,int d);
#endif
//header.cpp
#include"header.h"
int max(int a,int b,int c,int d)//求a,b,c,d中最大的数
{
return ((a>=b?a:b)>=c?(a>=b?a:b):c)>=d?((a>=b?a:b)>=c?(a>=b?a:b):c):d;
}
int w(char x,char y)
{
if(((x>='a'&&x<='z')||(x>='A'&&x<='Z'))&&((y>='a'&&y<='z')||(y>='A'&&y<='Z'))&&x==y)
return 8;
else
{
if(((x>='a'&&x<='z')||(x>='A'&&x<='Z'))&&((y>='a'&&y<='z')||(y>='A'&&y<='Z'))&&x!=y)
return -5;
else
return -3;
}
}

相关主题