Results 1 to 4 of 4
Thread: Arithmetic expression calculator
- 07-11-2011, 05:19 AM #1
Member
- Join Date
- Jun 2011
- Posts
- 40
- Rep Power
- 0
Arithmetic expression calculator
Hello everybody!
...hi dr nick
Anyways I have this code that compiles but won't complete the actual function it serves I need to calculate expressions such as 2+3+9-4 then hit the calculate button then it is suppose to be displayed in the other field however I don't know where it it going wrong
Java Code:import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*; import java.awt.*; import java.io.*; import java.util.*; public class CalcExp extends JPanel { private JTextField jTextField1 = new JTextField(10); private JTextField jTextField2 = new JTextField(10); private JButton jButton1 = new JButton("Calculate"); public CalcExp() { /*jTextField1.setEditable(true); jTextField2.setEditable(false); jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { jButton1ActionPerformed(e); } }); add(jTextField1); add(jTextField2); add(jButton1);*/ // draw the interface Panel northP = new Panel(); // input Panel centerP = new Panel(); // controls Panel southP = new Panel(); // output // input panel northP.setLayout( new BorderLayout() ); northP.add( "Center", jTextField1 = new JTextField(30) ); // controls panel centerP.add( jButton1 = new JButton("Calculate") ); // output panel southP.setLayout( new BorderLayout() ); southP.add( "Center", jTextField2 = new JTextField(30) ); jTextField2.setEditable( false ); // add all the panels setLayout( new BorderLayout() ); add( "North", northP ); add( "Center", centerP ); add( "South", southP ); return; } public boolean action( Event ev, Object arg ) { if (ev.target instanceof JButton) { if ("Calculate".equals(arg)) process(); return true; } return false; } // process the input string protected void process() { // get the input string String inputString = jTextField1.getText(); // trim the string inputString = inputString.trim(); // ensure there are characters to process if (inputString.length() > 0) // check syntax, evaluate and display results if correct if ( checkSyntax() ) jTextField2.setText( " = " + evaluate() ); } // checkSyntax checks the syntax of the input string, calls reportError // to report any errors. Returns true if the string is part of the // grammar, false if an error was found. protected boolean checkSyntax() { int opCount = 1; // start with a value boolean hasDec = false; // does the current # have a decimal component? int i; String inputString = jTextField1.getText(); // check each character for (i = 0; i < inputString.length(); i++) switch(inputString.charAt(i)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': opCount = 0; break; case '.': if (((opCount += 2) > 2) || hasDec) return reportError(i); hasDec = true; break; case '/': case '*': if (opCount++ > 0) return reportError(i); hasDec = false; break; case '+': case '-': if (opCount++ > 1) return reportError(i); hasDec = false; break; default: return reportError(i); } // make sure expression ends with a value if (opCount > 0) return reportError(i); else return true; } // evaluate - returns the value obtained by evaluating the input expression protected double evaluate() { String inputString = jTextField1.getText(); // temp token handle String tok1, tok2; // create a string tokenizer object, keeping the delimiters as tokens StringTokenizer tokens = new StringTokenizer( inputString, "+-/*", true ); // get the first token and put its value into result if ((tok1 = tokens.nextToken()).equals("+")) tok1 = tokens.nextToken(); else if (tok1.equals("-")) tok1 = "-".concat(tokens.nextToken()); double result = new Double(tok1).doubleValue(); // evaluate the expression while (tokens.hasMoreTokens()) { // get the operator token tok1 = tokens.nextToken(); // get the second operand token if ((tok2 = tokens.nextToken()).equals("+")) tok2 = tokens.nextToken(); else if (tok2.equals("-")) tok2 = "-".concat(tokens.nextToken()); // evaluate the subexpression switch (tok1.charAt(0)) { case '+': result += new Double(tok2).doubleValue(); break; case '-': result -= new Double(tok2).doubleValue(); break; case '/': result /= new Double(tok2).doubleValue(); break; case '*': result *= new Double(tok2).doubleValue(); break; } } return result; } // reportError - Reports a syntax error to outputTA. Always // returns false. protected boolean reportError( int index ) { String inputString = jTextField1.getText(); // create a new string with the first line of output String outputString = new String("Syntax error:\n"); // echo the user input as second line outputString = outputString.concat( inputString ); outputString = outputString.concat( "\n" ); // display pointer to error position as third line for (int i = 0; i < index; i++) outputString = outputString.concat(" "); outputString = outputString.concat("^"); // copy the output string text to the output text area jTextField2.setText( outputString ); return false; } private static void createAndShowUI() { JFrame frame = new JFrame("M009"); frame.getContentPane().add(new CalcExp()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); }}
- 07-11-2011, 07:17 AM #2
Posting inconsistently indented code with a whole lot of GUI stuff unrelated to the stated problem, and including a block of 10 commented-out lines in your post isn't the best way to get help on a forum.
Recommended reading: SSCCE and How to ask questions the smart way
db
- 07-11-2011, 10:37 AM #3
- Join Date
- Sep 2008
- Location
- Voorschoten, the Netherlands
- Posts
- 11,385
- Blog Entries
- 7
- Rep Power
- 17
Basically it's the checkSyntax() method you're having problems with, all the rest doesn't matter here. You don't parse expressions like that. The easiest (read: less tricky) way to do that is to build a recursive descent parser; it follows the following grammar rules:
The stuff between angular brackets represent your (recursive) methods, all the rest are simple tokens. I left out the definition for a <number> for brevity. You also need a lexical analyzer that produces the simple tokens for the above parser. Google for "expression parser" and "recursive descent parser" for the details.Java Code:<expression> = <term> <expression_tail> <expression_tail> = empty | [+|-] <expression> <expression_tail> <term> = <factor> <term_tail> <term_tail>= empty | [*|/] <term> <term_tail> <factor> = - <factor> | <number> | ( <expression> )
kind regards,
JosWhen people rob a bank they get a penalty; when banks rob people they get a bonus.
- 07-11-2011, 04:28 PM #4
Does it execute without exceptions?it is suppose to be displayed in the other field however I don't know where it it going wrong
Can you explain what the code does and why that is not what you want it to do?
Give the input sequence you use to test it and show what it outputs. Explain what is wrong with the output.
Try debugging your code by adding lots of printlns to show the execution flow and the values of variables as they change.
You should understand how you want your program to work. The printed output will show you where the code is executing differently from what you want it to do. When you see where that is happening you can go in and change that code so it works the way you want it to.
Similar Threads
-
Find the value of the arithmetic expression...
By hydride in forum Advanced JavaReplies: 3Last Post: 03-16-2011, 09:17 AM -
Arithmetic using doubles
By Black_Eye in forum New To JavaReplies: 4Last Post: 10-19-2010, 08:35 AM -
Polynomials Arithmetic
By thisisIT in forum New To JavaReplies: 3Last Post: 03-09-2010, 01:27 PM -
String to Expression? calculator app question
By Belbis in forum New To JavaReplies: 2Last Post: 12-24-2008, 07:13 AM -
Arithmetic Stacks
By unc123w in forum New To JavaReplies: 22Last Post: 10-21-2008, 08:24 PM


LinkBack URL
About LinkBacks
Reply With Quote
Bookmarks