2011-10-28 66 views
0

我正在尝试创建一个程序,它将采用用户输入(标记)并将这些标记的平均值输出为字母等级。 我相信我已经成功地让程序成功计算出平均值,但是它不会输出正确的字母等级?需要帮助的do-while循环程序? (C++)

有什么建议吗? 编辑:也许这是一些在计算中,因为我的输出总是给人百分比为“F”级....

// Used iomanip to display averages for possible three digit or greater answers. 
#include <iostream> 
#include <iomanip> 
using namespace std; 

// Set up my program using only main() 
int main() 
{ 
    //Created the variable 'mark' so the user input can be stored and tested in the do-while condition. 
    //Variable 'sum' and 'average' to calculate mark and then be tested against letter grades. 
    //'counter' used to keep track of number of terms being averaged. 
    double mark=0, sum=0, average=0; 
    int counter=-1; 

    // Do-while statement to test the loop. Gets input from user, and tests whether it is a a valid letter grade. 
    // Marks below 0 or above 100 will test true and loop back re-promting the user for another mark. 
    // If tested condition is false, then if statements then test the mark and output the letter grade. 

    cout << "Please enter marks to calculate average, and enter -1 to stop and find letter equivalence. " << endl; 

    do 
    { 
     if (mark < 0 || mark > 100) 
     { 
      cout << "Entered mark is invalid. Please try again, or enter -1 to stop and find letter equivalence. " << endl; 
      break; 
     } 

     sum = sum + mark; 
     counter++; 
     cin >> mark; 

    } 
    while (mark != -1); 

    average = sum/counter ; 

    //What happens when above statement is false... 
    if (mark >= 90) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of A+ "; 
     } 
    else if (mark >=80) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of A "; 
     } 
    else if (mark >=70) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of B "; 
     } 
    else if (mark >=60) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of C "; 
     } 
    else if (mark >=50) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of D "; 
     } 
    else 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of F "; 
     } 
return 0; 
} 
+0

问题是什么? – jman

回答

1

夫妇的事情要考虑:

  1. 您的成绩分配应该考虑average而不是marks。如果您使用标记,则最后输入的值-1退出您的do while循环将用于评分哪一个总是会导致F等级。

  2. 添加endldo-while循环后,所有的cout语句。输出流可能已被缓冲,这可能会导致cout语句不出现在您的显示器上。 endl将刷新输出流。

例如,
cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of A+ " << endl;

+0

对于您的第一部分建议,如果我的平均计算在do-while循环之后发布,我该如何实现这一目标?我试图在编译器中,结果是没有输出?!谢谢 –

+0

这对我来说似乎是功课。我不会提供代码。如果你的编辑器支持调试,那么跳过你的代码并仔细观察变量。如果不是,请添加调试语句,以查看您出错的位置。 – srikanta

+0

我对调试器是新手,但经过几次尝试后,我设法做到了,并意识到我可怜的错误D: 谢谢你的耐心,真的很感激它! –

0

仔细检查您的if报表。我打赌你总是看到正确的平均值等于F.

+0

你会做什么来阻止我的正确平均值总是'F'? 我不确定如何将平均值与我的if语句进行比较,因为我的平均计算结果是在我的while语句之后? –

0

在循环结束时,mark始终为-1。因此,所有测试都失败了,您将遇到else子句,并输出F.此修复程序将测试average,而不是mark

+0

当我的平均值的计算超出循环范围时,如何测试平均值,因此无法测试? –

+0

不,我的意思是在输出平均值的'if' /'else if'树中。 –

+0

if/else if树用于确定用户输入是否有效.... if语句正在测试用户是否放入了有效标记。我不确定为什么要测试平均值? –