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