0

我想用 C 语言从一个文本文件中计算基因的数量,一个三元组是一组 3 个字母。基因由包含开头和结尾的三联体序列组成。

基因开头: ATG

基因末端: TAA、TGA 或 TAG

如果开始和结束之间的至少一个三元组(例如 TAA ATG)不是有效基因,则认为该基因是有效的

文本文件示例,文本文件可以有多行

ATG GCA TAT ATG TGG AAG TAA GTT GTA ATG CAC GAT GGC AAC GGC GGC TAG CCA ATG AAA

这个例子包含两个基因

我试了至今,不知道如何找到开头然后结尾。

 int Count (char *file) {   
    FILE *ptr = NULL;   
    int count = 0;  

    char *start = "ATG";
    char *end = "TAA"; // miss TGA, TAG

    char chr;
    int occur, i;

    ptr = fopen(filename, "r");  //open text file

        if (ptr == NULL)
            return -1;

    chr = fgetc(ptr);
    while(chr != EOF){

             if(ch == start[0]){                 
                  for(i=1; i< StrLen(start); i++){
                    chr = fgetc(ptr);

                       if(chr == EOF){
                            occur = 0;
                            break;
                       }
                       else if(chr != start[i]){
                            chr = fgetc(ptr);
                            occur = 0;
                            break;
                       }
                       else
                            occur = 1;
                  }   

                  if(occur == 1){
                        count++;
                  }

             } else{
                chr = fgetc(ptr);
             }              
        }

    if (!feof(ptr)){
        return -1;
    }
    fclose(ptr);

    return count;
}

int StrLen(char *word){
 int i = 0;
 char c = word[0];
 while(c != '\0'){
  i++;
  c = word[i];
 }
 return i;
}

请帮帮我!:)

4

2 回答 2

0

一种方法是使用 flex 创建一个扫描仪,然后让扫描仪完成工作。看看恐龙.compilertools.net和FLEX。有一堆老式的领域特定语言工具可以帮助为 c/c++ 生成代码,以处理文本序列的语法、句法和解析。您只需在 c 程序中使用生成的代码。附带说明:如果您的要求允许,您可能应该使用perl它,因为它是为此类任务量身定制的。

于 2012-10-22T21:04:33.187 回答
0

尝试从更高的层面看待你的问题。你想找到由一系列三联体组成的基因。为此,您必须阅读三胞胎并测试它是基因的开始还是结束,或者介于两者之间。

所以,这可能看起来像这样:

char triplet[4];
while (read_triplet(fp, triplet)) {
    if (is_beginning(triplet)) {
        /* handle beginning */
    } else if (is_end(triplet)) {
        /* handle end of gene */
    } else {
        /* is between */
    }
}

然后为三元组处理定义函数:

int read_triplet(FILE *fp, char *triplet) { /* ... */ }
int is_beginning(const char *triplet) { return strcmp(triplet, "ATG") == 0; }
int is_end(const char *triplet)
{
    if (strcmp(triplet, "TAA") == 0)
        return 1;

    if (strcmp(triplet, "TGA") == 0)
        return 1;

    if (strcmp(triplet, "TAG") == 0)
        return 1;

    /* No, it's not an end triplet */
    return 0;
}

希望这有助于开始。

于 2012-10-22T21:08:39.307 回答