C ++ застрял в бесконечном цикле

0

Хорошо, ребята, я новичок в программировании и нуждаюсь в небольшой помощи. У меня есть программа, которая принимает предложение, которое вводит и показывает количество слов и гласных. Затем я хочу повторить программу, если пользователь этого захочет, но когда я использую цикл do-while, он застревает в бесконечном цикле. После того, как я введу "Y", чтобы повторить, он возвращается назад, чтобы показать гласные и количество слов, введенных для предыдущего предложения.

Вот мой код:

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    char sentence[50];
    int countA=0, countE=0, countI=0, countO=0, countU=0, countSP=0;
    char repeat;

    do {
    cout << "Enter sentence : ";
    cin.get(sentence, 50, '\n'); cin.ignore(10, '\n');


    cout << sentence;
    cout << "\nThird character is : " << sentence[2];
    cout << "\nLast character is : " << sentence[strlen(sentence)-1];
    cout << "\nLength of sentence is : " << strlen(sentence);

    for(int x=0; x < strlen(sentence); x++) {
        char ch = tolower (sentence[x]);
        switch (ch) {
        case 'a':   countA++;break;
        case 'e':   countE++;break;
        case 'i':   countI++;break;
        case 'o':   countO++;break;
        case 'u':   countU++;break;
        case ' ':   countSP++;break;
        }
    }


    cout << "\nNumber of A : " << countA;
    cout << "\nNumber of E : " << countE;
    cout << "\nNumber of I : " << countI;
    cout << "\nNumber of O : " << countO;
    cout << "\nNumber of U : " << countU;
    cout << "\nNumber of words : " << countSP+1;

    cout << "\n\nWould you like to enter a new sentence? (Y/N): ";
    cin >> repeat;

    }while (repeat == 'y' || repeat == 'Y');

    _getche();
    return 0;
}
  • 5
    (repeat == 'y' && repeat == 'Y'); всегда будет ложным Как это может равняться обоим?
  • 2
    я думаю, что вы имеете в виду (repeat == 'y' || repeat == 'Y');
Показать ещё 1 комментарий
Теги:
loops
while-loop
infinite

5 ответов

3

Выражение (repeat == 'y' && repeat == 'Y') всегда будет равным false, так как repeat не может быть равно 'y' и 'Y'.

Возможно, вы имели в виду:

(repeat == 'y' || repeat == 'Y');
  • 0
    Извините, да, это должно быть «или», я изменил его, когда возился с кодом, и забыл изменить его, прежде чем вставить его в это. Это когда у меня есть «или», это застревает в петле.
1

Главное, чтобы помнить, что С++ делает так называемую короткоцепочечную оценку. Если одна из сторон условия && является ложной, тогда все ложно. Например,

int y = 1;
int x = 2;
if (y == 0 && x ==2) {
....
}

Он просто проверяет первую часть. Поскольку y = 1, он вернет ложное логическое значение, и этот оператор if никогда не будет выполнен.

Как и мудрый, с или, ||, если одна сторона условия истинна, тогда условие вернет True Boolean, а затем условие будет выполнено.

Для вашей ситуации правильным способом сделать это будет:

(repeat == 'Y' || repeat == 'y');

Таким образом, если первая сторона истинна, тогда условие будет выполнено и оно будет выполнено.

1

Изменить (repeat == 'y' && repeat == 'Y'); to (repeat == 'y' || repeat == 'Y');

EDIT: У вас также нет брекетов, чтобы открыть или закрыть вашу петлю.

while (repeat == 'y' || repeat == 'Y')
   {
      _getche();
   }

потому что цикл не имеет тела, и он не знает, что выполнить.

EDIT2 почему бы не сделать это?

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
     do while (repeat == 'y' || repeat == 'Y') {
     Enter()
     cout << "\n\nWould you like to enter a new sentence? (Y/N): ";
     cin >> repeat;
}

}
return 0;

Enter(){
    char sentence[50];
    int countA=0, countE=0, countI=0, countO=0, countU=0, countSP=0;
    char repeat = Y;

cout << "Enter sentence : ";
cin.get(sentence, 50, '\n'); cin.ignore(10, '\n');


cout << sentence;
cout << "\nThird character is : " << sentence[2];
cout << "\nLast character is : " << sentence[strlen(sentence)-1];
cout << "\nLength of sentence is : " << strlen(sentence);

for(int x=0; x < strlen(sentence); x++) {
    char ch = tolower (sentence[x]);
    switch (ch) {
    case 'a':   countA++;break;
    case 'e':   countE++;break;
    case 'i':   countI++;break;
    case 'o':   countO++;break;
    case 'u':   countU++;break;
    case ' ':   countSP++;break;
    }



cout << "\nNumber of A : " << countA;
cout << "\nNumber of E : " << countE;
cout << "\nNumber of I : " << countI;
cout << "\nNumber of O : " << countO;
cout << "\nNumber of U : " << countU;
cout << "\nNumber of words : " << countSP+1;

repeat = ' ';
}
  • 0
    Извините, да, это должно быть «или», я изменил его, когда возился с кодом, и забыл изменить его, прежде чем вставить его в это. Это когда у меня есть «или», это застревает в петле.
  • 0
    Но это цикл "сделай пока"? Код, который должен быть выполнен, идет после do? Условие наступает через какое-то время, если повторение равно «Y» или «y». Нет?
1

Попробуйте заменить repeat == 'y' && repeat == 'Y' с repeat == 'y' || repeat == 'Y') repeat == 'y' || repeat == 'Y'), потому что условие в вашем коде никогда не может быть правдой.

  • 0
    Извините, да, это должно быть «или», я изменил его, когда возился с кодом, и забыл изменить его, прежде чем вставить его в это. Это когда у меня есть «или», это застревает в петле.
  • 0
    Когда вы говорите «бесконечный цикл», что именно делает или не делает код? Это просто повторяет всю программу, независимо от того, что вы печатаете?
Показать ещё 5 комментариев
0

Вам нужно установить repeat в начале вашего цикла на что-либо еще, кроме Y или y (например: repeat = NULL;)

  • 0
    Нет радости, все еще застрял в петле.
  • 0
    Извините, но если я скомпилирую ваш код с этим расширением (в Visual Studio 2012), все работает нормально. Может быть, вы могли бы дать нам больше информации? (например: компилятор, специальные настройки, которые вы сделали в своем проекте / компиляторе)
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню