affichage d'un tableau à 2 dimensions

affichage d'un tableau à 2 dimensions - C - Programmation

Marsh Posté le 21-11-2005 à 22:06:58    

Salut,
Je cherche à réaliser l'affichage d'un sapin du type:
      *
    ***
   ****
     ||
Pour cela, je récupères la hauteur de son cone, et la hauteur du tronc et sa largeur.
Je place tout ca dans un tableau à 2 dimensions. Notez que pendant l'implémentation du tableau, j'affiche le caractère en cours et ca marche tres bien.
Mais quand je veux afficher mon tableau, rien ne va.
Ca doit être un truc stupide, mais pour l'instant je ne vois pas. Est-ce que quelqu'un peut m'aider?  
 

Code :
  1. #include <stdio.h>
  2. int sapin(int hauteur_cone, int largeur_tronc, int hauteur_tronc)
  3.     {
  4.            int vide,espace,compteur1,compteur2,longueur_cone;
  5.            char Tab[hauteur_cone + hauteur_tronc][largeur_tronc];
  6.          
  7.          
  8.            longueur_cone = 1; /*Largeur du cone*/         
  9.            vide = hauteur_cone - 1; /*les emplacements vides du cone dans le tableau*/
  10.            espace = vide - (largeur_tronc / 2);  /*les emplacements vides du tronc dans le tableau*/       
  11.          
  12.            /*On dessine le cone*/
  13.            for (compteur1 = 1; compteur1 <= hauteur_cone; compteur1++)
  14.                {
  15.                           for (compteur2 = 1; compteur2 <= vide; compteur2++)   
  16.                               {
  17.                                          Tab[compteur1][compteur2] = 32;         /* 32 = code ascii de l'espace */
  18.                                          printf("%c",Tab[compteur1][compteur2]);
  19.                               }
  20.                           for (compteur2 = 1; compteur2 <= longueur_cone; compteur2++)   
  21.                               {
  22.                                          Tab[compteur1][compteur2] = 42;         /* 42 = code ascii de '*' */
  23.                                          printf("%c",Tab[compteur1][compteur2]);
  24.                               }
  25.                           printf("\n" );
  26.                           longueur_cone = longueur_cone + 2;
  27.                           vide = vide - 1;
  28.                }
  29.            /*On dessine le tronc*/
  30.            for (compteur1 = hauteur_cone; compteur1 < (hauteur_cone + hauteur_tronc); compteur1++)
  31.                {
  32.                           for (compteur2 = 1; compteur2 <= espace; compteur2++)   
  33.                               {
  34.                                          Tab[compteur1][compteur2] = 32;         /* 32 = code ascii de l'espace */
  35.                                          printf("%c",Tab[compteur1][compteur2]);                       
  36.                               }
  37.                           for (compteur2 = 1; compteur2 <= largeur_tronc; compteur2++)   
  38.                               {
  39.                                          Tab[compteur1][compteur2] = 124;         /* 32 = code ascii du pipe '|' */
  40.                                          printf("%c",Tab[compteur1][compteur2]);
  41.                               }
  42.                           printf("\n" );
  43.                           longueur_cone = longueur_cone + 2;
  44.                        
  45.                }
  46.            /*affichage du tableau*/
  47.            for (compteur1 = 1; compteur1 < (hauteur_cone + hauteur_tronc); compteur1++)
  48.                {
  49.                           for (compteur2 = 1; compteur2 < (largeur_tronc + espace); compteur2++)
  50.                              {
  51.                                        printf("%c",Tab[compteur1][compteur2]);
  52.                              }
  53.                          printf("\n" );
  54.                }
  55.     }
  56. /*Début du programme*/
  57. int main (void)
  58.     {
  59.           /*Définitions des variables*/
  60.           int hauteur_cone,largeur_tronc,hauteur_tronc;
  61.           printf("Rentrer la hauteur du cone:\n" );
  62.           scanf("%d",&hauteur_cone);
  63.           printf("la largeur du tronc:\n" );
  64.           scanf("%d",&largeur_tronc);
  65.           printf("la hauteur du tronc:\n" );
  66.           scanf("%d",&hauteur_tronc);
  67.           printf("et le nombre de boules:\n" );
  68.           scanf("%d",&nbr_boules);
  69.           sapin(hauteur_cone,largeur_tronc,hauteur_tronc);
  70.     }

