【问题标题】:Counting the number of complete genes in a text file in C计算C中文本文件中完整基因的数量
【发布时间】:2012-10-22 17:11:42
【问题描述】:

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

基因的开始: ATG

基因末端: TAA、TGA 或 TAG

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

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

ATG GCA TAT ATG TGG AAG TAA GTT GTA ATG CAC GAT GGC AAC GGC GGC 标签 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;
}

请帮帮我! :)

【问题讨论】:

  • 请不要将 stackoverflow 误解为“DoMyWork”。从读取 c 中的文件开始,然后继续询问您在编写代码时遇到的问题。
  • 似乎这将是一个微不足道的正则表达式。尝试这种方法,如果您无法使正则表达式正常工作,请返回。
  • 对不起,我把我目前的代码,我不知道如何在开始后找到基因的结尾

标签: c count counter


【解决方案1】:

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

所以,这可能是这样的:

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

希望这有助于开始。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2013-12-19
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      相关资源
      最近更新 更多