繁体   English   中英

计算C中文本文件中完整基因的数量

[英]Counting the number of complete genes in a text file in C

我想使用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;
}

请帮帮我! :)

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

尝试从更高层次看待您的问题。 您想找到由三胞胎序列组成的基因。 为此,您必须阅读三胞胎并测试它是否是基因或两者之间的某个基因的开始或结束。

因此,这可能看起来像这样:

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;
}

希望这对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM