SimpleCalc -- simple calculator using 1.5 java.util.Scanner : Console « Development Class « Java






SimpleCalc -- simple calculator using 1.5 java.util.Scanner

  
/*
* Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002.
* All rights reserved. Software written by Ian F. Darwin and others.
* $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* 
* Java, the Duke mascot, and all variants of Sun's Java "steaming coffee
* cup" logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,
* pioneering role in inventing and promulgating (and standardizing) the Java 
* language and environment is gratefully acknowledged.
* 
* The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for
* inventing predecessor languages C and C++ is also gratefully acknowledged.
*/



import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.Scanner;
import java.util.Stack;

/**
* SimpleCalc -- simple calculator using 1.5 java.util.Scanner
* @version  $Id: SimpleCalcScanner.java,v 1.3 2004/03/10 18:01:35 ian Exp $
*/
public class SimpleCalcScanner {
  /** The Scanner */
  protected  Scanner scan;

  /** The output */
  protected PrintWriter out = new PrintWriter(System.out);

  /** The variable name (not used in this version) */
  protected String variable;

  /** The operand stack */
  protected Stack s = new Stack();

  /* Driver - main program */
  public static void main(String[] av) throws IOException {
    if (av.length == 0)
      new SimpleCalcScanner(
        new InputStreamReader(System.in)).doCalc();
    else 
      for (int i=0; i<av.length; i++)
        new SimpleCalcScanner(av[i]).doCalc();
  }

  /** Construct a SimpleCalcScanner by name */
  public SimpleCalcScanner(String fileName) throws IOException {
    this(new FileReader(fileName));
  }

  /** Construct a SimpleCalcScanner from an open Reader */
  public SimpleCalcScanner(Reader rdr) throws IOException {
    scan = new Scanner(rdr);
    // Control the input character set:
    scan.slashSlashComments(true);  // treat "//" as comments
    scan.ordinaryChar('-');    // used for subtraction
    scan.ordinaryChar('/');  // used for division
  }

  /** Construct a SimpleCalcScanner from a Reader and a PrintWriter */
  public SimpleCalcScanner(Reader rdr, PrintWriter pw) throws IOException {
    this(rdr);
    setWriter(pw);
  }

  /** Change the output to go to a new PrintWriter */
  public void setWriter(PrintWriter pw) {
    out = pw;
  }

  protected void doCalc() throws IOException {
    int iType;
    double tmp;

    while (scan.hasNext()) {
      if (scan.hasNextDouble()) {
        push(scan.nextDouble());
      } else {
        String token = scan.next().toString();
        if (token.equals("+")) {
          // Found + operator, perform it immediately.
          push(pop() + pop());
        } else if (token.equals("-")) {
          // Found - operator, perform it (order matters).
          tmp = pop();
          push(pop() - tmp);
        } else if (token.equals("*")) {
          // Multiply is commutative
          push(pop() * pop());
        } else if (token.equals("/")) {
          // Handle division carefully: order matters!
          tmp = pop();
          push(pop() / tmp);
        } else if (token.equals("=")) {
          out.println(peek());
        } else {
          out.println("What's this? " + token);
        }
      }
    }
  }

  void push(double val) {
    s.push(new Double(val));
  }

  double pop() {
    return ((Double)s.pop()).doubleValue();
  }

  double peek() {
    return ((Double)s.peek()).doubleValue();
  }

  void clearStack() {
    s.removeAllElements();
  }
}


           
         
    
  








Related examples in the same category

1.Turn System.out into a PrintWriterTurn System.out into a PrintWriter
2.Output to standard output and standard error; and input from standard input.Output to standard output and standard error; and input from standard input.
3.VarArgsDemo - show 1.5 variable argumentsVarArgsDemo - show 1.5 variable arguments
4.How to read from standard inputHow to read from standard input
5.How to deal with the console parametersHow to deal with the console parameters
6.Read input from consoleRead input from console
7.Command line input
8.Read an int from Standard Input
9.Read an int from Standard Input, using 1.5
10.Show use of Argv to get an integer value from command lineShow use of Argv to get an integer value from command line
11.Java program to calculate the area of a circleJava program to calculate the area of a circle
12.Java program to demonstrate menu selectionJava program to demonstrate menu selection
13.Utility class for printing aligned columns of text
14.Processing the command line
15.A representation of the command line arguments passed to a Java class' main(String[]) method
16.Helper class for storing long command lines inside temporary file.
17.CommandLine Parser
18.This parses command line arguments optimized for ease of programmer use.
19.Console read and write Utils