Как вы передаете структурные параметры в методе - PullRequest
0 голосов
/ 05 февраля 2020

Я нигде не нашел ответа на свой вопрос, я новичок в OOP, поэтому, пожалуйста, пощадите меня. Итак, у меня есть следующий код:

class Group
{
public:
    struct Student
    {
        char name[40],
        int grades[5]};
    }

    Student s[10];

    .....

    private: double med(???)
    {
        .....
    }
}

Так где же ??? Я хочу иметь в качестве параметров оценки отдельного студента и вывести средние из них. Я не знаю, как мне их объявлять, я пытался разными способами, но каждый раз получаю ошибки.

Ты много

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Итак, у вас есть структура с параметрами, такими как:

struct Student
{
    std::string name;
    std::array<int, 5> grades;
};

Поскольку это тег C++, я решил использовать std::array<int, 5> вместо int[5].

По моему мнению, Student не обязательно должно быть внутри Group, но я думаю, что это основано на мнении.

Теперь у вас есть Group, который содержит студентов:

struct Group
{
    Group(std::vector<Student> students) :
        _students{ std::move(students) }
    {}

    double med(/* ... */) const
    { /* ... */ }

    std::vector<Student> _students; // C++ -> use std::vector
};

Скажем, вы хотите передать оценки конкретного учащегося в качестве параметра функции med, а не просто:

double Group::med(const std::array<int, 5>& grades) const
{ /* sum up grades, divide by 5, and return the result */ }

И вы бы назвали эту функцию следующим образом:

Student paul{"Paul", {1,2,3,4,5}};
Group group({paul});
group.med(paul.grades);

Как указано в комментариях, вы можете указать имя ученика вместо его / ее оценок:

double med(const std::string& name)
{
    // find student
    auto it = std::find_if(_students.begin(), _students.end(), [&name](const Student& student)
    {
        return student.name == name;
    });

    // if no student by that name
    if (it == _students.end())
        return -1.0;

    // else    
    int sum{ 0 };
    for (const auto& grade : it->grades)
    {
        sum += grade;
    }
    return static_cast<double>(sum)/(it->grades.size());
}

Здесь - это обсуждение хороших книг по C ++.

0 голосов
/ 07 февраля 2020

Tyr этот код Содержит четыре функции avg (), все они одинаковы, но различаются по способу вызова функций.

#include<iostream>
#include<string.h>

using namespace std;

class Group
{
 public:
    struct Student
    {
        char name[40];
        int grades[5];

    }student;

    double avg()
    {
        double sum=0;

        for(int i=0;i<5;i++)
            sum+=student.grades[i];

        return (sum/5);
    }
};

double avg(int *grade)
{
    double sum=0;

    for(int i=0;i<5;i++)
        sum+=grade[i];

    return (sum/5);
}

double avg(Group::Student stduent)
{
   double sum=0;

    for(int i=0;i<5;i++)
        sum+=stduent.grades[i];

    return (sum/5);
}

double avg(Group group)
{
    double sum=0;

    for(int i=0;i<5;i++)
        sum+=group.student.grades[i];

    return (sum/5);
}

int main()
{
    Group group1;

    strcpy(group1.student.name,"MyName");

    for(int i=0;i<5;i++)
    group1.student.grades[i]=5;

    cout<<"Name:"<<group1.student.name<<endl;
    cout<<"Avg:"<<avg(group1.student.grades)<<" "<<avg(group1.student)<<" "<<avg(group1)<<" "<<group1.avg();

    return 0;
}

Вывод:

Name:MyName
Avg:5 5 5 5
Process returned 0 (0x0)   execution time : 0.379 s
Press any key to continue.

Вы можете оставить структуру без имени как

  struct
  {
    char name[40];
    int grades[5];
  }student;

Если вы удаляете функцию и вызов функции из кода

double avg(Group::Student stduent)
{
   double sum=0;

    for(int i=0;i<5;i++)
        sum+=stduent.grades[i];

    return (sum/5);
}
...