完成了。分析统计你的“结果22”在我电脑上大概3秒左右。
简单介绍一下程序的运行方法。
程序带一个参数,即模体的长度N,通过这个参数程序可以计算10以内的所有模体统计。
输入输出通过流的重定向完成。不理解没关系,按照下面的例子来就可以。
假设程序的可执行文件及输入文件在同一目录下
设可执行文件名为dna.exe, 输入文件名为data_in.txt,输出文件准备命名为data_out.txt
打开控制台窗口,并切换到程序所在目录,执行
dna 8 <data_in.txt >data_out.txt
等程序执行完后,就可以在当前目录下去查看生成的data_out.txt文件了,建议别用记事本打开。
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MOTIF_LEN_MIN 1
#define MOTIF_LEN_MAX 10
int trans_base(int base)
{
switch(base)
{
case 'A' : return 0;
case 'T' : return 1;
case 'C' : return 2;
case 'G' : return 3;
}
return -1;
}
int main(int argc, char ** argv)
{
int * motif_group, * count_group;
int motif_len, group_len, count_max, motif, base, mark;
int i, j;
char *base_name = "ATCG", *tail;
if(argc != 2) return 1;
motif_len = strtol(argv[1], &tail, 0);
if(*tail != '\0' || motif_len < MOTIF_LEN_MIN || motif_len > MOTIF_LEN_MAX)
return 1;
group_len = 1 << (motif_len * 2);
mark = ~(-1 << (motif_len * 2));
motif_group = (int *)malloc(group_len * sizeof(int));
if(motif_group == NULL) return 1;
memset(motif_group, 0, group_len * sizeof(int));
for(motif = 0, i = motif_len - 1; i && (base = getchar()) != EOF;)
if((base = trans_base(base)) >= 0)
{
motif = (motif << 2) + base;
i--;
}
for(count_max = 0; (base = getchar()) != EOF;)
if((base = trans_base(base)) >= 0)
{
motif_group[motif = ((motif << 2) + base) & mark]++;
if(motif_group[motif] > count_max) count_max = motif_group[motif];
}
count_group = (int *)malloc((count_max + 1) * sizeof(int));
if(count_group == NULL) return 1;
memset(count_group, 0, (count_max + 1) * sizeof(int));
for(i = 0; i < group_len; i++)
{
for(j = motif_len - 1; j >= 0; j--)
putchar(base_name[(i >> (j * 2)) & 3]);
printf("\t%d\n", motif_group[i]);
count_group[motif_group[i]]++;
}
for(i = 0; i <= count_max; i++)
printf("%d\t%d\n", i, count_group[i]);
free(motif_group);
free(count_group);
return 0;
}