2013-10-24 42 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]。我想我不确定你在说什么 –