Joli sapin de noel

Résolu/Fermé
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 - 28 févr. 2009 à 16:12
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 - 3 mars 2009 à 16:21
Bonjour,
salut les gars.
je dois realiser un script qui affiche un joli sapin de noel a l'ecran en fonction de la taille donnee.
je suis deja assez avance la dessus, mais lorsque je l'execute il m'affiche rien. En fait, comme je l'avais deja code en C, j'y ai juste apporte des modification.
voici mon code:

<?php
  
 function last_line($taille)
  {
      
     $lastline = 7;
     $jump = 6;
     
     for ($i = 1; $i < $taille; $i++)
     {
        if (($i % 2) != 0)
          $lastline += $jump;
        else if ($i != 1)
          {
            $jump += 2;
            $lastline += $jump;
          }
     }
     return($lastline);
 }
 

 function first_line($taille)
  {
    
     $firstline = 1;
     $jump = 4;
     
     for ($i = 1; $i < $taille; $i++)
     {
        if (($i % 2) != 0)
            $firstline += $jump;
        else if ($i != 1)
             {
                $jump += 2;
                $firstline += $jump;
             }
     }
    return ($firstline);
 }

  function draw($num,$taille)
 {
 
    $blank = $last_line($taille) / 2 - $first_line($num) / 2;
    $stars = $first_line($num) - 1;
    $jump = 4;
    $hauteur_branche = $num + 3;
    
    for ($i = 0; $i < $hauteur_branche; $i++)
      {
          for ($j = 0; $j < $blank; $j++)
             echo(' ');
          for ($j = 0; $j < $stars; $j++)
                  echo('*');
                  $blank--;
                  $stars += 2;
                  echo('*');
                  echo('\n');
      }
 }

  function draw_tronc($taille)
 {
     
    if (($taille % 2) != 0)
       $largeur_tronc = $taille;
    else
       $largeur_tronc = $taille + 1;
       $hauteur_tronc = $taille;
       $blank = (last_line($taille) / 2) - ($largeur_tronc / 2);
       for ($i = 0; $i < $hauteur_tronc; $i++)
          {
            for ($j = 0; $j < $blank; $j++)
              echo(' ');
            for ($j = 0; $j < $largeur_tronc; $j++)
              echo('|');
              echo('\n');
          }
 }

 function sapin($taille)
  {
      
     if ($taille > 0)
       {
          $i = 1;
          while ($i <= $taille)
           {
              draw($i, $taille);
              $i++;
           }
          draw_tronc($taille);
       }    
  }

  function trans($arg,$length)
    {
       

     $res = 0;
     $p = 1;
     
     $res += ($arg[($length--)] - '0');
     while (($length >= 0) && ($arg[$length] != '-'))
       {
           $p *= 10;
           $res += (($arg[$length--] - '0') * $p);
       }
     return ($res);
 }

 function main($argc, $argv)
 {
     

     if ($argc == 2)
      {
         $length = 0;
         while($argv[1][$length] != 0)
         $length++;
         $length--;
         sapin(trans($argv[1], $length));
      }
      else
        echo("Veuillez entrer la taille du sapin\n");                
 }
 
?>
A voir également:

6 réponses

Bonsoir

¿ No sabes todo ? ;-)

J'ai testé ton programme et il a l'air de marcher moyennant quelques adaptations :

Dans tes lignes :
$blank = $last_line($taille) / 2 - $first_line($num) / 2;
$stars = $first_line($num) - 1;
fais attention, les noms des fonctions first_line et last_line ne doivent pas commencer par $

