对于我的班级,我正在制作管理酒店的计划。我的'测试'方法创建随机客房和随机客户。一旦它执行了此操作,它就会获取它创建的随机客户,并将它们检入它创建的随机房间。
我的目标是让测试仅与客户签入 HALF 的房间。并将另一半房间留空。而且,每个房间我只能有1个顾客。
该方法编译,但它们有一些缺陷:
任何人都可以帮我弄清楚如何填充所创建的房间的一半。 还帮我弄清楚如何不让单个房间应用于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;
}
答案 0 :(得分:2)
您需要填满一半的房间。由于只有1位客人可以入住任何房间,因此您需要填写numRooms
次房间。所以,你只需要调整你的循环:
for (int i = 0; i < numRooms/2; i++)
有很多方法可以确保这一点。 天真的方法将在循环中重试
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
的方法实现最佳分发。请注意,天真的方法具有非确定性(可能是坏的)性能。< / p>
答案 1 :(得分:1)
在循环中,结束条件应为i<numRooms/2
以仅填充一半的房间。
每个房间只有一位顾客,根据您的限制,您有一些选择。您必须跟踪已经分配的房间。
例如,您可以从列表中删除指定的房间 - 在大多数情况下可能不允许这样做。
或者你可以修改Room类以包含你填充时设置的布尔值,并且如果它被填充你会寻找另一个房间 - 再次,你说你不想改变除循环之外的任何东西。 / p>
您也可以创建一个整数数组,并将随机选择的值索引房间数组(以及另一个客户数组,如果您不想多次分配客户),删除之前指定的值。
另一种方法,如果你不需要统一的分配,有一个标记,标记需要填充多少房间,分配一半,迭代房间,每个房间,决定你是否填写它或不。当剩余的未处理房间数等于要填写的房间数时,请填写所有房间。