为什么我的代码没有按预期工作?[关闭]

Why is my code is not working as expected? [closed]

提问人:Krinesh Vasava 提问时间:7/11/2023 最后编辑:Alan BirtlesKrinesh Vasava 更新时间:7/11/2023 访问量:110

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

4个月前关闭。

在输出中,当我尝试显示它时出现错误。输出显示时没有任何错误,但不显示总分和百分比。如果有人能提供解释,我将不胜感激。

  1. 创建一个存储 roll_no,name 的班级学生。
  2. 创建一个班级测试,用于存储五个科目中获得的分数。
  3. 从学生和测试中获得的班级成绩包含测试中获得的总分和百分比。
  4. 输入和显示学生的信息。

#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;
}
C++ 多重继承

评论

1赞 jabaa 7/11/2023
请提供一个带有硬编码数据的最小可重现示例
5赞 Alan Birtles 7/11/2023
s,并且是 3 个独立的对象。 in 从不初始化trmarksr
3赞 john 7/11/2023
关于C++如何工作,这里存在严重的误解。要理解的主要事情是 , 和 是单独的对象,这与 不同,也不等同于 。你似乎认为,因为继承自 and,这在 和 和 之间建立了某种联系,但这完全是一个误解。将代码的不同部分连接在一起的真正方法是将参数传递给函数并从函数返回值strt.marksr.markss.namer.nameresultstudenttestrst
1赞 john 7/11/2023
我正在查看您的代码,并且没有一个实例您的任何函数具有参数或返回值。所以我认为你需要修改这些主题,然后从头开始重写这段代码。
1赞 john 7/11/2023
我没有注意到“班级成绩来自学生和考试”的要求。你感到困惑并不奇怪,你是由一个无能的人教的。

答:

-1赞 Aconcagua 7/11/2023 #1

从您的函数:main

student s;
test t;
result r;
s.studentdata();
t.getmarks();
r.percentage();

您显然忽略了这样一个事实,即由于继承,实例已经同时包含 a 和 a。resultstudenttest

现在,您可以初始化单独的实例和实例,而实例的实例仍未初始化。studenttestresultr

为了获得有意义的结果,您需要初始化 的实例 – 当您不使用或进一步删除它们时,剩下的就是:rst

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 循环:resultstudenttestresulttotalmarkspercentresultpercentageint itestresultfor(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我完全同意。我已经将此信息添加为评论。设计是由任务授权的,所以我认为信息最好去那里......