Le PHP n'est pas le C. Il ne lance pas l'exécution de la fonction main(). Il faut que tu programmes toi-même l'appel. Quant aux paramètres $args et $argv, ça dépend si tu appelles ton script en ligne de commande ou comme page HTTP. Si tu appelles en ligne de commande, regarde dans le manuel PHP, mais je ne pense pas que ça se passe comme ça. Et les chaînes de caractères en PHP ne se terminent pas par un zéro.
Si tu appelles ton script de manière classique, tu peux passer les paramètres par la méthode GET. Mais il faut aussi quelques aménagements comme le remplacement de \n par des <br />, celui des espaces par   et encadrer le tout de balises <pre> </pre>
0
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 3
28 févr. 2009 à 22:58
D'abord merci beaucoup de m'avoir répondu. C'est gentil de ta part. Il y a juste une chose que je ne comprends pas dans ta remarque.En fait, qu'est-ce que tu veux par programmer l'appel moi même? Je te rappelle que doit exécuter le script depuis la ligne de commande, alors je doit précéder le arg et argv du caractère '$' ou pas?
Comment je peux l'appeler par le méthode GET?
Quant au retour à la ligne, je te rassure que "\n" marche aussi. J'aurai pu utiliser la balise <br/>.
0
Tu ne me rappelles pas que tu dois exécuter le script depuis la ligne de commande, tu me l'apprends. Ou plutôt tu confirmes ce que je soupçonnais.

Quand je dis programmer toi-même l'appel, je veux dire qu'une fonction en PHP ne s'exécute pas si elle n'est pas appelée, pas même la fonction main. Il faut au moins une ligne en dehors de toute fonction pour faire quelque chose. Dans ton cas :
<?php
function last_line($taille)
....
function main($argc, $argv)
{
...
} // fin de main
main ($argc, $argv); /appel de la fonction main avec des paramètres tels que tu les attends
?>

Pour ce qui est de $argc et $argv, je ne savais pas qu'ils existaient aussi en PHP mais tu as raison. Mais attention, ce sont des variables globales, pas de paramètres passés automatiquement à une fonction dont le nom est obligatoirement main (même si dans ton exemple tu appelles ta fonction main et que tu donnes ce nom à tes paramètres).

Quant à l'utilisation de \n et <br /> non, tu n'as pas le choix. En ligne de commande c'est obligatoirement \n et en HTML c'est obligatoirement <br />

Tu sais que ton length et ta fonction trans sont inutiles en PHP ? Tu peux faire directement sapin($argv[1]). En C tu pouvais aussi simplifier beaucoup avec sscanf mais ça n'est pas le sujet.

Bonne soirée
0
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 3
2 mars 2009 à 15:47
voila, maintenat cela marche. Mais au lieu de faire un retour a la ligne, il m'affiche carrement ca"<br/>";
0
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 3
2 mars 2009 à 15:27
ok Mr Toto, je viens de modifier mon code en apportant des modifications que tu m'as proposées. Et cela ne marche toujours pas. C'est surprenant que tu me dises que ça marche chez toi.
0
peux-tu me montrer le code ? je te montrerai où tu 'as pas appliqué ce que j'ai dit.
0
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 3
2 mars 2009 à 15:51
le voici:
<?php
  
 function last_line($taille)
  {
      
     $lastline = 7;
     $jump = 6;
     
     for ($i = 1; $i < $taille; $i++)
     {
        if (($i % 2) != 0)
          $lastline += $jump;
        else if ($i != 1)
          {
            $jump += 2;
            $lastline += $jump;
          }
     }
     return($lastline);
 }
 

 function first_line($taille)
  {
    
     $firstline = 1;
     $jump = 4;
     
     for ($i = 1; $i < $taille; $i++)
     {
        if (($i % 2) != 0)
            $firstline += $jump;
        else if ($i != 1)
             {
                $jump += 2;
                $firstline += $jump;
             }
     }
    return ($firstline);
 }

  function draw($num,$taille)
 {
 
    $blank = last_line($taille) / 2 - first_line($num) / 2;
    $stars = first_line($num) - 1;
    $jump = 4;
    $hauteur_branche = $num + 3;
    
    for ($i = 0; $i < $hauteur_branche; $i++)
      {
          for ($j = 0; $j < $blank; $j++)
             echo(" ");
          for ($j = 0; $j < $stars; $j++)
                  echo("*");
                  $blank--;
                  $stars += 2;
                  echo("*");
                  echo("<br/>");
      }
 }

  function draw_tronc($taille)
 {
     
    if (($taille % 2) != 0)
       $largeur_tronc = $taille;
    else
       $largeur_tronc = $taille + 1;
       $hauteur_tronc = $taille;
       $blank = (last_line($taille) / 2) - ($largeur_tronc / 2);
       for ($i = 0; $i < $hauteur_tronc; $i++)
          {
            for ($j = 0; $j < $blank; $j++)
              echo(" ");
            for ($j = 0; $j < $largeur_tronc; $j++)
              echo("|");
              echo("<br/>");
          }
 }

 function sapin($taille)
  {
      
     if ($taille > 0)
       {
          $i = 1;
          while ($i <= $taille)
           {
              draw($i, $taille);
              $i++;
           }
          draw_tronc($taille);
       }    
  }

  function trans($arg,$length)
    {
       

     $res = 0;
     $p = 1;
     
     $res += ($arg[($length--)] - '0');
     while (($length >= 0) && ($arg[$length] != '-'))
       {
           $p *= 10;
           $res += (($arg[$length--] - '0') * $p);
       }
     return ($res);
 }

 function main($argc, $argv)
 {
     

     if ($argc == 2)
      {
         $length = 0;
         while($argv[1][$length] != 0)
         $length++;
         $length--;
         sapin(trans($argv[1], $length));
      }
      else
        echo("Veuillez entrer la taille du sapin\n");                
 }
 
 main($argc, $argv);
 
