1

これは私が書いた初めての C++ プログラムであり、オペランドを入れる順序を理解するのに苦労しています。これはクラス用ですが、宿題タグを使用することになっていないようです。私がこれを間違っている場合は申し訳ありません。

これは私の入力です

// Get DNA string

string st;
cout << "Enter the DNA sequence to be analysed: ";
cin >> st;

これはうまくいくようですが、これが間違っている場合に備えて含めると思いました。

これは、入力がC、T、A、またはGのみであることを確認するためにこれまでに行ったことです。プログラムを実行し、「有効なシーケンス1を入力してください、有効なシーケンス2を入力してください... ect。I私は何か非常にばかげたことをしていると確信しています。

 // Check that the sequence is all C, T, A, G

while (i <= st.size()){
if (st[i] != 'c' && st[i] != 'C' && st[i] != 'g' && st[i] != 'G' && st[i] != 't' && st[i] != 'T' && st[i] != 'a' && st[i] != 'A');
    cout << "Please enter a valid sequence" <<
    i++;
else if (st[i] == c,C,G,t,T,a,A)
    i++;

私のプログラムの後半は、シーケンス内の C と G の数を数えることです。

for (i < st.size() ; i++ ;);
for (loop <= st.size() ; loop++;)
    if (st[loop] == 'c')
    {
    count_c++;
    }
    else if (st[loop] == C)
    {
    count_c++;
    }
    else if (st[loop] == g)
    {
    count_g++;
    }
    else if (st[loop] == G);
    {
    count_g++;
    }


cout << "Number of instances of C = " << count_c;
cout << "Number of instances of G = " << count_g;

ループしていないようです。文字の1つをカウントします。ループさせるにはどうすればよいですか?endl を入れられないようです。どこかで必要になることはわかっていますが、エラーが返されることなくどこでも。

正しい方向に向けるための助けやヒントをいただければ幸いです。私はこのコードに 2 日間取り組んできました (認めるのは恥ずかしいことです)。


編集 :

私のシーケンスチェッカーは次のようになります。

while (i < st.size() ) {
if (st[i] != c && st[i] != C && st[i] != g && st[i] !=G && st[i] !=t && st[i] !=T && st[i] !=a && st[i] != A)
    cout << "Please enter a valid sequence" << "\n" << "\n";
    i++;
}

私のカウンターは次のようになります。

// Count the number of Cs and Gs

count_c = 0;
count_g = 0;

for (i = 0; i < st.size() ; i++) {
   if ((st[i] == 'c') || (st[i] == 'C'))
   count_c++;
   else if ((st[i] == 'g')|| (st[i] == 'G'));
   count_g++;
}


cout << "Number of instances of C = " << count_c;
cout << "Number of instances of G = " << count_g;
4

3 に答える 3

1

「;」を削除する必要があります その後 if 演算子:

 if (st[i] != 'c' && st[i] != 'C' && st[i] != 'g' && st[i] != 'G' && st[i] != 't' && st[i] != 'T' && st[i] != 'a' && st[i] != 'A');

今は何もしていません。

文字列配列の間違ったインデックス付けを避けるために、「<=」の代わりに「<」を使用する必要があります (サイズ「サイズ」の文字列は、インデックスが 0 からサイズ - 1 であることを意味します)。

while (i <= st.size())

シンボルが c,C,g,G,t,T,a,A のいずれでもないことを既に確認している場合は、もう一度確認する必要はありません。したがって、if (st[i] == c,C,G ,t,T,a,A) は役に立ちません。

しかし、これらの修正を行っても、コードは論理的に間違っています。

于 2012-11-30T04:54:46.187 に答える
1

検証とカウントの両方を一度に修正しましょう。

bool sequencedna(const string &s, int &count_a, int &count_t, int &count_c, int &count_g)
{
    for(int i = 0; i != s.length(); i++)
    {
        /* get the character at position i and convert it to uppercase */
        char c = s[i];

        if((c == 'C') || (c == 'c'))
            count_c++;
        else if((c == 'G') || (c == 'g'))
            count_g++;
        else if((c == 'T') || (c == 't'))
            count_t++;
        else if((c == 'A') || (c == 'a'))
            count_a++;
        else
            return false; // invalid character in DNA sequence!
    }

    return true; // valid DNA sequence
}

void doit()
{
    string st;

    while(true)
    {
        cout << "Enter the DNA sequence to be analysed: ";
        cin >> st;

        int count_c = 0, count_g = 0, count_t = 0, count_a = 0;

        if(sequencedna(st, count_a, count_t, count_c, count_g))
        {
            cout << "The DNA string has been sequenced. Counts " << endl
                 << "  Adenine: " << count_a << endl
                 << "  Thymine: " << count_t << endl
                 << " Cytosine: " << count_c << endl
                 << "  Guanine: " << count_g << endl;
            return;
        }

        cout << "Invalid sequence. DNA sequences may contains only A, T, C and G." << endl;
    }
}
于 2012-11-30T05:02:27.730 に答える
1

for ループで間違った構文が使用されています。あなたがしたい:

for (i = 0; i < st.size() ; i++) {
    ...
}

また、インデックス作成は で始まり で終わるため、インデックス作成には常に< sizeand ではなくを使用する必要があります。<= size0size-1

于 2012-11-30T04:38:56.527 に答える