簡體   English   中英

調試二次方程圖示器(Java)

[英]Debugging Quadratic Equation Grapher (Java)

我目前正在嘗試調試一些代碼以完成某項任務,並且碰壁了,我意識到這不僅是為了給我答案,因此我只是在尋找正確方向的幫助。 提供給我的程序應該允許用戶使用滑塊更改方程式中的系數來繪制各種二次方程式,但是當b和c值更改時,它們始終保持正值。 還值得一提的是,系數正確顯示在圖形屏幕的頂部,只是圖形錯誤。

//********************************************************************
//   Equation.java       Authors: Lewis/Loftus
//
//   Solution to Programming Project 10.9 
//********************************************************************

public class Equation
{
   private int a, b, c;
   public final String SQUARED = "\u00B2";

   //------------------------------------------------------------------
   //   Sets up the default coeficients of this equation:
   //   a*x^2 + b*x + c
   //------------------------------------------------------------------
   public Equation()
   {
      a = b = c = 0;
   }

   //------------------------------------------------------------------
   //   Sets up the coeficients of this equation as specified.
   //------------------------------------------------------------------
   public Equation (int aValue, int bValue, int cValue)
   {
      a = aValue;
      b = bValue;
      c = cValue;
   }

   //------------------------------------------------------------------
   //   Computes the current value of this equation.
   //------------------------------------------------------------------
   public double computeValue(double x)
   {
      return a*x*x + b*x + c;
   }

   //------------------------------------------------------------------
   //   Returns a string representation of this equation.
   //------------------------------------------------------------------
   public String toString()
   {
      StringBuffer equation = new StringBuffer();

      if (a==0 && b==0 && c==0)
         equation.append("0");
      else
      {
         if (a != 0)
         {
            if (a==-1)
               equation.append("-");
            else
               if (a!=1)
                  equation.append(a);
            equation.append( "x" + SQUARED);
         }
         if (b != 0)
         {
            if (b < 0)
            {
               if (a==0)
                  equation.append("-");
               else
                  equation.append(" - ");
                  b = -b;
            }
            else
               equation.append(" + ");
            if (b!=1 && b!= -1)
               equation.append(b);
            equation.append("x");
         }
         if (c != 0)
         {
            if (c < 0)
            {
               if (a!=0 || b!=0)
                  equation.append(" - ");
               else
                  equation.append("-");
                  c = -c;
            }
            else
               equation.append(" + ");
            equation.append(c);
         }
      }

      // erase leading +
      if (equation.length() > 2)
      {
         char ch = equation.charAt(1);
         if (ch=='+')
         {
           equation.deleteCharAt(0);
           equation.deleteCharAt(0);
         }
      }
      return equation.toString();
   }
}


//********************************************************************
//  EquationGraphPanel.java       Authors: Lewis/Loftus
//
//  Solution to Programming Project 10.9 
//********************************************************************

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.LineBorder;

public class EquationGraphPanel extends JPanel
{
   private JSlider aSlider;
   private JSlider bSlider;
   private JSlider cSlider;
   private EquationViewportPanel display;
   private JLabel equationLabel;

   private final String EQUATION_SUBSTRING = "Graph of equation y = ";

   private final int MIN_VALUE = -5;
   private final int MAX_VALUE = 5;
   private final int INIT_VALUE = 0;
   private final int TICK_SPACING = 5;
   private final int MINOR_TICK_SPACING = 1;

   //-----------------------------------------------------------------
   //  Sets up the panel.
   //-----------------------------------------------------------------
   public EquationGraphPanel()
   {
      setLayout(new BorderLayout());

      add(getSliderPanel(), BorderLayout.WEST);

      display = new EquationViewportPanel();
      add(display, BorderLayout.CENTER);

      equationLabel = new JLabel(EQUATION_SUBSTRING + 0);
      equationLabel.setHorizontalAlignment(SwingConstants.CENTER);
      equationLabel.setFont(new Font("Dialog", Font.BOLD, 16));
      add(equationLabel, BorderLayout.NORTH);
   }

