Code php que je ne comprend pas

Fermé
lolipop2701 - 17 déc. 2019 à 00:28
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 - 17 déc. 2019 à 09:47
Bonjour, voilà j'ai eu un problème en php, ci dessous, je ne suis pas arrivé à le résoudre mais je ne comprend pas la correction. étant débutante si vous pouviez mettre un commentaire à cahqie ligne pour que je comprenne un peu mieu le code serait très gentil ????????

énoncé :
Herculito IV : Le sanglier d'Érymanthe.
Extrait de https://callicode.fr/pydefis/Herculito04Sanglier/txt

Histoire
Pour son 4e travail, Eurysthée demanda à Hercule de capturer vivant le sanglier d'Érymanthe.

Gigantesque, celui-ci dévastait avec rage le nord-ouest de l'Arcadie.

Après avoir débusqué le sanglier, Hercule le poursuivit dans les montagnes en lui jetant des pierres. Le profil montagneux était assez accidenté et ressemblait à ceci :

Hercule, pour économiser ses forces, ne jetait des pierres que dans les descentes.

Précisément, il jetait une pierre tous les 10 mètres (changement d'altitude).
Ainsi, dans une descente de 30 mètres, il jetait 4 pierres.
On peut produire un relevé du profil des montagnes, en donnant les altitudes de chaque sommet et chaque col.

Par considérons un relevé qui donnerait : 0, 50, 40, 100, 70, 90, 0

À partir de ce relevé uniquement, on peut voir qu'il y a 3 descentes, de 10, 30 et 90 mètres : Hercule jettera donc 16 pierres sur le sanglier.

Défi
Un relevé du profil réel vous est donné en entrée.

Vous devez indiquer à Hercule combien de pierre il aura à jeter sur le sanglier.

la correction :

<?php
function sanglierErymanthe($montagnes)
{
$pierres=0;
for ($i=0;$i<count($montagnes);$i++) {
if ($montagnes[$i]>$montagnes[$i+1]) {
$metres=$montagnes[$i]-$montagnes[$i+1]; //positif quand on descend
$metres=($metres/10)+1; //on jete une pierre a chaque 10m
$pierres+=$metres;}
}
return $pierres;
}

?>


Configuration: Android / Chrome 75.0.3770.101
A voir également:

2 réponses

Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
17 déc. 2019 à 09:07
Bonjour,

En gros, il s'agit de compter le nombre de dizaines de mètres descendus.
<?php
// La fonction prend en entrée le profil montagneux, dans l'exemple c'est [0, 50, 40, 100, 70, 90, 0]
// Elle renvoie $pierre, qui compte le nombre de pierres lancées (égal au nombre de dizaines de mètres descendus)
function sanglierErymanthe($montagnes)
{
    $pierres=0; // Le total des pierres lancées, qui commence à 0
    for ($i=0;$i<count($montagnes);$i++) {  // On parcourt le tableau...
        if ($montagnes[$i]>$montagnes[$i+1]) { // en repérant les descentes
            $metres=$montagnes[$i]-$montagnes[$i+1]; //on compte les mètres descendus
            $metres=($metres/10)+1; //on compte le nombre de dizaines de mètres (+1 si Hercule lance une pierre tout en haut puis tout en bas)
            $pierres+=$metres; // Et on les ajoute au total
        }
    }
    return $pierres; // Pour finir, on renvoie le total calculé.
}

?> 

D'ailleurs en passant, ce code est faux est provoquera une erreur sur le dernier élément du tableau, parce que $montagnes[$i+1] ne sera pas défini. Il manque un -1 dans la condition d'arrêt du for().

Voilà, pose des questions s'il y a un point précis qui te paraît encore flou.

Xavier
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié le 17 déc. 2019 à 09:47
Bonjour,

Pour commencer, merci d'utilisedr les balises de code pour poster ton code sur le forum
explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Ensuite, le code que tu nous montres contient une erreur...
Si on active l'affichage des erreurs php on constate qu'on obtient une erreur d'offset.
Normal, vu que vous faites du $i+1 sur l'array montage.... et donc, lorsque vous êtes sur le dernier élément, et bien... y'a plus rien derrière.
Il faut donc modifier la boucle pour aller jusqu'au dernier élément moins un !
 count($montagnes)-1


Maintenant... concernant ta question...
que ne comprends tu pas exactement ?
Quelle instruction PHP ne te semble pas claire ?
car il suffit de le tester pour voir comment ça fonctionne
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);



function sanglierErymanthe($montagnes)
{
  $pierres=0;
  //on boucle sur chaque hauteur (moins 1 )
  for ($i=0;$i<count($montagnes)-1;$i++) {
    //on vérifie si on est en montée ou descente. (positif quand on descend)
    if ($montagnes[$i]>$montagnes[$i+1]) {
      $metres=$montagnes[$i]-$montagnes[$i+1]; //on calcul la différence de mettre entre les deux hauteurs
      $metres=($metres/10)+1; //on jete une pierre a chaque 10m
      $pierres+=$metres;//on cumul le nombre de pierre jetées.
    }
  }
  return $pierres;// on retourne le total de pierres jetées
}



$datas = array(0, 50, 40, 100, 70, 90, 0);
$result = sanglierErymanthe($datas);

print_r($result);


0