Bonjour,
Voila je rencontre un petit problème avec mon code.
je veux afficher une fraction en php : pour cela j'ai écrit
$a=3;
$b=2;
$c="$a/$b";
echo $c; //cela affiche 3/2
mais d'autre part je veux multiplier $c par un nombre entier;
echo $c*2; //cela m'affiche une err
( ! ) Notice: A non well formed numeric value encountered
si quelqu'un peut m'aider
et merci d'avance;
Salut,
Il faut juste supprimer les guillemet :
$c=$a/$b;
Sinon ton $c est considéré comme (string).
Ensuite tu n'auras plus de soucis à faire ta multiplication.
salut,
merci pour ta reponse ,mais j'ai besoins d'afficher la fraction "$a/$b", y a -t-il une méthode pour afficher la fractio sans utilser " "
J ai essayé (float)$c
ca ne fonctionne pas.
J ai essayé settype($c, "float")
ca ne fonctionne pas.
A priori, il te faut creer 2 variables : une string et une numerique.
Tu peux utiliser par exemple, le meme nom de variable mais avec un underscore pour la variable string.
Ca donnerait :
$a = 3;
$b = 2;
$c_ = "$a/$b";
$c = $a/$b;
echo "$c_ = ".$c; // 3/2 = 1.5
sinon avec un petit programe
index.php
<?php
require_once('calcul.php');
$f = '(1*x)+(320-y)-(z*50)+(40/z)';
echo '<br>f = '.$f.'<br><br>';
$x=152 ; $y=20; $z=2;
echo '... avec x . y . z = '.$x.' . '.$y.' . '.$z;
calcul($f, $x, $y, $z);
// **********************
echo '<br><br><hr><br>';
$f='(57954+32800)-(x*2)+(29000/y)-(456900/z)';
echo '<br>f = '.$f.'<br>';
calcul($f, $x, $y, $z);
et
calcul.php
<?php
function affiche(array $tab, int $lentab)
{
echo '<br> f = ';
for($i=0; $i<$lentab; $i++){
echo ' '.$tab[$i];
}
}
function calcul(string $f, int $x, int $y, int $z)
{
// 1. incorporation de la string dans un array ($tab)
// avec remplacement des variables x y z par leur valeur
$len=strlen($f); // = 27 caracteres dans la string '$f'
$tab=[];
for($i=0; $i<$len; $i++)
{
switch ($f[$i])
{
case 'x':
$tab[$i] = $x;
break;
case 'y':
$tab[$i] = $y;
break;
case 'z':
$tab[$i] = $z;
break;
default:
$tab[$i]=$f[$i];
break;
}
}
$lentab=count($tab); // 27 elements dans $tab dont 4 integer.
// 2. modif. du cast des string 'numeric' en 'integer'
// et reconstitution des nombres ('3' '2' '0' -> 320 integer)
for($i=0; $i<$lentab; $i++)
{
if( is_string($tab[$i]) && is_numeric($tab[$i]) )
{
$numericBefore = preg_match('/[0-9]/', $tab[$i-1]);
$numericAfter = preg_match('/[0-9]/', $tab[$i+1]);
if( ($numericBefore==0) && ($numericAfter==0) )
{settype($tab[$i],'int');}
else
{
for($j=($i+1); $j<$len; $j++)
{
if(is_numeric($tab[$j]))
{
$tab[$i]=$tab[$i].$tab[$j];
$tab[$j]='s';
} else {break ;}
}
settype($tab[$i],'int');
}
}elseif($tab[$i]==='s'){unset($tab[$i]);}
}
// 3. calcul niveau 1
echo '<br><br>';
$tab = array_values($tab);
$lentab = count($tab); // = 23
affiche($tab, $lentab);
echo '<br>';
for ($i=0; $i<$lentab; $i++)
{
if ( is_integer($tab[$i]) && $tab[$i+1]!==')' )
{
$operator = $tab[$i+1];
switch ($operator)
{
case '+':
$tab[$i] = $tab[$i] + $tab[$i+2];
break;
case '-':
$tab[$i] = $tab[$i] - $tab[$i+2];
break;
case '*':
$tab[$i] = $tab[$i] * $tab[$i+2];
break;
case '/':
if ($tab[$i+2] !== 0){
$tab[$i] = $tab[$i] / $tab[$i+2];
if(is_float($tab[$i])){round($tab[$i],2);}
} else {echo '<br>Erreur (division par 0) !';}
break;
default:
echo '<br>erreur (operateur non valide) !';
break;
}
$tab[$i+1]='s'; $tab[$i+2]='s';
} elseif($tab[$i]=='s'){ unset($tab[$i]);}
}
$tab = array_values($tab);
$lentab = count($tab); // = 15
affiche($tab, $lentab);
// 4. calcul niveau 2
echo '<br>';
// on supprime les parentheses du array
for ($i=0; $i<$lentab ; $i++) {
if($tab[$i]=='('){
unset($tab[$i]);
$tab[$i+2]='s';
}elseif($tab[$i]=='s'){
unset($tab[$i]);}
}
$tab = array_values($tab);
$lentab = count($tab); // $lentab = 7
affiche($tab, $lentab);
// 5. calcul niveau 3 (final)
echo '<br><br>';
$result = 0;
for($i=0; $i<$lentab; $i++)
{
if($i==0)
{
$operator = $tab[$i+1];
switch ($operator)
{
case '+':
$result = $result + $tab[$i]+$tab[$i+2];
$tab[$i+2]='s';
break 1;
case '-':
$result = $result - $tab[$i]-$tab[$i+2];
break 1;
case '*':
$result = $tab[$i]*$tab[$i+2];
break 1;
case '/':
if($tab[$i+2] !== 0){
$result = $tab[$i]/$tab[$i+2];
} else {echo 'Erreur (division par 0';}
break 1;
default:
echo 'erreur';
break 1;
}
$tab[$i+2]='s';
}
elseif(is_int($tab[$i]))
{
$operator = $tab[$i-1];
switch ($operator)
{
case '+':
$result = $result + $tab[$i];
$tab[$i+2]='s';
break 1;
case '-':
$result = $result - $tab[$i];
break 1;
case '*':
$result = $tab[$i]*$tab[$i+2];
break 1;
case '/':
if($tab[$i+2] !== 0){
$result = $tab[$i]/$tab[$i+2];
} else {echo 'Erreur (division par 0';}
break 1;
default:
echo 'erreur';
break 1;
}
}
}
echo ' f = '.$result;
}
on obtient :
= (1*x)+(320-y)-(z*50)+(40/z)
... avec x . y . z = 152 . 20 . 2
f = ( 1 * 152 ) + ( 320 - 20 ) - ( 2 * 50 ) + ( 40 / 2 )
f = ( 152 ) + ( 300 ) - ( 100 ) + ( 20 )
f = 152 + 300 - 100 + 20
f = 372
---------------------------------------------------------------------
f = (57954+32800)-(x*2)+(29000/y)-(456900/z)
f = ( 57954 + 32800 ) - ( 152 * 2 ) + ( 29000 / 20 ) - ( 456900 / 2 )
f = ( 90754 ) - ( 304 ) + ( 1450 ) - ( 228450 )
f = 90754 - 304 + 1450 - 228450
f = -89608