Besoin d'aide dans mon code

Besoin d'aide dans mon code - C - Programmation

Marsh Posté le 09-10-2011 à 19:54:58    

Bonsoir à tous,
 
Je suis actuellement en école d'informatique et je débute en langage C.
Mon exercice est d'afficher un sapin en fonction de l'entier entré par l'utilisateur, comme ceci :
 
(pblm d'affichage sur le site)

Code :
  1. *
  2.      ***
  3.     *****
  4.    *******
  5.     *****
  6.    *******
  7.   *********
  8. ***********
  9. *************
  10.      |||
  11.      |||


 
Mon problème c'est que j'ai appris que je n'avais pas le droit à la boucle for et à isdigit et isspace.
Etant pressé niveau timing je vous demande de l'aide pour m'aider à remplacer ces boucle for par while et isdigit et isspace.
Merci d'avance.
 

Code :
  1. void    my_putchar(char c)
  2. {
  3.   write(1, &c, 1);
  4. }
  5. void    aff_etoile(int d, int a, int max, int stars)
  6. {
  7.   for (d = 1 ; d <= max/2 - stars/2 ; d++, my_putchar(' '));
  8.   for (a = 1 ; a <= stars ; a += 1, my_putchar('*'));
  9.   my_putchar('\n');
  10. }
  11. void    aff_tronc(int d, int a, int max)
  12. {
  13.   for (d = 1 ; d <= max/2 - a/2 ; d++ , putchar(' '));
  14.   for (d = 1 ; d <= a ; d++ , putchar('|'));
  15.   putchar('\n');
  16. }
  17. void    sapin(int taille)
  18. {
  19.   int i, lines, c, stars, a, max, d, decal, mode;
  20.   for (mode = 1 ; mode <=2 ; mode++)
  21.     {
  22.       decal = 1;
  23.       lines = 4;
  24.       stars = 1;
  25.       for (i = 1 ; i <= taille ; i++)
  26. {
  27.           for (c = 1 ; c <= lines ; c++)
  28.             {
  29.               if (mode == 2)
  30.                 aff_etoile(d, a, max, stars);
  31.               stars = stars + 2;
  32.             }
  33.           lines ++;
  34.           if (i >= 3 && i % 2 == 1) decal++;
  35.           stars = stars - (2 * decal) - 2;
  36.         }
  37.       max = stars + 2*decal;
  38.     }
  39.   a = taille;
  40.   if (taille % 2 == 0)    a = taille + 1;
  41.   for (c = 1 ; c <= taille ; c++)
  42.     aff_tronc(d, a, max);
  43. }
  44. int entier(char *chaine)
  45. {
  46.   int   signe = 1;
  47.   int   x = 0;
  48.   while (isspace(*chaine))
  49.     chaine++;
  50.   if (*chaine == '-')
  51.     {
  52.       signe = -1;
  53.       chaine++;
  54.     }
  55.   else if (*chaine == '+')
  56.     chaine++;
  57.   }
  58.   else if (*chaine == '+')
  59.     chaine++;
  60.   while (isdigit(*chaine))
  61.     x = x*10 + *chaine++ - '0';
  62.   return (signe * x);
  63. }
  64. int main(int argc, char **argv)
  65. {
  66.   sapin(entier(argv[1]));
  67. }


Message édité par caddicted le 09-10-2011 à 19:58:23
Reply

Marsh Posté le 09-10-2011 à 19:54:58   

Reply

Marsh Posté le 09-10-2011 à 20:01:40    

Je doute que quequ'un accèpte de faire ton devoirà ta place sur ce forum.
Cf § [0D] de http://forum.hardware.fr/hfr/Progr [...] 4544_1.htm
 
Aussi je ne donnerai qu'une piste : As-tu le droit à le récusivité ?
 
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-10-2011 à 20:06:56    

Salut, merci pour ta réponse.
Je ne demande pas à ce qu'on me fasse le code, juste un exemple pour comment remplacer un for par un while dans un premier temps.
et me dire comment changer les isdigit et isspace.
 
J'ai le droit à la récursivité biensur.

Reply

Marsh Posté le 09-10-2011 à 20:12:01    

Dans ce cas, pas besoin de boucle.
Je ne vois pas non plus l'utilité de isspace ou isdigit pour ce problème.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-10-2011 à 20:13:28    

Tu peux m'en dire plus ?  
Parce que les boucles je maitrise pas mal mais la récursivité pas trop, je débute
 
si tu peux me donner un exemple j'essayerai de l'appliquer dans mon code et tester;
 
Merci.

Reply

Marsh Posté le 09-10-2011 à 20:24:45    

Exemple typique de la récursivité : la fonction factoriel :
 
fac( 5 ) = 5 * 4 * 3 * 2 * 1 = 120
 
Tu peux écrire la fonction fac avec une boucle de 1 à n.
 
Ou bien tu dis que  
fac( 1 ) = 1 et fac( n ) = n * fac( n -1 )
 
Dans ce cas :
 
int fac( int n )
{
  if( n == 1 )
  {
    return 1;
  }
  else
  {
    return n * fac( n - 1 );
}
 
 
Pour le reste, je ne comprends pas bien ton code.
Je croyais que ton programme prenait un seul paramètre numérique !
 
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-10-2011 à 20:45:28    

J'ai mofidié tout mes for en boucle while comme ceci ;
 
void    aff_etoile(int d, int a, int max, int stars)
{
  d = 1;
  while (d <= max/2 - stars/2)
    d++, my_putchar(' ');
  a = 1;
  while (a <= stars)
    a++, my_putchar('*');
  my_putchar('\n');
}
 
mais maintenant je n'affiche que le tronc...

Reply

Marsh Posté le 09-10-2011 à 20:57:54    

Question :
A quoi te servent a et d dans les paramètres de la fonction puisque tu n'utilises pas les valeurs qui te sont passées ?
 
Remarque 1 :
Mets des parenthèses dans tes expressions c'est plus clair
while( d <= max/2 - stars/2 )
devient  
while(  d <= ( max/2 - stars/2 ) )
 
Remarque 2 :
Ensuite les accolades :
  while (d <= max/2 - stars/2)
    d++, my_putchar(' ');  
devient :
  while( d <= ( max/2 - stars/2 ) )
  {
    d++;
    my_putchar(' ');
  }
Ou alors:
  while( d++ <= ( max/2 - stars/2 ) )
    my_putchar(' ');
 
Mais les accolades c'est quand même plus clair !
  while( d++ <= ( max/2 - stars/2 ) )
  {
    my_putchar(' ');
  }
Dès fois que t'ais envie d'ajouter un truc dans la boucle plus tard ;)
 
Parce-que je me demande si tes boucles ne font pas que d++ et a++...
 
A+


Message édité par Mara's dad le 09-10-2011 à 21:00:00

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-10-2011 à 21:01:35    

a et d me permettent de naviguer dans les lignes et les colonnes.
a vrai dire j'ai recommencer mon code à zéro en faisant mon algo sur papier, je vais voir ou je recontre un problème.
A tout de suite.

Reply

Marsh Posté le 09-10-2011 à 21:05:11    

Je comprends l'utilité de a et d.
Je ne comprends pas ce qu'elles font dans les paramètres :
 
Version for() :
 
void aff_etoile( int max, int stars )
{
  for ( int d = 1 ; d <= ( max/2 - stars/2 ); d++ )
  {
    my_putchar(' ');
  }
 
  for( int a = 1 ; a <= stars ; a++ )
  {
    my_putchar('*');
  }
 
  my_putchar('\n');
}


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-10-2011 à 21:05:11   

Reply

Marsh Posté le 09-10-2011 à 21:15:52    

Elle me permette d'afficher dans la fonction aff_etoile par exemple à gérer la "pyramide" d'étoiles du sapin.
 
Je galère vraiment à modifier mon code avec des while.
Et je ne vois pas comment je pourrai le simplifier, car je suis sure que j'ai chercher trop compliqué.
 
 

