我的程序中存在什么问题?为什么无法显示最终输出

时间:2019-05-12 14:38:42

标签: c++

无法显示最终结果。

/ *一位老师有五名学生参加了四项考试。老师根据以下四个评分的平均值,使用以下评分标准为学生分配字母评分: 90-100安 80-89乙 70-79摄氏度 60-69天 0-59英尺

编写一个程序,该程序使用字符串对象数组来保存五个学生的姓名,使用五个字符数组来保存五个学生的字母成绩,并使用五个数组(每个数组包含四个双打)来保存每个学生的测试分数集。 enter code here 该程序应允许用户输入每个学生的姓名以及他或她的四个测试分数。然后,它应该计算并显示每个学生的平均考试成绩,并根据该平均成绩得出字母等级。 输入验证:请勿接受小于零或大于100的测试分数。* /

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    const int SUBJECT=4,STUDENT=5;
    string name[5];
    char grade[5];
    double score[SUBJECT][STUDENT];
    double average[5];
    int i,j,k,l;

    for (k=0;k<STUDENT;k++)
    {
        cout<<"Enter the name of student "<<k+1<<":"<<endl;
        getline(cin,name[k]);
    }

    for (i=0;i<STUDENT;i++)
    {
        double sum=0;

        for (j=0;j<SUBJECT;j++)
        {
            cout<<"Enter the test scores of subject "<<j+1<<" for "<<name[i]<<":";
            cin >> score[i][j];

            while (score[i][j] < 0||score[i][j] > 100)
            {
                cout<<"Invalid test score! Test scores can't be less than 0 or greater than 100."<<endl;
                cout<<"Enter again the test scores of subject "<<j+1<<":";
                cin >> score[i][j];
            }
            sum+=score[i][j];
            average[i]=sum / SUBJECT;
        }
    }

    cout<<setw(30)<<"Student's name"<<setw(25)<<"Average test score"<<setw(15)<<"Letter Grade"<<endl;
    cout<<"------------------------------------------------------------------------------------------"<<endl;

    for (l=0;l<STUDENT;l++)
    {
        if (average[l]>=90)
            {
                grade[l]='A';
            }
            else if (average[l]<90 && average[l]>=80)
            {
                grade[l]='B';
            }
            else if (average[l]<80 && average[l]>=70)
            {
                grade[l]='C';
            }
            else if (average[l]<70 && average[l]>=60)
            {
                grade[l]='D';
            }
            else
            {
                grade[l]='F';
            }

            cout<<setw(30)<<name[l]<<setw(25)<<average[l]<<setw(9)<<grade[l];
    }



  return 0;
}

在程序终止之前,没有显示最终结果名称,平均值和等级。

2 个答案:

答案 0 :(得分:0)

您的代码中有几个问题:

  • 在此行cin >> score[i][j];中,i与一名学生有关,而j与一个科目有关,而声明为score [SUBJECT] [STUDENT]
  • 平均值必须在主题循环之后计算
  • 您应该避免使用魔术常数,就像名字[5]一样
  • 最好避免使用using namespace std;
  • 最好更好地封装变量ij,因此不要将它们声明为全局变量

这是一个有效的示例。请注意,最终的输出仍然需要优化,但是我让您做到了!

#include <iostream>
#include <iomanip>
#include <string>

//using namespace std;

int main()
{
    const int SUBJECT = 4,STUDENT = 5;
    std::string name[STUDENT];
    char grade[STUDENT];
    double score[STUDENT][SUBJECT];
    double average[STUDENT];

    for (int i = 0; i < STUDENT;i++)
    {
        std::cout << "Enter the name of student " << i+1 << " : " << std::endl;
        getline (std::cin,name[i]);
    }

    for (int i = 0; i < STUDENT; i++)
    {
        double sum = 0;
        for (int j = 0; j < SUBJECT; j++)
        {
            std::cout << "Enter the test scores of subject "<<j+1<<" for "<<name[i]<<": ";
            std::cin >> score[i][j];

            while (score[i][j] < 0||score[i][j] > 100)
            {
                std::cout<<"Invalid test score! Test scores can't be less than 0 or greater than 100." << "\n";
                std::cout<<"Enter again the test scores of subject " << j+1 << ": ";
                std::cin >> score[i][j];
            }
            sum += score[i][j];
        }
        average[i] = sum / SUBJECT;
    }

    std::cout << std::setw(30) << "Student's name" << std::setw(25) << "Average test score" << std::setw(18) << "Letter Grade" << "\n";
    std::cout<<"------------------------------------------------------------------------------------------" << "\n";

    for (int i = 0;i < STUDENT; i++)
    {
        if (average[i]>=90)
            {
                grade[i]='A';
            }
            else if (average[i]<90 && average[i]>=80)
            {
                grade[i]='B';
            }
            else if (average[i]<80 && average[i]>=70)
            {
                grade[i]='C';
            }
            else if (average[i]<70 && average[i]>=60)
            {
                grade[i]='D';
            }
            else
            {
                grade[i]='F';
            }

            std::cout<<std::setw(30)<<name[i]<<std::setw(25)<<average[i]<<std::setw(20)<<grade[i]<<"\n";
    }

  return 0;
}

答案 1 :(得分:-2)

如何在最后一个<<endl表达式中添加cout语句。这应该将内部缓冲区刷新到输出。