Как обновить элементы объектов в массиве, построенном из другого класса?

#c #class #object #oop #parameter-passing

Вопрос:

У меня есть 2 отдельных класса в C ,которые являются Algorithms классом и Student классом, каждый из которых имеет следующие члены и методы.

 #include <iostream>
using namespace std;
#define MAX  10
class Student {
private:
   int ID;
   string name;
   string surname;
   int quiz_scores[4];

public:
   Student()
   {
      ID = 0;
      name = "" ;
      surname = "";
      quiz_scores[4] = {0};
   }
   void setID(int ID_set);
   int getID();
   void setName(string name_set);
   string getName();
   void setSurName(string surname_set);
   string getSurName();
   void setQuizScores(int* quizscores);
   const int* getQuizScores() const;
}; 
 

и Algorithms класс следующим образом:

 class Algorithms{
   private:
      Student students[MAX];
      int num =0 ; // The current number of students in the course, initially 0.
      float weightQ;
      float weightHW;
      float weightF;

   public:
      Algorithms()
      {
         students[num] = {};
         weightQ = 0.3;
         weightHW = 0.3;
         weightF = 0.4;

      }
      int getNum(); // Returns how many students are in the course
      void addNewStudent(Student new_student);
 

А вот методы декларирования Student класса и Algorithms класса соответственно.

 // Method declerations for the class Student

void Student :: setID(int ID_set){
   ID = ID_set;
}
int Student :: getID(){
   return ID;
}
void Student :: setName(string name_set){
   name = name_set;
}
string Student :: getName(){
   return name;
}
void Student :: setSurName(string surname_set){
   surname = surname_set;
}
string Student :: getSurName(){
   return surname;
}
void Student :: setQuizScores(int* quizscores){
   for(int i = 0; i<4; i  ){
      quiz_scores[i] = quizscores[i];
   }
}
const int* Student :: getQuizScores() const {
   return quiz_scores;   }

// Method declerations for the class Algorithms

int Algorithms:: getNum(){
   return num;
}
void Algorithms :: addNewStudent(Student new_student){
   students[num] = new_student ;
   num = num   1;
}
void Algorithms :: updateWeights(float weightQ_update, float weightHW_update, float weightF_update){
            weightQ = weightQ_update;
            weightHW = weightHW_update;
            weightF = weightF_update; 
}
void Algorithms :: getStudentInfo(int ID_given, Algorithms amp;algorithms){
   for(int i = 0; i<MAX; i  ){
      if(ID_given == students[i].getID()){
         cout << "Student Name amp; Surname : " << students[i].getName() << " " << students[i].getSurName()<<"n";
         cout << "Quiz results :" <<  students[i].getQuizScores();
      }
   } 
}
 

I have also user-interface in the main . It calls the following functions

 void addNewStudent(int ID, string name, string surname, Algorithms amp;algorithms){
    Student student;
    student.setID(ID);
    student.setName(name);
    student.setSurName(surname);                                  
    algorithms.addNewStudent(student);
 }
   
 void showStudent(int ID, Algorithms amp;algorithms){
    algorithms.getStudentInfo(ID, algorithms);
 }
 

Both work properly with the code in main as below

 int main(){
   Algorithms ECE101;
   int x;
   int ID;
   string name, surname;

   string option_1 = "1) Add a student ";
   string option_2 = "2) Search a student by ID";
   string option_3 = "3) Change a student’s score";

   cout << "Welcome to the ECE101 Classroom Interface"<<"n";
   cout << "Choose your optionn";
   cin >> x;

    do {
        if (x == 1) {
            cout << "Enter the student ID ";
            cin >> ID;
            cout << endl;
            cout << "Enter the student name ";
            cin >> name;
            cout << endl;
            cout << "Enter the student surname " ;
            cin >> surname;
            addNewStudent(ID, name, surname, ECE101);
        }
        else if (x==2){
            cout << "Enter the student IDn";
            cin >> ID;
            showStudent(ID, ECE101);
        }
        else {
           int quiz_grades[4];
           cout << "Enter the student ID";
           cin >> ID;
           cout << endl;
           cout << "Enter the quiz grades" << endl;
           for (int i = 0 ; i<4 ; i  ) {
              cin >> quiz_grades[i];
           }
           changeStudentScores(ID, quiz_grades);
        }
 

Проблема здесь кроется в changeStudentScores(ID, quiz_grades, ECE101)
Что я хочу сделать, так это то, что программа должна взять массив из 4 чисел(соответствует оценкам викторины) и установить для ученика, чей идентификатор указан пользователем. (Конечно, сначала студент должен быть добавлен в курс по варианту 1) НО, я не смог передать массив туда changeStudentScores , где он реализован

 void changeStudentScores(int ID, int* quizscores ){
    // Problem occurs here, creating new students object is not so logical, but I tried.
    Student student;
    student.setID(ID);
    student.setQuizScores();
    // I just try to pass the quiz grades writing by the user to the set method, which set quiz grades to the students.
 

После выбора варианта 2, в котором отображается информация о студентах, которым присвоен идентификатор, я вижу правильные имя и фамилию, но я не смог обновить оценки в тесте.
ограничения:

  • Не должно быть никаких других методов и элементов данных, кроме записанных методов и элементов данных.
  • Но мы можем реализовать дополнительные методы и функции (но не члены данных класса)
  • getStudentInfo(int ID_given, Algorithms amp;algorithms) функция должна возвращать данные об ученике с указанным идентификатором, но моя реализация, которую я мог бы использовать с void
    вопросы:
  • Как я могу правильно реализовать changeStudentScores функцию, чтобы пользователь мог обновить существующий результат студенческой викторины?
  • Моя getStudentInfo(int ID_given, Algorithms amp;algorithms) функция не возвращает ничего, что я мог бы использовать для получения информации. Поэтому необходимо вернуть информацию о студенте, поэтому возвращаемый тип не должен быть void .
  • Какова общая идея обновления элементов объектов, которые используются в другом классе с некоторой структурой данных(вот массив).

Комментарии:

1. То, что вы сделали, addNewStudent чтобы передать в данном Algorithms случае, кажется правильным местом для начала. Затем добавление новой функции Algorithms для поиска и возврата ссылки на запрошенное в students даст вам инструмент для получения доступа к необходимому Student .

2. @user4581301 Подумайте, что это похоже на задание программирования, и есть некоторые ограничения, одно из которых-не использовать другие методы внутри классов.

3. Пожалуйста, добавьте ограничения к вопросу.

4. @user4581301 Добавил, спасибо!

5. Глобальные переменные-отстой. Они создают больше проблем, чем решают. Как только вы делаете переменную глобальной, вы подвергаете себя таким неприятностям, как фиаско со статическим порядком инициализации , и переменная может быть изменена в любой момент в вашем коде в любое время, что означает, что все в вашей программе может иметь побочные эффекты, которые необходимо отслеживать во время отладки.