lvshuer 2023-11-15 00:29 采纳率: 100%
浏览 11
已结题

关于#c++#的问题:建立一个对象数组,内放5个学生的数据(学号、成绩),用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者

建立一个对象数组,内放 5 个学生的数据(学号、成绩),设立一个函数 max,用指向对象的指针作函数参
数,在 max 函数中找出 5 个学生中成绩最高者,并输出其学号。

代码没有报错,但是输出的并不是成绩最高者的学号,请问这是哪里出问题了,感谢回答。

#include<iostream>
using namespace std;    
class Student
{
public:
    Student(int n,float s):m_num(n),m_score(s){}
    void max(Student* arr[]);

private:
    int m_num;
    float m_score;
};

void Student::max(Student* arr[])
    {
        int len = sizeof(arr)/sizeof(arr[0]);
        for(int i=0;i<len;i++)
        {
            if(arr[i]->m_score > arr[0]->m_score)
            {
                arr[0]->m_score = arr[i]->m_score;
                arr[0]->m_num = arr[i]->m_num;
            }
            
        }
        cout<<"成绩最高者的学号为:"<<arr[0]->m_num<<endl;
    
    }
int main()
{
    Student stud(10,45);
    Student* arr[] = {new Student(12, 78.5), new Student(21, 85), new Student(41, 92.5), new Student(42, 88), new Student(53, 95)};
    stud.max(arr);

    return 0;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-15 02:07
    关注

    【以下回答由 GPT 生成】

    问题的关键是在max函数中计算数组长度的部分有误。sizeof(arr)会返回指针数组的大小,而不是数组中包含的元素个数。所以在循环中,len的值并不是5,而是指针数组的大小。

    解决方案可以采用以下两种方法之一:

    方法一:传递数组长度

    修改max函数的参数,额外传递一个表示数组长度的参数,然后在函数内部使用这个参数来控制循环。

    void Student::max(Student* arr[], int len)
    {
        for(int i=0; i<len; i++)
        {
            if(arr[i]->m_score > arr[0]->m_score)
            {
                arr[0]->m_score = arr[i]->m_score;
                arr[0]->m_num = arr[i]->m_num;
            }
        }
        cout<<"成绩最高者的学号为:"<<arr[0]->m_num<<endl;
    }
    
    int main()
    {
        Student stud(10,45);
        Student* arr[] = {new Student(12, 78.5), new Student(21, 85), new Student(41, 92.5), new Student(42, 88), new Student(53, 95)};
        int len = sizeof(arr)/sizeof(arr[0]); 
        stud.max(arr, len);
    
        return 0;
    }
    

    方法二:在数组的末尾使用NULL作为结束标志

    通过在数组的末尾添加一个NULL指针作为结束标志,可以不需要传递数组长度,而是通过迭代遍历数组直到遇到NULL指针来结束循环。

    void Student::max(Student* arr[])
    {
        int i = 0;
        while(arr[i] != NULL)
        {
            if(arr[i]->m_score > arr[0]->m_score)
            {
                arr[0]->m_score = arr[i]->m_score;
                arr[0]->m_num = arr[i]->m_num;
            }
            i++;
        }
        cout<<"成绩最高者的学号为:"<<arr[0]->m_num<<endl;
    }
    
    int main()
    {
        Student stud(10,45);
        Student* arr[] = {new Student(12, 78.5), new Student(21, 85), new Student(41, 92.5), new Student(42, 88), new Student(53, 95), NULL};
        stud.max(arr);
    
        return 0;
    }
    

    在以上两种方法中,都可以正确找出最高成绩的学生并输出他的学号。选择哪种方法取决于具体的需求和使用场景。



    【相关推荐】


    • 这篇博客: C语言程序设计--配套书(第三版)中的 7.2 输入两个整数,求输出二者中的大者。要求在主函数中输入两个整数,用一个函数max求出其中的大者,并在主函数中输出该值 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 已采纳回答 11月15日
  • 创建了问题 11月15日

悬赏问题

  • ¥15 hive on spark
  • ¥15 星穹铁道中的ai自动战斗逻辑
  • ¥15 SimpleHook 一下android fake模块的VIP日期
  • ¥15 如何在VBA中利用word的错词提示功能识别word文本中的错别字并标注
  • ¥15 c#调用c++函数 传参数问题
  • ¥15 jupyter notebook无法识别的空格,如何解决?(语言-python)
  • ¥15 自动回复评论的小插件
  • ¥20 用c++完成两道大题,要求提供.h和.cpp,以及用来测试的main.cpp
  • ¥15 2024电赛H题指导
  • ¥15 第三方如何控制E8a进行烧录