Une fonction pour convertir

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,
J'aimerais effectuer des conversions de mesures aéronautiques. L'utilisateur entre la valeur et l'unité et retrouve cette valeur convertie dans toutes les autres unités utilisées dans l'aéronautique. En codant, j'ai remarqué que mon code était affreusement répétitif… J'ai crû comprendre qu'il fallait absolument éviter cela. Donc j'ai commencé à réfléchir à une fonction ou une classe qui pourrait simplifier tout ça, mais j'arrive vraiment pas à voir comment faire ça. Voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
 if (isset($_POST['value']) && isset($_POST['unit'])) {
            $value = floatval($_POST['value']);
            $value == 0 ? $value = 1 : $value = $value; // Si n'importe quoi est envoyé, $value sera égale à 1

            $nbDecimal = 3;

            switch ($_POST['unit']) {
                // Vitesses
                case 'km/h':
                    echo '<p>'. $value . ' km/h = ' . number_format($value/1.852, $nbDecimal) . ' kt.</p>' ; // km/h vers kt
                    echo '<p>'. $value . ' km/h = ' . number_format($value * 0.2777777777778, $nbDecimal) . ' m/s.</p>' ; // km/h vers m/s
                break;

                case 'kt':
                    echo '<p>'. $value . ' kt = ' . number_format($value*1.852, $nbDecimal) . ' km/h.</p>' ; // kt vers km/h
                    echo '<p>'. $value . ' kt = ' . number_format($value*0.51444444444, $nbDecimal) . ' m/s.</p>' ; // kt vers m/s
                break;

                case 'm/s':
                    echo '<p>'. $value . ' m/s = ' . number_format($value*3.6, $nbDecimal) . ' km/h.</p>' ; // m/s vers km/h
                    echo '<p>'. $value . ' m/s = ' . number_format($value*1.9438444924571, $nbDecimal) . ' kt.</p>' ; // m/s vers kt
                break;

                // Longueurs
                case 'ft':
                    echo '<p>'. $value . ' ft = ' . number_format($value/3.2808, $nbDecimal) . ' m.</p>' ; // ft vers m
                    echo '<p>'. $value . ' ft = ' . number_format($value*0.0003048, $nbDecimal) . ' km.</p>' ; // ft vers km
                    echo '<p>'. $value . ' ft = ' . number_format($value*0.33333, $nbDecimal) . ' yd.</p>' ; // ft vers yd
                break;

                case 'm':
                    echo '<p>'. $value . ' m = ' . number_format($value*3.2808399, $nbDecimal) . ' ft.</p>' ; // m vers ft
                    echo '<p>'. $value . ' m = ' . number_format($value/1000, $nbDecimal) . ' km.</p>' ; // m vers km
                    echo '<p>'. $value . ' m = ' . number_format($value*1.0936, $nbDecimal) . ' yd.</p>' ; // m vers yd
                break;

                case 'km':
                    echo '<p>'. $value . ' km = ' . number_format($value*3280.8398950131, $nbDecimal) . ' ft.</p>' ; // km vers ft
                    echo '<p>'. $value . ' km = ' . number_format($value*1000, $nbDecimal) . ' m.</p>' ; // km vers m
                    echo '<p>'. $value . ' km = ' . number_format($value*1093.61329834, $nbDecimal) . ' yd.</p>' ; // km vers yd
                break;

                case 'yd':
                    echo '<p>'. $value . ' yd = ' . number_format($value*3.00, $nbDecimal) . ' ft.</p>' ; // yd vers ft
                    echo '<p>'. $value . ' yd = ' . number_format($value*0.9144, $nbDecimal) . ' m.</p>' ; // yd vers m
                    echo '<p>'. $value . ' yd = ' . number_format($value/1093.61329834, $nbDecimal) . ' km.</p>' ; // yd vers km 
                break;


                // Températures
                case '°C':
                    echo '<p>'. $value . ' °C = ' . number_format(($value*1.8000) + 32.00, 2) . ' °F.</p>' ; // °C vers °F
                    echo '<p>'. $value . ' °C = ' . number_format($value+273.15, 2) . ' K.</p>' ; // °C vers K
                break;

                case '°F':
                    echo '<p>'. $value . ' °F = ' . number_format(($value-32)/1.8000, 2) . ' °C.</p>' ; // °F vers °C
                    echo '<p>'. $value . ' °F = ' . number_format((($value-32)/1.8000)+273.15, 2) . ' K.</p>' ; // °F vers K
                break;

                case 'K':
                    echo '<p>'. $value . ' K = ' . number_format($value-273.15, 2) . ' °C.</p>' ; // K vers °C
                    echo '<p>'. $value . ' K = ' . number_format(($value*(9/5))-459.67, 2) . ' °F.</p>' ; // K vers °F
                break;

                default:
                    echo "<strong>ERREUR:</strong> Les valeurs entrées sont incorrectes ou incomplètes.";
                break;
            }
        }
