Comment faire un calcul ?

Mammouth du PHP | 545 Messages

07 déc. 2006, 00:39

Bonjour,

Je me suis lancé dans l'idée de faire un composant pour joomla et je voudrais poser une question par rapport à la méthode de calul ... je me débrouille en html et en php (pas plus !) mais je ne sais pas comment m'y prendre !

Alors, voici une partie (un tableau de saisie) du code qui me permettra de saisir les données pour un test en course à pied (C.A.T Test de R.Chanon et H. Stephan)
<form id="form1" name="form1" method="post" action="">
  <table class="joscat" border="0" cellspacing="0" cellpadding="2" width="100%">
    <tr bgcolor="#FFFF66">
      <td class="josheader" colspan="7" bgcolor="#FFFF66"><div align="center">En utilisant le C.A.T Test de R.Chanon et H. Stephan</div></td>
    </tr>
    <tr>
      <td width="8%"></td>
      <td bgcolor="#999999"><div align="center" class="Style6">Distance en m&egrave;tres </div></td>
      <td bgcolor="#999999"><div align="center" class="Style6">Temps 00:00:00 </div></td>
      <td bgcolor="#999999"><div align="center" class="Style6">FC puls/min </div></td>
      <td colspan="3"></td>
    </tr>
    <tr>
      <td width="15%" bgcolor="#FFFF66"><span class="Style6">Palier 1 </span></td>
      <td bgcolor="#CCCCCC"><div align="center">800</div></td>
      <td><div align="center">
        <input name="tempsp1" type="text" id="tempsp1" value="00:00:00" size="8" maxlength="8" />
      </div></td>
      <td><div align="center">
        <input name="fcp1" type="text" id="fcp1" value="0" size="3" maxlength="3" />
      </div></td>
      <td bgcolor="#FFFF66"><div align="center" class="Style5">Vitesse 1</div></td>
      <td><span class="Style1">200,12</span></td>
      <td>m/min</td>
    </tr>
    <tr>
      <td width="15%" bgcolor="#FFFF66"><span class="Style6">Palier 2 </span></td>
      <td bgcolor="#CCCCCC"><div align="center">800</div></td>
      <td><div align="center">
        <input name="tempsp2" type="text" id="tempsp2" value="00:00:00" size="8" maxlength="8" />
      </div></td>
      <td><div align="center">
        <input name="fcp2" type="text" id="fcp2" value="0" size="3" maxlength="3" />
      </div></td>
      <td bgcolor="#FFFF66"><div align="center" class="Style5">Vitesse 2 </div></td>
      <td><span class="Style1"></span></td>
      <td>m/min</td>
    </tr>
    <tr>
      <td width="15%" bgcolor="#FFFF66"><span class="Style6">Palier 3 </span></td>
      <td><label>
        <div align="center">
          <select name="palier3" size="1" id="palier3">
            <option value="1000" selected="selected">1000 m - D&eacute;butant</option>
            <option value="1500">1500 m - Sprinter</option>
            <option value="2000">2000 m - Niveau moyen</option>
            <option value="3000">3000 m - Bon niveau</option>
          </select>
        </div>
      </label></td>
      <td><div align="center">
        <input name="tempsp3" type="text" id="tempsp3" value="00:00:00" size="8" maxlength="8" />
      </div></td>
      <td><div align="center">
        <input name="fcp3" type="text" id="fcp3" value="0" size="3" maxlength="3" />
      </div></td>
      <td bgcolor="#FFFF66"><div align="center" class="Style5">VMA</div></td>
      <td><span class="Style1"></span></td>
      <td>m/min</td>
    </tr>
    <tr>
      <td width="15%"></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td><span class="Style1"></span></td>
      <td><strong>Km/h</strong></td>
    </tr>
    <tr>
      <td colspan="3"><div align="right"><strong>FC apr&egrave;s 5 minutes de r&eacute;cup&eacute;ration : </strong></div></td>
      <td><div align="center">
        <input name="fcrecup" type="text" id="fcrecup" value="0" size="3" maxlength="3" />
      </div></td>
      <td><div align="right">R&eacute;cup&eacute;ration : </div></td>
      <td><span class="Style1"><span id="josResult"></span></td>
      <td></td>
    </tr>
    <tr>
      <td colspan="4"> <div align="right">Estimation de la </div></td>
      <td><div align="center" class="Style2">VO2 max</div></td>
      <td><span class="Style1"></span></td>
      <td>ml/min/kg</td>
    </tr>
    <tr>
      <td colspan="2" bgcolor="#FFFF66"><div align="center" class="Style7">FC max </div></td>
      <td><div align="center"><span class="Style1">
        <input name="fcmax" type="text" id="fcmax" value="0" size="3" maxlength="3" />
      </span></div></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td colspan="2" bgcolor="#FFFF66"><div align="center" class="Style7">FC de la capacit&eacute; a&eacute;robie </div></td>
      <td><span class="Style1"></span></td>
      <td></td>
      <td colspan="3"><div align="center"></div></td>
    </tr>
    <tr>
      <td width="15%"><div align="center"></div></td>
      <td></td>
      <td><div align="center"></div></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td colspan="2" bgcolor="#FFFF66"><div align="center" class="Style7">% PMA pour CT a&eacute;robie :</div></td>
      <td colspan="4"><div align="center">(entre 70 et 90 % de la VMA) en fonction de l'&eacute;tat de forme</div></td>
      <td></td>
    </tr>
    <tr>
      <td colspan="5" bgcolor="#FFFF66"><div align="center" class="Style7">Temps indicatif sur 1000 m en CAPACITE AEROBIE : min:sec,d</div></td>
      <td colspan="2"></td>
    </tr>
    <tr>
	  <td colspan="7"><div align="center"><input type="button" class="button" value="Calcul" onClick="docalc()">
	  </div></td>
    </tr>
  </table>
