【问题标题】:While Loop in For LoopFor循环中的while循环
【发布时间】:2020-05-15 19:45:14
【问题描述】:

我正在尝试计算字符串中的猫和狗。所以,

例如:

如果字符串是“cc+dd-cd”,:

我想计算2 positive cats2 positive dogs1 negative cat1 negative dog(是的,我知道这是一种奇怪的计算方式,但这是我的任务的一部分)。

我想过做一个 for 循环,在其中迭代字符串,然后嵌套在 for 循环中,我会有一个 while 循环,它会一直运行到“-”,然后运行到“+”或结尾.我开始编写代码,甚至没有深入其中,它创建了一个无限循环。

问题:我该如何解决?

谢谢!

string animalparkString = "cc+dd-cd" 
for (int k = 0; k != animalparkString.size(); k++)
   {
       while (k != '-'){
           pdc = pdc + 1; //positive dog count
           pcc = pcc + 1; //positive cat count
       }
       while (k != '+') {
           ndc = ndc + 1;
           ncc = ncc + 1;
       }
       
   }

【问题讨论】:

  • 那些while 循环不会对k 做任何事情,所以如果第一次条件是true,它将永远是true。此外,无论如何,条件没有多大意义,而不是再次检查字符k,您应该检查它们与animalparkString[k]
  • 对于初学者来说,k 是一个索引,因此要与'-''+' 进行比较,您应该使用animalparkString[k]
  • 不要忘记在 will 循环中检查 K,@Blaze 的答案是正确的并添加检查

标签: c++ for-loop while-loop infinite-loop


【解决方案1】:

直接的问题是while 循环检查k 的值,但不要修改它。因此,一旦您进入其中之一,您将被无限卡住,因为k 在循环体内不会发生变化。

我不会为嵌套循环而烦恼 - 我只需在一个循环中遍历整个字符串,然后依次评估每个字符。实现此目的的一种巧妙方法是保持您是加法还是减法的状态(根据您最后遇到的是+ 还是- 符号:

bool positive = true;
string animalparkString = "cc+dd-cd";
for (int k = 0; k < animalparkString.size(); k++) {
     char ch = animalparkString[k];

     switch (ch) {
         case '+':
             positive = true;
             break;
         case '-':
             positive = false;
             break;
         case 'c':
             if (positive) {
                 pcc++;
             } else {
                 ncc++
             }
             break;
         case 'd':
             if (positive) {
                 pdc++;
             } else {
                 ndc++
             }
             break;
     }
}

【讨论】:

    【解决方案2】:

    This post 描述迭代所有字符是一个字符串。

    这是一个使用现代 C++ 的简单解决方案:

    int sign = 1; 
    int dogs_count = 0, cats_count = 0;  
    std::string animalparkString = "-cccccc+dddd-cd"; 
    for (const char& ch : animalparkString)
    {
         switch (ch) {
             case '+':
                 sign = 1;
                 continue;
             case '-':
                 sign = -1;
                 continue;
             case 'c':
                 cats_count += sign;
                 continue;
             case 'd':
                 dogs_count += sign;
                 continue;
         } 
    }
    
    std::cout <<"dogs: " << dogs_count << " cats: " <<cats_count;  
    

    一些帮助您入门的建议:
    1.使用在线c++编译器快速测试代码
    2. 如果您的代码未按预期运行,请在您的 IDE 中使用逐步调试或使用 std::cout 打印我们的变量
    3. 明确说明命名空间被认为是好的做法。即:

    // preferable:  
    std::string myString; 
    // avoid:  
    using namespace std;  
    string myString   
    

    【讨论】:

      【解决方案3】:

      要使您的代码无需太多更改即可正常工作,您只需将while() 条件替换为if()。此外,您应该比较第 k 个字符串元素 animalparkString[k],而不是检查迭代器值 k

      然后您可能会开始怀疑您编写的代码是否真的按照您的预期进行。您可以尝试回答的可能问题是“我如何区分正数或负数”,然后是“我如何区分猫和狗”?您可能还需要检查cs 和ds,而不仅仅是操作标志!

      string animalparkString = "cc+dd-cd" 
      for (int k = 0; k != animalparkString.size(); k++)
         {
             if(animalparkStrink[k] != '-'){
                 // Now you know, there will be a pos count. Dog or Cat?
             }
             if(animalparkString[k] != '+') {
                // Now you know, there will be a neg count. Dog or Cat?
             }
      
         }
      

      请注意,如果您写while( k != '-'),它将始终评估为真,因此您将被困在那里。如果这是第一次使用 for-loops,请考虑打印迭代器值,以了解您何时何地被卡住。

      string animalparkString = "cc+dd-cd" 
      for (int k = 0; k != animalparkString.size(); k++)
         {
      
             std::cout << "for-loop iteration number: " << k << std::endl;
      
             if(animalparkStrink[k] != '-'){
                 // Now you know, there will be a pos count. Dog or Cat?
             }
             if(animalparkString[k] != '+') {
                // Now you know, there will be a neg count. Dog or Cat?
             }
      
         }
      

      【讨论】:

        【解决方案4】:

        forwhile 一起使用的方法过于复杂。这是一个更简单的解决方案:

        #include <concepts>
        #include <iostream>
        
        int main() {
          auto const& str{"cc+dd-cd"};
          std::boolean auto isPositive = 1;
          std::integral auto pdc{0}, pcc{0}, ndc{0}, ncc{0};
          for (char const ch : str) {
            switch (ch) {
              case 'c': {
                pcc += isPositive;
                ncc += !isPositive;
                break;
              }
              case 'd': {
                pdc += isPositive;
                ndc += !isPositive;
                break;
              }
              case '+': {
                isPositive = true;
                break;
              }
              case '-': {
                isPositive = false;
                break;
              }
            }
          }
        
          std::cout << "pcc: " << pcc << '\n'
                    << "ncc: " << ncc << '\n'
                    << "pdc: " << pdc << '\n'
                    << "ndc: " << ndc << '\n';
        }
        

        LIVE

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-05
          • 2013-06-12
          • 2011-05-11
          • 2015-09-18
          相关资源
          最近更新 更多