   //-----------------------------------------------------------------
   //  Creates the sliders and slider panel.
   //-------------------------------------------------------------
   private JPanel getSliderPanel()
   {
      SliderMouseListener changed = new SliderMouseListener();

      aSlider = new JSlider(JSlider.HORIZONTAL, MIN_VALUE, MAX_VALUE, INIT_VALUE);
      aSlider.setPaintTicks(true);
      aSlider.setPaintLabels(true);
      aSlider.setMajorTickSpacing(TICK_SPACING);
      aSlider.setMinorTickSpacing(MINOR_TICK_SPACING);
      aSlider.setSnapToTicks(true);
      aSlider.addMouseListener(changed);

      bSlider = new JSlider(JSlider.HORIZONTAL, MIN_VALUE, MAX_VALUE, INIT_VALUE);
      bSlider.setPaintTicks(true);
      bSlider.setPaintLabels(true);
      bSlider.setMajorTickSpacing(TICK_SPACING);
      bSlider.setMinorTickSpacing(MINOR_TICK_SPACING);
      bSlider.setSnapToTicks(true);
      bSlider.addMouseListener(changed);

      cSlider = new JSlider(JSlider.HORIZONTAL, MIN_VALUE, MAX_VALUE, INIT_VALUE);
      cSlider.setPaintTicks(true);
      cSlider.setPaintLabels(true);
      cSlider.setMajorTickSpacing(TICK_SPACING);
      cSlider.setMinorTickSpacing(MINOR_TICK_SPACING);
      cSlider.setSnapToTicks(true);
      cSlider.addMouseListener(changed);

      JPanel aPanel = new JPanel();
      aPanel.setLayout(new BoxLayout(aPanel, BoxLayout.Y_AXIS));
      aPanel.setBorder(new LineBorder(Color.black));
      aPanel.add(new JLabel("value of 'a'"));
      aPanel.add(aSlider);

      JPanel bPanel = new JPanel();
      bPanel.setLayout(new BoxLayout(bPanel, BoxLayout.Y_AXIS));
      bPanel.setBorder(new LineBorder(Color.black));
      bPanel.add(new JLabel("value of 'b'"));
      bPanel.add(bSlider);

      JPanel cPanel = new JPanel();
      cPanel.setLayout(new BoxLayout(cPanel, BoxLayout.Y_AXIS));
      cPanel.setBorder(new LineBorder(Color.black));
      cPanel.add(new JLabel("value of 'c'"));
      cPanel.add(cSlider);

      JPanel sliderPanel = new JPanel();
      sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.Y_AXIS));
      JLabel title = new JLabel("ax\u00B2 + bx + c");
      title.setFont(new Font("Dialog", Font.BOLD, 16));
      title.setHorizontalAlignment(SwingConstants.CENTER);
      sliderPanel.add(title);
      sliderPanel.add(new JLabel("Select values for each coefficient:"));
      sliderPanel.add(Box.createVerticalGlue());
      sliderPanel.add(aPanel);
      sliderPanel.add(Box.createVerticalGlue());
      sliderPanel.add(bPanel);
      sliderPanel.add(Box.createVerticalGlue());
      sliderPanel.add(cPanel);

      return sliderPanel;
   }

   //-----------------------------------------------------------------
   //  Update and equation label.
   //-------------------------------------------------------------
   private void updateEquationLabel (Equation equation)
   {
      equationLabel.setText (EQUATION_SUBSTRING + equation.toString());
   }

   //********************************************************************
   //  Represents the mouse listener class for the sliders.
   //********************************************************************
   private class SliderMouseListener extends MouseAdapter
   {
      //-----------------------------------------------------------------
      //  Redraws the graph.
      //-----------------------------------------------------------------
      public void mouseReleased(MouseEvent event)
      {
         Equation equation = new Equation(aSlider.getValue(), bSlider.getValue(), cSlider.getValue());
         display.setEquation(equation);
         updateEquationLabel(equation);
         repaint();
      }
   }
}


//********************************************************************
//  EquationViewportPanel.java       Authors: Lewis/Loftus
//
//  Solution to Programming Project 10.9 
//********************************************************************

