提问人:Krinesh Vasava 提问时间:7/11/2023 最后编辑:Alan BirtlesKrinesh Vasava 更新时间:7/11/2023 访问量:110
为什么我的代码没有按预期工作?[关闭]
Why is my code is not working as expected? [closed]
问:
在输出中,当我尝试显示它时出现错误。输出显示时没有任何错误,但不显示总分和百分比。如果有人能提供解释,我将不胜感激。
- 创建一个存储 roll_no,name 的班级学生。
- 创建一个班级测试,用于存储五个科目中获得的分数。
- 从学生和测试中获得的班级成绩包含测试中获得的总分和百分比。
- 输入和显示学生的信息。
#include <iostream>
using namespace std;
class student {
int roll_no;
string name;
public:
void studentdata()
{
cout << "\n ENTER STUDENT NAME:";
cin >> name;
cout << "\nENTER ROLL NUMBER:";
cin >> roll_no;
}
};
class test {
int i;
// int marks[5{}];
public:
int marks[5];
void getmarks()
{
cout << "\nENTER MARKS OF EACH SUBJECT:";
for (i = 0; i < 5; i++) {
cout << "\n subject " << (i + 1) << " :";
cin >> marks[i];
}
}
};
class result : public student, public test {
int i;
float totalmarks = 0;
float percent;
public:
void percentage()
{
// int total_marks=0;
for (i = 0; i < 5; i++) {
totalmarks += totalmarks + marks[i];
}
cout << " \n TOTAL MARKS OUT OF 500 IS:" << totalmarks;
percent = (totalmarks * 100) / 500;
cout << " \n \nPERCENTAGE OBTAINED IN THE TEST:" << percent << " %";
}
};
int main()
{
student s;
test t;
result r;
s.studentdata();
t.getmarks();
r.percentage();
return 0;
}
答:
-1赞
Aconcagua
7/11/2023
#1
从您的函数:main
student s;
test t;
result r;
s.studentdata();
t.getmarks();
r.percentage();
您显然忽略了这样一个事实,即由于继承,实例已经同时包含 a 和 a。result
student
test
现在,您可以初始化单独的实例和实例,而实例的实例仍未初始化。student
test
result
r
为了获得有意义的结果,您需要初始化 的实例 – 当您不使用或进一步删除它们时,剩下的就是:r
s
t
result r;
r.studentdata(); // r has inherited the function from student class!
r.getmarks(); // r has inherited the function from test class!
r.percentage(); // result's own function
但请注意,尽管您的任务强制要求这种设计,但由于多种原因,这种设计非常糟糕;绝对没有理由为什么这个类应该继承自 和 ,它们彼此之间是无关的,如果有的话,应该聚合其他两个。此外,变量对类没有用途,它们专门在函数中使用,因此应该是局部变量——我知道这是任务规定的,但你至少应该意识到这一点。但至少你可以使循环计数器(在两者和类中)成为它们各自函数的局部变量: – 或者更简单,使用基于范围的 for 循环:result
student
test
result
totalmarks
percent
result
percentage
int i
test
result
for(int i = 0; i < std::size(marks); ++i)
for (auto& m : marks)
// ^ important here!
{
std::cin >> m; // here you need the reference above!
}
for (auto m : marks)
{
totalmarks += m;
}
第二个循环不需要引用,因为它是一个小类型,如果你放置它就无关紧要了——但你可能会习惯于主要添加它,按值计算,编译器会相应地优化效率更高,尽管你可以通过引用来支持它的工作:const
for (auto const& m : marks)
{
totalmarks += m;
}
评论
3赞
Mestkon
7/11/2023
注意:尽管这是正确的答案,但它仍然是一个可怕的设计,甚至不应该在实际代码中考虑。
0赞
Aconcagua
7/11/2023
@Mestkon我完全同意。我已经将此信息添加为评论。设计是由任务授权的,所以我认为信息最好去那里......
评论
s
,并且是 3 个独立的对象。 in 从不初始化t
r
marks
r
s
t
r
t.marks
r.marks
s.name
r.name
result
student
test
r
s
t