</form>
Ce qui donne à peu près ceci:
Image
Les chiffres en noir sur fond blanc sont les saisies qui devront être encodées par l'utilisateur et une fois que le bouton calcul sera actionné, les chiffres en rouge ainsi qu'un petit message devront s'afficher ... voilà ce que j'ai envie de faire !

Mes questions auquelles je ne trouve pas de réponse tourne autour de la manière de faire le calcul et d'afficher un message en fonction du résultat !

Si je recherche par exemple:
  • la vitesse 1=800*0,0006944444/tempsp1
    la vitesse 2=800*0,0006944444/tempsp2
    la vitesse 3=palier3*0,0006944444/tempsp3
Si je veux afficher un qualificatif pour la récupération sur excell, je fais à peu de chose prêt ceci:

Code : Tout sélectionner

SI(fcrecup<tempsp3*0,5652;"Excellente";SI(fcrecup<tempsp3*0,5815;"Très bonne";SI(fcrecup<tempsp3*0,6033;"Bonne";SI(fcrecup<tempsp3*0,6304;"Moyenne";SI(D11<D9*0,663;"Médiocre";SI(D11<D9*0,6902;"Mauvaise";"Très mauvaise"))))))
Donc ... comment et où faire le calcul + comment afficher les résultats ? Cela serait sympa si quelqu'un pouvait m'aider ou m'aiguiller vers des endroits où je pourrais trouver les réponses à mes questions en français :lol:

Un grand merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

07 déc. 2006, 11:55

Désolè, j'ai oublié de vous dire que imprimer bêtement la valeur de la vitesse, j'en étais capable
<?php echo "$vitesse1" ?>
mais que où cela posait un gros problème pour moi c'était pour de récupérer la valeur de cette vitesse ($vitesse1) que j'avais calculé dans une autre page !

Néanmoins, j'ai quand même un peu avancé pour trouver qu'il fallait créer une structure dans une 'function' ... là, je ne saisis pas :roll:


Donc, il me reste comme question:
  • L'utilisation d'une 'function'
    l'importation de données récupérés dans la page 'cat.php', calculer la 'fuction' dans la page 'cat.js' et renvoyer les données dans la page 'cat.php'
Merci à celui qui peux m'aider
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

07 déc. 2006, 13:25

Re,
Si je veux afficher un qualificatif pour la récupération sur excell, je fais à peu de chose prêt ceci:

Code : Tout sélectionner

SI(fcrecup<tempsp3*0,5652;"Excellente";SI(fcrecup<tempsp3*0,5815;"Très bonne";SI(fcrecup<tempsp3*0,6033;"Bonne";SI(fcrecup<tempsp3*0,6304;"Moyenne";SI(D11<D9*0,663;"Médiocre";SI(D11<D9*0,6902;"Mauvaise";"Très mauvaise"))))))
Peut-être que ceci serait correct:

Code : Tout sélectionner

function recup () { if(fcrecup<tempsp3*0,5652) recup = "Excellente"; if(fcrecup<tempsp3*0,5815) recup = "Très bonne"; if(fcrecup<tempsp3*0,6033) recup = "Bonne"; if(fcrecup<tempsp3*0,6304) recup = "Moyenne"; if(D11<D9*0,663) recup = "Médiocre"; if(D11<D9*0,6902) recup = "Mauvaise"; else recup = "Très mauvaise"; }
ou vaut-il mieux que j'utilise un switch ? Le calcul dans la même fonction ne pose pas de problème ?

Je donne l'impression de me parler à moi-même mais cela ne fait rien, je consigne et quand quelqu'un aura le temps, il me remettra sur les bons rails :D