Reply

Marsh Posté le 09-10-2011 à 21:18:39    

OK, ce sont donc des variables locales à la fonction, pas des paramètres.
 
M'enfin tu as l'air d'avoir des problèmes plus graves.
 
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-10-2011 à 21:19:33    

De plus je voulais etre sur
 
ma fonction avec for :
 
# for (d = 1 ; d <= max/2 - stars/2 ; d++, my_putchar(' '));
#   for (a = 1 ; a <= stars ; a += 1, my_putchar('*'));
#   my_putchar('\n');
 
est-elle correcte avec les while ici ? :
 
 d = 1;
  while (d <= max/2 - stars/2)
    d++, my_putchar(' ');
  a = 1;
  while (a <= stars)
    a++, my_putchar('*');
  my_putchar('\n');

Reply

Marsh Posté le 09-10-2011 à 21:20:40    

Je ne pense pas, et je pense aussi avoir déjà répondu : parenthèses et accolades...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-10-2011 à 21:22:46    

A priori, ce que tu veux savoir, c'est ceci:

Code :
  1. for (mode = 1 ; mode <=2 ; mode++) {
  2.   ...
  3. }


 
ça se transforme en:

Code :
  1. mode = 1;
  2. while (mode <= 2) {
  3.    ...
  4.   mode++;
  5. }


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-10-2011 à 21:32:48    

Ok, merci.
 
Maintenant j'ai trouvé la fonction suivante sur internet qui utilise isdigit et isspace.
Je me suis renseigén sur ces fonctions mais je ne sais pas comment procéder pour ne pas les employer.
 

Code :
  1. # int entier(char *chaine)
  2. # {
  3. #   int   signe = 1;
  4. #   int   x = 0;
  5. #   while (isspace(*chaine))
  6. #     chaine++;
  7. #   if (*chaine == '-')
  8. #     {
  9. #       signe = -1;
  10. #       chaine++;
  11. #     }
  12. #   else if (*chaine == '+')
  13. #     chaine++;
  14. #   }
  15. #   else if (*chaine == '+')
  16. #     chaine++;
  17. #   while (isdigit(*chaine))
  18. #     x = x*10 + *chaine++ - '0';
  19. #   return (signe * x);
  20. # }

Reply

Marsh Posté le 09-10-2011 à 21:35:05    

Au hasard je dirais sscanf : http://www.cplusplus.com/reference [...] io/sscanf/


Message édité par Mara's dad le 09-10-2011 à 21:40:35

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-10-2011 à 21:38:41    

Soit un truc du genre :

Code :
  1. int main( int argc, char **argv )
  2. {
  3.   int n = 0;
  4.   if( argc < 2 )
  5.   {
  6.     printf( "Il manque un argument !\n" );
  7.     return 1;
  8.   }
  9.   sscanf( argv[1], "%d", &n );
  10.   sapin( n );
  11. }


Message édité par Mara's dad le 09-10-2011 à 21:42:00

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-10-2011 à 22:07:01    

S'il n'as pas le droit aux fonctions de base du C je doute qu'il ait droit a sscanf
 
Perso je tenterais plus le coup avec un switch (code non testé):
 

Code :
  1. int entier(char *chaine)
  2. {
  3.   int nombre = 0;
  4.   while (chaine[i] != '\0')
  5.   {
  6.     switch (chaine[i])
  7.     {
  8.         case '0':
  9.         case '1':
  10.         case '2':
  11.         case '3':
  12.         case '4':
  13.         case '5':
  14.         case '6':
  15.         case '7':
  16.         case '8':
  17.         case '9':
  18.             nombre = nombre*10+ (chaine[i] -'0');
  19.             break;
  20.  
  21.         default:
  22.             break;
  23.     }
  24.     i++;
  25.   }
  26.   return nombre;
  27. }


bon il y a peut être des modifs a faire mais l'idée est là.


Message édité par breizhbugs le 09-10-2011 à 22:10:20

---------------
Seul Google le sait...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed