私は私立寄宿学校の教師であり、C++ でプログラムを作成しようとしています。このプログラムは、生徒が毎週別の生徒や別のスタッフ メンバーと一緒に座るように、食堂のテーブルに生徒をランダムに座らせます。理想的には、一定期間、同じテーブルに 2 度も着席せず、できるだけ多くの異なる生徒と一緒に座らないようにします。私はこのプログラムを Python で作成しましたが、うまく機能します (まあ、かなり良いです)。さまざまな理由から、これを C++ に移植しようとしています (C++ はよくわかりません)。そうすれば、搭乗員に渡すことができます。学生とスタッフの両方 (およびテーブルの容量) は、テキスト ファイルから読み取られます。データを処理するために、学生用とテーブル用の 2 つのカスタム クラスを作成しました。以下に、2 つのクラス ヘッダー ファイルを示します。
Table.h
#pragma once
#include <iostream>
#include "Student.h"
#include <vector>
using namespace std;
class Table
{
// Private class variables
string staff;
int numSeats;
vector<Student> seating;
public:
Table(); // Default constructor
Table(string s, int n);
Table(const Table& that) : staff(that.staff), numSeats(that.numSeats)
{
}
// Copy Constructor
Table& operator=(const Table& that)
{
staff = that.staff;
numSeats = that.numSeats;
return *this;
}
int getNumSeats();
string getStaffName();
void addStudent(Student student);
void removeStudent(Student student);
void clearStudents();
vector<Student> getTableSeating();
int getRemainingSeats();
~Table(void);
};
生徒のクラス ファイルは次のとおりです。
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class Student
{
string name;
string country;
vector<int> tablesSatAt;
public:
Student(string n, string c);
Student();
Student(const Student& that) : name(that.name), country(that.country)
{
}
Student& operator=(const Student& that)
{
name = that.name;
country = that.country;
return *this;
}
string getName();
string getCountry();
void addTable(int tableNumber);
void removeTable(int tableNumber);
bool satAtTable(int tableNumber);
friend bool operator==(Student s1, Student s2);
friend bool operator!=(Student s1, Student s2);
~Student(void);
};
bool operator==(Student s1, Student s2);
bool operator!=(Student s1, Student s2);
重い作業を行う再帰関数は次のとおりです。
bool seatRecursive(vector<Student> &tempStudents, vector<Table> &tempTables)
{
if (tempStudents.size() == 0) return true; //base case
Student nextStudent = randomSelect(tempStudents);
for (vector<int>::size_type i=0; i<tempTables.size(); i++)
{
if (tempTables[i].getRemainingSeats() > 0 && !nextStudent.satAtTable(i))
{
addStudentToTable(nextStudent, tempTables, i);
if (seatRecursive(tempStudents, tempTables)) return true;
else
{
removeStudentFromTable(nextStudent, tempTables, i);
tempStudents.push_back(nextStudent);
}
}
}
return false;
}
これのほとんどは機能します。プログラムを実行すると、10 週間の座席を含むテキスト ファイルが得られますが、テーブルの座席はすべて同じです。つまり、私が特定のスタッフ メンバーである場合、同じ子供たちが 10 週間ずっと私のテーブルに座っています。私は、生徒が時間をかけて座ったテーブル番号を格納することになっている int のベクトルを持っています。デバッグ時に、これらのテーブル番号がそのベクターに格納されていないことに気付きました。常に空です。私の問題は、なぜこれが起こっているのか理解できないことです。ベクトルを参照渡ししているためですか?ポインターを明示的に宣言していなくても、ポインターと関係がありますか?
提案は大歓迎です。必要に応じて残りのコードを貼り付けることができます。
ブライアン