?>

Donc les valeurs sont obtenues grâce aux variables $_POST['value'] (contient la valeur à convertir) et $_POST['unit'] contient l'unité d'origine.
Si vous savez comment faire, merci d'avance !

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Voici comment je vois les choses:

je remarque qu'il y a toujours deux choses dans tes conversions :

  • un multiplicateur
  • un additionneur

parfois le multiplicateur n'apparait pas, car en fait c'est une multiplication par 1.
parfois l'additionneur n'apparait pas, car en fait on ajoute 0.

Donc ma première idée serait de dire : on va faire un tableau de conversion :

1
2
3
4
5
{
    "km/h" : { "m/s": [0.2777777777778, 0], "kt":[1/1.852, 0]},
    "m/s" : { "km/h": [3.5, 0], "kt":[1.9438444924571, 0]},
    "kt": { "km/h": [1.852, 0], "m/s":[ 0.51444444444, 0}]}
}

tableau de conversion des distance

ensuite tu n'auras plus qu'à faire une fonction qui convertit une unité en une autre:

1
2
3
4
5
6
7
<?php
//en supposant que ton tableau s'appelle conversion_tab
function convert($from_unit, $target_unit, $from_value){
    $multiplier = $conversion_tab[$from_unit][$target_unit][0];
    $origin_ordinate = $conversion_tab[$from_unit][$target_unit][1];
    return $from_value." $from_unit = ".number_format(($from_value*$multiplier)-$origin_ordinate, 2);
}
+2 -0
Auteur du sujet

Merci beaucoup de ta réponse, et excuse moi du retard de la mienne.
Et effectivement, je n'avais absolument pas pensé à utiliser un tableau (en faite, je n'y pense jamais… :-° ). Donc je pourrais imaginer un tableau comme celui-ci ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php

$convertion_tab = array (
                         "km/h" => array(
                                         "kt" => 1/1.852, 
                                         "m/s" => 0.2777777777778,
                                         "ft/min" => 54.68066);
                         "kt" => array(
                                         "km/h" => 1.852,
                                         "m/s" => 0.51444444444,
                                         "ft/min" => 1.687810);
                         "m/s" => array(
                                         "km/h" => 3.6,
                                         "kt" => 1.9438444924571,
                                         "ft/min" => 196.8504);
                         "ft/min" => array(
                                         "km/h" => 1/54.68066,
                                         "kt" => 1/101.2686,
                                         "m/s" => 1/196.8504);
                         );

Ça pourrait fonctionner? Merci de votre aide!

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Auteur du sujet

Merci beaucoup. Mais que veux-tu dire par additionneurs ? Je ne vois pas de quoi tu parles…

