序列比对

#include<stdio.h>
#include<time.h>
#include<iostream.h>
#include<fstream.h>
#include <iomanip.h>


void reverse(char *p);//对字符串进行旋转

int k=-2;

int a[100][100];
char ms[100];

char s[100]="ATGGTGCACCTGACTCCTGAGGAGAAGTCTGCCGTTACTGCCCTGTGGGGCAAGGTGAACGTGGATTAAGTTGGTGGTGAGGCCCTGGGCAG";                  //"acgtcact";
char t[100]="ATGCTGACTGCTGAGGAGAAGGCTGCCGTCACCGGCTTCTGGGGCAAGGTGAAAGTGGATGAAGTTGGTGCTGAGGCCCTGGGCAG";                                                                                                 //"atgtacta";

char as[100]="";
char at[100]="";

int count=0;

int getLength(char *p)
{
    int i=0;
    while(*p!='/0')
    {
        i++;
        p++;
    }
    return i;
}

int score(char * p1,char * p2)
{
    if(*p1==*p2)
        return 1;
    else
        return -1;
}
int maxint(int n1,int n2,int n3)
{
    int temp=(n1>=n2)?n1:n2;
    temp=(temp>=n3)?temp:n3;
    return temp;
}

void contact(char *p,char *q)
{
    char * origin=p;
    while(*p)p++;
    *p=*q;
}

int align(char *s,char *t,int m,int n)
{
    for(int i=0;i<=m;i++)
    {
        a[i][0]=k*i;
    }
    for(int j=0;j<=n;j++)
    {
        a[0][j]=k*j;
    }
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n;j++)
        {
        int temp=score(s+i-1,t+j-1);
        a[i][j]=maxint(a[i-1][j]+k,a[i][j-1]+k,a[i-1][j-1]+temp);
        }
    }
    return a[m][n];
}

void traceBack(int i,int j)
{
    if((i==0)&&(j==0))return;
    else if((i>0)&&(j>0)&&(a[i-1][j-1]+score(s+i-1,t+j-1)==a[i][j]))
    {
        contact(as,s+(i-1));
        contact(at,t+(j-1));
        count++;
        traceBack(i-1,j-1);
    }
    else if((i>0)&&(a[i-1][j]+k==a[i][j]))
    {
        contact(as,s+(i-1));
        contact(at,"-");
        count++;
        traceBack(i-1,j);
    }
    else
    {
        contact(as,"-");
        contact(at,t+(j-1));
        count++;
        traceBack(i,j-1);
    }
}

void main()
{
    //时间开始
    time_t   start=clock();
   
    int m=getLength(s);
    int n=getLength(t);
    fstream fout("d://visualC//AlignOut.txt",ios::out);
    fout<<"m:"<<m<<endl;
    fout<<"n:"<<n<<endl;

    fout<<align(s,t,m,n)<<endl;

    for(int i=0;i<=m;i++)
    {
        for(int j=0;j<=n;j++)
        {
            fout<<setw(8)<<a[i][j]<<" ";
        }
        fout<<endl;
    }

    traceBack(m,n);

    reverse(as);
    reverse(at);

    fout<<"as串为:"<<as<<endl;
    fout<<"ts串为:"<<at<<endl;
//时间结束
  time_t end=clock(); 
  double dur=static_cast<double>(end-start)/CLOCKS_PER_SEC*1000; 
  cout<<"/n您的程序执行所耗费的时间为:"<<dur<<"毫秒。"<<endl;  
    /*cout<<"m:"<<m<<endl;
    cout<<"n:"<<n<<endl;
   
    cout<<align(s,t,m,n)<<endl;

    for(int i=0;i<=m;i++)
    {
        for(int j=0;j<=n;j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
   
    traceBack(m,n);

    reverse(as);
    reverse(at);

    cout<<"as串为:"<<as<<endl;
    cout<<"ts串为:"<<at<<endl;*/

}

    void reverse(char *p)
    {
        cout<<"********"<<p<<endl;
        int n=getLength(p);
        for(int i=0,j=n-1;i<=j;i++,j--)
        {
            char temp=*(p+i);
            *(p+i)=*(p+j);
            *(p+j)=temp;
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值