CS1 Course Site

CS1 at Oswego

Hypertexknowlogy

Frequently Asked Questions

 
CS1 Course Site  
 
 
 
Programming Challenge Archive

Number Machine
 
 

 
  JavaApplication  -- NumberMachine

   // General Information
   // --------------------------------------------------
  
   // File:  NumberMachineApp.java
   // Type:  java application file
   // Date:  Wed Oct 18, 1995
   // Name:  BLUE
   // Line:  Interpreter for simple arithmetic commands
  
  
   // Application Description
   // --------------------------------------------------
  
   /*
  
      A simple interpreter which reads an "operator" and
      and "integer", performs a "real" computation, and
      reports the "real" result.  
  
      Establish "current" as a  "real" and assign it the 
      value 0.0.  The prompt  will consist of the value
      of "current" followed by a colon.  There are five 
      commands.
  
         .        terminate execution of the interpreter
         +   make current ( current +  )
         -   make current ( current -  )
         *   make current ( current *  )
         /   make current ( current /  )
  
      In short, if the user types a period, the program 
      stops.  If not, the value of current is changed.
  
      Sample Session ...
  
      indigo> java NumberMachineApp
      0:         + 5
      5:         - 3
      2:         * 5
      10:        / 3
      3.33333:   * 2
      6.66667:   * 100
      666.667:   - 212
      454.667:   / 10
      45.4667:   .
      indigo> 
  
   */
  
  
   // Required Packages
   // --------------------------------------------------
  
      import blue.io.*;
  
  
   // Application Class
   // --------------------------------------------------
  
      class NumberMachineApp
      {
      // establish current number
         static private double current = 0.0;
  
      // declare operation code variable and operand variable+
  
         static private char opCode;
         static private int operand;
  
      // the main method
         static public void main (String args[])
         {
            interpreter();
         }
  
      // the interpreter
         static private void interpreter()
         {
         // issue the prompt
            issuePrompt();
  
         // read the operation code
            readOpCode();
  
         // return if "stop" command
            if ( opCode == '.' )
            {
               return;
            };
  
         // read operand for arithmetic commands
            operand = IO.read_int();
  
         // dispatch to appropriate "action" method
            if ( opCode == '+' )
            {
               processPlus();
            };
            if ( opCode == '-' )
            {
               processMinus();
            };
            if ( opCode == '*' )
        {
    processTimes();
        }
            if ( opCode == '/' )
        {
    processDivides();
        }
  
         // do it again
            interpreter();
         };
  
      // issue the prompt
         static private void issuePrompt()
         {
            IO.print(current + ":");
            int length = Double.toString(current).length();
            for ( int i = 1; i <= ( 10 - length ); i++ )
            {
               IO.print(" ");
            };
         }
  
      // read the operation code
         static private void readOpCode()
         {
            char c = IO.read_char();
            boolean plus = ( c == '+' );
            boolean minus = ( c == '-' );
            boolean times = ( c == '*' );
            boolean divides = ( c == '/' );
            boolean stop = ( c == '.' );
            if ( plus || minus || times || divides || stop )
            {
               opCode = c;
            }
            else
            {
               readOpCode();
            };
         }
  
      // process the plus command
         static private void processPlus()
         {
            current = current + operand;
         }
  
      // process the minus command
         static private void processMinus()
         {
            current = current - operand;
         }
  
      // process the times command
          static private void processTimes()
          {
      current = current * operand;
          }
  
      // process the divides command
          static private void processDivides()
          {
      current = current / operand;
          }
  
      }
  
  
   // Demo
   // --------------------------------------------------
  
   /*
     $ javac NumberMachineApp.java
     $ java NumberMachineApp
     0.0:       +11
     11.0:      -1
     10.0:      /3
     3.3333333333333335:*12
     40.0:      *571
     22840.0:   /41
     557.0731707317074:-1234
     -676.9268292682926:/5
     -135.38536585365853:.
     $ 
       
   */