【问题标题】:A program where user enters a string and the program counts the instances of the letters用户输入字符串并计算字母实例的程序
【发布时间】:2012-11-18 07:27:24
【问题描述】:

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

这是我的意见

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

【问题讨论】:

  • 您的 for 循环缺少第一部分。
  • 这段代码不能编译,即使编译了,它也不会像你声称的那样做
  • 我并没有声称它有任何作用!我在寻求帮助。不过,它现在正在为我编译 - 但它会重复计算我的 gs,我会在一分钟内编辑我的帖子。
  • @MooingDuck,如果您的意思是 for 循环,就编译器所知,它们是有效的。 loop++ 是一个有效的布尔表达式,如果 loop 不是某个没有可用转换的类并且其他两个不必严格遵循声明/赋值和递增。
  • 我可能会制作一个字符映射来计数并运行for_each,检查每个字符是否在映射中,并增加适当的计数器。作为一种可能效率较低的解决方案,您可以将字符串设置为大写或小写,并为四个字母中的每一个使用std::count。但是,对于每个输入一次四个字母,性能差异可以忽略不计,因此后者可能是更好的解决方案。

标签: c++ string for-loop if-statement


【解决方案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');

现在它什么也没做。

您应该使用“

while (i <= st.size())

如果您已经检查过该符号不是 c,C,g,G,t,T,a,A 之一,则无需再次检查,因此 if (st[i] == c, C,G,t,T,a,A) 没用。

但即使有了这些更正,您的代码在逻辑上也是错误的。

【讨论】:

  • 谢谢!我不知道我是怎么一直看过去的!
  • 顺便说一句,符号(st[i] == c,C,G,t,T,a,A) 不会将 st[i] 与所有这些字符进行比较。逗号运算符很棘手...
【解决方案2】:

让我们同时修复验证和计数:

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

【讨论】:

  • @MooingDuck 嗯?你觉得哪里少了一个 else?
  • doit 看起来像是一个错误,但经过进一步检查,我意识到了其意图。这很奇怪。
【解决方案3】:

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

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

此外,您应该始终使用&lt; size 而不是&lt;= size 进行索引,因为索引从0 开始并以size-1 结束。

【讨论】:

  • 我从那里开始,但是 g++ 给了我一条错误消息,我从循环外部删除了 i = 0 并将其放回它一直运行到现在。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2014-07-17
相关资源
最近更新 更多