Un problème de calcul

cs_cabanac Messages postés 17 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 12 mars 2011 - 10 mars 2011 à 00:59
cs_cabanac Messages postés 17 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 12 mars 2011 - 12 mars 2011 à 21:35
Bonjour à tous,

Dans un site, je dois mettre en place un calcul.

Je ne connais pas le javascript, et donc, n'y arrive pas.

J'aimerai trouver de l'aide.

Explication : des surfaces 0 à 120 des prix 1500
121 à 170 8.60 (en plus bien sur des 1500)
171 à 300 909.60
301 à 500 10.37 (en plus bien sur des 909.6)

J'ai bien commencer avec les deux faciles, c'est à dire de 0 à 120 et de 171 à 300. Mais le reste, je ne trouve pas la solution pour écrire ces codes.

Je vous mets ce dont j'ai commencé :
</style>
<script language="JavaScript" type="text/JavaScript">
function aeweboutils (form1) {
if (form1.surface.value <= 120)
{form1.m.value = 1500}
else
if ((form1.surface.value >= 121) && (form1.surface.value <= 170))
{form1.m.value = form1.surface.value*8.6
form1.m.value = (Math.round(form1.m.value*100))/100}
else if ((form1.surface.value >= 171) && (form1.surface.value <= 300))
{form1.m.value = 909.60}
else if ((form1.surface.value >= 301) && (form1.surface.value >=500))
{form1.m.value = form1.surface.value
form1.m.value = (Math.round(form1.m.value*100))/100}}
</script>

et, plus bas :
<form name="form1" method="post" action="">

Surface en m²
€TTC

En fait, les calculs sont simples : cela donne (pour les deux manquants)
par ex : 150-120 * 8.60 + 1500 = 1758

