Download | Plain Text | No Line Numbers
- /*
- * Copyright (c) 2008, Manuel Mausz <manuel at mausz.at>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of the copyright holders nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
- * HOLDERS 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.
- */
-
- import java.io.InputStream;
- import java.util.HashMap;
- import java.util.Scanner;
- import java.lang.Class;
- import java.lang.Boolean;
- import java.lang.reflect.*;
- import java.util.InputMismatchException;
- import java.lang.NoSuchMethodException;
-
-
- /**
- * CalcOperator encapsulate an Operator
- * NOTE: This class isn't public due to EPROG limitations.
- * EPROG doesn't allow shipping files not specified
- *
- * @version 1.0
- * @author Manuel Mausz (manuel at mausz.at)
- * @author http://manuel.mausz.at/
- */
- class CalcOperator
- {
-
- /**
- * Constructor
- *
- * @param value init value
- */
- {
- this.op = op;
- }
-
- /**
- * @return encapsulated operator
- */
- {
- return op;
- }
-
- /**
- * Indicates whether some other object is "equal to" this one
- *
- * @param obj the reference object with which to compare
- * @return true if this object is the same as the obj argument; false otherwise
- */
- {
- if (op2 == null)
- return false;
- else if (op2 instanceof CalcOperator)
- return this.op.equals(((CalcOperator) op2).get());
- else
- return false;
- }
-
- /**
- * Returns a hash code value for the object
- *
- * @return string
- */
- public int hashCode()
- {
- return op.hashCode();
- }
-
- /**
- * Converts instance to string
- *
- * @return string
- */
- {
- return op;
- }
- }
-
-
- /**
- * Abstract for CalcValue
- *
- * @version 1.0
- * @author Manuel Mausz (manuel at mausz.at)
- * @author http://manuel.mausz.at/
- */
- abstract class CalcValue
- {
- protected static HashMap<CalcOperator, String> operators = new HashMap<CalcOperator, String>();
-
- /**
- * Assigns an operator to a method
- *
- * @param op operator
- * @param func method name
- */
- {
- operators.put(op, func);
- }
-
- /**
- * Checks if instance has an method assigned to operater
- *
- * @param op operator
- * @return boolean
- */
- public boolean isSupported(CalcOperator op)
- {
- return operators.containsKey(op);
- }
-
- /**
- * Invokes the method assigned to operator
- * passes value as argument
- *
- * @param value argument passed to the invoked method
- * @param op operator
- * @return object return by invoked method
- * @throws NoSuchMethodException
- * @throws InvocationTargetException
- */
- {
-
- if (methodname == null)
-
- try
- {
- }
- {
- }
-
- return ret;
- }
- }
-
-
- /**
- * Calculator
- *
- * @version 1.0
- * @author Manuel Mausz (manuel at mausz.at)
- * @author http://manuel.mausz.at/
- */
- public class Calculator
- {
- private static Complex val1;
- private static Complex val2;
- private static CalcOperator op;
-
- /**
- * read values and operator from src
- * only allow syntax: "op real1 img1 real2 img2 ..."
- *
- * @param src input stream
- * @return boolean true on success, false otherwise
- * @throws InputMismatchException
- * @throws NoSuchMethodException
- * @throws InvocationTargetException
- */
- {
- int real, img;
-
- /* get first line only */
- if (!scanner.hasNextLine())
- return false;
- scanner.close();
-
- /* parse first line */
- scanner = new Scanner(line1);
-
- /* scan operator */
- if (!scanner.hasNext())
- throw new InputMismatchException("Invalid operator");
- op = new CalcOperator(scanner.next());
-
- /* scan first complex value */
- if (!scanner.hasNextInt())
- throw new InputMismatchException("Invalid real part. No integer");
- real = scanner.nextInt();
-
- if (!scanner.hasNextInt())
- throw new InputMismatchException("Invalid imaginary param. No integer");
- img = scanner.nextInt();
-
- val1 = new Complex(real, img);
-
- /* check operator. this will also be done implicitly in calc() */
- if (!val1.isSupported(op))
-
- /* scan other complex values */
- while(scanner.hasNext())
- {
- if (!scanner.hasNextInt())
- throw new InputMismatchException("Invalid real param. No integer");
- real = scanner.nextInt();
-
- if (!scanner.hasNextInt())
- throw new InputMismatchException("Invalid imaginary param. No integer");
- img = scanner.nextInt();
-
- val2 = new Complex(real, img);
-
- /* do calculation */
- val1.calc(val2, op);
- }
-
- scanner.close();
-
- return true;
- }
-
- /**
- * main method
- *
- * @param args not used
- */
- {
- val1 = new Complex(0, 0);
-
- try
- {
- /* parse stdin */
-
- /* print result to stdout */
- }
- {
- }
- }
- }
-