2013-01-07 42 views
7

Tôi mới sử dụng JavaScript và tôi đang cố viết một kịch bản đơn giản giải quyết các phương trình tuyến tính. Cho đến nay kịch bản của tôi giải quyết các phương trình tuyến tính chỉ cộng và trừ như "2x + 28 - 18x = 36 - 4x + 10". Tôi muốn nó cũng có thể giải các phương trình tuyến tính/các vấn đề đại số có chứa phép nhân và phép chia như "2x * 3x = 4/2x".Giải phương trình tuyến tính và các vấn đề đại số tương tự với JavaScript

Tôi có ý tưởng phải làm gì tiếp theo nhưng tôi nghĩ kịch bản tôi có bây giờ có thể quá phức tạp và nó sẽ làm cho việc thêm nhân và chia trở nên phức tạp hơn.

Dưới đây là tập lệnh của tôi. Tôi hy vọng cho một vài gợi ý về cách tôi có thể cải thiện và đơn giản hóa những gì tôi đã có và cách tốt nhất để thêm nhân và chia?

kịch bản của tôi trên JS Bin: http://jsbin.com/ufekug/1/edit

kịch bản của tôi:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Problem Solver</title> 
<script> 
window.onload = function() { 
    // Total Xs on each side of equation 
    // Example problem: 5x + 2 = 10 - 2x 
    var leftSideXTotal = 0; // 5 
    var rightSideXTotal = 0; // -2 

    // Total integers on each side of equation 
    // Example problem: 5x + 2 = 10 - 2x 
    var leftSideIntTotal = 0; // 2 
    var rightSideIntTotal = 0; // 10 


    // Enter a math problem to solve 
    var problem = "5x + 2 = 10 - 2x"; 


    // Remove all spaces in problem 
    // Example problem: 5x + 2 = 10 - 2x 
    problem = problem.replace(/\s/g,''); // 5x+2=10-2x 

    // Add + signs in front of all - signs 
    // Example problem: 5x + 2 = 10 - 2x 
    problem = problem.replace(/-/gi, "+-"); // 5x+2=10+-2x 

    // Split problem into left and right sides 
    // Example problem: 5x + 2 = 10 - 2x 
    var problemArray = problem.split("="); 
    var problemLeftSide = problemArray[0]; // 5x+2 
    var problemRightSide = problemArray[1]; // 10+-2x 

    // Split values on each side into an array 
    var problemLeftSideValues = problemLeftSide.split("+"); 
    var problemRightSideValues = problemRightSide.split("+"); 

    // Go through the left side values and add them up 
    for (var i = 0; i < problemLeftSideValues.length; i++) { 

     // Current value 
     var currentValue = problemLeftSideValues[i]; 
     // Length of current value 
     var currentValueLength = currentValue.length; 

     if (currentValue.charAt(currentValueLength - 1) == "x") { //Check if current value is a X value 

      // Remove X from end of current value 
      currentValue = currentValue.split("x"); 

      // Add to total Xs on left side 
      leftSideXTotal = Number(leftSideXTotal) + Number(currentValue[0]); 

     } else { 

      // Add to total integers on left side 
      leftSideIntTotal = Number(leftSideIntTotal) + Number(problemLeftSideValues[i]); 

     } 
    } 

    // Go through the right side values and add them up 
    for (var i = 0; i < problemRightSideValues.length; i++) { 

     // Current value 
     var currentValue = problemRightSideValues[i]; 
     // Length of current value 
     var currentValueLength = currentValue.length; 

     if (currentValue.charAt(currentValueLength - 1) == "x") { //Check if current value is a X value 

      // Remove X from end of current value 
      currentValue = currentValue.split("x"); 

      // Add to total Xs on right side 
      rightSideXTotal = Number(rightSideXTotal) + Number(currentValue[0]); 

     } else { 

      // Add to total integers on right side 
      rightSideIntTotal = Number(rightSideIntTotal) + Number(problemRightSideValues[i]); 

     } 
    } 

    // Compute 
    var totalXs = (leftSideXTotal - rightSideXTotal) 
    var totalIntegers = (rightSideIntTotal - leftSideIntTotal) 
    var solution = (totalIntegers/totalXs) 

    // Display solution 
    document.getElementById("divSolution").innerText = solution; 
} 
</script> 
</head> 

<body> 
<div id="divSolution"></div> 
</body> 
</html> 
+0

Đây là một câu hỏi khá thú vị. Tôi nghĩ bạn có thể thu hút nhiều người trả lời hơn nếu bạn rút ngắn tiêu đề. –

+3

'2x * 3x = 4/2x' không thực sự là một phương trình tuyến tính. – Rikonator

+0

Tiêu đề đã chỉnh sửa. Thay đổi phương trình tuyến tính thành phương trình tuyến tính và các vấn đề đại số tương tự. – user1822824

Trả lời

6

Bạn cần phải viết (hoặc sử dụng) một phân tích cú pháp của nhà điều hành được ưu tiên.

Ý tưởng là biến phương trình thành một cây, ví dụ:

x + 3 = 3x - 2 

Thực sự là cấu trúc

 = 
    / \ 
    +  - 
/\ /\ 
    x 3 * 2 
     /\ 
     3 x 

đâu mỗi nhà khai thác mô tả một hoạt động giữa hai "chi nhánh" của cây. Sử dụng đối tượng javascript không khó để tạo cấu trúc:

function tree(lterm,op,rterm) { 
    t.operator = op; 
    t.left = lterm; 
    t.right = rterm; 
    return t; 
} 