?>

En fait, si j'enleve la fonction trans cela ne va pas marche, raison pour laquelle je l'ai maintenue.
0
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 3
2 mars 2009 à 15:56
Et voici ce qu'il m'affiche:
./sapin.php 1
PHP Notice:  Uninitialized string offset:  1 in /nfs/s1/space/users/sept2/ca_n/rendu/web/www/jour_02/sapin.php on line 121
   *<br/>  ***<br/> *****<br/>*******<br/>   |<br/>(ca_n@ios 2528)

0
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 3
2 mars 2009 à 16:44
finalment ca marche!!Mais pour cela, j'ai du remplacer le retour a la ligne par "\n".
je sais que que je ne dois pas faire cela, mais lorsque je mets la balise <br/> ca ne marche meme pas.
Cependant il m'affiche un avertissement dont je n'arrive pas a me debarasser:

PHP Notice: Uninitialized string offset: 1 in /nfs/s1/space/users/sept2/ca_n/rendu/web/www/jour_02/sapin.php on line 121
0

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

Posez votre question
Pour le problkème /n ou <br>, je te l'avais pourtant bien dit...
Pour l' avertissement que tu as, je te l'avais dit aussi dès le message 1 : Et les chaînes de caractères en PHP ne se terminent pas par un zéro.
Il ne faut pas chercher un zéro pour trouver la longueur de la chaîne : il n'y en a pas ! Donc ton compteur augmente et tu dépasses la fin...
Utilise directement la fonction strlen() qui te donne la longueur de la chaîne
D'ailleurs comme je te l'ai déjà dit aussi dès le 1er message, tu n'as pas besoin de la longueur non plus, la traduction de chaîne en nombre est automatique en PHP : ta fonction trans ne sert à rien
0
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 3
3 mars 2009 à 12:25
enfin, ça marche. Je viens de me rendre compte pourquoi tu me disait qu'en php on n'a pas besoin du caractere 0 pour savoir si on est à la fin d'une chaine ou pas. Et quant au retour à la ligne, s'il s'agit d'un script qui sera executé depuis la ligne de commande, on peut mettre un "\n". Cela fait tout à fait le boulot; par contre si c'est dans une page web on n'a vraiment pas le choix, c'est toujours <br/>.
Je te remercie quand même pour ton aide. Excellente journée.
0
s'il s'agit d'un script qui sera executé depuis la ligne de commande, on peut mettre un "\n".
Non, ce n'est pas on peut, mais on doit. La console du mode commande n'interprète pas le HTML, ça n'a jamais été son rôle.
0
Sabetodo Messages postés 120 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 18 août 2010 3
3 mars 2009 à 16:21
bon, ok. Si tu le prefere comme ça, tant mieux.
Hasta la vista!!
0