CS 100: Lecture L23

April 20

| Back to Lecture Index |


public class Retailer
{	
   protected int nStores;     // Number of stores.
   protected int nItems;      // Number of items.
   protected int[][] price;   // Price array: price[i][j] is the price (in dollars) of item j in store i. 
   protected int[][] inv;     // Inventory array: inv[i][j] is the inventory of item j in store i. 
   
   // The Constructor.
   public Retailer(int[][] P, int[][] I)
   // P is the price array and I is the inventory array. They are the same size. The number
   // of stores equals the number of rows and the number of retail items equals the number of columns.
   {
      nStores = P.length;        
      nItems = P[0].length;
      price = copy(P);
      inv   = copy(I);
   }
 
   
   // i satisfies 0 <= i < nStores.
   // PO represents a purchase order. It has length nItems and P0[k] is the
   // quantity of item k that the customer wishes to buy.
   // Yields true if the ith store can handle the purchase order, i.e.,
   // PO[j] < = inv[i][j], j=0,...,nItems-1.
   public boolean iCanDo(int i, int[] PO)
   {
      int j=0;
      while(j< nItems && PO[j]< =inv[i][j])
         j++;
      return (j==nItems);
   }
   
   // i satisfies 0 < = i < nStores.
   // PO represents a purchase order. It has length nItems and P0[j] is the
   // quantity of item j that the customer wishes to buy.
   // Yields the cost of processing the purchase order at store i.
   public int iCost(int i, int[] PO)
   {
      int value = 0;
      for(int j=0;j < nItems;j++)
         value = value + price[i][j]*PO[j];
      return value;
   } 
   
   // PO represents a purchase order. It has length nItems and P0[j] is the
   // quantity of item j that the customer wishes to buy.
   // If no store can process the purchase order then an appropriate message is
   // printed and each store increases its inventory just enough so that it can 
   // process the PO "the next time".
   // Otherwise, the index of the store that can most cheaply fill the PO is printed 
   // along with the minimum cost. The store that processes the order has its inventory
   // depleted accordingly.
   public void processPO(int[] PO)
   {
      int i = 0;
      while (i< nStores && !iCanDo(i,PO))
         i++;
      if (i==nStores)
      {
         // No store has sufficient inventory.
         System.out.println("No single store can process this order at this time.");
         updateInv(PO);
      }
      else
      {
         // Find the store that can most cheaply fill the PO.
         int minCost = iCost(i,PO);
         int bestStore = i;
         for (int s=i+1;s < nStores;s++)
            if (iCanDo(s,PO) && iCost(s,PO) < minCost)
            {
               bestStore = s;
               minCost = iCost(s,PO);
            }
         System.out.println("Price at store " + bestStore + " is " + minCost);
         updateInv(bestStore,PO);
      }
    }
    
    // PO represents a purchase order. It has length nItems and P0[j] is the
    // quantity of item j that the customer wishes to buy. The inventory of every
    // store is increased (if necessary) so that it can just handle the PO.
    public void updateInv(int[] PO)
    {
       for(int i=0;i< nStores;i++)
          for(int j=0;j< nItems;j++)
              if (inv[i][j]< PO[j])
                 inv[i][j] = PO[j];
    }
    
    // i satisfies 0 < = i < nStores
    // PO represents a purchase order. It has length nItems and P0[j] is the
    // quantity of item j that the customer wishes to buy. 
    // The inventory for store i is adjusted to reflect the processing of the PO.
    public void updateInv(int i, int[] PO)
    {
       for(int j=0;j< nItems;j++)
          inv[i][j] = inv[i][j] - PO[j];
    }      
    
    // Displays the inventory array.
    public void showInv()
    {
       System.out.println(" ");
       for(int i=0;i< nStores;i++)
       {
          for(int j=0;j< nItems;j++)
             Format.print(System.out," %3d ",inv[i][j]);
          System.out.println(" ");
       }
       System.out.println(" ");
    }  
    
   // Yields a reference to an array that is an identical copy of A.
   public static int[][] copy(int[][] A)
   {
      int nRows = A.length;
      int nCols = A[0].length;
      int[][] B = new int[nRows][nCols];
      for(int i=0;i< nRows;i++)
         for(int j=0;j< nCols;j++)
            B[i][j] = A[i][j];
      return B;
   }

}


import java.io.*;
public class ShowRetailer
{	
	public static void main(String args[])
	{
       TokenReader in = new TokenReader(System.in);
	   
	   // A sample price array.
	   int[][] eg_P = { { 32 , 20 , 22 , 12 , 19 , 17 , 31 , 12} ,
		                { 34 , 22 , 25 , 10 , 13 , 19 , 33 , 15} ,
		                { 34 , 21 , 24 , 13 , 17 , 17 , 34 , 12} };
		     
	   // A sample inventory array.      
	   int[][] eg_I = { { 10 , 20 , 60 , 10 , 40 , 70 , 20 , 10} ,
	                    { 90 , 40 , 80 , 50 , 30 , 40 , 80 , 90} ,
	                    { 30 , 60 , 40 , 30 , 90 , 70 , 30 , 80} };
	                     
	   // Build a store and process three customers.
	   Retailer TallMart = new Retailer(eg_P,eg_I);
	   TallMart.showInv();
	   int[] PO1 = {10,10,10,10,10,10,10,10}; TallMart.processPO(PO1); TallMart.showInv();
	   int[] PO2 = {20,20,20,20,20,20,20,20}; TallMart.processPO(PO2); TallMart.showInv();
	   int[] PO3 = {100,0,0,0,0,0,0,0};       TallMart.processPO(PO3); TallMart.showInv();
	   
	   in.waitUntilEnter();
	}

}

/*

  10   20   60   10   40   70   20   10
  90   40   80   50   30   40   80   90
  30   60   40   30   90   70   30   80

Price at store 0 is 1650

   0   10   50    0   30   60   10    0
  90   40   80   50   30   40   80   90
  30   60   40   30   90   70   30   80

Price at store 1 is 3420

   0   10   50    0   30   60   10    0
  70   20   60   30   10   20   60   70
  30   60   40   30   90   70   30   80

No single store can process this order at this time.

 100   10   50    0   30   60   10    0
 100   20   60   30   10   20   60   70
 100   60   40   30   90   70   30   80

*/