0

C言語を使ってテキストファイルから遺伝子の数を数えたいのですが、トリプレットは3文字のセットです。遺伝子は、開始と終了を含む一連のトリプレットで構成されています。

遺伝子の始まり: ATG

遺伝子の末端: TAA、TGA または TAG

開始と終了の間の少なくとも 1 つのトリプレット (TAA ATG など) が有効な遺伝子でない場合、遺伝子は有効と見なされます。

テキスト ファイルの例。テキスト ファイルには複数の行を含めることができます。

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

この例には 2 つの遺伝子が含まれています

これまで試してみましたが、最初と最後を見つける方法がわかりません。

 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

問題をより高いレベルから見てみてください。トリプレットのシーケンスで構成される遺伝子を見つけたいと考えています。そのためには、トリプレットを読んで、それが遺伝子の始まりか終わりか、またはその間の何かかどうかをテストする必要があります。

したがって、これは次のようになります。

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 に答える
0

これを行う 1 つの方法は、flex を使用してスキャナーを作成し、スキャナーに作業を任せることです。dinosaur.compilertools.netFLEXを見てください。文法、構文、およびテキスト シーケンスの解析を処理するための c/c++ 用のコードを生成するのに役立つ、古い学校のドメイン固有言語ツールが多数あります。C プログラム内から生成されたコードを使用するだけです。補足として、perlこの種のタスクに合わせて調整されているため、要件が許す場合は、おそらくこれを使用する必要があります。

于 2012-10-22T21:04:33.187 に答える