C++ 课程代码用于确定最终成绩和平均成绩不起作用

C++ 课程代码用于确定最终成绩和平均成绩不起作用,c++,class,average,C++,Class,Average,我最近接到一个任务,要求我创建一个包含私有变量和成员函数/void函数的类。课程刚介绍给我,我的老师给了我一个我不太懂的作业。我遇到的问题是,平均分数和字母分数没有正确输出,如下所示。所有事情都必须在成员函数中进行。另外,我是否正确使用了成员函数?我在网上看到它们是在类中定义的,但在我的笔记中,我看到它们被引用并被当作用户定义的函数来处理。我感到困惑的是作业的这一部分: 成员函数将每个成员变量设置为给定值 作为函数的参数,成员函数用于检索 来自每个成员变量的数据,一个void函数 计算学生在整个

我最近接到一个任务,要求我创建一个包含私有变量和成员函数/void函数的类。课程刚介绍给我,我的老师给了我一个我不太懂的作业。我遇到的问题是,平均分数和字母分数没有正确输出,如下所示。所有事情都必须在成员函数中进行。另外,我是否正确使用了成员函数?我在网上看到它们是在类中定义的,但在我的笔记中,我看到它们被引用并被当作用户定义的函数来处理。我感到困惑的是作业的这一部分:

成员函数将每个成员变量设置为给定值 作为函数的参数,成员函数用于检索 来自每个成员变量的数据,一个void函数 计算学生在整个课程中的加权平均数字分数 设置相应的成员变量和一个void函数 计算学生的最终字母分数并设置 对应的成员变量

我的代码如下:

#include <iostream>
#include <cmath>

using namespace std;

class student_records
{
    private:
        double quiz1, quiz2, midterm_exam, final_exam;
        float weighted_avg;
        char final_grade;

    public:
        void setquiz1 (double q1)
        {
            quiz1 = q1;
        }
        void setquiz2 (double q2)
        {
            quiz2 = q2;
        }
        void setmidterm_exam (double mid)
        {
            midterm_exam = mid;
        }
        void setfinal_exam (double finale)
        {
            final_exam = finale;
        }

        void input()
        {
            cout << "Welcome to the Grading Program! Please enter the following information\n";

            cout << "Enter Quiz 1 and 2 results out of 10 points: ";
            cin >> quiz1 >> quiz2;

            cout << "Enter Mid-term result out of 100 points: ";
            cin >> midterm_exam;

            cout << "Enter Final exam result out of 100 points: ";
            cin >> final_exam;
        }

        void weightavg ()
        {
            weighted_avg = ((quiz1 + quiz2)/20 * 0.25 + midterm_exam / 100 * 0.25 + final_exam / 100 * 0.5) * 100;
        }

        void finalg ()
        {
            if (weighted_avg >= 90)
    {
        final_grade = 'A';
    }
    else if (weighted_avg >= 80)
    {
        final_grade = 'B';
    }
    else if (weighted_avg >= 70)
    {
        final_grade = 'C';
    }
    else if (weighted_avg >= 60)
    {
        final_grade = 'D';
    }
    else
    {
        final_grade = 'F';
    }
        }

        double getquiz1 ()
        {
            return (quiz1);
        }
        double getquiz2 ()
        {
            return (quiz2);
        }
        double getmidterm_exam ()
        {
            return (midterm_exam);
        }
        double getfinal_exam ()
        {
            return (final_exam);
        }
        double getweighted_avg ()
        {
            return (weighted_avg);
        }
        double getfinalg ()
        {
            return (final_grade);
        }

};

int main()
{
    student_records values, final_avg, grade, s;

    values.input();
    final_avg.weightavg();
    grade.finalg();

    cout << "The average is " << s.getweighted_avg() << " and your final grade is " << s.getfinalg();
    return 0;
}

student\u records::input()
将输入值分配给局部变量,而不是类成员变量。因此,当您想要使用这些类成员变量时,它们仍然处于未初始化状态

然后,在
main()。你只需要一个

student_records s;
s.input();
s.weightavg();
s.finalg();

student\u records::input()
将输入值分配给局部变量,而不是类成员变量。因此,当您想要使用这些类成员变量时,它们仍然处于未初始化状态

然后,在
main()。你只需要一个

student_records s;
s.input();
s.weightavg();
s.finalg();

所以我看到您正在使用getter和setter。这是一个非常好的做法。 为了回答您关于使用成员函数的问题,您已经正确地使用了它们

还可以在类之外定义成员函数

至于您的主要问题,在input()函数中,您没有调用Setter函数来设置类中的数据成员,因此它们不包含任何值

从stdin获取局部变量后,可以调用setter


而且似乎您的局部变量信息未被使用,请确保注释,如果未被使用。

因此我看到您正在使用getter和setter。这是一个非常好的做法。 为了回答您关于使用成员函数的问题,您已经正确地使用了它们

还可以在类之外定义成员函数

至于您的主要问题,在input()函数中,您没有调用Setter函数来设置类中的数据成员,因此它们不包含任何值

从stdin获取局部变量后,可以调用setter

