1

这是我编写的第一个 C++ 程序,我无法理解必须放入操作数的顺序。这是一个类,但看起来我不应该使用 homework 标记。对不起,如果我做错了。

这是我的输入

// Get DNA string

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

这似乎工作正常,但我想我会包括它,以防这是我做错了。

到目前为止,这是我要检查输入是否完全是 C、T、A 或 G。它通过程序运行并简单地打印“请输入有效的序列 1,请输入有效的序列 2,……等等。我我确定我在做一些非常愚蠢的事情,我就是想不通。

 // 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++;

我程序的后半部分是统计序列中Cs和Gs的个数

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; 任何地方都不会出现错误,尽管我知道我会在某个地方需要它。

任何帮助或提示我正确的方向将不胜感激 - 我已经在这段代码上工作了两天(承认这很尴尬)。


编辑 :

我的序列检查器现在看起来像这样:

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

您的 for 循环使用了不正确的语法。你要:

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

此外,您应该始终使用< size而不是<= size索引,因为索引从 开始0并结束于size-1.

于 2012-11-30T04:38:56.527 回答
1

你应该删除“;” 之后如果运算符:

 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');

现在它什么也没做。

您应该使用“<”而不是“<=”来避免对字符串数组进行错误索引(大小为“size”的字符串表示索引从 0 到 size - 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 回答