added parenthesis handling for chemical equation balancer

This commit is contained in:
Kenneth Jao 2016-07-16 18:41:41 +08:00
parent c99fcd3009
commit 1bc2dafcb4

View File

@ -150,7 +150,7 @@ function balanceEquation(reactant, product) {
formulaStr = reactant + "+" + product; formulaStr = reactant + "+" + product;
compounds = formulaStr.replace(/\s/g,"").split("+"); compounds = formulaStr.replace(/\s/g,"").split("+");
// Create element matrix. // Create element matrix list.
for(var i = 0; i < compounds.length; i++) { for(var i = 0; i < compounds.length; i++) {
var counter = 0; var counter = 0;
var indexes = []; var indexes = [];
@ -171,7 +171,7 @@ function balanceEquation(reactant, product) {
element = currString.substring(indexes[j],indexes[j+1]); element = currString.substring(indexes[j],indexes[j+1]);
elementNoNum = element.replace(/[0-9]/g,""); elementNoNum = element.replace(/[0-9]/g,"");
if(vary.indexOf(elementNoNum) == -1) { if(vary.indexOf(elementNoNum) == -1 && elementNoNum != '(' && elementNoNum != ')') {
vary.push(elementNoNum); vary.push(elementNoNum);
} }
@ -183,6 +183,62 @@ function balanceEquation(reactant, product) {
} }
} }
//Parenthesis handling.
for(var r = 0; r < compounds.length; r++) {
var s = 1;
while(s < compounds[r].length) {
if(compounds[r][s][0] == "(") {
var count = 1;
var v = s;
while(count > 0) {
v++;
if(compounds[r][v][0] == "(") count++;
if(compounds[r][v][0] == ")") count--;
}
var curr = compounds[r];
var times = curr[v][1];
var before = curr.splice(0,s);
var mid = curr.splice(1,v-1-before.length);
var ae = 0;
var open = 0;
while(ae < curr.length) {
if(curr[ae][0] == "(") {
open++;
if(open == 1) curr.splice(ae,ae+1);
} else if(curr[ae][0] == ")") {
open--;
if(open === 0) curr.splice(ae,ae+1);
break;
} else {
ae++;
}
}
var after = curr;
for(var ab = 0; ab < mid.length; ab++) {
if(times > 1) {
mid[ab][1] *= times;
before.push(mid[ab]);
} else {
before.push(mid[ab]);
}
}
if(after !== 0) {
for(var ac = 0; ac < after.length; ac++) {
before.push(after[ac]);
}
}
compounds[r] = before;
s=0;
}
s++;
}
}
// Create matrix.
for(var x = 0; x < vary.length; x++) { for(var x = 0; x < vary.length; x++) {
matrix[x] = []; matrix[x] = [];
for(var y = 0; y < compounds.length; y++) { for(var y = 0; y < compounds.length; y++) {
@ -244,6 +300,22 @@ function balanceEquation(reactant, product) {
lead++; lead++;
} }
// Remove redundant lines.
for(var r = 0; r < matrix.length; r++) {
var splice = true;
for(var q = 0; q < matrix[0].length; q++) {
if(matrix[r][q] === 0 && splice === false) {
splice = true;
} else {
splice = false;
}
}
if(splice) {
matrix.splice(r,r+1);
r = 0;
}
}
// Extract free matrix. // Extract free matrix.
var rank = matrix.length; var rank = matrix.length;
for(var m = 0; m < rank; m++) { for(var m = 0; m < rank; m++) {
@ -294,10 +366,11 @@ function balanceEquation(reactant, product) {
} }
// Get GCD. // Get GCD.
var gcd = finalMatrix[0]; var gcd;
for(var u = 0; u < finalMatrix.length-1; u++) {
gcd = getGCD(finalMatrix[u], finalMatrix[u+1]);
for(var u = 0; u < finalMatrix.length-2; u++) {
gcd = getGCD(gcd, finalMatrix[u+1]);
} }
// Get final answers. // Get final answers.