2011-10-05 253 views
2

我有一個不會停止的函數for循環。 這裏是一個用於查找一個人的成績全功能,將它們添加在一起,則顯示的平均屏幕上: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 \ weapon \ weapon.cpp(25):warning C4244 :'=':收斂sion從'float'到'int',可能丟失數據

1> c:\ users \ hastudent \ documents \ visual studio 2008 \ projects \ weapons \ weapon \ weapon.cpp(30):warning C4244:' =」:轉換從‘雙’到‘浮動’,數據

該程序起到其要求的下一個號碼的點的可能的損失。然後你輸入號碼,它一直問你。

+0

這些是_warnings_,而不是_errors_。 –

+0

你應該爲'x'使用'int';我認爲不可能輸入一半的成績。另外,您應該認真考慮爲變量使用更多描述性名稱。使用'i'作爲計數器是好的,但用'numGrades'代替'x'將使代碼更容易閱讀。 –

+0

實際上我有numGrades之前,但我改變它爲我的易用性。此外,for循環現在可以工作,但現在無論何時顯示averageGrade,控制檯都只顯示其內存地址。 – ChrisMP

回答

8

for循環應爲:

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

你現在有什麼(i = x)是xi分配,而你可能是打算一個比較。在這種情況下,使用的正確比較是「小於」(i < x)。

+0

+1:中間條款是「只要情況如此」,而不是「直到這種情況」......即使是這樣,OP的意思是「==」而不是「=」。 –

+0

我的指數確實從零開始。查看for循環開始之前的代碼。 – ChrisMP

+0

@ user980583:我的不好,答案已糾正。 – NPE

1

你有沒有嘗試在for循環中打印我的值?你從x開始,並繼續增加。

這也許應該是:

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

通常你從0開始計數,而不是1

的主要問題是,你做我= X你想放而不是條件是必須如果從i = 0開始,或者像其他人所建議的那樣i == x,如果從i = 1開始計數,則保持在循環的每次迭代(即所謂的loop invariant),即i < x。

2

您的循環永遠跑,因爲:

  • 我= x是分配的,而不是一個平等的測試。
  • 它的值是左手側
  • 的價值,你給它的非零值
  • 和非零值是true在C++中。

如果你想要一個平等的測試,使用==。但是,在這種情況下,你想要一個<最好的。

1

for迴路的第二部分是「當繼續」狀態,而不是「何時停止」。

因爲你開始與指數1(非常規但在C並非聞所未聞++),你應該循環到數問題:

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

注意,即使條件是「何時退出」 =是在C++中的賦值,而==是等同比較。

0

在FOR循環中使用!=(比較運算符)而不是=(賦值運算符)。