2016-10-22 2 views
-3

Проблема заключается в том, чтобы найти все гласные все четные слова в общем количестве предложений, другими словами, эти гласные должны выполняться любым четным словом в предложении. Но я, когда я вхожу, например: «ewedyua aiuye dswidje ieuayj eeee eeeui dajhdfjcne aodijsbfe». я получаю: EIU , но «е», как ожидается, в качестве последнего слова даже не содержит «и» (я использую «» только для разделения здесь в тексте и не использовать их в выводе)отладка программы на C++ с помощью <set> контейнеров

Программа:

int main(){ 
string str; 
char ch = ' '; 
set<char> strSet; 
set<char> resultSet; 
set<char> tempSet; 
int count = 1; 
int i = 0; 

cout << "Enter a line: "; 
getline(cin, str); 
str = delOverSpace(str); // delete excessive gaps<br> 
do { 
ch = str.at(i); 
if(((count % 2) == 0) && (ch != ' ')){ // this is an even word and not a gap 
    if(isVowel(upperToLower(ch))) // this is a vowel 
    tempSet.insert(upperToLower(ch)); 
    } 

    if (ch == ' ') { // if we've passed through the word add inforamtion on it 
    if(((count % 2) == 0) && (count/2) == 1) 
    strSet.insert(tempSet.begin(), tempSet.end()); 
    else if (((count % 2) == 0) && (count/2) != 1){ 
    set_intersection(
    strSet.begin(),strSet.end(), tempSet.begin(), tempSet.end(), 
    insert_iterator<set<char> >(resultSet, resultSet.begin()) 
    ); 

    strSet.clear(); 
    tempSet.clear(); 
    strSet.insert(resultSet.begin(), resultSet.end()); 
    resultSet.clear(); 
    } 
    count++; 
} 

i++; 
}while(ch != '.'); 

if (count == 2) cout << "Only one word was entered" << endl; 
else if (strSet.empty()) cout << "No vowels were found" << endl; 
else { 

copy(strSet.begin(), strSet.end(), ostream_iterator<char>(cout, " ")); 
cout << endl; 
} 

return 0; 
} 
+1

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить [Минимальный, Полный и Подтверждаемый] (http: // stackoverflow.com/help/mcve) пример, который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчике. –

+0

При переходе кода в отладчик обычно помогает помещать отдельные инструкции в отдельные строки, в противном случае отладчик может переходить на операторы, которые фактически выполняются. Я говорю о ваших строках 'if (...) cout << ...'. Это не так плохо, так как вы увидите результат, но если эти однострочные элементы не содержат вывода, отлаживать его гораздо сложнее. Эти строки не ошибаются, они просто делают процесс отладки немного сложнее. –

+0

Я вижу, спасибо за помощь. – Neyroman

ответ

0

Не пытайтесь использовать одну переменную-счетчик для различных целей. Например, вы можете использовать count для текущего количества символов в текущем слове и words для подсчета слов. В вашем примере вы делаете count слишком усердно.

Решите, что вы рассчитываете. Вы хотите считать каждого персонажа? Или вы хотите считать символы в текущем слове?

При наращивании счетчика попробуйте поставить его рядом с логикой, которая ему нужна. Например, i++ должен идти сразу после того, как вы использовали его для получения следующего символа. И count должен быть увеличен в блоке, который обрабатывает буквы (т. Е. Не пробел, а не точку). Если счетчики слишком далеко от того, что они отслеживают, вы можете ввести ошибки.

Перенесите сначала пробел, а также проверьте на конец предложения . Очистить отступы помогает следовать коду - я использую 4 символа, но 2 или 3 в порядке. Отступы с 1 символом трудно читать.

Используйте пустые строки, чтобы разделить различные куски логики.

Вы можете добавить логику для обработки пунктуации как ,, ?, ! и т.д.

Когда вы обрабатываете входную строку, которая разделяется на слова, часто легче обращаться конец входного состояния вне петля. В этом случае петля выходит после того, как она берет последнюю букву. Если это не ., тогда у вас будет необработанное слово, сидящее в tempSet. Вы можете попробовать и ожидать этого в цикле, но кажется более естественным выйти из цикла и проверить, есть ли что-то, что осталось обработать.

Если вы разделите свою логику на четко разделенные блоки, вы можете установить контрольные точки внутри каждого блока. Затем вы узнаете, в какой ситуации вы справляетесь. Вы можете разбить внутреннюю логику конца слова и проверить tempSet и count. Они такие, чего вы ожидаете? И в разделе else вы можете проверить ch и проверить, правильно ли он классифицирован как гласный.

int main() { 

    string str; 
    char ch = ' '; 
    set<char> strSet; 
    set<char> tempSet; 

    int count = 0, words = 0, i = 0; 
    cout << "Enter a line: "; 
    getline(cin, str); 
    str = delOverSpace(str); // delete excessive gaps<br> 

    while (i < str.size() && ch != '.') { 

     // Get next character 
     ch = str.at(i); 
     i++; 

     if (ch == ' ' || ch == '.') { // if we've passed through the word add inforamtion on it 
      if(count > 0 && ((count % 2) == 0)) { 
       strSet.insert(tempSet.begin(), tempSet.end()); 
       words++; 
      } 
      count = 0; // reset the char counter 
      tempSet.clear(); // clear the temp vowel set 
     } 
     else { 
      // letter - not a space or a dot, increase the character count 
      count++; 
      if(isVowel(upperToLower(ch))) // this is a vowel 
       tempSet.insert(upperToLower(ch)); 
     } 
    } 
    // pick up any unprocessed word if we hit end of input without seeing '.' 
    if (count > 0 && ((count % 2) == 0)) { 
     strSet.insert(tempSet.begin(), tempSet.end()); 
     words++; 
    } 

    if (words == 0) 
     cout << "No words entered" << endl; 
    else if (words == 1) 
     cout << "Only one word was entered" << endl; 
    else if (strSet.empty()) 
     cout << "No vowels were found" << endl; 
    else { 
     copy(strSet.begin(), strSet.end(), ostream_iterator<char>(cout, " ")); 
     cout << endl; 
    } 
    return 0; 
} 
+0

John D, большое спасибо за ваш ответ, это было очень полезно – Neyroman

Смежные вопросы