A+
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

ViPHP
ViPHP | 1961 Messages

07 déc. 2006, 13:45

Bonjour,

Avant de te donner une réponse, ta fonction c'est du JavaScript ou du PHP ?

Dans les deux cas il y a des erreurs, mais il est préférable de les corriger en fonction du langage.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 545 Messages

07 déc. 2006, 13:57

Salut,
Bonjour,

Avant de te donner une réponse, ta fonction c'est du JavaScript ou du PHP ?

Dans les deux cas il y a des erreurs, mais il est préférable de les corriger en fonction du langage.
C'est du PHP ... je ne suis pas encore à l'apprentissage du javascript qui est prévue pour bien plus tard :oops:

Merci pour ta réponse

NB: Etant d'un naturel curieux, je serais intéressé de savoir ce que cela pourrait donner dans les 2 languages !
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

ViPHP
ViPHP | 1961 Messages

07 déc. 2006, 14:18

Re,

Je ne vais pas te parler du calcul en lui même mais de la manière d'utiliser les fonctions en PHP.

Toute variable en PHP commence par "$".

Toute variable créée en dehors de la fonction (sauf les super globales - $_GET[], $_POST[], etc)
ne sont pas visibles dans la fonction si elles ne sont pas explicitement déclarées comme "global"

Toute variable créée dans la fonction ne sera visible que dans le corps de la fonction (entre { et })

Dans ton cas tu utilises quatre variables externes à la foncion ($frecup, $D9, $D11 et $tempsp3)
elles ne sont pas reconnues à l'intérieur de la fonction.

Tu as deux solutions pour pouvoir les utiliser
- Tu les déclares comme globales (déconseillé)
- Tu les passes en paramètres à l'appel de la fonction

Le but de ta fonction est d'effectuer un calcul, mais la valeur calculée doit être utilisable en dehors de la fonction,

Comme vu plus haut la variable $recup est locale à la fonction, donc non visible du reste du PGM.

Pour pouvoir l'utiliser hors de la fonction, deux solutions
- Passer la variable par référence (déconseillé pour débuter)
- Retourner la valeur

Si on reprends tout ça et qu'on l'applique ça nous donnerait QQ chose du style
<?php
// Fonction de calcul de la récupération
function recup($frecup, $D9, $D11, $temps3){
   // tes calculs ici
   if($fcrecup < $tempsp3 * 0,5652) return("Excellente");
   if($fcrecup < $tempsp3 * 0,5815) return("Très bonne");
   if($fcrecup < $tempsp3 * 0,6033) return("Bonne");
   if($fcrecup < $tempsp3 * 0,6304) return("Moyenne");
   if($D11 < $D9 * 0,663) return("Médiocre");
   if($D11 < $D9 * 0,6902) return("Mauvaise");
   return("Très mauvaise");
}
// Appel de la fonction
$recup = recup($frecup, $D9, $D11, $temps3);

//Affichage de la valeur calculée
echo $recup;
?>
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 545 Messages

07 déc. 2006, 15:33

