3

私は私立寄宿学校の教師であり、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 のベクトルを持っています。デバッグ時に、これらのテーブル番号がそのベクターに格納されていないことに気付きました。常に空です。私の問題は、なぜこれが起こっているのか理解できないことです。ベクトルを参照渡ししているためですか?ポインターを明示的に宣言していなくても、ポインターと関係がありますか?

提案は大歓迎です。必要に応じて残りのコードを貼り付けることができます。

ブライアン

4

2 に答える 2

6

難しくする理由は?

すべての生徒をベクトルに入れてから、STL random_shuffle アルゴリズムを使用し、最後に生徒の結果のベクトルを使用可能なすべてのテーブルに線形に配置します。

学生やテーブル用のカスタムクラスさえ本当に必要ありません

于 2013-05-14T14:29:21.067 に答える