Пока L oop в For Loop - PullRequest
       15

Пока L oop в For Loop

3 голосов
/ 30 января 2020

Я пытаюсь сосчитать кошек и собак в одну строку. Итак,

например:

если строка "cc + dd-cd",:

Я хочу сосчитать 2 positive cats, 2 positive dogs, 1 negative cat, 1 negative dog (да, я знаю, что это странный способ подсчета, но это часть моего назначения).

Я думал о создании для l oop, где я перебрал строку, затем вложил внутри для l oop у меня будет некоторое время l oop, которое будет работать до «-», а затем до «+» или до конца. Я запустил код, и даже не углубившись в него, он создал бесконечную l oop.

Вопрос: как я могу это исправить?

Спасибо!

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

   }


Ответы [ 4 ]

4 голосов
/ 30 января 2020

Непосредственная проблема заключается в том, что while цикл проверяет значение k, но не изменяет его. Поэтому, как только вы введете один из них, вы застрянете там бесконечно, поскольку k не изменяется внутри тела l oop.

Я бы не стал возиться с вложенными циклами - я бы просто go по всей строке в одном l oop и оцените каждый символ по очереди. Оптимальный способ выполнить sh - это сохранить состояние того, добавляете ли вы или вычитаете (в зависимости от того, встречали ли вы в последний раз знак + или -:

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 голос
/ 30 января 2020

Этот пост описывает итерацию всех символов в строку.

Это простое решение с использованием современного 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 или напечатайте наши переменные как go, используя std :: cout
3. Явное указание пространства имен считается хорошей практикой. т.е.:

// preferable:  
std::string myString; 
// avoid:  
using namespace std;  
string myString   
0 голосов
/ 30 января 2020

for и while совместный подход излишне сложен. Вот более простое решение:

#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

0 голосов
/ 30 января 2020

Чтобы ваш код работал без особых изменений, вы можете просто заменить условие while() на if(). Более того, вместо проверки значения итератора k, вы должны сравнить k-й строковый элемент animalparkString[k].

Тогда вы можете начать задаваться вопросом, действительно ли написанный вами код выполняет то, что вы ожидаете. Возможные вопросы, на которые вы можете попытаться ответить: «Как я могу отличить guish между положительным или отрицательным числом» и затем «как я могу отличить guish между кошками и собаками»? Возможно, вам придется проверить также на c с и d с, а не только на знак операции!

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

   }
...