需要帮助do-while循环程序?(c++)

Need help do-while loop program? (C++)

本文关键字:c++ 程序 循环 帮助 do-while      更新时间:2023-10-16

我正在尝试创建一个程序,该程序将接受用户输入(标记)并将这些标记的平均值输出到字母等级。我相信我已经成功地让程序成功地计算平均分,但是它不会输出正确的字母等级?

有什么建议吗?编辑:也许是计算中的问题,因为我的输出总是给出"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;
}

需要考虑的几点:

  1. 你的成绩分配应该考虑average而不是marks。如果你使用标记,那么最后输入的值是-1,以退出你的do while循环,将用于评分,这将始终导致F级。

  2. do-while循环之后将endl添加到所有cout语句中。输出流可能已被缓冲,这可能导致cout语句不会出现在监视器上。endl将刷新输出流。

例如


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

仔细检查您的if语句。我敢打赌,你总是看到正确的平均值等于f。

在循环结束时,mark始终是-1。因此,所有的测试都失败了,您进入else子句,并输出f。修复方法是测试average,而不是mark