Reply

Marsh Posté le 21-11-2005 à 22:06:58   

Reply

Marsh Posté le 22-11-2005 à 01:34:29    

Encore la même question !  :)  Voir http://forum.hardware.fr/hardwaref [...] 8270-1.htm
Le tableau semble trop petit. La deuxième dimension devrait être au moins largeur_tronc + espace au lieu de largeur_tronc.

Reply

Marsh Posté le 22-11-2005 à 02:04:29    

Au passage, pourquoi utiliser un tableau pour faire ca ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 22-11-2005 à 10:24:50    

bossgama a écrit :

Salut,
Je cherche à réaliser l'affichage d'un sapin du type:
      *
    ***
   ****
     ||
Pour cela, je récupères la hauteur de son cone, et la hauteur du tronc et sa largeur.
Je place tout ca dans un tableau à 2 dimensions. Notez que pendant l'implémentation du tableau, j'affiche le caractère en cours et ca marche tres bien.


Normal, ce n'est pas toi, mais la machine qui gère le déplacement du curseur...
 

  • Tu écris par-dessus les espaces... La deuxième boucle (avec les caractères * et | doit démarrer à 1 + xxx et non à 1 tout court...)
  • Au fait, démarrer à 1 fait perdre un emplacement.
  • Les VLA (Variable Length Array) C99 sont bien tentants, mais officiellement 'en panne' sur gcc...
  • Ne pas utiliser des valeurs magiques pour les caractères constants, mais les expressions litéralles ('*', ' ', '|')


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 22-11-2005 à 13:31:44    

Je n'avais pas vu l'autre post, mais de toute facon il n'utilise pas les tableau. ;)
 
0x90, je pourrais le faire sans tableau, en réalisant juste un printf du caractère dans chaque boucle (ca marche, c'est ce que je faisais au début), mais en fait je dois également rentrer un nombre de boules et les mettre de manière aléatoire sur le cone. Je ne l'ai juste pas indiqué car je ne devrais pas avoir de problème à l'implémenter une fois que mon tableau sera initialisé correctement.
 
Emmanuel Delahaye, je ne comprends pas bien  tes deux premiers points. Pourquoi je réécris sur les espaces, vu que quand j'initialise dans les boucles juste avant, l'affichage est correct. Le deuxième point, tu veux dire que le tableau commence à 0 c'est bien ca?
Quand au dernier point, j'aimerais bien le faire mais le compilateur n'affiche pas ces caractères mais leurs codes ascii. C'est pour ca que j'ai utilisé cette 'astuce'. Ca doit venir du compilateur de dev cpp que je suis censé utiliser.
 

Reply

Marsh Posté le 22-11-2005 à 14:13:40    

bossgama a écrit :

Emmanuel Delahaye, je ne comprends pas bien  tes deux premiers points. Pourquoi je réécris sur les espaces, vu que quand j'initialise dans les boucles juste avant, l'affichage est correct.


Citation :


                           for (compteur2 = 1; compteur2 <= vide; compteur2++)      
                               {
                                          Tab[compteur1][compteur2] = 32;         /* 32 = code ascii de l'espace */
                                          printf("%c",Tab[compteur1][compteur2]);
                               }
                           for (compteur2 = 1; compteur2 <= longueur_cone; compteur2++)      
                               {
                                          Tab[compteur1][compteur2] = 42;         /* 42 = code ascii de '*' */
                                          printf("%c",Tab[compteur1][compteur2]);
                               }  



Tu redemarres avec compteur2 = 1. Tu ecrases donc ce que tu viens d'ecrire.
Il faut faire


                           for (compteur2 = 1 + vide; compteur2 <= longueur_cone + vide; compteur2++)      
                               {
                                          Tab[compteur1][compteur2] = 42;         /* 42 = code ascii de '*' */
                                          printf("%c",Tab[compteur1][compteur2]);
                               }  


Le fait que l'affichage soit correct montre que la séquence est bonne, mais ça ne prouve pas que tu écrives au bon endroit dans le tableau. Ce n'est pas toi qui positionne le curseur à l'écran (ce qu'on ne sait pas faire en standard), c'est le système. Cette méthode de vérification du comportement est donc erroné. Par contre, le code suivant qui affiche réellement le contenu du tableau met bien en évidence le problème d'ecrasement...

