So to help you seekers of assignment solutions, here you go. Study it, though, rather than just copying it wholesale. Maybe I'm not making this as streamlined as I should, or maybe the xor business is too much trouble for the modest speed and memory boost.
First, the working applet:
And the code behind it:
package cea.demos.fibonacci; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JTextArea; import javax.swing.JTextField; @SuppressWarnings("serial") // Swing applet to display Fibonacci numbers between a range of integers public class Fibonacci extends JApplet implements ActionListener { // Declare form elements JLabel lowLabel, highLabel; JTextField lowText, highText; JButton button; JTextArea output; public void init() { // Set component positions by hand setLayout(null); // Instantiate form elements lowLabel = new JLabel("Lower Limit"); highLabel = new JLabel("Upper Limit"); lowText = new JTextField(); highText = new JTextField(); button = new JButton("Calculate"); output = new JTextArea(); // Set their locations lowLabel.setBounds(10, 10, 100, 20); lowText.setBounds(10, 30, 50, 20); highLabel.setBounds(150, 10, 100, 20); highText.setBounds(150, 30, 50, 20); button.setBounds(275, 20, 100, 20); output.setBounds(10, 60, 365, 100); // Set the text area to properly word wrap, disable it from user input, // and set its text color back to black output.setLineWrap(true); output.setWrapStyleWord(true); output.setEnabled(false); output.setDisabledTextColor(Color.BLACK); // Add them to the applet add(lowLabel); add(lowText); add(highLabel); add(highText); add(button); add(output); // Add action listeners to the button and the two text fields // (in case user just wants to hit enter after typing a number) button.addActionListener(this); lowText.addActionListener(this); highText.addActionListener(this); } // The main Fibonacci calculator private void calculate() { int low, high; // Make sure both text fields are filled in with numbers try { low = Integer.parseInt(lowText.getText()); high = Integer.parseInt(highText.getText()); } catch (NumberFormatException e) { output.setText("Both text fields must contain integers"); return; } // Verify limits are both non-negative, and that "higher" is the larger. if (low < 0 || high < 0) { output.setText("Neither limit can be negative"); return; } if (high <= low) { output.setText("Higher limit must be greater than lower limit"); } // Init the first two numbers in the sequence, and the first line of output int current = 0; int next = 1; StringBuffer out = new StringBuffer ("Fibonacci sequence between " + low + " and " + high + ":\n"); // "started" flag is used to check whether or not to add a comma before // printing the current item in the sequence. If started is false, you // haven't printed anything yet, so no comma is needed. boolean started = false; // Start calculating the sequence until the high limit is reached... while (current <= high) { // but don't start printing until the low limit is reached if (current >= low) { if (started) out.append(", "); else started = true; out.append(current); } // Add next to current, then use an xor swap to switch them. This avoids // using a third variable and the logic c = a + b, a = b, b = c. current += next; next ^= current; current ^= next; next ^= current; } // Finally, print the results in the text area output.setText(out.toString()); } @Override public void actionPerformed(ActionEvent e) { calculate(); } }
No comments:
Post a Comment