2013-10-24 43 views
0
for(i=0; i<NUM_STUDENTS; i++) 
{ 

    if(studentGrades[i]>=GRADE_BOUNDS[0]) 
    { 
     cout<<"Student "<<k<<" got "<<studentGrades[i]<<" which is a(n) "<<GRADE_LETTERS[0]<<endl; 
    } 

    else if(studentGrades[i]<GRADE_BOUNDS[10]) 
    { 
     cout<<"Student "<<k<<" got "<<studentGrades[i]<<" which is a(n) "<<GRADE_LETTERS[11]<<endl; 
    } 

    for(j=0; j<GRADE_COUNT; j++) 
    { 
     if(studentGrades[i]<GRADE_BOUNDS[j]&&studentGrades[i]>=GRADE_BOUNDS[j+1]) 
     { 
      cout<<"Student "<<k<<" got "<<studentGrades[i]<<" which is a(n) "<<GRADE_LETTERS[j+1]<<endl; 
      break; 
     } 
    } 
    k++; 
} 

大家好,輸出誤差,這是我的計算器上的第一篇文章,我會盡量保持我的問題準確,我目前在介紹編程所以請原諒我,如果我的片段是不是一流的我我還在學習。我負責設計一個程序,該程序將接受20個學生成績(0.0 - 100.0)的用戶輸入。 for循環接受輸入工作正常,我目前的問題是,當我輸入一個小於60的值(在這種情況下被認爲是F)時,程序將輸出「Student k got 59 which is a(n )F「連續兩次,但當我輸入任何大於60的值時,它都可以正常工作。這是爲什麼發生?我將包含我在這個片段中使用的兩個數組。最後的k ++只是一個累加器變量來保持學生的數量。並行陣列

我原來在嵌套for循環中有三條if語句,但我的教師建議我將其中的前兩個移動到外部循環,因爲前兩個if語句不使用變量「j」根本就不需要在嵌套循環中放入它們。它完美地工作,直到我做出這個改變。

**編輯忘了,包括GRADE_LETTERS陣列

const string GRADE_LETTERS[] = { "A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "D-", "F" }; 

const double GRADE_BOUNDS[] = { 92.0, 90.0, 87.0, 82.0, 80.0, 77.0, 72.0, 70.0, 67.0, 62.0, 60.0, 0.0 }; 
const int GRADE_COUNT = sizeof(GRADE_BOUNDS)/sizeof(GRADE_BOUNDS[0]); 
+0

歡迎來到StackOverflow!感謝您付出努力發佈代碼上下文並精確地構建您的問題 - 這確實有幫助。快樂的編碼! –

回答

0

你有兩個地方你都不可能打印的東西:

if(studentGrades[i]>=GRADE_BOUNDS[0]) // > 92.0 
    else if(studentGrades[i]<GRADE_BOUNDS[10]) // < 60.0 

if(studentGrades[i]<GRADE_BOUNDS[j]&&studentGrades[i]>=GRADE_BOUNDS[j+1]) 

GRADE_BOUNDS[0]是92.0,如果你輸入一個高於92的值,它不會觸發第二個條件。但GRADE_BOUNDS中的最後一項爲0,因此輸入介於0和60之間的值會觸發頂部條件(else if(studentGrades[i] < 60))和底部條件(if(studentGrades[i]< 60 &&studentGrades[i]>= 0))。

希望有幫助!

+0

非常感謝,這很有道理。它檢查if-then的條件,然後它會迭代嵌套的for循環,它不會檢查> = 92.0的上界,但它最終會再次檢查0 =

+0

優秀!我贊同你重新解釋答案的方式,以幫助你自己解釋。祝你的工作順利!不要擔心成爲初學者 - 我們都曾經在那裏。保持良好的工作。 –

0

得到一個分段錯誤,如果你有一個等級是你剛纔忘了繼續到下一個學生,一旦你發現他在第2 if語句:

if(studentGrades[i]>=GRADE_BOUNDS[0]) 
{ 
    cout<<"Student "<<i<<" got "<<studentGrades[i]<<" which is a(n) "<<GRADE_LETTERS[0]<<endl; 
    continue; 
}   
else if(studentGrades[i]<GRADE_BOUNDS[10]) 
{ 
    cout<<"Student "<<i<<" got "<<studentGrades[i]<<" which is a(n) "<<GRADE_LETTERS[11]<<endl; 
    continue; 
} 

另一個問題將是訪問j+1這將導致緩衝區溢出(另一個分段錯誤)

+0

我還沒有學過continue關鍵字,我在猜測如果我繼續使用,它會完全跳過嵌套的for循環,並重新循環第一個for循環? Noob問題我知道>> –

+0

它會運行遞增計數器,如果它滿足條件,它將再次進入循環(結束當前迭代)。 – RonenKr

+0

分段錯誤,無法確定需要什麼,但我不相信我正在訪問此代碼段中的任何位置的-1索引。我同意訪問j + 1最終會導致溢出,但只有當等級不在0.0-100.0的範圍內時,纔是正確的?它可能導致溢出的唯一方法是,如果通過0.0-100.0搜索未找到輸入。它會嘗試搜索不存在的GRADE_BOUNDS [13]。我想我不確定你在說什麼 –