/*solides.js
Calculs avec des relations
utilise les relations
Copyright (C) 2005 Jean-Paul Davalan<jpdvl@wanadoo.fr>
*/
var Pi=Math.PI;
function MatriceFP(formules, parms) {
this.formules=formules;
this.parametres=parms;
this.nparam=this.parametres.length;
this.nformules=this.formules.length;
this.m=new Array();
this.v=new Array();
this.f=new Array();
this.g=new Array();
function init() {
for(var i=0;i<this.nformules;i++) {
this.m[i]=new Array();
var s=this.formules[i].split(/=/);
this.f[i]=s[1];
if(s.length>2) this.g[i]=s[2];
else this.g[i]=s[1];
var isset=false;
for(var j=0;j<this.nparam;j++) {
if(s[1].indexOf(this.parametres[j],0) !=-1) {
this.m[i][j]=true;
} else {
this.m[i][j]=false;
}
if(isset==false && s[0].indexOf(this.parametres[j],0) !=-1) {
this.v[i]=j;
isset=true;
}
}
}
}
this.init=init;
}
function paren(s) {
var st=s, u, test=true;
while(test==true) {
test=false;
do {
u=st;
st=st.replace(/^\s+/,"");
st=st.replace(/\s+$/,"");
} while(u!=st);
if(st.charAt(0)=="(" && st.charAt(st.length-1)==")")
var n=1
for(i=1;n>0 && i<st.length;i++) {
if(st.charAt(i)=="(") n++;
else if(st.charAt(i)==")") n--;
}
if(n==0 && i==st.length) {
st=st.replace(/^\(/,"")
st=st.replace(/\)$/,"")
test=true;
}
}
return st;
}
function problem(formules,parms,rel,commt, matrice, nf, cmt) {
this.nparam=parms.length;
this.nformules=formules.length;
this.listeparam=new Array();
this.sus=new Array();
this.values=new Array();
this.demo="";
this.formules=formules
this.parms=parms;
this.rel=rel;
this.commt=commt;
this.nf=nf;
this.cmt=cmt;
this.matrice=matrice;
this.numbers=true;
function lit() {
var i, ld, loc, lc, x;
for(i=0;i<this.nparam;i++) {
if(document.forms[this.nf]!=null) {
loc=document.forms[this.nf].elements[i].value;
do {
lc=loc;
loc=loc.replace(/^\s+/,"");
loc=loc.replace(/\s+$/,"");
} while(loc !=lc);
if(loc !=null && loc !=""/*&& (x=parseFloat(loc))>=0 && (i!=9 || x<=90)*/ ) {
loc=paren(loc);
if(loc.search(/[a-zA-Z_]/g) !=-1) this.numbers=false
x=loc;
if(x.search(/[\+\-\/\*]/g)!=-1) {
x="("+x+")";
}
this.values[i]=x;
this.listeparam[i]=true;
this.sus[i]=true;
} else {
document.forms[this.nf].elements[i].value="";
this.listeparam[i]=false;
this.sus[i]=false;
}
}
}
}
this.lit=lit;
function calc(lang) {
var nl=0;
this.demo=(lang=="fr")? "<table border=1 cellspacing=0 cellpadding=4 class=def><tr><td>n°</td><td>Calculs,<br />dans cet ordre,<br>des inconnues :</td><td colspan=2>en utilisant les données et les relations ci-dessous :</td></tr>\n" : "<table border=1 cellspacing=0 cellpadding=4 class=def><tr><td>n°</td><td>Calculations,<br />in this order, of<br>the unknown factors :</td><td colspan=2>by using the data and the relations below:</td></tr>\n";
var test=true, utilisable;
while (test==true) {
test=false;
for(var i=0;test==false && i<this.nformules;i++) {
if(this.sus[this.matrice.v[i]]==false) {
utilisable=true;
for(j=0;utilisable==true && j<this.nparam;j++) {
if(this.matrice.m[i][j]==true && this.sus[j]==false) {
utilisable=false;
}
}
if(utilisable==true) {
var s=(this.numbers==true)? this.matrice.f[i] : this.matrice.g[i];
var u=this.matrice.v[i];
nl++;
this.demo+="<tr><td>"+nl+"</td><td>"+this.parms[u]+"</td><td><code>"+this.commt[2*this.rel[i]]+"</code></td><td>"+this.commt[2*this.rel[i]+1]+"</td></tr>\n";
for(var k=0;k<this.parms.length;k++) {
if(this.matrice.m[i][k]==true) {
var r=new RegExp(this.parms[k],"g");
do {
var s=s;
s=s.replace(r,this.values[k]);
}while(s!=s);
}
}
var v;
if(this.numbers==true)
with(Math) {
v=eval(s);
}
else {
s=paren(s);
v="("+s+")";
v=v.replace(/\s+/g,"");
}
if(v!=null && (this.numbers==false || isNaN(v)==false)) {
test=true;
this.sus[this.matrice.v[i]]=true;
this.values[this.matrice.v[i]]=v;
}
}
}
}
}
this.demo+="</table>\n";
}
this.calc=calc;
function aff() {
for(var i=0;i<this.nparam;i++) {
if( this.values[i]!=null) {
document.forms[this.nf].elements[i].value=(this.numbers==true)? this.values[i]:paren(this.values[i]);
}
}
document.getElementById(this.cmt).innerHTML=this.demo;
}
this.aff=aff;
}
function mktable(tableSolide, t, lang) {
var s="";
s+=(lang=="fr")? '<h4>Entrée des données</h4>\n' : '<h4>The table</h4>\n';
s+='<div class="define">';
s+=(lang=="fr")?"<fieldset><legend>Emprunts</legend>":"<fieldset><legend>Loans</legend>"
s+="<form name='f"+t+"'>"
s+="<center>";
s+="<table border=0 class=def>"
for(var i=0;i<tableSolide.length;i++) {
s+="<tr>\n"
s+="<td>"+tableSolide[i]+"</td>\n";
i++;
s+="<td width=40 align=center>"+tableSolide[i]+"</td>\n";
s+="<td>\n";
s+="<input type='text' class=tt  value=''>\n";
s+="</td>\n";
s+="</tr>\n";
}
s+='<tr>\n';
s+='<td colspan=3>&nbsp;</td></tr>\n';
s+='<tr>\n';
s+='<td colspan=3 align=right>\n';
var ef=(lang=="fr")?"f":"e";
s+="<img align=middle style='{cursor:pointer;border:0;}' src='"+ef+"calc0.png' onmouseover='this.src=Im[1].src' onmouseout='this.src=Im[0].src' onmousedown='this.src=Im[2].src' onclick='cherche("+t+");' alt=''>\n";
s+="<img align=middle style='{cursor:pointer;border:0;}' src='"+ef+"eff0.png' onmouseover='this.src=Im[4].src' onmouseout='this.src=Im[3].src' onmousedown='this.src=Im[5].src' onclick='efface("+t+");' alt=''>\n";
s+='</td></tr>\n';
s+='</table>';
s+='</center>';
s+='</form>\n';
s+='</fieldset>';
s+='</div>\n';
s+=(lang=="fr")?'<h4>Ordre des calculs et relations utilisées</h4>\n':'<h4>Order of the calculation and relations used</h4>\n';
s+='<div class="define" id="cmt'+t+'" style="{width=500;border: 1 solid #dd6644;">\n';
s+='';
s+='</div>\n';
document.write(s);
/*
document.write("<form name=f2>");
document.write("<textarea cols=72 rows=20 name=b></textarea>");
document.write("</form>");
document.f2.b.value=s;
*/
}
function efface(t) {
for(i=0;document.forms[t].elements[i]!=null;i++) {
document.forms[t].elements[i].value="";
}
document.getElementById("cmt"+t).innerHTML="";
}
<!--
function cherche(t) {
switch(t) {
case 0:
chercheSphere(0);
break;
case 1:
chercheCylindre(1);
break;
case 2:
chercheCone(2);
break;
case 3:
chercheTcone(3);
break;
default:
break;
}
}
-->
/*données du programme
calculs dans une
Copyright (c) Jean-Paul Davalan<jpdvl@wanadoo.fr>
*/
var Im=new Array();
Im[0]=new Image();Im[0].src="fcalc0.png";
Im[1]=new Image();Im[1].src="fcalc1.png";
Im[2]=new Image();Im[2].src="fcalc2.png";
Im[3]=new Image();Im[3].src="feff0.png";
Im[4]=new Image();Im[4].src="feff1.png";
Im[5]=new Image();Im[5].src="feff2.png";
var formulesEmprunt=new Array(
" c = 1 + Tm /100 ",
" Tm = 100 * ( c - 1 ) ",
" M = 1/100 * C * Tm * pow( c , Dm ) / ( pow( c , Dm ) - 1 ) =  C * Tm / 100 * c ^ Dm / ( c ^ Dm - 1 ) ",
" c = pow( 100 * M / (100 * M - C * Tm ) , Dm ) = (M / (M - C * Tm /100) ) ^ Dm ",
" Dm = (log( M ) - log( M - C * Tm / 100 )) / log ( c ) ",
" C = 100 * M * ( pow( c , Dm ) - 1 )/ ( Tm * pow( c , Dm ) ) =  100 * M * (c ^Dm -1 )/( Tm * c ^Dm )",
" Ct = M * Dm ",
" M = Ct / Dm ",
" Dm = Ct / M ",
" Cc = Ct - C ",
" C = Ct - Cc ",
" Ct = C + Cc ",
" Dm = 12 * Da ",
" Da = Dm / 12 ",
" Ta = Tm * 12 ",
" Tm = Ta / 12 ",
" Tr = pow( 1 + Tm / 100 , 12 ) * 100 - 100 = 100 * ( (1 + Tm / 100)^12 -1) ",
" Tm = pow( 1 + Tr / 100 , 1/12 ) * 100 - 100 = 100 * ( (1 + Tm / 100)^(1/12) -1)"
);
var relationsEmprunt=new Array(0,0,1,1,1,1,2,2,2,3,3,3,4,4,5,5,6,6);
var commentairesEmprunt=new Array(
"c = 1 + tm/100 ","coefficient multiplicateur et taux",
"M = C*Tm/100 * c^Dm /(c^Dm - 1)","calcul d'une mensualité",
"Ct = M * Dm", "coût total",
"Cc = Ct - C ", "coût de l'emprunt",
"Dm = Da * 12","durée en mois ou en années",
"Ta = 12 * Tm","taux mensuel et taux annuel",
"Tr = 100 *((1+ Tm/100)^12 -1)","taux annuel réel"
);
var parametresEmprunt=new Array( " C "," Ta "," Tr "," Tm "," c "," Da "," Dm "," M "," Cc "," Ct " );
var tableEmprunt=new Array(
"Capital initial","C",
"Taux annuel","Ta",
"Taux annuel réel","Tr",
"Taux mensuel","Tm",
"Coefficient multiplicateur","c",
"Durée en années","Da",
"Durée en mois","Dm",
"Mensualité","M",
"Coût du crédit","Cc",
"Coût total","Ct"
);
function exoEmprunt(t,n) {
efface(t);
switch (n) {
case 0:
document.forms[t].elements[0].value=100000;
document.forms[t].elements[1].value=6;
document.forms[t].elements[5].value=10;
break;
case 1:
document.forms[t].elements[0].value=10000;
document.forms[t].elements[1].value=6;
document.forms[t].elements[7].value=500;
break;
case 2:
document.forms[t].elements[1].value=9;
document.forms[t].elements[6].value=60;
document.forms[t].elements[7].value=500;
break;
case 3:
document.forms[t].elements[0].value=10000;
document.forms[t].elements[1].value=4.5;
document.forms[t].elements[5].value=4;
break;
case 4:
document.forms[t].elements[0].value="C";
document.forms[t].elements[5].value="a";
document.forms[t].elements[1].value="t";
break;
case 100:
document.forms[t].elements[0].value="1000 *A";
document.forms[t].elements[3].value="u";
document.forms[t].elements[6].value="24+x";
break;
default:
break;
}
}
var matriceEmprunt=new MatriceFP(formulesEmprunt, parametresEmprunt);
matriceEmprunt.init();
function chercheEmprunt(t) {
var pb=new problem(formulesEmprunt, parametresEmprunt,relationsEmprunt,commentairesEmprunt,matriceEmprunt,t,("cmt"+t));
pb.lit();
pb.calc();
pb.aff();
}
function cherche(t) {
chercheEmprunt(t);
}

