Member 13479017 Ответов: 3

Как выйти из цикла?


Я создал программу на языке Си++ для вычисления средней оценки студента. Первая часть работает, но когда я набираю "готово", чтобы выйти, моя программа проходит через бесконечный цикл и не перестает производить числа.

Вот мой код:

#include <iostream>

using namespace std ;

void studentGrade (string) ;

int main ()
{
	string name ;
	int scoreOne, scoreTwo, scoreThree, scoreFour, scoreFive, scoreSix, scoreSeven, scoreEight, scoreNine, scoreTen ;
	float average = 0 ;			//stores the average of all grades
	float total = 0 ;			//stores sum of grades
	char letterGrade ;			//stores the final letter grade of student
	name = "zero" ;
	studentGrade (name) ;
	
}
void studentGrade (string name)
{
	int scoreOne, scoreTwo, scoreThree, scoreFour, scoreFive, scoreSix, scoreSeven, scoreEight, scoreNine, scoreTen ;
	char letterGrade ;
	float average = 0 ;
	float total = 0 ;
	while (name != "done")
	{
		cout << "Enter student's name." << endl ;
		getline (cin, name) ;
		cin.ignore () ;
		if (name != "done")
		{
			cout << "Enter " << name << "'s 10 test scores." ;
			cin >> scoreOne >> scoreTwo >> scoreThree >> scoreFour >> scoreFive >> scoreSix >> scoreSeven >> scoreEight >> scoreNine >> scoreTen ;
			total = scoreOne + scoreTwo + scoreThree + scoreFour + scoreFive + scoreSix + scoreSeven + scoreEight + scoreNine + scoreTen ;
			average = total / 10 ;
			if (average > 89.5)
				letterGrade = 'A' ;
			else if (average > 79.5)
				letterGrade = 'B' ;
			else if (average > 69.5)
				letterGrade = 'C' ;
			else if (average > 59.5)
				letterGrade = 'D' ;
			else
			letterGrade = 'F' ;
		cout << "Student's name: " << name << endl ;
		cout << "Average Grade: " << average << endl ;
		cout << "Letter Grade: " << letterGrade << endl ;
		name = "zero" ;
		}
		else
			cout << "All student's done." << endl ;
	}
	cout << "All student's done." << endl ;
}


Что я уже пробовал:

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

Jingchun Su

у вас есть файлы из вашего компьютера?

Jingchun Su

А где же класс Е?

Jingchun Su

у кого-то из учеников есть оценка F??

3 Ответов

Рейтинг:
25

CPallini

Цитата:
в то время как (имя != "готово")
{
соиь <&ЛТ; "введите имя учащегося." на << епси ;
getline (cin, имя) ;
Кин.игнорировать () ;
если (имя != "готово")
{
cout << "Enter" << name << "s 10 баллов теста." ;
cin >> scoreOne >> scoreTwo >> scoreThree >> scoreFour >> scoreFive >> scoreSix >> scoreSeven >> scoreEight >> scoreNine >> scoreTen ;
итого = scoreOne + scoreTwo + scoreThree + scoreFour + scoreFive + scoreSix + scoreSeven + scoreEight + scoreNine + scoreTen ;

Переместите cin.ignore(); заявление, чтобы получить
while (name != "done")
	{
		cout << "Enter student's name." << endl ;
		getline (cin, name) ;
		
		if (name != "done")
		{
			cout << "Enter " << name << "'s 10 test scores." ;
			cin >> scoreOne >> scoreTwo >> scoreThree >> scoreFour >> scoreFive >> scoreSix >> scoreSeven >> scoreEight >> scoreNine >> scoreTen ;
            cin.ignore (); // <--- moved here
			total = scoreOne + scoreTwo + scoreThree + scoreFour + scoreFive + scoreSix + scoreSeven + scoreEight + scoreNine + scoreTen ;


Jingchun Su

Это хорошие решения?

CPallini

Лучше, чем у тебя, по крайней мере :-)
(Шучу, конечно)

Jingchun Su

лол

Member 13479017

Это исправило проблему...большое вам спасибо!

CPallini

Добро пожаловать.

Рейтинг:
2

Rick York

Попробуйте изменить петли на что-то вроде этого :

while( true )
{
    cout << "Enter student's name." << endl;
    getline( cin, name );
    cin.ignore();
    if( name == "done" )
        break;
    // continue logic here
}


Рейтинг:
2

Jingchun Su

Просто добавить

break
там, где вы думаете, что вам нужно остановить цикл.


CPallini

ОП уже имеет условие остановки (в операторе while), проблема возникает из-за того, что неоплазия не использует символ новой строки.

Jingchun Su

окей