Citation :

Le deuxième point, tu veux dire que le tableau commence à 0 c'est bien ca?


Oui. En ça sent le débordement de tavbleau.  
 
Rappel : pour un tableau de taille N, les indices valides vont de 0 à N-1. (certainement pas de 1 à N)
 

Citation :

Quand au dernier point, j'aimerais bien le faire mais le compilateur n'affiche pas ces caractères mais leurs codes ascii. C'est pour ca que j'ai utilisé cette 'astuce'. Ca doit venir du compilateur de dev cpp que je suis censé utiliser.


Quoi ? Si tu fais

printf("| *\n" );

, il ne sort pas les bons caractères ? C'est ça que tu essaye de me faire croire ? "I don't buy it" (Je ne connais pas l'équivallent en français)


Message édité par Emmanuel Delahaye le 22-11-2005 à 14:17:10

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 22-11-2005 à 18:59:54    

Citation :

Rappel : pour un tableau de taille N, les indices valides vont de 0 à N-1. (certainement pas de 1 à N)


C'est le problème quand on programme sur plusieurs langages en même temps (VB, Pascal, et C), on mélange. :bounce:  :bounce:  
 
Sinon je pense savoir pourquoi il affichait mal *, espace et |. Problème stupide, à force de retoucher mon code je pense que j'ai du oublier de modifier le %d en %c, vu que je viens de refaire un test de base et ca marche :ange: .  
Mea Culpa, Emmanuel Delahaye, c'était mon erreur.
 
Je vais tester la solution que tu me proposes. Je reposte dés que c'est fait.

Reply

Marsh Posté le 23-11-2005 à 09:54:12    

Tu peut parfaitement gérer les boules sans tableau hein ;) ca te ferait je pense un code plus léger.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 23-11-2005 à 14:10:03    

