如何将此循环分配给矢量的一半而不是整个矢量?

时间:2012-03-22 23:08:47

标签: c++ loops

对于我的班级,我正在制作管理酒店的计划。我的'测试'方法创建随机客房和随机客户。一旦它执行了此操作,它就会获取它创建的随机客户,并将它们检入它创建的随机房间。

我的目标是让测试仅与客户签入 HALF 的房间。并将另一半房间留空。而且,每个房间我只能有1个顾客。

该方法编译,但它们有一些缺陷:

  1. '测试'用客户填充所有房间(而不是只有一半)。
  2. “测试”通常会为多个客户分配一个房间(例如,301室现在属于3个不同的客户,而不仅仅是1个)
  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;
    }
    

2 个答案:

答案 0 :(得分:2)

第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的方法实现最佳分发。请注意,天真的方法具有非确定性(可能是坏的)性能。< / p>

答案 1 :(得分:1)

在循环中,结束条件应为i<numRooms/2以仅填充一半的房间。

每个房间只有一位顾客,根据您的限制,您有一些选择。您必须跟踪已经分配的房间。

例如,您可以从列表中删除指定的房间 - 在大多数情况下可能不允许这样做。

或者你可以修改Room类以包含你填充时设置的布尔值,并且如果它被填充你会寻找另一个房间 - 再次,你说你不想改变除循环之外的任何东西。 / p>

您也可以创建一个整数数组,并将随机选择的值索引房间数组(以及另一个客户数组,如果您不想多次分配客户),删除之前指定的值。

另一种方法,如果你不需要统一的分配,有一个标记,标记需要填充多少房间,分配一半,迭代房间,每个房间,决定你是否填写它或不。当剩余的未处理房间数等于要填写的房间数时,请填写所有房间。