Merci pour ce dépannage bien précieux !
J'ai quand même fait quelques bricolage car il n'y a que 2 variables (j'avais fait une erreur dans les doinnées) et j'ai voulu apporter un test au cas où les valeurs seraient vides:
// Fonction de calcul de la récupération
function recup($frecup, $tempsp3){
   // tes calculs ici
   if($fcrecup = 0 or $tempsp3 = 0) return(" "); //Pas de message d'erreur !
   if($fcrecup < $tempsp3 * 0,5652) return("Excellente");
   if($fcrecup < $tempsp3 * 0,5815) return("Très bonne");
   if($fcrecup < $tempsp3 * 0,6033) return("Bonne");
   if($fcrecup < $tempsp3 * 0,6304) return("Moyenne");
   if($fcrecup < $tempsp3 * 0,663) return("Médiocre");
   if($fcrecup < $tempsp3 * 0,6902) return("Mauvaise");
   return("Très mauvaise");
} 
Est-ce correcte ?

J'aimerai savoir pour un même type de calcul que l'on retrouve plusieurs fois sur la page peut-on faire ceci:
// Fonction de calcul de la vitesse
function vitesse($tempsp1, $tempsp2, $tempsp3, $palier3) {
	// si les valeurs sont différentes de 0 alors on fait le calcul pour chaque vitesse (1,2 et 3)
	if($tempsp1 != 0) return ($vitesse1 = 800*0.0006944444/$tempsp1);
	if($tempsp2 != 0) return ($vitesse2 = 800*0.0006944444/$tempsp2);
	if($tempsp3 != 0 and $palier3 != 0) return ($vitesse3 = $palier3*0.0006944444/$tempsp3);	
	}
Ou dois-je créer une function $vitesse1, $vitesse2 et $vitesse3?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

07 déc. 2006, 15:36

Return va te sortir de ta fonction
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
ViPHP | 1961 Messages

07 déc. 2006, 15:46

Re,

Je ne sais pas ce que tu chersches à faire.
Ou niveau syntaxique pas de souci, mais au niveau fonctionnel tu risques d'avoir des surprises.
Expose ce que tu voudrais faire.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 545 Messages

07 déc. 2006, 16:02

Re,

Dans le fichier 'cat.php', il y a ce tableau qui s'affiche
Image
ou l'utilisateur remplit les cases blanches qui seront les saisies !
Au moment de la validation du formulaire, les valeurs sont retournées dans un fichier où je stocke toutes mes fonctions 'cat.js' où, je voudrais, qu'elles soient traitées et renvoyées sur la 1er page !

Par exemple, pour le palier 1 où la distance est de 800 m, je devrais d'abord y voir si (dans le fichier 'cat.js') $tempsp1 est différent de 0 avant de faire le calcul $vitesse1 = 800*0.0006944444/$tempsp1 afin que le tableau (du fichier 'cat.php') se remplisse ... je peux fournir le fichier Excell pour montrer mes intentions mais où le poster?

mere-teresa,
Donc, je dois faire 3 fonctions différentes?

Merci à tout les 2
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

07 déc. 2006, 17:08

Salut,
Return va te sortir de ta fonction
Donc, il est souhaitable de tout séparer ainsi:
function vitesse1($tempsp1) {
	if($tempsp1 != 0) return ($vitesse1 = 800*0.0006944444/$tempsp1);
	}

function vitesse2($tempsp2) {
	if($tempsp2 != 0) return ($vitesse2 = 800*0.0006944444/$tempsp2);
	}

function vitesse3($tempsp3, $palier3) {
	if($tempsp3 != 0 and $palier3 != 0) return ($vitesse3 = $palier3*0.0006944444/$tempsp3);	
	}
?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Eléphant du PHP | 134 Messages

07 déc. 2006, 17:20

tu peux faire mieux
function vitesse($tempsp, $palier, $facteur) {
    if($tempsp != 0) return ($vitesse = $palier*$facteur/$tempsp);
    } 

Mammouth du PHP | 545 Messages

07 déc. 2006, 20:20

Salut,
tu peux faire mieux
function vitesse($tempsp, $palier, $facteur) {
    if($tempsp != 0) return ($vitesse = $palier*$facteur/$tempsp);
    } 
Merci pour ta proposition mais je me pose des questions de débutant (peut-être !):
  • 1. je dois donc laisser tomber 'function vitesse1', 'function vitesse2' et 'function vitesse3' pour 'function vitesse' ... sera-t-il toujours bien fait la différence entre les 3 vitesses ?
    2. si pour la valeur $facteur, il vaut mieux qu'elle soit égal à '0.0006944444' ou à '1/(24*60)' ?
Merci pour les infos
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

07 déc. 2006, 23:47

Re,

Je suis toujours occupé de découvrir mais j'ai encore une question avec la fonction d'évaluation de la récupération:
<?php
// Fonction d'évaluation de la récupération
function recup($fcrecup, $fcp3){
   if($fcrecup = 0 or $fcp3 = 0) return(" "); //Pas de message d'erreur !
   if($fcrecup < $fcp3 * 0.5652) return("Excellente");
   if($fcrecup < $fcp3 * 0.5815) return("Très bonne");
   if($fcrecup < $fcp3 * 0.6033) return("Bonne");
   if($fcrecup < $fcp3 * 0.6304) return("Moyenne");
   if($fcrecup < $fcp3 * 0.663) return("Médiocre");
   if($fcrecup < $fcp3 * 0.6902) return("Mauvaise");
   return("Très mauvaise");
} 

// Appel de la fonction
$recup = recup($fcrecup, $tempsp3);
// Affichage de la valeur calculée
echo $recup;
?>
le message est d'entrée 'Très mauvaise'. Je comprend donc qu'il n'y aucune variable dont la valeur égale à 0 ... c'est bien cela ?

Comment y remédier ?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

ViPHP
ViPHP | 1961 Messages

08 déc. 2006, 00:34

Re,

En PHP un seul signe = signifie affectation
$a = 5; // Attribue la valeur 5 la variable $a
Pour tester l'égalité en valeur c'est le double = (==)
if($a == 5) // Vrai si le contenu de $a est = 5 mais aussi si $a = '5' (caractère)
Pour tester l'égalité et le type c'est le triple = (===)
if ($a === 5) // Vrai si $a est = 5 Faux si $a = '5' (caractère)
Donc dans ta focntion tu fais une affectation
if($fcrecup = 0 or $fcp3 = 0)
et non un test.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein