Hướng dẫn code chương trình vẽ đồ thị hàm số bằng C# và Java

Thứ hai , 15/05/2017, 08:12 GMT+7
     

Các bài trước chúng ta đã đi qua một số hướng dẫn code các bài tập về môn cơ sở lập trình

         + Xe qua trạm thu phí

         + Check in hành khách ở sân bay

         + Code chương trình giải bài toán hình học

Bài này sẽ đến với Hướng dẫn code chương trình vẽ đồthị hàm số bằng C# và Java

Giao diễn chính của chương trình như sau:

Chương trình bao gồm các lớp và các hàm sau:

Tạo class frmMain.cs

trong class này ta khai báo các biến và viết một số hàm sau:

int max_x, max_y;
        Graphics g;
        Function fn = new Function();
        ArrayList arr;
        double x, dx, fx1, fx2;
        int max, min, x1, y1, x2, y2, x0, y0, k = 30, delay = 0;
        int m_x, m_y;
        bool stop = false, repaint = false ;
private void VeTrucToaDo()
        {
 
            Pen pen = new Pen(Color.Black, 2);
            g.DrawLine(pen, 1, y0, max_x, y0);
            g.DrawLine(pen, x0, 1, x0, max_y);
 
            Font f = new Font("Tahoma", 10);
            Brush br = new SolidBrush(Color.Red);
 
            g.DrawString("O",f , br , x0 - 15, y0);
            g.DrawString("X", f, br, max_x - 20, y0);
            g.DrawString("Y", f, br, x0 + 3, 1);
 
            Pen pen_x = new Pen(Color.Gray, 1);
 
            int i;
 
            for (i = x0 + k; i < max_x; i += k)
                g.DrawLine(pen_x, i, y0 - 3, i, y0 + 2);
 
            for (i = x0 - k; i > 0; i -= k)
                g.DrawLine(pen_x, i, y0 - 3, i, y0 + 2);
 
            for (i = y0 + k; i < max_y; i += k)
                g.DrawLine(pen_x, x0 - 3, i, x0 + 2, i);
 
            for (i = y0 - k; i > 0; i -= k)
                g.DrawLine(pen_x, x0 - 3, i, x0 + 2, i);
 
            
            Pen pen_limit = new Pen(Color.Red, 2);
            
            g.DrawLine(pen_limit, x0 + (min * k), y0 - 5, x0 + (min * k), y0 + 5);
            g.DrawLine(pen_limit, x0 + (max * k), y0 - 5, x0 + (max * k), y0 + 5);
 
        }
 
 
        private void VeDoThi()
        {
            int limit = max_y / 30 * k;
            Pen pen = new Pen(Color.Blue, 2);
            x = min;
            dx = 1.0f / k;
 
            fx1 = f(x);
            x1 = x0 + (int)(x * k);
            y1 = y0 - (int)(fx1 * k);
 
            
            if (stop) return;
 
            while (x < max)
            {
                x += dx;
                fx2 = f(x);
                x2 = x0 + (int)(x * k);
                y2 = y0 - (int)(fx2 * k);
 
                try 
                {
                    if (!(fx1 * fx2 < 0 && Math.Abs((int)(fx1 - fx2)) > k))
                    {
                        g.DrawLine(pen, x1, y1, x2, y2);
                        if (delay > 0) System.Threading.Thread.Sleep(delay);
                    }
                }
                catch {}
 
                x1 = x2;
                y1 = y2;
                fx1 = fx2;
            }
            
        }
private void PaintGraph()
        {
            fn.Parse(txtFunction.Text.ToLower());
            fn.Infix2Postfix();
            arr = fn.Variables;
 
            if (arr.Count != 1)
            {
                MessageBox.Show("Biểu thức không hợp lệ. Vui lòng nhập lại !nnVí dụ: (sin(x)+3)/(x+4)", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            else
            {
                if (arr[0].ToString() != "x")
                {
                    MessageBox.Show("Biểu thức không hợp lệ. Vui lòng nhập lại !nnVí dụ: (sin(x)+3)/(x+4)", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
 
              
            PicPaint.Refresh();
            btnPaint.Enabled = false;
            Application.DoEvents();
 
            
            int.TryParse(txtMin.Text, out min);
            int.TryParse(txtMax.Text, out max);
 
            
            ttStatus.Text = "Trạng thái: Đang vẽ ....";
 
            VeTrucToaDo();
            Application.DoEvents();
 
            g.DrawString(txtFunction.Text, new Font("Tahoma", 10), new SolidBrush(Color.Red), 5, 5);
            Pen pen = new Pen(Color.Red, 2);
 
            VeDoThi();
 
            btnPaint.Enabled = true;
            delay = 0;
            ttStatus.Text = "Trạng thái: Hoàn tất !";
 
        }
 
        private void frmMain_Resize(object sender, EventArgs e)
        {
            max_x = PicPaint.Width;
            max_y = PicPaint.Height;
            k = 30;
 
            x0 = (int)(max_x / 2);
            y0 = (int)(max_y / 2);
 
            if (chkAutoFill.Checked)
            {
                min = -x0 / k - 1;
                max = x0 / k + 1;
            }
 
            txtMin.Text = min.ToString();
            txtMax.Text = max.ToString();
            txtTiLe.Text = k.ToString();
            
        }
Bước 2 ta tạo một class frmFunction chứa các hàm xử lý đồ thị
public void Infix2Postfix()
    {
      Symbol tpSym;
      Stack tpStack = new Stack();
      foreach(Symbol sym in m_equation)
      {
        if((sym.m_type == Type.Value) || (sym.m_type == Type.Variable))
          m_postfix.Add(sym);
        else if((sym.m_name == "(") || (sym.m_name == "[") || (sym.m_name == "{"))
          tpStack.Push(sym);
        else if((sym.m_name == ")") || (sym.m_name == "]") || (sym.m_name == "}"))
        {
          if(tpStack.Count > 0)
          {
            tpSym = (Symbol)tpStack.Pop();
            while((tpSym.m_name != "(") && (tpSym.m_name != "[") && (tpSym.m_name != "{"))
            {
              m_postfix.Add(tpSym);
              tpSym = (Symbol)tpStack.Pop();
            }
          }
        }
        else
        {
          if(tpStack.Count > 0)
          {
            tpSym = (Symbol)tpStack.Pop();
            while((tpStack.Count != 0) && ((tpSym.m_type == Type.Operator) || (tpSym.m_type == Type.Function) || (tpSym.m_type == Type.Comma)) && (Precedence(tpSym) >= Precedence(sym)))
            {
              m_postfix.Add(tpSym);
              tpSym = (Symbol)tpStack.Pop();   
            }
            if(((tpSym.m_type == Type.Operator) || (tpSym.m_type == Type.Function) || (tpSym.m_type == Type.Comma)) && (Precedence(tpSym) >= Precedence(sym)))
              m_postfix.Add(tpSym);
            else
              tpStack.Push(tpSym);
          }
          tpStack.Push(sym);
        }
      }
      while(tpStack.Count > 0)
      {
        tpSym = (Symbol)tpStack.Pop();
        m_postfix.Add(tpSym);
      }
    }
public void EvaluatePostfix()
    {
      Symbol tpSym1, tpSym2, tpResult;
      Stack tpStack = new Stack();
      ArrayList fnParam = new ArrayList();
      m_bError = false;
      foreach(Symbol sym in m_postfix)
      {
        if((sym.m_type == Type.Value) || (sym.m_type == Type.Variable) || (sym.m_type == Type.Result))
          tpStack.Push(sym);
        else if(sym.m_type == Type.Operator)
        {
          tpSym1 = (Symbol)tpStack.Pop();
          tpSym2 = (Symbol)tpStack.Pop();
          tpResult = Evaluate(tpSym2, sym, tpSym1);
          if(tpResult.m_type == Type.Error)
          {
            m_bError = true;
            m_sErrorDescription = tpResult.m_name;
            return;
          }
          tpStack.Push(tpResult);
        }
        else if(sym.m_type == Type.Function)
        {
          fnParam.Clear();
          tpSym1 = (Symbol)tpStack.Pop();
          if((tpSym1.m_type == Type.Value) || (tpSym1.m_type == Type.Variable) || (tpSym1.m_type == Type.Result))
          {
            tpResult = EvaluateFunction(sym.m_name,tpSym1);
            if(tpResult.m_type == Type.Error)
            {
              m_bError = true;
              m_sErrorDescription = tpResult.m_name;
              return;
            }
            tpStack.Push(tpResult);
          }
          else if(tpSym1.m_type == Type.Comma)
          {
            while(tpSym1.m_type == Type.Comma)
            {
              tpSym1 = (Symbol)tpStack.Pop();
              fnParam.Add(tpSym1);
              tpSym1 = (Symbol)tpStack.Pop();
            }
            fnParam.Add(tpSym1);
            tpResult = EvaluateFunction(sym.m_name,fnParam.ToArray());
            if(tpResult.m_type == Type.Error)
            {
              m_bError = true;
              m_sErrorDescription = tpResult.m_name;
              return;
            }
            tpStack.Push(tpResult);
          }
          else
          {
            tpStack.Push(tpSym1);
            tpResult = EvaluateFunction(sym.m_name);
            if(tpResult.m_type == Type.Error)
            {
              m_bError = true;
              m_sErrorDescription = tpResult.m_name;
              return;
            }
            tpStack.Push(tpResult);
          }
        }
      }
      if(tpStack.Count == 1)
      {
        tpResult = (Symbol)tpStack.Pop();
        m_result = tpResult.m_value;
      }
    }

Download source: Code chương trình vẽ đồ thị hàm số bằng C# 

Code một số bài toán khác: http://congnghegi.com/source-code/

congnghegi.com
code c# java chuong trinh xe do thi code chuong trinh ve do thi ham so ve do thi ham so code C#