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