2012-10-22 39 views
0

我想使用C語言計算來自文本文件的基因數,三元組是一組3個字母。 基因由包含開始和結束的三元組序列組成。計算C文本文件中完整基因的數量C

開始該基因的: ATG基因的

端: TAA,TGA或TAG

的基因被認爲是,如果有效的開始和結束之間,例如至少一個三元組TAA ATG,不是有效的基因文本文件的

例如,文本文件可以有多個行

ATGGCA TAT ATG TGG AAGTAA GTT GTA ATGCAC GAT GGC AAC GGC GGCTAG 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; 
} 

請幫幫我! :)

+1

請不要誤解爲「DoMyWork」的stackoverflow。從閱讀c文件開始,向前邁進,在編寫代碼時詢問你面臨的問題。 –

+0

[你有什麼嘗試?](http://whathaveyoutried.com) – SparKot

+0

似乎它將是一個微不足道的正則表達式。嘗試這種方法,如果您無法正確使用正則表達式,請回來。 – Barmar

回答

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

希望這有助於爲一個開始。

0

做到這一點的一種方法是使用flex創建掃描儀,並讓掃描儀完成工作。看看dinosaur.compilertools.netFLEX。有一堆老派的域專用語言工具,它們有助於爲c/C++生成代碼來處理文本序列的語法,語法和解析。您只需使用您的c程序中生成的代碼。 請注意:如果您的要求允許,您應該使用perl,因爲它是爲這類任務量身定製的。