在For循环中使用While循环

3
我想要计算字符串中的猫和狗,例如: 如果字符串是"cc+dd-cd",我想要计算出 "2 positive cats", "2 positive dogs", "1 negative cat", "1 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;
       }
       
   }


1
那些 while 循环没有对 k 做任何操作,所以如果条件在第一次成立,它将永远成立。此外,该条件本身也没有太多意义,与其检查字符是否等于 k,不如检查它们是否等于 animalparkString[k] - Blaze
1
首先,k是一个索引,因此要与'-''+'进行比较,您应该使用animalparkString[k] - acraig5075
不要忘记在 while 循环中也检查 K,@Blaze 的回答是正确的,然后添加检查。 - alon
4个回答

4
立即的问题是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;
     }
}

1

这篇文章 描述了如何迭代字符串中的所有字符。

这是使用现代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   

0

为了使你的代码改动较小,你可以简单地将 while() 条件替换为 if()。此外,不要检查迭代器值 k,而应该比较第 k 个字符串元素 animalparkString[k]

然后你可能会开始想知道你编写的代码是否真的做到了你的期望。你可以尝试回答的可能问题是“我如何区分正数或负数计数”,然后是“我如何区分猫和狗”?你可能还需要检查 cd,不仅仅是操作符号!

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 != '-'),它将始终计算为true,因此您将被卡住。如果这是您第一次使用for循环,请考虑打印迭代器值,以了解您卡在何处和何时。
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?
       }

   }

0

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

直播


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接