Résoudre une équation en 6 étapes

Description

Manipulation de regexs pour résoudre une équation à une ou deux inconues !
Les inconues peuvent etre n'importe qu'elle lettre de l'alphabet.

Source / Exemple :


/* Code source codé et commenté par Zestyr */
sNbSpec = "+0.000000000000001";
emePres = 12;

function resoudreEq(membreGauche, membreDroite, oAlgo)
{
	/* Initialisation de l'objet algo */ 
	var algoIsNull = (oAlgo == undefined || oAlgo == null || oAlgo == "")
	var algo = ((algoIsNull) ? document.getElementById("algo") : oAlgo);
	
	/* Récupération des valeurs passées en arguments */
	var mG = membreGauche; 
	var mD = membreDroite;
	
	var inconue; //Déclaration de la variable qui va stocker l'inconue (a, b , c ... x, y, z)
	
	/* Extraction de l'inconue dans mG ou mD */
	if(mG.match(/[^0-9+-\/*]/) != null || mD.match(/[^0-9+-\/*]/) != null)
	{
		inconue = (mG.match(/[^0-9+-\/*]/) != null) ? mG.match(/[^0-9+-\/*]/)[0] : mD.match(/[^0-9+-\/*]/)[0]; //On commence par vérifier si l'inconue se trouve dans mG, s'il elle n'y est pas on ch dans mD et si elle n'y est dans ni l'une ni l'autre: Syntax Error!
	}
	else
	{
		alert("Syntax Error !");
	}
	/* Affichage du calcul à effectuer*/
	algo.innerHTML = mG + " = " + mD;

	
	/* etape1: regroupement des inconues et calcul des nombres disociés de l'inconue de mD */
	mD = mD.replace(/(\d+\.?\d*)(?!\D)([*\/])(\d+\.?\d*)(?!\D)/g, "($1$2$3)");//multiplication  et division en premier, on remplace a*b par (a*b)

	var regex1 = new RegExp("([-+])*(\\d+)("+inconue+")", "g"); //motif: un nombre qui peut commencer par (+ ou -) avec une inconue
	var regex2 = new RegExp("([-+])*(\\d+)(?="+inconue+")", "g"); //motif: un nombre qui peut commencer par (+ ou -) et qui est suivi par une inconue
	var calcul1 = mD.replace(regex1, "");// calcul de nombres disocié de l'inconue
	var calcul2_tab = mD.match(regex2, ""); //tableau contenant les produit de l'inconue
	var calcul2 = ""; //calcul des produit des inconue, si l'inconue = x: 4x+3x-2x = (4+3-2)x = 5x  
	if(calcul2_tab != null)
	{
		i = 0;
		while(calcul2_tab[i] != undefined)
		{
			calcul2 += calcul2_tab[i];
			i++;
		}
					
			mD_preced = mD; //variable stockant mD avant qu'on le modifie 
			/* on factorise les inconues et on effecte les calculs disocié de l'inconue */
			mD = arrondir(eval(calcul2+sNbSpec), emePres) + inconue + ((calcul1 != undefined) ? "+"+arrondir(eval(calcul1+sNbSpec),12) : "");
					
			/* On affiche les calculs s'il ya eu des changements */
			if(mD_preced != mD)
			{
				algo.innerHTML += "<br />" + mG + " = " + mD;
			}
	}
	else
	{
		mD = eval(calcul1);
		algo.innerHTML += "<br />" + mG + " = " + mD;
	}
				
	/* etape2: on fait passer les inconues dans mG */
	mD_preced = mD;
	mG_preced = mG;
	mD = (calcul1 != undefined && calcul1 != "" && calcul1 != null) ? arrondir(eval(calcul1+sNbSpec), 12) : (""); 
	mG += (calcul2_tab != null && calcul2 != "" ) ? eval(calcul2)*(-1)+inconue : "";
	/* On affiche les calculs s'il ya eu des changements */
	if(mD_preced != mD || mG_preced != mG)
	{
		algo.innerHTML += "<br />" + mG + " = " + mD;
	}
				
				
	/* etape3: regroupement des inconues et calcul des nombres disociés de l'inconue de mD */
	mG = mG.replace(/(\d+\.?\d*)(?!\D)([*\/])(\d+\.?\d*)(?!\D)/g, "($1$2$3)"); 
	var regex1 = new RegExp("([-+])*(\\d+)("+inconue+")", "g");
	var regex2 = new RegExp("([-+])*(\\d+)(?="+inconue+")", "g");
	var calcul1 = mG.replace(regex1, "");
	var calcul2_tab = mG.match(regex2, ""); 
	var calcul2 = ""; 
				
		if(calcul2_tab != null)
		{
			i = 0;
			while(calcul2_tab[i] != undefined)
			{
				calcul2 += calcul2_tab[i];
				i++;
			}
			mG_preced = mG;
			
			/*========= Correction d'un bug ===========*/
			calcul1_def = (/^([*\/]*)(\d+\.?\d*)/g.test(calcul1)) ? calcul1.match(/^([*\/]*)(\d+\.?\d*)/g) : false; //réctification d'un bug
			calcul1Ap = (calcul1_def != null && /^([\/]+)(\d+\.?\d*)/g.test(calcul1)) ? calcul1.replace(/^([\/]*)(\d+\.?\d*)/g, "*$2") :  calcul1.replace(/^([*]*)(\d+\.?\d*)/g, "/$2");
			calcul1 = (calcul1 != null) ? calcul1.replace(/^([*\/]+)(\d+\.?\d*)/g, "") : calcul1;
			mD += (calcul1Ap != null && calcul1Ap != calcul1 && calcul1Ap != "" && calcul1Ap != undefined) ? calcul1Ap : "";
			/*========================================*/
			
			mG = eval(calcul2) + inconue + ((calcul1  != undefined && calcul1  != "") ? "+" + eval(calcul1)  : "");
			/* On affiche les calculs s'il ya eu des changements */
			if(mG_preced != mG)
			{
				algo.innerHTML += "<br />" + mG + " = " + mD;
			}
		}
				
		/* etape4: on fait passer les nombre disocié de l'inconue dans mD*/
		mD_preced = mD;
		mG_preced = mG;
		mG = ((calcul2 != "") ? arrondir(eval(calcul2+sNbSpec),emePres)+inconue : mG);
		if(calcul2 != "")
		{
			mD += ((calcul1  != undefined && calcul1  != "") ? arrondir(eval(calcul1+sNbSpec),12)*(-1) : "");
		}
		/* On affiche les calculs s'il ya eu des changements */
		if(mD_preced != mD || mG_preced != mG)
		{
			algo.innerHTML += "<br />" + mG + " = " + mD;
		}
				
		/* etape5: on met l'inconue à l'unité */
		mG_preced = mG;
		var regex4 = new RegExp(inconue, "");
		var produit = mG.replace(regex4, "");
		mG = mG.replace(produit, "");
		mD += "/"+produit;
		/* On affiche les calculs s'il ya eu des changements */
		if(mG_preced != mG)
		{
			algo.innerHTML += "<br />" + mG + " = " + mD;
		}
				
		/* etape6:  on fait les dernier calculs a droite (division) et on affiche le résultat */
		mD = eval(mD);
		algo.innerHTML += "<br />" + mG + " = " + mD;
				
	return mD;
}

function resoudreSystemParCombinaison(mG1, mG2, mD1, mD2, oAlgo)
{
	var algoIsNull = (oAlgo == undefined || oAlgo == null || oAlgo == "")
	var algo = ((algoIsNull) ? document.getElementById("algo") : oAlgo);
	var mGRef = mG1;
	var mDRef = mD1;
	
	var inconue1;
	var inconue2;
	/* Extraction des inconues dans mG1 */
	if(mG1.match(/[^0-9+-\/*]/g) != null)
	{
		inconue1 = ((mG1.match(/[^0-9+-\/*]/g) != null) ? mG1.match(/[^0-9+-\/*]/g)[0] : ""); 
		inconue2 = ((mG1.match(/[^0-9+-\/*]/g) != null) ? mG1.match(/[^0-9+-\/*]/g)[1] : "");
		mD1 = eval(mD1);
		mD2 = eval(mD2);
		algo.innerHTML = "[ "+mG1 + " = " + mD1 + "<br />" + "[ "+mG2 + " = " + mD2;
	}
	else
	{
		alert("Syntax error !");
	}
	
	/* etape1: multiplication des mG */
	var regex1 = new RegExp("([-+])*(\\d+)(?="+inconue1+")", "g"); //produit de l'inconue1
	var regex2 = new RegExp("([-+])*(\\d+)(?="+inconue2+")", "g"); //produit de l'inconue2
	
	/* mG1 */
	var calcul1_tab = mG1.match(regex1, ""); //tableau contenant les produit de l'inconue1
	var calcul1 = "";
	var calcul2_tab = mG1.match(regex2, ""); //tableau contenant les produit de l'inconue2
	var calcul2 = ""; 
	if(calcul1_tab != null)
	{
		i = 0;
		while(calcul1_tab[i] != undefined)
		{
			calcul1 += calcul1_tab[i];
			i++;
		}
	}	
	if(calcul2_tab != null)
	{
		i = 0;
		while(calcul2_tab[i] != undefined)
		{
			calcul2 += calcul2_tab[i];
			i++;
		}
	}
	calcul1 = arrondir(eval(calcul1+sNbSpec),emePres);
	calcul2 = arrondir(eval(calcul2+sNbSpec),emePres);
	
	/* mG2 */
	var calcul3_tab = mG2.match(regex1, ""); //tableau contenant les produit de l'inconue1
	var calcul3 = "";
	var calcul4_tab = mG2.match(regex2, ""); //tableau contenant les produit de l'inconue2
	var calcul4 = ""; 
	if(calcul3_tab != null)
	{
		i = 0;
		while(calcul3_tab[i] != undefined)
		{
			calcul3 += calcul3_tab[i];
			i++;
		}
	}	
	if(calcul4_tab != null)
	{
		i = 0;
		while(calcul4_tab[i] != undefined)
		{
			calcul4 += calcul4_tab[i];
			i++;
		}
	}
	calcul3 = arrondir(eval(calcul3+sNbSpec),emePres);
	calcul4 = arrondir(eval(calcul4+sNbSpec),emePres);
	
	//On multiplie les 2 lignes
	var produit1 = (calcul3);
	var produit2 = (calcul1*(-1));
	
	/* on affiche le résutat */
	mG1 ="("+produit1+") [ "+(((calcul1)*produit1)+inconue1)+"+"+(((calcul2)*produit1)+inconue2);
	mG2 ="("+produit2+") [ "+(((calcul3)*produit2)+inconue1)+"+"+(((calcul4)*produit2)+inconue2);
	mD1 *= produit1;
	mD2 *= produit2;
	algo.innerHTML += "<br /><br />"+mG1+" = "+mD1+"<br />"+mG2+" = " + mD2;
	
	/* etape2: on combine les 2 equations */
	var mGEq = (((calcul2)*produit1)+inconue2)+"+"+(((calcul4)*produit2)+inconue2);
	alert(mGEq);
	var mDEq = mD1+mD2;
	algo.innerHTML += "<br /><br />"+mGEq+" = "+mDEq;
	var inconue2Value = resoudreEq(mGEq, mDEq+"", document.getElementById("algo2"));
	
	/* etape3: on en enduit l'inconue1 */
	var regex3 = new RegExp(inconue2, "");
	mGEq = mGRef.replace(regex3, "*"+inconue2Value);
	var inconue1Value = resoudreEq(mGEq+"", mDRef+"", document.getElementById("algo3"));
	document.getElementById("algo4").innerHTML = "Le couple solution est ("+inconue1Value+" ; "+inconue2Value+").";
}		
function arrondir(x, n)
{
     var decalage = Math.pow(10, n);
     x *= decalage;
     x = Math.round(x);
     x /= decalage;
     return x;
}

Conclusion :


Default:
opérateurs: +-*/
il faut marquer 1x au lieu de x.

Ps: Si y a un bug merci de le signaler (undefined, NaN) ou meme faux résultat

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.