Et pour l'autre tranche par ex : 350-300 * 10.37 + 909.60 = 1428.10
Bien sur, les lignes {form1.m.value = form1.surface.value*8.6
form1.m.value = (Math.round(form1.m.value*100))/100}
et {form1.m.value = form1.surface.value
form1.m.value = (Math.round(form1.m.value*100))/100}} ne fonctionnent pas.
(J'avais trouvé quelque part ce bouts de code, j'ai voulu m'adapter, mais, je ne sais pas)

Je vous remercie par avance de l'aide que vous voudrez bien m'apporter.

12 réponses

007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
10 mars 2011 à 01:42
Une première indication, le signe du produit en javascript est * et non pas un point.
0
cs_cabanac Messages postés 17 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 12 mars 2011
10 mars 2011 à 09:53
Bonjour Julien,

Tout d'abord, je vous remercie de me répondre.

Comme je l'ai dit, je ne connais rien de javascript.

Certes, c'est une indication, mais, cela ne m'aide pas vraiment.

Ce que j'aurai aimé, c'est de me mettre sur la voie (voir plus) sur la façon d'écrire que (toujours suivant mon ex) la surface rentrée (dans la tranche entre 121 et 170) - 120 et égal à cette différence * 8.60 + 1500.

C'est surtout cette façon de l'écrire en java script que je ne sais pas faire.

Merci encore de l'aide dont vous pourrez m'apporter.
0
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
10 mars 2011 à 12:19
Il conviendrait d'abord de bien préciser le barème à appliquer... Les formules semblent être les suivantes, si P désigne le prix (en euros) et S la surface (en m² ?):

De 0 à 120 m²
P = 1500 € (1)

À partir de 120 et jusqu'à 170 m²
P = 1500 + (S-120) * 8.6 € (2)
(ce que l'on décrit habituellement par un Prix de 1500 € plus un supplément de 8.60 € par mètre-carré supplémentaire)

À partir de 170 et jusqu'à 300 m²
P = 1500 + 909,6 € (3)
(mais l'on s'embarrasserait pas alors de deux montants et annoncerait la somme totale ???)

Au delà de 300 m²
P = 1500 + 909.6 + (S-300) * 10.37 € (4)

Pourtant la discontinuité apparaissant entre les formules (2) et (3) (le prix pour 169,99 m² devrait me semble-t-il être très voisin de celui pour 170 m² ???) et le palier (les prix ne sont plus liés à la surface entre 170 et 300 m² ???), me font douter de la validité de mon interprétation des formules proposées.

Une fois ces formules établies ou rétablies, il devrait être possible de les traduire en javascript, par exemple comme suit:

var E,S,P,Q;
E=form1.surface
// Remplacer l'éventuelle virgule par un point
S=E.replace(/,/,'.');

if (S<120) P=1500;
else if (S<170) P=1500+(S-120)*8.6;
else if (S<300) P=1500+909,6
else 1500+909.6+(S-300)*10.37;
   
P=Math.round(P*100)/100;
// Remplacer le point par une virgule
Q=P.replace(/\./,',');
form1.montant.value=Q+' €';
0
cs_cabanac Messages postés 17 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 12 mars 2011
10 mars 2011 à 16:00
Merci de votre réponse rapide.

Pour le 1 et 2, vous avez bien vu, les barèmes sont bons.

Mais, pour ce qui concerne le 3 (et donc 4) j'ai fait une énorme bétise,

Ce n'ai pas 909.60, mais 9.60€ (là aussi de plus par m²) Cela m'apprendra à me relire, surtout lorsque l'on ne voit plus très bien.

Donc, afin de voir si j'ai tout compris, cela me donnerai :
else if (s<300) p=1500+(s-170)*9.6;
else if (s<500) p=1500+(s-300)*10.37;

Si c'est ça, faut-il que je change quelque chose à ce niveau :
<form name="form1" method="post" action="">

Surface en m²
€TTC

Ou cela fonctionnera-t-il de cette manière.

Encore merci, j'ai hâte de votre réponse afin de tester cela.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
10 mars 2011 à 16:40
Attention, il ne faut pas remplacer des majuscules par des minuscules (javascript est sensible à la casse !) donc votre proposition doit être précédée du code suivant
var e,s,p,q; 
e=form1.surface
// Remplacer l'éventuelle virgule par un point
s=e.replace(/,/,'.');

Ensuite, les 4 lignes centrales du script proposé (instructions if else emboîtées) forment un tout qu'il ne faut pas dissocier !

Quant aux valeurs, vous êtes seul juge, je constate seulement qu'il n'y avait pas de limite à 500 précedemment et que votre dernière condition if (si ...) n'est pas terminée par un else (sinon ...) : si la surface entrée est supérieure à 500, une erreur va survenir !

Pour tout cela il faut absolument disposer d'un cours de javascript ou bien faire des recherches en tapant simplement javascript if dans Google...

Sinon, j'ai remplacé le nom de l'input d'affichage du prix (m dans le formulaire initial) par un montant. C'est, me semble-t-il, la seule précaution à prendre après celle qui consistait à remplacer les virgules par des points, pour faire le calcul en javascript, puis revenir ensuite à la notation des francophones...

Mais, il faut absolument travailler avec un débogeur (firebug de Mozilla Firefox) où au minimum Activer, dans Internet Explorer, l'Option Afficher une notification de chaque erreur de script (voir Outils, Options Internet volet Avancé rubrique Navigation).
0
cs_cabanac Messages postés 17 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 12 mars 2011
10 mars 2011 à 17:01
Merci de tous vos conseils.

Je vais faire des recherches sur "if", puis plus généralement sur java script.

J'ai donc ajouter firebug à mon firefox.

Je teste tout cela, et, je ne manquerai pas de revenir soit pour vous remercier, soit pour avoir un complément d'information.

Cordialement.
0
cs_cabanac Messages postés 17 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 12 mars 2011
10 mars 2011 à 23:47
Un petit retour vers vous, car bien sur, le bouton "calcul ne fonctionne pas.
Je m'en doutais. Et, bien qu'ayant fait des recherches à la fois sur ce site, google et bien d'autres, je n'ai rien trouvé qui puisse m'aider.
Ce que j'ai compris, c'est le value="Calcul" c'est le nom du bouton.
Donc cela est bon, et onclick="quelque chose" c'est ce qui déclenche le calcul.
Donc, ce : onclick="aeweboutils(this.form)" ne fonctionne plus car cela : function aeweboutils (form1) a été changé.
J'ai bien essayé en suivant le même raisonnement de le remplacer par : "var", mais sans grand espoir.

Donc, voici ce que j'ai complété :

<script language="JavaScript" type="text/JavaScript">
var E,S,P,Q;
E=form1.surface
// Remplacer l'éventuelle virgule par un point
S=E.replace(/,/,'.');
if (S<120) P=1500;
else if (S<170) P=1500+(S-120)*8.6;
else if (S<300) P=1500+(S-170)*9,6;
else if (S<500) P=1500+(S-300)*10.37;else P=Math.round(P*100)/100;
// Remplacer le point par une virgule
Q=P.replace(/\./,',');
form1.montant.value=Q+' €';
</script>
</head>

Et, plus bas, à l'endroit du bouton :

<form name="form1" method="post" action="">

Surface en m²
€TTC

</form>

Afin que je puisse tester le calcul, pourriez vous me dire comment faire afin que ce bouton fonctionne.

Merci d'avance. (En attendant, je continue de chercher au cas où.)
0
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
11 mars 2011 à 00:43
Il suffit d'inclure le code proposé dans une fonction que l'on peut nommer comme on l'entend mais surtout pas var qui est un mot réservé servant à désigner des variables.

Donc avec une fonction nommée calculPrix (et en utilisant les boutons pour distinguer le code) la page pourrait être constituée comme suit; après correction de quelques erreurs résiduelles:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>Untitled</title>
<style type="text/css">
// Placer ici les indications de style
body {font-color:#000099;font-family:Garamond;}
</style>
<script type="text/javascript">
// la fonction dont l'argument f deviendra l'objet formulaire (voir l'appel plus bas) 
function calculPrix(f){
   var E,S,P,Q;
   E=f.surface.value;
   // Remplacer l'éventuelle virgule par un point
   S=E.replace(/,/,'.');alert(S)
   if (S<120) P=1500;
   else if (S<170) P=1500+(S-120)*8.6;
   else if (S<300) P=1500+(S-170)*9.6;
   else if (S<500) P=1500+(S-300)*10.37;
   else {alert('Surface trop grande. Formule indéfinie');return}
   P=Math.round(P*100)/100;
   // Remplacer le point par une virgule
   Q=P.toString().replace(/\./,',');
   f.montant.value=Q;
}// fin de la fonction
</script>
</head>

<form name="frm" method="post" action="">


   
      		Surface en m²
         
         
          Prix TTC en €
   




</form>

</html>
0
cs_cabanac Messages postés 17 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 12 mars 2011
11 mars 2011 à 10:36
Bonjour,

Je vous remercie de votre aide, je vais donc essayer et revenir vers vous pour vous donner le résultat

Bonne journée à vous
0
cs_cabanac Messages postés 17 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 12 mars 2011
11 mars 2011 à 23:00
Bonsoir,

J'aurais aimé vous donner de bonnes nouvelles, mais, cela ne fonctionne toujours pas.

Alors, j'ai étudié, essayé, mais, sans résultat.

Peut être quelques points à soulever car, vous m'aviez mis sur la voie en me disant, je vous cite : "après correction de quelques erreurs résiduelles:"
Donc, 1ère question, le "f" dans : function calculPrix(f) a-t-il une importance ? Si oui, faut-il l'ajouter à : onclick="calculPrix(this.form)".
Je veux dire comme ceci "calculPrix(f)(this.form)"
je dis cela, car j'ai vu que le onclick doit correspondre à la fonction.

2ème question, ce "f" es-ce le même que celui du :" E=f.surface.value;"

Vous voyez, je ne connais rien, mais j'essaie de comprendre.
Y-a-t-il plusieurs façons d'écrire cette fonction de calcul ? Si oui, je suppose que vous avez pris la plus simple afin que je puisse comprendre.
Par exemple, vous mettez : else if (S<170) P=1500+(S-120)*8.6;
Cela a-t-il la même signification que : <170 mais >120

Peut être une 3ème question, ne doit-il pas y avoir quelque chose entre : (S<170)et P=1500+(S-120)*8.6 .Quelque chose qui dirait si ça alors ça.

J'aimerai comprendre et non tout bêtement copier sans en connaitre les rouage.

Cordialement.
0
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
11 mars 2011 à 23:43
Êtes vous oui ou non capable de taper les mots «javascript instruction if» et «javascript fonctions» dans Google et de lire les premières pages obtenues à savoir celle-ci ou celle-la ?

Si oui. Bon courage et bonne continuation...
Sinon, arrêtez tout-de-suite et trouvez une autre activité !

Vous remarquerez, en outre, une très belle illustration de la stucture de l'instruction
if (condition réalisée) 
   {//alors on fait ceci 
    //... 
   } 
else 
   {// sinon on fait cela
    // ...
   }
0
cs_cabanac Messages postés 17 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 12 mars 2011
12 mars 2011 à 21:35
Bonsoir à vous,

J'avais dit que je n'y connaissais rien, mais oui, je suis capable de lire.

Et, j'avais lu, toutes les pages depuis le début, y avais appris de belles choses, pas que sur ce site de CCM, mais ici ou ailleurs.

Seulement, expliquer comment faire, c'est une chose, mais, dire les choses qui ne vont pas, c'est autre chose.

J'ai fini par trouver ce qui n'allait pas, sans pour autant me l'expliquer.
Donc, voici ce qui empêchait de fonctionner. Et ce, depuis le début je pense.

En bout de l'argument : // la fonction dont l'argument f deviendra l'objet formulaire (voir l'appel plus bas) venait s'ajouter function calculPrix(f){

J'avais beau remettre ça en dessous, à chaque fois, cela revenait en bout de l'argument lorsque que j'enregistrais ce changement.

Je ne sais pas si c'était la solution, mais, il m'a fallu que je mette le curseur en bas de la page avant d'enregistrer pour que cela fonctionne.

Et bien sur, comme, avant de vous copier ces bouts de lignes, je replaçais cette "function" en dessous, vous ne pouviez pas voir ce défaut.

Donc, un grand merci à vous deux pour l'aide apportée.

Je vais donc voir pour passer ce sujet en résolut.

Bonne soirée.
0
Rejoignez-nous