Хорошо, ребята, я новичок в программировании и нуждаюсь в небольшой помощи. У меня есть программа, которая принимает предложение, которое вводит и показывает количество слов и гласных. Затем я хочу повторить программу, если пользователь этого захочет, но когда я использую цикл 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;
}
Выражение (repeat == 'y' && repeat == 'Y')
всегда будет равным false, так как repeat
не может быть равно 'y'
и 'Y'
.
Возможно, вы имели в виду:
(repeat == 'y' || repeat == 'Y');
Главное, чтобы помнить, что С++ делает так называемую короткоцепочечную оценку. Если одна из сторон условия && является ложной, тогда все ложно. Например,
int y = 1;
int x = 2;
if (y == 0 && x ==2) {
....
}
Он просто проверяет первую часть. Поскольку y = 1, он вернет ложное логическое значение, и этот оператор if никогда не будет выполнен.
Как и мудрый, с или, ||, если одна сторона условия истинна, тогда условие вернет True Boolean, а затем условие будет выполнено.
Для вашей ситуации правильным способом сделать это будет:
(repeat == 'Y' || repeat == 'y');
Таким образом, если первая сторона истинна, тогда условие будет выполнено и оно будет выполнено.
Изменить (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 = ' ';
}
Попробуйте заменить repeat == 'y' && repeat == 'Y'
с repeat == 'y' || repeat == 'Y')
repeat == 'y' || repeat == 'Y')
, потому что условие в вашем коде никогда не может быть правдой.
Вам нужно установить repeat
в начале вашего цикла на что-либо еще, кроме Y
или y
(например: repeat = NULL;
)
(repeat == 'y' && repeat == 'Y');
всегда будет ложным Как это может равняться обоим?(repeat == 'y' || repeat == 'Y');