而且您的局部变量信息似乎未被使用,请务必注意,如果未使用,则有两个问题:

  • 在main()中,您创建了4个student_record实例,但您只需要其中一个。删除其他内容并将“values.input()”替换为“s.input()”等
  • 在input()中,将值分配给函数结束时忘记的局部变量,而不是对象的成员变量
    • 有两个问题:

      • 在main()中,您创建了4个student_record实例,但您只需要其中一个。删除其他内容并将“values.input()”替换为“s.input()”等
      • 在input()中,将值分配给函数结束时忘记的局部变量,而不是对象的成员变量

      让我们看看您正在做什么来删除
      学生记录信息来自
      无效输入(),并且您可以根据您想要的方式进行选择。如评论中所述,当您声明
      student\u记录信息时
      void input()
      内部,实例
      info
      将超出范围,并在
      input()
      返回后被解构。(幸好没用)

      对于类,成员函数和
      friend
      函数可以访问类
      private:
      变量。如果您选择在
      input()
      中进行输入,您可以直接对
      专用:
      变量
      quiz1、quiz2、期中考试、期末考试进行操作不需要任何本地变量。但是,您也可以选择读入局部变量,然后调用setter函数,例如,
      void setquiz1(双q1)
      将测验1的局部变量作为参数传递(这只会增加微不足道的开销)

      现在,让我们看看如何尝试使用
      main()
      中的类实例
      s
      。您希望通过以下方式输出结果:

          std::cout << "The average is " << s.getweighted_avg() << 
                      " and your final grade is " << s.getfinalg() << '\n';
      
      现在,在你解释之后,我怀疑你应该做的是将你的接口(你如何与用户交谈并获取输入)与你的实现(你的类和你的计算)解耦。这是面向对象编程的主要目标之一。不要将界面和实现混为一谈(它不是花生酱杯)

      从这个角度来看,您可以选择是将
      input()
      作为成员函数,还是将其完全分离并将对类实例的引用作为参数传递。将其作为一个成员函数,然后执行以下操作:

      void输入()
      {
      双q1、q2、mt、fe;
      标准::cout q1>>q2){
      标准:cerr mt){
      标准:cerr(铁){
      标准:cerr>q2){
      标准:cerr mt){
      标准:cerr(铁){
      标准:cerr=90)
      {
      期末成绩='A';
      }
      否则如果(加权平均值>=80)
      
      #include <iostream>
      
      class student_records
      {
          private:
              double quiz1, quiz2, midterm_exam, final_exam;
              float weighted_avg;
              char final_grade;
      
          public:
              void setquiz1 (double q1)
              {
                  quiz1 = q1;
              }
              void setquiz2 (double q2)
              {
                  quiz2 = q2;
              }
              void setmidterm_exam (double mid)
              {
                  midterm_exam = mid;
              }
              void setfinal_exam (double finale)
              {
                  final_exam = finale;
              }
      
              void input()
              {
                  double q1, q2, mt, fe;
                  
                  std::cout << "Welcome to the Grading Program! "
                                  "Please enter the following information\n";
              
                  std::cout << "Enter Quiz 1 and 2 results out of 10 points: ";
                  if (!(std::cin >> q1 >> q2)) {
                      std::cerr << "error: numeric input.\n";
                      return;
                  }
                  setquiz1 (q1);
                  setquiz2 (q2);
                  
                  std::cout << "Enter Mid-term result out of 100 points: ";
                  if (!(std::cin >> mt)) {
                      std::cerr << "error: numeric input.\n";
                      return;
                  }
                  setmidterm_exam(mt);
              
                  std::cout << "Enter Final exam result out of 100 points: ";
                  if (!(std::cin >> fe)) {
                      std::cerr << "error: numeric input.\n";
                      return;
                  }
                  setfinal_exam(fe);
                  
                  weightavg();
                  finalg();
              }
              
              void weightavg ()
              {
                  weighted_avg = ((quiz1 + quiz2)/20 * 0.25 + midterm_exam / 100 * 0.25 +
                                  final_exam / 100 * 0.5) * 100;
              }
      
              void finalg ()
              {
                  if (weighted_avg >= 90)
                  {
                      final_grade = 'A';
                  }
                  else if (weighted_avg >= 80)
                  {
                      final_grade = 'B';
                  }
                  else if (weighted_avg >= 70)
                  {
                      final_grade = 'C';
                  }
                  else if (weighted_avg >= 60)
                  {
                      final_grade = 'D';
                  }
                  else
                  {
                      final_grade = 'F';
                  }
              }
      
              double getquiz1 ()
              {
                  return (quiz1);
              }
              double getquiz2 ()
              {
                  return (quiz2);
              }
              double getmidterm_exam ()
              {
                  return (midterm_exam);
              }
              double getfinal_exam ()
              {
                  return (final_exam);
              }
              double getweighted_avg ()
              {
                  return (weighted_avg);
              }
              char getfinalg ()
              {
                  return (final_grade);
              }
      
      };
      
      int main ()
      {
          student_records s{};
          
          s.input();
          
          std::cout << "The average is " << s.getweighted_avg() << 
                      " and your final grade is " << s.getfinalg() << '\n';
          return 0;
      }