对于我的班级,我正在编写一个管理酒店的程序。我的“测试”方法会创建随机的房间和随机的客户。完成此操作后,它将接收创建的随机客户,并将其检入创建的随机房间。
我的目标是让测试仅向客户检入一半的房间。并将另一半房间留空。而且,我每个房间只能有1位客户。
该方法可以编译,但是存在一些缺陷:
“测试”将所有房间(而不是其中只有一半)填满客户。
“测试”通常会将一个房间分配给多个客户(例如,房间301现在将属于3个不同的客户,而不仅仅是1个)
谁能帮我弄清楚如何仅填充所创建房间的一半。
还可以帮助我弄清楚如何不让一个房间应用于多个客户?我很确定方法中的最后一个FOR循环应该是我唯一需要调整的东西。
string Hotel::test(int numRooms, int numCustomers)
{
string result;
for(int i=0;i<numRooms;i++) // **********CREATES RANDOM ROOMS
{
Room iRoom(randString(8),
randInt(0,1000),
randInt(0,1000),
randInt(0,1000),
randInt(0,1000));
listofrooms.add(iRoom);
}
for(int i=0;i<numCustomers;i++) // ***********CREATES RANDOM CUSTOMERS
{
Customer cus(randString(8),randNumberString(10),randNumberString(16));
listofcustomers.add(cus);
}
for(int i=0;i<numCustomers+numRooms;i++) // **FILLS RANDOM ROOMS WITH RANDOM CUSTOMERS
{ // **I KNOW THIS IS THE ONLY LOOP I NEED TO ADJUST
checkIn(listofrooms.getRandID(),listofcustomers.getRandID());
}
return result;
}
最佳答案
第1部分
您需要将一半的房间填满。由于任何房间只能有1位客人,因此您需要填写房间numRooms
次。因此,您只需要将循环调整为:
for (int i = 0; i < numRooms/2; i++)
第2部分
有很多方法可以确保这一点。天真的方法是循环尝试
for (int i = 0; i < numRooms/2; i++)
{
int assignedRoom;
do
{
assignedRoom = listofrooms.getRandID();
} while (isFull(assignedRoom);
checkIn(assignedRoom, listofcustomers.getRandID());
}
当然,您不希望在两个房间中使用相同的客户,因此您也需要对客户执行相同的操作。
另一种方法可能是随机抽取一个房间,如果房间已满,则迭代到下一个房间(如果溢出则环绕到第一个房间),直到找到一个空房间为止。
另一种方法可能是
random_shuffle
房间的副本,并取得前半部分。就像我说的那样,无论您如何处理房间,您也需要与客户联系。
建议:也许使用最后一种方法(使用
random_shuffle
的方法)可以获得最佳的分布。请注意,幼稚的方法具有不确定性(并且可能很差)。关于c++ - 如何使此循环分配给 vector 的一半而不是整个 vector ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9831879/