expression = tree("x", "/", tree("x","+",3)); // x/(x+3) 

Sau đó, thao tác với cây, bạn có thể giải phương trình hoặc thực hiện tính toán. Để đánh giá một biểu thức (không có ẩn), bạn chạy qua cây bắt đầu từ các thiết bị đầu cuối, và trở lên từ giao lộ đến giao lộ. Bạn có thể thay thế một phần của cây bằng một kết quả, hoặc chú thích nó với một kết quả - thêm một biến kết quả vào đối tượng tree.

Dưới đây là một số phương pháp hữu ích để đưa vào một lớp cây:

  • getLeft
  • GetRight
  • prettyprint
  • đánh giá
  • đánh giá ("x", 5) // x = 5, bây giờ đánh giá ...

Nó không chỉ các hoạt động tuyến tính có thể được "phân tích cú pháp" theo cách này.Trình phân tích cú pháp tốt hơn sẽ có danh sách toán tử bao gồm = */+ - nhưng cũng là toán tử đơn nhất: -() sin cos ...

Tôi chưa sử dụng trình phân tích cú pháp ưu tiên trong javascript, nhưng một số phải tồn tại trước . Chắc chắn một linh hồn tử tế trên trang web này sẽ thêm một liên kết tốt hoặc hai vào câu trả lời của tôi.

BTW, cách tiếp cận cây có nhiều ứng dụng. Trong một bảng tính:

A2 = A1+B1 

trong một giải boolean:

A = not (B or C) 
C = true 

trong phân tích cú pháp XML:

<main> 
    <part>A</part> 
    <part>B</part> 
</main> 
0

tôi đã xác định hai chức năng:

getTotalX(): Nó sẽ cung cấp cho bạn đếm x cho bất kỳ chuỗi đầu vào.

getTotalScalars(): Nó sẽ cung cấp cho bạn tổng số vô hướng (số).

Và cuối cùng, mã cập nhật của bạn (nó vẫn không chỉ cộng và trừ):

<script> 
window.onload = function() { 
    // Total Xs on each side of equation 
    // Example problem: 5x + 2 = 10 - 2x 
    var leftSideXTotal = 0; // 5 
    var rightSideXTotal = 0; // -2 

    // Total integers on each side of equation 
    // Example problem: 5x + 2 = 10 - 2x 
    var leftSideIntTotal = 0; // 2 
    var rightSideIntTotal = 0; // 10 


    // Enter a math problem to solve 
    var problem = "5x + 2 = 10 - 2x"; 


    // Remove all spaces in problem 
    // Example problem: 5x + 2 = 10 - 2x 
    problem = problem.replace(/\s/g,''); // 5x+2=10-2x 

    // Add + signs in front of all - signs 
    // Example problem: 5x + 2 = 10 - 2x 
    problem = problem.replace(/-/gi, "+-"); // 5x+2=10+-2x 

    // Split problem into left and right sides 
    // Example problem: 5x + 2 = 10 - 2x 
    var problemArray = problem.split("="); 
    var problemLeftSide = problemArray[0]; // 5x+2 
    var problemRightSide = problemArray[1]; // 10+-2x 

    leftSideXTotal = getTotalX(problemLeftSide); 
    leftSideIntTotal = getTotalScalars(problemLeftSide); 

    rightSideXTotal = getTotalX(problemRightSide); 
    rightSideIntTotal = getTotalScalars(problemRightSide); 

    // Compute 
    var totalXs = (leftSideXTotal - rightSideXTotal) 
    var totalIntegers = (rightSideIntTotal - leftSideIntTotal) 
    var solution = (totalIntegers/totalXs) 

    // Display solution 
    document.getElementById("divSolution").innerText = solution; 

    // Find the total number of X in the string 
    function getTotalX(data) { 
     data = data.replace(/\s/g,''); 
     xCount = 0; 

     if(data.indexOf('x') != -1) { 
      if (data.indexOf('+') != -1) { 
       data = data.split('+'); 

       for(var i = 0; i < data.length; i++) { 
        xCount += getTotalX(data[i]); 
       } 
      } else if (data.indexOf('-') != -1) { 
       data = data.split('-'); 

       // Single negative 
       if(data[0] == "") { 
        xCount -= getTotalX(data[1]); 
       } else { 
        xCount += getTotalX(data[0]); 

        for(var i = 1; i < data.length; i++) { 
         xCount -= getTotalX(data[i]); 
        } 
       } 
      } else { 
       xCount = parseInt(data.split('x')[0]); 
      } 
     } 

     return xCount; 
    } 

    // Find the total of scalars 
    function getTotalScalars(data) { 
     data = data.replace(/\s/g,''); 
     intCount = 0; 

     if (data.indexOf('+') != -1) { 
      data = data.split('+'); 

      for(var i = 0; i < data.length; i++) { 
       intCount += getTotalScalars(data[i]); 
      } 
     } else if (data.indexOf('-') != -1) { 
      data = data.split('-'); 

      // Single negative 
      if(data[0] == "") { 
       intCount -= getTotalScalars(data[1]); 
      } else { 
       intCount += getTotalScalars(data[0]); 

       for(var i = 1; i < data.length; i++) { 
        intCount -= getTotalScalars(data[i]); 
       } 
      } 
     } else { 
      if(data.indexOf('x') == -1) { 
       intCount = parseInt(data.split('x')[0]); 
      } else { 
       intCount = 0; 
      } 
     } 

     return intCount; 
    } 
} 
</script> 
Các vấn đề liên quan