EDIT : J'avance dans ma fonction, mais un problème se présente.. (Je ne comprend absolument pas pourquoi..)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
$convertion_tab = array (
                         "km/h" => array(
                                         "kt" => 1/1.852, 
                                         "m/s" => 0.2777777777778,
                                         "ft/min" => 54.68066),
                         "kt" => array(
                                         "km/h" => 1.852,
                                         "m/s" => 0.51444444444,
                                         "ft/min" => 1.687810),
                         "m/s" => array(
                                         "km/h" => 3.6,
                                         "kt" => 1.9438444924571,
                                         "ft/min" => 196.8504),
                         "ft/min" => array(
                                         "km/h" => 1/54.68066,
                                         "kt" => 1/101.2686,
                                         "m/s" => 1/196.8504));

if(array_key_exists("km/h", $convertion_tab)) {
    echo("saluuuuut");
}

function convert($from_unit, $from_value, $nbDecimal = 3)
{
    if (!array_key_exists($from_unit, $convertion_tab)) {
        echo '<p><strong>ERREUR : </strong>L\'unitée est inconnue.</p>';
    }
    else {
        [...]
    }
}
// TEST
convert("km/h", 165, 3);

Le premier test me renvoie bien saluuuuut et celui de la fonction me renvoie aussi ERREUR : L'unitée est inconnue.… Pourquoi???

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Auteur du sujet

Ah d'accooooord! Du coup voici ma fonction :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
function convert($units_tab, $from_unit, $from_value, $nbDecimal = 3)
{
    if (!isset($units_tab[$from_unit])) {
        echo '<p><strong>ERREUR : </strong>L\'unitée est inconnue.</p>';
    }
    else {
        if ($_POST['type_conv'] != 'temperature' && $from_value <= 0) { // On check qu'une vitesse ou une longueur ne soit pas négative.
           $from_value = 1;
        }

        foreach ($units_tab[$from_unit] as $target_unit => $multiplier) {
            echo '<p>'. $from_value . ' ' . $from_unit . ' = ' . number_format($from_value * $multiplier, $nbDecimal, ',', ' ') . ' ' . $target_unit . '.</p>' ;
        }
    }
}

Mais je ne comprend toujours pas de coup tu parlais en disant additionneurs ?

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Auteur du sujet

Comme c'est vraiment spécifique aux températures et que l’additionneur n'est jamais au même endroit je pense que je les écrirais à la main. En tout cas, merci beaucoup, mon code est vraiment mieux foutu maintenant !

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Staff

Comme c'est vraiment spécifique aux températures et que l’additionneur n'est jamais au même endroit je pense que je les écrirais à la main. En tout cas, merci beaucoup, mon code est vraiment mieux foutu maintenant !

Si, il est toujours au même endroit. C'est juste que parfois il vaut 0 ;)

+0 -0
Auteur du sujet

Bah.. Par exemple, cette ligne :

1
2
<?php
echo '<p>'. $value . ' °C = ' . number_format(($value*1.8000) + 32.00, 2) . ' °F.</p>' ; // °C vers °F

Me permet de passer de Celsius vers des Fahrenheit. Je multiplie d'abord par 1.8 puis j'ajoute 32. Alors que si je prend la ligne qui me permet de passer des Fahrenheit aux Kelvin :

1
2
<?php
echo '<p>'. $value . ' °F = ' . number_format((($value-32)/1.8000)+273.15, 2) . ' K.</p>' ; // °F vers K

Je retire d'abord 32, puis je divise par 1.8 (ce qui revient à multiplier par 1/1.8) puis je rajoute 273.15. Je ne vois pas trop comment l'additionneur peut être au même endroit ici..

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Je retire d'abord 32, puis je divise par 1.8 (ce qui revient à multiplier par 1/1.8) puis je rajoute 273.15. Je ne vois pas trop comment l'additionneur peut être au même endroit ici..

un petit développement?

en mathématique :

$$ \frac{a - 32}{1.8} + 273.15 = \frac{a}{1.8} - \frac{32}{1.8} + 273.15 = \frac{a}{1.8} + 255.3722222222 $$

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte