Votre question

Combinaison de 3 chiffre [C]

Tags :
  • b&c
  • Programmation
Dernière réponse : dans Programmation
10 Décembre 2011 22:52:46

Hello world,

J'ai un problème pour programmer mon code.

Description du code :

Je voudrais qu'il m'affiche un chiffre à 3 caractéres : " 000 " à " 999 "
Mais que ce code ne m'affiche pas les doublons dans les chiffres.

Exemple :

Celui-ci m'afficherait 000 ... 001 ... 012 ... "100" 'pas affiché car doublons entre 001 et 100) ... "120" 'pas affiché car doublons entre 012 et 120)

J'ai commencé avec se code :

  1. #include <stdio.h>
  2.  
  3. void my_putchar (char c)
  4. {
  5. write (1, &c, 1);
  6. }
  7.  
  8. void my_putstr(char *str)
  9. {
  10. while (*str != 0)
  11. {
  12. my_putchar(*str);
  13. str++;
  14. }
  15. }
  16.  
  17. void my_putpause()
  18. {
  19. system("pause");
  20. }
  21.  
  22. int main()
  23. {
  24. int a,b,c;
  25. a = 47;
  26. b = 47;
  27. c = 47;
  28. while (a <= 56)
  29. {
  30. my_putchar(a);
  31. a = a + 1;
  32. my_putchar('\n');
  33. while (b <= 56)
  34. {
  35. b = b + 1;
  36. my_putchar(a);
  37. my_putchar(b);
  38. my_putchar(c);
  39. my_putchar('\n');
  40. while (c <= 56)
  41. {
  42. c = c + 1;
  43. my_putchar(a);
  44. my_putchar(b);
  45. my_putchar(c);
  46. my_putchar('\n');
  47. }
  48. }
  49. my_putpause();
  50. }
  51. }


Voilà,
Merci pour votre aide d'avance,
Nir3x [:nir3x]

Autres pages sur : combinaison chiffre

a b L Programmation
11 Décembre 2011 17:36:54

Déjà, 48=0x30, donc moi, je mettrais le premier my_putchar après l'incrémentation de a (comme tu le fais pour les suivants).

Ensuite, je pense qu'il suffit que tu mettes les 3 chiffres dans l'ordre croissant, et si l'ordre ne change pas, alors c'est le doublon à garder, sinon tu jettes.
Comme ça, tu ne récupères que les plus petits doublons. ;) 
11 Décembre 2011 20:26:29

Se serait plutôt un code comme ceci ?

  1. #include <stdio.h>
  2.  
  3. void my_putchar (char c)
  4. {
  5. write (1, &c, 1);
  6. }
  7.  
  8. void my_putstr(char *str)
  9. {
  10. while (*str != 0)
  11. {
  12. my_putchar(*str);
  13. str++;
  14. }
  15. }
  16.  
  17. void my_putpause()
  18. {
  19. system("pause");
  20. }
  21.  
  22. int main()
  23. {
  24. int a,b,c;
  25. a = 48;
  26. b = 48;
  27. c = 48;
  28. my_putchar(a);
  29. my_putchar(b);
  30. my_putchar(c);
  31. my_putchar('\n');
  32. while (c <= 56)
  33. {
  34. c = c + 1;
  35. my_putchar(a);
  36. my_putchar(b);
  37. my_putchar(c);
  38. my_putchar('\n');
  39. my_putpause();
  40. while (b <= 56)
  41. {
  42. b = b + 1;
  43. my_putchar(a);
  44. my_putchar(b);
  45. my_putchar(c);
  46. my_putchar('\n');
  47. my_putpause();
  48. while (a <= 56)
  49. {
  50. a = a + 1;
  51. my_putchar(a);
  52. my_putchar(b);
  53. my_putchar(c);
  54. my_putchar('\n');
  55. my_putpause();
  56. }
  57. }
  58. }
  59. }


Nir3x [:nir3x]
Contenus similaires
11 Décembre 2011 20:30:18

Mais celui-ci m'affiche,

Spoiler
000
001
011
111
211
311
411
511
611
711
811
911
921
931
941
951
961
971
981
991
992
993
994
995
996
997
998
999
a c 232 L Programmation
12 Décembre 2011 08:55:30

Tu as juste fait l'inverse là...
Il t'a dit qu'il fallait trier les 3 chiffres.
12 Décembre 2011 20:45:55

J'ai du mal expliquer, il faut que le programme m'affiche les nombres et des qu'il y a un doublon, il ne l'affiche pas.

Début de l'affichage :

000
001
002
003
004
005
006
007
008
009
011
012
013
014
015
016
017
018
019
022
023

Pourquoi les nombre 010, 020, 021 ne sont pas affiché : Parce qu'ils sont en doublons avec 001, 002, 012.

Nir3x [:nir3x]
a b L Programmation
12 Décembre 2011 21:04:20

Je crois que j'avais bien compris.
Par contre dans ton algo, tu dois virer tous les my_putchar, et ne garder que ceux de la dernière boucle. En ne gardant que ces derniers, tu affiches déjà tous les nombres (et garde tes boucles commençant à 47).

Une fois que tu n'as plus que 3 my_putchar dans ton programme, tu ajoutes un test juste avant en appelant une fonction (pour faire propre) qui va tester si tu dois afficher le nombre ou pas.
Je te disais qui te suffisait de tester si les nombres a,b et c sont dans le bon ordre. Bref, il faut juste vérifier que a <= b <= c. Si c'est le cas tu affiches tes 3 seuls my_putchar de ton programme, sinon tu ne l'affiche pas.

Sur ton exemple:
a,b,c = 0,1,0 : a <= b mais b > c, donc on affiche pas
a,b,c = 0,2,0 : a <= b mais b > c, donc on affiche pas
a,b,c = 0,2,1 : a <= b mais b > c, donc on affiche pas
a,b,c = 0,0,1 : a <= b <= c, donc on affiche
a,b,c = 0,0,2 : a <= b <= c, donc on affiche
a,b,c = 0,1,2 : a <= b <= c, donc on affiche

Ps: OmaR, pas mal ton avatar anonyme. Je devrais faire pareil avec mon logo. :D 
12 Décembre 2011 21:13:26

CRicky a dit :
Je crois que j'avais bien compris.
Par contre dans ton algo, tu dois virer tous les my_putchar, et ne garder que ceux de la dernière boucle. En ne gardant que ces derniers, tu affiches déjà tous les nombres (et garde tes boucles commençant à 47).

Une fois que tu n'as plus que 3 my_putchar dans ton programme, tu ajoutes un test juste avant en appelant une fonction (pour faire propre) qui va tester si tu dois afficher le nombre ou pas.
Je te disais qui te suffisait de tester si les nombres a,b et c sont dans le bon ordre. Bref, il faut juste vérifier que a <= b <= c. Si c'est le cas tu affiches tes 3 seuls my_putchar de ton programme, sinon tu ne l'affiche pas.

Sur ton exemple:
a,b,c = 0,1,0 : a <= b mais b > c, donc on affiche pas
a,b,c = 0,2,0 : a <= b mais b > c, donc on affiche pas
a,b,c = 0,2,1 : a <= b mais b > c, donc on affiche pas
a,b,c = 0,0,1 : a <= b <= c, donc on affiche
a,b,c = 0,0,2 : a <= b <= c, donc on affiche
a,b,c = 0,1,2 : a <= b <= c, donc on affiche


Et en code sa donne quoi tout cela ?
a c 232 L Programmation
12 Décembre 2011 21:21:46

Tu ne verras pas Cricky te donner du code... (ou alors très rarement pour montrer comment ça peut se faire en 3 lignes avec du python :dawa: ).
Il t'a déjà donné une bonne base, avec tout l'algo... à toi de transformer ça en code, ce n'est pas très compliqué.

Citation :
Ps: OmaR, pas mal ton avatar anonyme. Je devrais faire pareil avec mon logo.

:D 
Peut être un peu plus compliqué avec ton logo :p 
a b L Programmation
13 Décembre 2011 19:42:23

Oui, en plus j'ai détaillé ce qu'il fallait faire...

En python, c'est effectivement beaucoup plus simple. ;) 
C'est faisable en 1 ligne, mais j'en fais 2 pour la lisibilité.
l = [list(str(i)) for i in range(1000)]
[format(int(''.join(i)),'03d') for i in l if sorted(i)==i]

13 Décembre 2011 21:55:15

Ça sent le my_aff_comb de chez Epitech ça.
Premier jour de C, tu devrais pouvoir t'en sortir, c'est vraiment basique comme algo. :p 
a b L Programmation
14 Décembre 2011 20:43:47

Tiens en relisant mon code je me suis rendu compte qu'il y a plus simple:
[format(i,'03d') for i in range(1000) if sorted(list(str(i)))==list(str(i))]

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS