![]() |
#2
rjsp2012-11-09 14:51
连蒙带猜才搞懂你想干什么鸟事
以下代码通过了 gcc4.7.0 -std=c99 的编译 ![]() #include <stdio.h> #include <string.h> #include <assert.h> unsigned long dna8_str2val( const char str[8] ) { unsigned long val = 0; for( size_t i=0; i<8; ++i ) { val <<= 2; switch( str[i] ) { case 'a': val|=0; break; case 'g': val|=1; break; case 'c': val|=2; break; case 't': val|=3; break; default: return -1ul; } } return val; } void dna8_val2str( unsigned long val, char str[8] ) { assert( val < (1ul<<(8*2)) ); for( size_t i=0; i<8; ++i ) { str[7-i] = "agct"[val%4]; val >>= 2; } } int main() { unsigned long words = 0; unsigned long numbers[65536] = { 0 }; // 处理 FILE* fin = fopen( "result1.txt", "r" ); if( !fin ) return 1; for( char s[9]; fgets(s,9,fin); ) { if( s[0] == '@' ) // 遇到@则结束 break; ++words; size_t len = strlen(s); if( len < 8 ) // 此行不足8个字符 continue; if( s[len-1] == '\n' ) // 此行不足8个字符 continue; unsigned long val = dna8_str2val(s); if( val == -1ul ) // 出现了agct之外的字符 { fclose( fin ); return 2; } ++numbers[val]; for( int c; c=fgetc(fin), c!=EOF; ) { if( c == '\n' ) // 遇到回车说明此行结束 break; val = (val<<2)&0xFFFF; switch( (char)c ) { case 'a': val|=0; break; case 'g': val|=1; break; case 'c': val|=2; break; case 't': val|=3; break; default: // 出现了agct之外的字符 fclose( fin ); return 2; } ++numbers[val]; } } fclose( fin ); // 输出 FILE* fout = fopen( "result2.txt", "w" ); if( !fout ) return 3; fprintf( fout, "The Number of total words are %ld\n", words ); fprintf( fout,"The Expect Number words are %f\n", words/65536.0 ); for( int i=0; i<65536; ++i ) { if( numbers[i] !=0 ) { char str[8]; dna8_val2str( i, str ); fprintf( fout, "%.8s\t%ld\t%f\n", str, numbers[i], numbers[i]/65536.0 ); } } fclose( fout ); return 0; } 测试,result1.txt 内容如下 aaaaaaaaa aaaaaaaag aaaaaaaac @ 输出的 result2.txt 内容如下 The Number of total words are 3 The Expect Number words are 0.000046 aaaaaaaa 4 0.000061 aaaaaaag 1 0.000015 aaaaaaac 1 0.000015 [ 本帖最后由 rjsp 于 2012-11-10 13:52 编辑 ] |
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define N 65536
struct motif
{
char name[20];
float number;
} lead[N];
void main()
{
/////计算TATA 保守性
FILE *in,*out;
in=fopen("result1.txt","r");
out=fopen("结果.txt","w");
static char s[1687200000];
char c[4]={'a','g','c','t'};
int i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,number=0;
int person=0;
float words=0;
float expect=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(l=0;l<4;l++)
for(m=0;m<4;m++)
for(n=0;n<4;n++)
for(p=0;p<4;p++)
for(q=0;q<4;q++)
for(r=0;r<4;r++)
{
lead[number].name[0]=c[i];
lead[number].name[1]=c[j];
lead[number].name[2]=c[l];
lead[number].name[3]=c[m];
lead[number].name[4]=c[n];
lead[number].name[5]=c[p];
lead[number].name[6]=c[q];
lead[number].name[7]=c[r];
number++;
}
while(!feof(in))
{
fgets(s,1687200000,in);
if(s[0]=='@') break;
for(i=0;i<1687199999;i++)
{
for(j=0;j<4;j++)
for(k=0;k<4;k++)
for(l=0;l<4;l++)
for(m=0;m<4;m++)
for(n=0;n<4;n++)
for(p=0;p<4;p++)
for(q=0;q<4;q++)
for(r=0;r<4;r++)
{
if(s[i]==c[j]&&s[i+1]==c[k]&&s[i+2]==c[l]&&s[i+3]==c[m]&&s[i+4]==c[n]&&s[i+5]==c[p]&&s[i+6]==c[q]&&s[i+7]==c[r])
lead[person].number++;
person++;
}
person=0;
words++;
}
for(i=0;i<1687199999;i++)
s[i]=' ';
}
fprintf(out,"The Number of total words are %f\n",words);
expect=words/N;
fprintf(out,"The Expect Number words are %f\n",expect);
for(k=0;k<N;k++)
fprintf(out,"%s\t%f\t%f\n",lead[k].name,lead[k].number,lead[k].number/65536.0);
fclose(out);
}
这个程序的意思是统计由acgt这四个字母组合成的8长度的字符串,在另一个文件中出现的频数。由这四种字母组成字符串长度为8的方式一共有4的8次方个(65536)。比如:aaaaaaaa、aaaaaaag、aaaaaaac等等 以此类推。另一个文件中也全是由这四种字母组成的,共有16亿长度。我就是想统计这65536个字符串中,在文件2中,每个字符串各出现了多少 次,并依次输出。
[ 本帖最后由 a13780393 于 2012-11-9 18:27 编辑 ]