Select a Chapter: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Back to the Main Page
Chapter Two listings: 10 classes

public class MoveOne
{
     // Take a CD from the third slot; put it in the second slot.

     public static void main (String[ ] args)  
     {    Vic sue;          // 1
          sue = new Vic();  // 2

          sue.moveOn();     // 3  move to the second slot
          sue.moveOn();     // 4  move to the third slot
          sue.takeCD();     // 5  take CD from slot 3, put on stack

          sue.backUp();     // 6  move back to the second slot
          sue.putCD();      // 7  put CD in slot 2, taken from stack
     }    //======================
}     


public class SmartVic extends Vic
{
     public void moveTake()
     {    moveOn();
          takeCD();
     }    //======================


     public void backPut()  
     {    backUp();
          putCD();
     }    //======================
}     


public class BringThreeBack
{
     // Move the CDs in slots 2, 3, and 4 back to slots 1, 2, 3,
     // respectively.  Presumes a reset with at least 4 slots.

     public static void main (String[ ] args)  
     {    Vic.reset (args);     // 1
          SmartVic sue;         // 2
          sue = new SmartVic(); // 3
          sue.moveTake();       // 4  move to slot 2 and take CD
          sue.backPut();        // 5  back to slot 1 and put CD there

          sue.moveOn();         // 6
          sue.moveTake();       // 7  move to slot 3 and take CD
          sue.backPut();        // 8  back to slot 2 and put CD there

          sue.moveOn();         // 9
          sue.moveTake();       // 10 move to slot 4 and take CD
          sue.backPut();        // 11 back to slot 3 and put CD there
     }    //======================
}     


public class TwoToFour
{
     // If a CD is in the second slot, take it out and then
     // put it in the fourth slot if possible (robustly).

     public static void main (String[ ] args)  
     {    Vic.reset (args);         // 1
          Vic sue;                  // 2
          sue = new Vic();          // 3
          sue.moveOn();             // 4

          if (sue.seesCD())         // 5  if sue sees a CD in slot 2, 
          {    sue.takeCD();        // 6     then sue takes that CD 
               sue.moveOn();        // 7
               sue.moveOn();        // 8
               if (sue.seesSlot())  // 9  if sue has a slot number 4,
                    sue.putCD();    // 10    then sue puts the CD there
          }                         // 11
     }    //======================
}     


public class ThreeSequences
{
     // For each of the first three sequences, move a CD from the
     // third slot to the fifth slot, insofar as possible.

     public static void main (String[ ] args)
     {    Vic.reset (args);
          Shifter one;
          one = new Shifter();                  // design step 1
          one.shiftThreeToFive();               // design step 2

          Shifter two;
          two = new Shifter();                  // design step 3
          if (two.seesSlot())                   // design step 4
          {    two.shiftThreeToFive();            // design step 4a
               Shifter three;
               three = new Shifter();             // design step 4b
               if (three.seesSlot())              // design step 4c
                    three.shiftThreeToFive();
          }
     }    //======================
}    


public class Shifter extends Vic
{
     // take the CD from slot 3 (if any) and put it in slot 5.

     public void shiftThreeToFive()
     {    moveOn();
          moveOn();                             // now in slot 3
          if (seesCD())
          {    takeCD();
               moveOn();                        // now in slot 4
               if (seesSlot())
               {    moveOn();                   // now in slot 5
                    if (seesSlot())
                         putCD();
               }
          }
     }    //======================
}


public class FillThreeApp
{
     /** Put a CD in each of the first three slots.
      *  Stop as soon as you run out of CDs on the stack. */

     public static void main (String[ ] args)
     {    Vic.say ("This program fills the first three slots.");
          Vic.reset (args);                  // 2
          if (Vic.stackHasCD())              // 3
          {    Vic sue;                      // 4
               sue = new Vic();              // 5
               sue.putCD();                  // 6    in slot 1
               if (Vic.stackHasCD())         // 7
               {    sue.moveOn();            // 8    to slot 2
                    sue.putCD();             // 9
                    if (Vic.stackHasCD())    // 10
                    {    sue.moveOn();       // 11   to slot 3
                         sue.putCD();        // 12
                    }                        // 13
               }                             // 14
          }                                  // 15
          Vic.say ("All done!");             // 16
     }    //======================
}     


public class TwoVics
{
     /** Take the CD in slot 1 if there is one, otherwise put a
      *  CD there; repeat for the second sequence, if any. */

     public static void main (String[ ] args)  
     {    Vic first;                       // 1
          first = new Vic();               // 2
          if (first.seesCD())              // 3
               first.takeCD();             // 4
          else                             // 5
               first.putCD();              // 6

          Vic second;                      // 7
          second = new Vic();              // 8
          if (second.seesSlot())           // 9
          {    if (second.seesCD())        // 10
                    second.takeCD();       // 11
               else                        // 12
                    second.putCD();        // 13
          }                                // 14
     }    //======================
}     


public class Checker extends Vic
{
     /** Tell whether the stack has at least two CDs.
      *  Precondition: the executor is not at the end
      *  of its slots and the current slot is empty. */

     public boolean hasTwoOnStack()
     {    if ( ! stackHasCD())             // 1
               return false;               // 2
          putCD();                         // 3
          if (stackHasCD())                // 4
          {    takeCD();                   // 5
               return true;                // 6
          }                                // 7
          else                             // 8
          {    takeCD();                   // 9
               return false;               // 10
          }                                // 11
     }    //======================


     /** Tell whether the executor's current slot and the one
      *  after it exist and have no CD.  No precondition. */

     public boolean seesTwoEmpty()  
     {    if ( ! seesSlot())               // 12
               return false;               // 13
          if (seesCD())                    // 14
               return false;               // 15
          moveOn();                        // 16
          if (seesSlot())                  // 17
          {    if ( ! seesCD())            // 18
               {    backUp();              // 19
                    return true;           // 20
               }                           // 21
          }                                // 22
          backUp();                        // 23
          return false;                    // 24
     }    //======================
}


public class CheckerRewritten extends Vic  // improved version
{
     /** Tell whether the stack has at least two CDs.
      *  Precondition: the executor is not at the end 
      *  of its slots and the current slot is empty. */

     public boolean hasTwoOnStack()
     {    if ( ! stackHasCD())                 // 1
               return false;                   // 2 
          putCD();                             // 3    modify state
          boolean result;                      // 4
          result = stackHasCD();               // 5
          takeCD();                            // 6    restore state 
          return result;                       // 7
     }    //======================


     /** Tell whether the executor's current slot and the
      *  one after it exist and have no CD.  No precondition. */

     public boolean seesTwoEmpty()  
     {    if ( ! seesSlot() || seesCD())
               return false;
          moveOn();
          boolean valueToReturn;
          valueToReturn = seesSlot() && ! seesCD();
          backUp();
          return valueToReturn;
     }    //======================
}

All information Copyright (c)2001 - Dr. William C. Jones, Jr.
Layout and Design Copyright © Psumonix, LLC. All Rights Reserved.