Так что мне довелось закончить мою домашнюю программу, но сегодня во время лекции мой добрый старый профессор сказал нам, что нам не разрешается использовать STL, как в векторах или списках, для создания нашей базы данных. Нам также сказали, что все наши переменные должны быть приватными. Я делал эту программу совершенно неправильно. Это то, что я до сих пор.
в классе
class Student {
private:
string last;
string first;
int student_id;
int enroll_id;
int *grades;
}
class Gradebook {
public:
Gradebook();
void newCourse(Gradebook *info);
private:
string name;
int course_id;
int count_course;
int enroll;
Student *students;
public:
//Constructor
}
Я знаю, что могу получить доступ к частным членам Gradebook
с помощью конструктора, чтобы я мог установить каждый член в моем Gradebook
,
функция для создания newCourse
Gradebook::Gradebook() {
students = new Student;
course_id=0;
count_course=0;
enroll = 0;
}
Gradebook::newCourse(Gradebook *info) {
int i, loop=0;
cout << "Enter Number of Courses: ";
cin >> loop;
info = new Gradebook[loop];
for(i=0; i<loop; i++) {
cout << "Enter Course ID: ";
cin >> info[info->count_course].course_id;
cout << "Enter Course Name: ";
cin >> info[info->count_course].name;
info->count_course++
}
}
Итак, Курсы сейчас установлены. Поскольку переменные в Student
являются частными. Я не могу просто использовать указатель на переменные для доступа к ним. Может кто-нибудь показать мне, как это сделать?
Хорошо, я не знал, как задать этот вопрос, но на самом деле я ответил на него. Но я хочу мнение каждого о моем методе.
class Student {
public:
void setID(int ID){student_id = ID; };
int getID(){return student_id);
private:
string last;
string first;
int student_id;
int enroll_id;
int *grades;
};
class Gradebook {
public:
Gradebook();
void newCourse(Gradebook *info);
void newStudent(Gradebook *info);
private:
string name;
int course_id;
int count_course;
int count_student;
int enroll;
Student *students;
public:
//Constructor
}
void Gradebook::newStudent() {
int i, loop=0;
int student=0;
string lastName;
cout << "Enter number of students: ";
cin >> loop;
for(i=0; i<loop; i++) {
cout << "Enter Student ID: ";
cin >> student;
info->students[info->count_student].setID(student);
cout << "Enter Last Name: ";
cin >> lastName;
info->students[info->count_student].setLast(lastName);
info->count_student++;
}
}
Есть ли что-то плохое в этом?
Изменить: Вы не можете использовать «Студент * студенты» для вашего контейнера для нескольких студентов …
Вы можете использовать свои собственные списки. Что-то вроде
struct Participant{ // or class (and maybe more clever name)
Student *student;
Participant *prev;
Participant *next;
};
Вам нужно немного заняться акробатикой с указателями, но, возможно, в этом и заключается идея этого упражнения.
И, как и в предыдущем ответе, используйте функции get и set в классе ученика.
Хорошо, я извиняюсь, но ваш код беспорядок …
Я не могу сделать это домашнее задание для вас, но вот несколько советов, которые пришли в голову
Вы уверены, что не было бы проще создавать разные классы для ученика, курса и зачётной книжки? Я не знаю ваших домашних заданий, поэтому не могу быть уверен, что именно ваша программа должна делать.
Вы не можете использовать оценки int * для хранения всех оценок одного ученика. То же самое касается студентов * студентов. Вы не можете получить доступ к итерации * студентов, как массив студентов [i] .something ()
Если вы используете какой-либо класс справки (или структуру), например, «Участник», вы должны найти нужного ученика, повторяя цикл. Обратите внимание, что у вас есть «первый» участник магазина в вашем классе, а «int ученики» — в вашем числе (также в вашем классе)
Participant *current = first;
int id = Id; // Id is from function/method call
for(unsigned int i = 0; i < students; ++i){
if(current->getId()== id){
// do something and
break;
}
else if(current->next != NULL){ // test this just in case
current = current->next;
}
else break; // something went wrong
}
Возможно, было бы неплохо хранить всех студентов в одном списке (который вы составляете) и использовать указатели в курсе, в зачетной книжке или где-либо еще … Если вы знаете «статический», то здесь подсказка
class Student{
public:
. // get and set functions
static Student* getStudent(int id); // return NULL if no student with id
private:
static Student *first;
static Student *last;
static unsigned int counter; // helps with loops, but you can always use next != NULL
Student *next;
Student *prev;
}
Поместите это в конструктор Student
с первым учеником, которого вы создаете, вы устанавливаете первым и последним, чтобы указать ему / ей, а затем и предыдущий на NULL. После этого всегда, когда вы создаете нового студента, вы устанавливаете
this->prev = last;
last->next = this;
last = this;
this->next = NULL;
Обычно эти упражнения по программированию домашних заданий не должны быть слишком причудливыми, оптимизированными или полностью оптимизированными. Так что не переусердствуйте их;)
class Student {
private:
string last;
string first;
int student_id;
int enroll_id;
int *grades;
public:
string &getLast(){ return Last; }
...
...
};
Вызов Student::getLast()
когда вам нужно получить доступ к вашему last
переменная и т. д.
или же
void setLast(string sLast){last = sLast;}
для написания и
string getLast(){return last;}
для чтения
И пример динамического массива:
struct Student;
int Count = 0;
Student *Students = nullptr;
int AddStudent(Student nStudent)
{
Student *Buffer = new Student[Count + 1];
for (int a = 0; a < Count; a++)
Buffer[a] = Student[a];
Buffer[Count] = nStudent;
if(Students)
delete[] Students;
Students = Buffer;
return ++Count -1
}
void RemoveStudent(int Index)
{
Student *Buffer = new Student[Count - 1];
for (int a = 0; a < Index; a++)
Buffer[a] = Students[a];
for (int a = Index; Index < Count - 1; a++)
Buffer[a] = Students[a - 1];
if (Students)
delete[] Students;
Students = Buffer;
}