总是循环前期正确,后期错误,请指教
DNA链:AACACCATGGTGTTTCAAAATGG…….(只有A、T、C、G共4个字符)8模体即8个字符(如TGTTTCAA,其不是核小体结合模体,因无CG),只要其至少含1个CG,其就是核小体结合模体;147个字符共有140个8模体;
目的:以DNA链第9个碱基/字符为统计起点、以252为统计窗口,分别统计252大小的窗口内拥有最大核小体结合模体个数和最大G+C含量的147个字符的起止点,并以两个区间的平均起止点作为核小体定位起点与终点;以前述定位核小体定位终点加9为下一次统计起点,以252为统计窗口,按上述要求确定下一个核小体定位起点与终点;重复上述过程,直到得到DNA链的全部核小体定位起点与终点。
以下是我的程序,但总是前十几个循环输出正确,后面的循环输出错误(无故某量突然变为零),请各位大侠指教!
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define N 210000 //N指序列长度
FILE *fp,*qqq,*aaa,*ss;
struct motif
{
char str[300];
int qi,zhi;
}lead[1600];
void main()
{
fp=fopen("E:\\EGFR.txt", "rt");
qqq=fopen("E:\\核小体位置1.txt","wt");
aaa=fopen("E:\\连接序列位置.txt","wt");
ss=fopen("E:\\jian.txt","wt");
int i,a=9,b=260,c=0,j,m,h,z=0;
int f1=0,f2=0,f3=0,ave1=0,sum[160];
float num=0;
for(j=0;j<160;j++)
sum[j]=0;
if(a<N) // 1
{
i=0;
fseek(fp,(a-1),0);
while (a<=b) // 11行
{
lead[z].str[i]=fgetc(fp);
i++;
a++;
}
for(j=0;j<106;j++) //205bp长,146bp为窗口,故循环59次
{
for(m=j;m<=j+146;m++)
if(lead[z].str[m]=='C'||lead[z].str[m]=='G') //
sum[j]++; //统计185(n-1)-10到185n+10区间内每146bp窗口内的核小体结合模体的个数
if(sum[j]>f1)
{
f1=sum[j]; //寻找每146bp内最大的G+C个数
f2=j+1+8; //确定拥有最大G+C个数的146bp窗口的起点
}
}
for(j=0;j<160;j++)
sum[j]=0;
f1=0;
for(j=0;j<106;j++) //205bp长,146bp为窗口,故循环59次
{
for(m=j;m<=j+140;m++) //之所以写成139,是因为147bp长的序列含有140个8模体,由于从0开始,故为139
if(lead[z].str[m]=='C'&&lead[z].str[m+1]=='G'||lead[z].str[m+1]=='C'&&lead[z].str[m+2]=='G'||lead[z].str[m+2]=='C'&&lead[z].str[m+3]=='G'
||lead[z].str[m+3]=='C'&&lead[z].str[m+4]=='G'||lead[z].str[m+4]=='C'&&lead[z].str[m+5]=='G'||lead[z].str[m+5]=='C'
&&lead[z].str[m+6]=='G'||lead[z].str[m+6]=='C'&&lead[z].str[m+7]=='G') //
sum[j]++; //统计185(n-1)-10到185n+10区间内每146bp窗口内的核小体结合模体的个数
if(sum[j]>f1)
{
f1=sum[j]; //寻找每146bp内最大的核小体结合模体个数个数
f3=j+1+8; //确定拥有最大G+C个数的146bp窗口的起点
}
}
}
for(j=0;j<160;j++)
sum[j]=0;
ave1=(f2+f3)/2; //平均起点
lead[z+1].qi=ave1+146+9; //下一个搜索窗口的起点
lead[z+1].zhi=ave1+146+260; //下一个搜索窗口的终点
fprintf(qqq,"%d\t%d\n",ave1,ave1+146); //核小体平均起止点
fprintf(aaa,"%d\t%d\n",1,ave1-1); //连接序列起止点
fprintf(aaa,"%d\t",ave1+146+1); //下一个连接序列的起点
fprintf(ss,"搜索起点=%d\t搜索终点=%d\t核小体起点1=%d\t核小体起点2=%d\n",lead[z].qi,lead[z].zhi,f2,f3);
ave1=0,f1=0,f2=0,f3=0; //需全部置零,否则下面易出问题
for(z=1;z<60;z++)
{
if(lead[z].qi<N) // 2
{
i=0;
fseek(fp,(lead[z].qi-1),0);
while (lead[z].qi<=lead[z].zhi) // 11行
{
lead[z].str[i]=fgetc(fp);
i++;
lead[z].qi++;
}
c=lead[z].qi-252;
printf("c=%d\n",c);
for(j=0;j<106;j++) //205bp长,146bp为窗口,故循环59次
{
for(m=j;m<=j+146;m++)
if(lead[z].str[m]=='C'||lead[z].str[m]=='G') //
sum[j]++; //统计185(n-1)-10到185n+10区间内每146bp窗口内的核小体结合模体的个数
if(sum[j]>f1)
{
f1=sum[j]; //寻找每146bp内最大的G+C个数
f2=c+j+1; //确定拥有最大G+C个数的146bp窗口的起点,减252是因为while语句中的a增加了252
}
}
for(j=0;j<160;j++)
sum[j]=0;
f1=0;
for(j=0;j<106;j++) //205bp长,146bp为窗口,故循环59次
{
for(m=j;m<=j+140;m++) //之所以写成139,是因为147bp长的序列含有140个8模体,由于从0开始,故为139
if(lead[z].str[m]=='C'&&lead[z].str[m+1]=='G'||lead[z].str[m+1]=='C'&&lead[z].str[m+2]=='G'||lead[z].str[m+2]=='C'&&lead[z].str[m+3]=='G'
||lead[z].str[m+3]=='C'&&lead[z].str[m+4]=='G'||lead[z].str[m+4]=='C'&&lead[z].str[m+5]=='G'||lead[z].str[m+5]=='C'
&&lead[z].str[m+6]=='G'||lead[z].str[m+6]=='C'&&lead[z].str[m+7]=='G')
sum[j]++; //统计185(n-1)-10到185n+10区间内每146bp窗口内的核小体结合模体的个数
if(sum[j]>f1)
{
f1=sum[j]; //寻找每146bp内最大的核小体结合模体个数个数
f3=c+j+1;
}
}
for(j=0;j<160;j++)
sum[j]=0;
ave1=(f2+f3)/2;
lead[z+1].qi=ave1+146+9;
lead[z+1].zhi=ave1+146+260;
fprintf(qqq,"%d\t%d\n",ave1,ave1+146); //核小体平均起止点
fprintf(aaa,"%d\n%d\t",ave1-1,ave1+146+1); //本核小体的终点和下一个核小体的起点
fprintf(ss,"搜索起点=%d\t搜索终点=%d\t搜索起点c=%d\t核小体起点1=%d\t核小体起点2=%d\n",lead[z].qi-252,lead[z].zhi,c,f2,f3);
ave1=0,f1=0,f2=0,f3=0,c=0;
}
}
}