Для цикла не останавливается - PullRequest
2 голосов
/ 05 октября 2011

У меня есть цикл for в функции, которая не останавливается. Вот вся функция, которая используется для нахождения оценок человека, их сложения и последующего отображения среднего значения на экране:

float Student::average() { 
   cout << "How many grades would you like to enter? (Up to ten)\n";
   float x;
   cin >> x;

   cout << "What is your first grade?";
   cin >> grade[0];
   int i = 1;
   for (i; i = x; i++) {
      cout << "What is the next number?\n";
      cin >> grade[i];
   }
   averageGrade = std::accumulate(grade, grade+10, 0.0);
   averageGrade = averageGrade / 10;

   return averageGrade;
}

А вот цикл for сам по себе:

for (i; i = x; i++) {
   cout << "What is the next number?\n";
   cin >> grade[i];
}

Ошибка также выводит (но все еще позволяет программе работать), говоря:

1> c: \ users \ hastudent \ Documents \ visual studio 2008 \ projects \ Weapons \ Weapons \ Weapon.cpp (25): предупреждение C4244: '=': преобразование из 'float' в 'int', возможная потеря данных

1> c: \ users \ hastudent \ documents \ visual studio 2008 \ projects \ Weapons \ Weapons \ arms.cpp (30): предупреждение C4244: '=': преобразование из 'double' в 'float', возможная потеря данных

Программа доходит до того момента, когда запрашивает следующий номер. Затем вы вводите номер, и он постоянно спрашивает вас об этом.

Ответы [ 5 ]

8 голосов
/ 05 октября 2011

Цикл for должен выглядеть следующим образом:

for (int i = 1; i < x; i++)

Теперь у вас (i = x) есть назначение от x до i, тогда как вы, вероятно, намеревались сравнение . В этом случае правильное сравнение для использования «меньше, чем» (i < x).

2 голосов
/ 05 октября 2011

Ваш цикл for запустился навсегда, потому что:

  • i = x является присваиванием, а не проверкой на равенство.
  • его значение равно значению левой стороны
  • вы дали ему ненулевые значения
  • , и ненулевое значение истинно в C ++.

Если вы хотите проверить равенство, используйте ==.Однако в этом случае вы хотите

1 голос
/ 05 октября 2011

Вторая часть цикла for - это условие «Когда продолжить», а не «когда остановиться».

Поскольку вы начинаете с индекса 1 (нетрадиционного, но не неслыханного в C ++), вам следует выполнить итерацию до указанного числа:

for(i = 1; i <= x; ++i)

Обратите внимание, что даже если условие было «когда выйти», = - это присваивание в C ++, тогда как == - это сравнение на равенство.

1 голос
/ 05 октября 2011

Вы пробовали печатать значение i в цикле for?Вы начинаете с x и продолжаете увеличиваться.

Это, вероятно, должно быть:

for(int i=0; i<x; i++) { /* do something */ }

Обычно вы начинаете считать с 0, а не с 1.

Основная проблема в том, что, где вы делаете i = x, вы хотитевместо этого поставьте условие, которое должно выполняться на каждой итерации цикла (которое называется инвариант цикла ), то есть i

0 голосов
/ 05 октября 2011

используйте! = (Оператор сравнения) вместо = (оператор присваивания) в цикле FOR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...