Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1427 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Besoin d'aide dans mon code

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Besoin d'aide dans mon code

n°2105454
caddicted
Posté le 09-10-2011 à 19:54:58  profilanswer
 

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
mood
Publicité
Posté le 09-10-2011 à 19:54:58  profilanswer
 

n°2105455
Mara's dad
Yes I can !
Posté le 09-10-2011 à 20:01:40  profilanswer
 

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é.
n°2105456
caddicted
Posté le 09-10-2011 à 20:06:56  profilanswer
 

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.

n°2105457
Mara's dad
Yes I can !
Posté le 09-10-2011 à 20:12:01  profilanswer
 

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é.
n°2105459
caddicted
Posté le 09-10-2011 à 20:13:28  profilanswer
 

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.

n°2105461
Mara's dad
Yes I can !
Posté le 09-10-2011 à 20:24:45  profilanswer
 

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é.
n°2105462
caddicted
Posté le 09-10-2011 à 20:45:28  profilanswer
 

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...

n°2105466
Mara's dad
Yes I can !
Posté le 09-10-2011 à 20:57:54  profilanswer
 

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é.
n°2105467
caddicted
Posté le 09-10-2011 à 21:01:35  profilanswer
 

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.

n°2105468
Mara's dad
Yes I can !
Posté le 09-10-2011 à 21:05:11  profilanswer
 

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é.
mood
Publicité
Posté le 09-10-2011 à 21:05:11  profilanswer
 

n°2105472
caddicted
Posté le 09-10-2011 à 21:15:52  profilanswer
 

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é.
 
 

n°2105473
Mara's dad
Yes I can !
Posté le 09-10-2011 à 21:18:39  profilanswer
 

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é.
n°2105474
caddicted
Posté le 09-10-2011 à 21:19:33  profilanswer
 

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');

n°2105475
Mara's dad
Yes I can !
Posté le 09-10-2011 à 21:20:40  profilanswer
 

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é.
n°2105476
gilou
Modérateur
Modzilla
Posté le 09-10-2011 à 21:22:46  profilanswer
 

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é!  --
n°2105478
caddicted
Posté le 09-10-2011 à 21:32:48  profilanswer
 

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. # }

n°2105479
Mara's dad
Yes I can !
Posté le 09-10-2011 à 21:35:05  profilanswer
 

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é.
n°2105480
Mara's dad
Yes I can !
Posté le 09-10-2011 à 21:38:41  profilanswer
 

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é.
n°2105481
breizhbugs
Posté le 09-10-2011 à 22:07:01  profilanswer
 

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...

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Besoin d'aide dans mon code

 

Sujets relatifs
Besoin d'aide sur code[PHP] Besoin d'aide pour du code PHP
Besoin d'aide pour un code PHPconnexion ado avec acces et besoin d'aide pour code vb svp
Besoin d'aide sur un code "copier - coller"[ Besoin D'AIDE ! ] Quelques lignes de code Svp. ( noob )
Besoin d'aide pour écrire un code VBAbesoin d'aide pour le code d'1 graphique
Besoin d'aide sur un code.Besoin d'aide pour mon bout de code PHP
Plus de sujets relatifs à : Besoin d'aide dans mon code


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR