С ++ программа не продолжается после цикла - PullRequest
0 голосов
/ 04 мая 2020
#include <iostream>
using namespace std;

class movie {
private:

string rating;

public:
string title;
string director;


movie(string aTitle, string aDirector, string aRatings) {
    title = aTitle;
    director = aDirector;
    setrating(aRatings);
};

void setrating(string aRating) {

    // this loop checks to see if the rating entered is valid
 do
    if (aRating == "G" || aRating == "PG" || aRating == "PG-13" || aRating == "18" || aRating == "NR") {


        rating = aRating;
    }
    else {

        cout << "rating must be, G, PG, PG-13, 18 or NR \n";
        cout << "enter the rating: ";
        cin >> aRating;
    }
 while (aRating != "G" || aRating != "PG" || aRating != "PG-13" || aRating != "18" || aRating != "NR");
}

string getrating() {

    return rating;

}
};

int main()
{

movie avengers("The Avengers", "Joss Whedon", "PG-13");
avengers.setrating("dog");

cout << avengers.title << "\n";
cout << avengers.director << "\n";
cout << avengers.getrating() << "\n";
}

Кажется, я не могу вывести программу из-за того, что l oop, как только я ввожу правильное значение, l oop останавливается, но остальная часть программы не продолжается. Если правильное значение уже есть, программа просто ничего не отображает.

программа должна попросить пользователя ввести правильную оценку, если введенная оценка неверна, программа будет l oop, пока переменная не будет равна единице. ценностей. Затем программа должна отобразить заголовок, режиссера и рейтинг (эта последняя часть в настоящее время не работает).

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Ваше логическое условие неверно:

while (aRating != "G" || aRating != "PG" || aRating != "PG-13" || aRating != "18" || aRating != "NR");

Напишите несколько примеров, и вы увидите, что это условие всегда верно. (любое значение aRating всегда будет, например, не G или не PG ).

Вам необходимо заменить все || на && s.

Кроме того, ваш do-while l oop имеет недостатки, так как вы не будете назначать rating, когда это необходимо. Вместо этого вы могли бы реструктурировать его следующим образом:

do 
{
   cout << "rating must be, G, PG, PG-13, 18 or NR \n";
   cout << "enter the rating: ";
   cin >> aRating;
} while (aRating != "G" && aRating != "PG" && aRating != "PG-13" && aRating != "18" && aRating != "NR");

// now just assign
rating = aRating;

Это также позволяет избежать необходимости по существу прописывать ограничения дважды.

1 голос
/ 04 мая 2020

Вам нужно использовать && вместо || в строке

while (aRating != "G" || aRating != "PG" || aRating != "PG-13" || aRating != "18" || aRating != "NR");

Лучше альтернативой было бы поместить лог c «is valid valid» в его собственную функцию и использовать это и в операторе if, и в операторе do while.

bool isValidRating(strting const& aRating)
{
   return (aRating == "G" || aRating == "PG" || aRating == "PG-13" || aRating == "18" || aRating == "NR");
}

void setrating(string aRating)
{
   // this loop checks to see if the rating entered is valid
   do
   {
      if ( isValidRating(aRating) )
      {

         rating = aRating;
      }
      else
      {
         cout << "rating must be, G, PG, PG-13, 18 or NR \n";
         cout << "enter the rating: ";
         cin >> aRating;
      }

   } while ( !isValidRating(aRating) );
}

Вторая функция может быть упрощена до:

void setrating(string aRating)
{
   while  ( !isValidRating(aRating) )
   {
      cout << "rating must be, G, PG, PG-13, 18 or NR \n";
      cout << "enter the rating: ";
      cin >> aRating;
   }

   rating = aRating;
}
...