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