sans tableau, ca veut dire un srand dans la boucle, avec lequel on teste si on doit mettre une boule ou une étoile. C'est comme ca que je voulais le faire au début. Mais ca veut dire aussi qu'on peut théoriquement avoir moins de boules que demandé, voire même pas de boule du tout( mais bon c'est vrai que pour ce dernier cas la probabilité est faible).
C'est pour ca qu'utiliser un tableau garantit qu'on a bien le nombre de boules voulu.

Message cité 1 fois
Message édité par bossgama le 23-11-2005 à 21:08:27
Reply

Marsh Posté le 23-11-2005 à 21:12:39    

Bon, tout marche maintenant. :d
Une dernière petite chose, j'utilise dev cpp, et il ne reconnais pas clrscr(), même si j'inclue conio.h.
Est-ce qu'il y a une autre méthode pour effacer un écran?
 
Grands remerciements à 0x90, olivthill et  Emmanuel Delahaye qui ont pris la peine de me répondre :d.
Merci, Merci, Merci !!!

Message cité 1 fois
Message édité par bossgama le 23-11-2005 à 21:44:32
Reply

Marsh Posté le 23-11-2005 à 21:12:39   

Reply

Marsh Posté le 23-11-2005 à 21:22:53    

bossgama a écrit :

Une dernière petite chose, j'utilise dev cpp, et il ne reconnais pas clrscr(), même si j'inclue conio.h.


Je crois que c'est <conio2.h> maintenant...

Citation :

Est-ce qu'il y a une autre méthode pour effacer un écran?


Ca ne sert à rien. On te demande de maitriser les algos et le langage, pas de faire de la présentation...
 
Si tu y tiens :  

  system ("cls" );


mais bien que standard, ce n'est pas portable.


Message édité par Emmanuel Delahaye le 23-11-2005 à 21:31:00

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-11-2005 à 21:23:09    

Pour effacer l'écran, il y a plusieurs méthodes dont cls. Voir http://www.codeguru.com/forum/showthread.php?t=363202 :)

Reply

Marsh Posté le 23-11-2005 à 21:26:14    

bossgama a écrit :

sans tableau, ca veut dire un srand dans la boucle, avec lequel on teste si on doit mettre une boule ou une étoile. C'est comme ca que je voulais le faire au début. Mais ca veut dire aussi qu'on peut théoriquement avoir moins de boules que demandé, voire même pas de boule du tout( mais bon c'est vrai que pour ce dernier cas la probabilité est faible).
C'est pour ca qu'utiliser un tableau garantit qu'on a bien le nombre de boules voulu.


 
Avec un peu d'imagination, on peut s'affranchir aussi de ce problème ;) (et avoir un nombre précisément de boules dans l'abre )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 23-11-2005 à 21:43:55    

Citation :

Je crois que c'est <conio2.h> maintenant...


 
Non ca ne marche pas, il ne reconnait pas conio2.h... :(  
 

Citation :


Ca ne sert à rien. ONnte demande de maitriser les algos et le langage, pas de faire de la présentation...


Mais moi je suis du genre pinailleur :p  :bounce:  :bounce:  :bounce:  
 
 :)  
 
plus sérieusement, c'est vrai, mais comme c'est un devoir ramassé et noté, autant optimisé au maximum :ange:  
 
J'avais trouvé system ("cls" ); sur le net, mais mon prof utilise linux, et j'avais lu que ce n'etait pas compatible, donc je l'avais laissé tombé.
 

Citation :


Pour effacer l'écran, il y a plusieurs méthodes dont cls. Voir http://www.codeguru.com/forum/showthread.php?t=363202 :)


Si j'utilise le cls comme indiqué dans le lien, cls( GetStdHandle( STD_OUTPUT_HANDLE));
il me fait une erreur iostream.  :(  :(  :(  
 
 

Citation :

Avec un peu d'imagination, on peut s'affranchir aussi de ce problème ;) (et avoir un nombre précisément de boules dans l'abre )


 
Bah, instinctivement moi j'ai pensé au tableau pour résoudre le problème (et maintenant ca marche  :bounce:  :bounce:  :bounce: ), mais si tu as une solution en tete, ca m'interesse aussi :) .

Reply

Marsh Posté le 23-11-2005 à 22:16:19    

bossgama a écrit :


J'avais trouvé system ("cls" ); sur le net, mais mon prof utilise linux, et j'avais lu que ce n'etait pas compatible, donc je l'avais laissé tombé.


Sous linux faut faire system("clear" )
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-11-2005 à 23:03:51    

bossgama a écrit :


 

Citation :

Avec un peu d'imagination, on peut s'affranchir aussi de ce problème ;) (et avoir un nombre précisément de boules dans l'abre )


 
Bah, instinctivement moi j'ai pensé au tableau pour résoudre le problème (et maintenant ca marche  :bounce:  :bounce:  :bounce: ), mais si tu as une solution en tete, ca m'interesse aussi :) .


 
Bon mon idée se sert bien évidement d'un peu de pseudorandom, mais bcp moins souvent, et en contrepartie d'un tableau d'entiers de la taille du nombre de boule ( rien de dramatique ).
1) tu calcule le nombre d'etoiles de ton Sapin en fonction de sa hauteur, on va dire l'appelle E. ( je te laisse ce plaisir, simple )
2) tu fais un tableau de taille N ( le nombre de boules )
3) tu remplis ce tableau de N nombres aléatoires entre 1 et E.
4) tu trie ton tableau ( pas essentiel mais ca simplifie la suite ) en ordre ascendant.
5) tu prends un pointeur P qui pointe vers la première case du tableau.
6) tu affiche ton sapin étoile par étoile en maintenant un compteur du nombre d'etoiles affichées, si le nombre est égal à la case pointée par P, tu affiche une boule au lieu d'une étoile et tu fais avancer P d'une case.
7) vala c'est tout :)
Te reste un peu de précaution à prendre pour pas dépasser du tableau, mais je te laisse le plaisir de trouver comment ;)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 23-11-2005 à 23:18:33    

je vois à peu près comment tu veux le faire, mais je trouve ca beaucoup plus compliqué ;) et moins évident.
L'utilisation des pointeurs, je connais, mais je trouve ca plus 'poussé' qu'un tableau simple avec 2 dimensions.
Et puis moins je les utilise mieux je me porte, hehehe.
Mais bon je pense que c'est une question de feeling après. :)

Reply

Sujets relatifs:

Leave a Replay

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