【问题标题】:My counter is not properly being divided by str.length(). C++我的计数器没有被 str.length() 正确划分。 C++
【发布时间】:2021-03-24 03:39:15
【问题描述】:

我只需要一些帮助来除以字符串/DNA 链中 Gs 和 Cs 的计数器,然后将它们除以 DNA 链的长度,得到一个双倍表示字符串中 Cs 和 Gs 的百分比。但是,当我将计数器除以 DNA.length() 时,它返回 0。它并没有给我实际的答案/乘积。请帮忙!!

    #include <iostream>
    #include<string>
    using std::string; using std::cout; using std::endl; using std::cin;

    double get_gc_content(const string& dna)
    {
      int counter = 0;

        for(std::size_t i = 0; i < dna.size();++i)
        {
            if(char(dna[i]=='C') || char(dna[i]=='G'))
            {
                counter++;
                // cout<<counter<<endl;     
            }

        }
      cout<<counter<<endl;

      double gc_content = counter / dna.length();

      return gc_content;
    }


    int main()
    {
      std::string dna = "ACCGCAAATT";

      double gc_count;

      gc_count = get_gc_content(dna);
      
      cout<<gc_count<<endl;

      return 0;
    } 

【问题讨论】:

  • double gc_content = counter / dna.length(); -- 一个整数除以一个整数会得到一个整数。
  • 这并没有解决问题,但在if 语句中去掉了那些char 演员表。 if (dna[i] == 'C' || dna[i] == 'G') 就是你所需要的。

标签: c++ string for-loop


【解决方案1】:

这一行:

double gc_content = counter / dna.length();

执行整数除法,因为分子和分母都是整数类型。因此结果将被截断为整数并存储在gc_content中。

gc_content 是否为double 无关紧要——除法的结果在值存储到gc_content 之前已经发生。在您的情况下,dna.lengh() 可能小于counter,因此您得到的值为0.0

解决方案是确保将counterdna.length() 强制转换为double,以便实际发生浮点除法。

double gc_content = static_cast<double>(counter) / dna.length();  // For example.

【讨论】:

    【解决方案2】:

    仔细看下面的表达式:

    double gc_content = counter / dna.length();
    

    您将整数值counter 除以另一个整数dna.length(),此操作的结果也将是一个整数值。由于您的示例中为counter &lt; dna.length(),因此此操作的结果为0。接下来,此结果将转换为double 并分配给gc_content

    要正确计算gc_content,您需要在操作之前将整数值转换为double。也就是说,你可以这样写:

    double gc_content = double(counter) / double(dna.length());
    

    现在,操作的结果将是一个double 值,然后将分配给gc_content

    if 条件中的代码存在另一个缺陷。当你评估`

    char(dna[i]=='G')
    

    您正在计算一个bool 值,它由表达式dna[i]=='G' 产生,然后将该值转换为char。接下来,再次将此值强制转换为 bool 以评估 if 语句的条件。

    你应该简单地使用:

    if(dna[i] == 'C' || dna[i] == 'G')
    

    因为std::string 类中重载的operator[] 已经返回char 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多