import java.awt.*;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class EquationViewportPanel extends JPanel
{
   private final int X_MIN = -10, Y_MIN = -10, X_MAX = 10, Y_MAX = 10;
   private final int REAL_WORLD_WIDTH = X_MAX - X_MIN;
   private final int REAL_WORLD_HEIGHT = Y_MAX - Y_MIN;
   private final double TICK_LENGTH = 0.2;

   private Equation equation;

   //-----------------------------------------------------------------
   //  Constructor: Sets up this panel.
   //-----------------------------------------------------------------
   public EquationViewportPanel()
   {
      equation = new Equation();
      setBorder (new LineBorder(Color.black, 4));
      setPreferredSize(new Dimension(500, 500));
   }

   //-----------------------------------------------------------------
   //  Sets the equation.
   //-----------------------------------------------------------------
   void setEquation (Equation newEquation)
   {
      equation = newEquation;
   }

   //-----------------------------------------------------------------
   //  Converts world X coordinate to screen X coordinate.
   //-----------------------------------------------------------------
   private int convertX (double x)
   {
      double offset = x - X_MIN;
      double result = offset * getSize().width / REAL_WORLD_WIDTH;
      return (int)Math.round(result);
   }

   //-----------------------------------------------------------------
   //  Converts world Y coordinate to screen Y coordinate.
   //-----------------------------------------------------------------
   private int convertY (double y)
   {
      double offset = Y_MAX - y;
      double result = offset * getSize().height / REAL_WORLD_HEIGHT;
      return (int)Math.round(result);
   }

   //-----------------------------------------------------------------
   //  Draws a line in world coordinates on the screen.
   //-----------------------------------------------------------------
   private void drawScreenLine(Graphics page, double xMin, double yMin,
      double xMax, double yMax)
   {
      page.drawLine(convertX(xMin), convertY(yMin), convertX(xMax), convertY(yMax));
   }

   //-----------------------------------------------------------------
   //  Draws a point in world coordinates on the screen.
   //-----------------------------------------------------------------
   private void drawScreenPoint(Graphics page, double x, double y)
   {
      page.drawLine(convertX(x), convertY(y), convertX(x), convertY(y));
   }

   //-----------------------------------------------------------------
   //  Draws the graph axes and equation.
   //-----------------------------------------------------------------
   public void paintComponent(Graphics page)
   {
      page.setColor(Color.white);
      page.fillRect(0,0,getSize().width, getSize().height);

      // draw the x and y axis
      page.setColor(Color.pink);
      drawScreenLine(page, X_MIN, 0, X_MAX, 0);
      drawScreenLine(page, 0, Y_MIN, 0, Y_MAX);

      // draw tick marks
      for (int x=X_MIN; x<X_MAX; x++)
         drawScreenLine(page, x, -TICK_LENGTH, x, TICK_LENGTH);
      for (int y=Y_MIN; y<Y_MAX; y++)
         drawScreenLine(page, -TICK_LENGTH, y, TICK_LENGTH, y);

      // draw the graph of the equation
      page.setColor(Color.black);
      double x = X_MIN;
      double y;
      double stepSize = (double)(X_MAX - X_MIN) / getSize().width;
      int screenX = getSize().width;
      for (int i = 0; i <= screenX; i++)
      {
         y = equation.computeValue(x);
         drawScreenPoint(page, x, y);
         x += stepSize;
      }
   }
}

這是三個相關的程序,因為另一個程序僅是驅動程序類。 我測試了通過在重新繪制圖形之后(在第二個代碼塊的第124行之后)立即打印值來從滑塊獲得正確的值,並且這些值是正確的,但是當在Equation方法中分配它們時它們似乎改變了符號(第一個代碼塊的024行)。

我一直在試圖弄清為什么會這樣或正在解決這個問題,但似乎無法解決任何問題,因此我們將不勝感激。

謝謝

在某些條件下,您要在toString()方法中更改bc的符號。 這是錯誤的: toString()不應更改對象的狀態。

用局部變量重寫toString()方法,例如:

int local_b = b;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM