Partage
  • Partager sur Facebook
  • Partager sur Twitter

zLCD

zSolutions

    28 juin 2010 à 14:36:54

    On peut encore répondre ? (vu que c'est un vieux sujet...)
    • Partager sur Facebook
    • Partager sur Twitter
      29 juin 2010 à 13:13:24

      D'accord :)

      Dans ce cas, voici ma (longue) solution :

      _          a 
      |_|        fgb
      |_|        edc
      
       _ 
      | |
      |_|        0        abcdef
         
        |
        |        1        bc
       _ 
       _|
      |_         2        abdeg
       _ 
       _|
       _|        3        abcdg
         
      |_|
        |        4        bcfg
       _ 
      |_ 
       _|        5        acdfg
       _ 
      |_ 
      |_|        6        acdefg
       _ 
        |
        |        7        abc
       _ 
      |_|
      |_|        8        abcdefg
       _ 
      |_|
       _|        9        abcdfg


      #include <stdlib.h>
      #include <stdint.h>		// pour uint8_t et uint32_t
      #include <string.h>		// pour memset
      #include <math.h>		// pour pow
      #include <stdio.h>
      


      // teste si le flag 'flag' est à 1 dans la combinaison de flags 'combi'
      #define FLAG(combi, flag)	 ( ((combi) & (flag)) == (flag) )
      
      
      #define SEG_a 1
      #define SEG_b 2
      #define SEG_c 4
      #define SEG_d 8
      #define SEG_e 16
      #define SEG_f 32
      #define SEG_g 64
      
      // affiche un segment vertical (|) ou horizontal (_)
      // si son flag est à 1 dans combi,
      // sinon affiche un espace ( )
      #define PRINTHSEG(combi, segFlag)	do{ \
      		if(FLAG(combi, segFlag))	\
      			printf("_");		\
      		else		\
      			printf(" ");	\
      		} while(0)
      #define PRINTVSEG(combi, segFlag)	do{ \
      		if(FLAG(combi, segFlag))	\
      			printf("|");		\
      		else		\
      			printf(" ");	\
      		} while(0)
      


      void zLCD(uint32_t x) {
      	int8_t* o;   // tableau de combis de flags (int8_t) indiquant pour chaque chiffre
      	             // (un int8_t correspondant à un chiffre) si tel
      	             // segment est allumé ou pas (cf les defines)
      	uint32_t i;
      	uint32_t size;   // nombre de chiffres (en écriture décimale) composant le nombre x
      	uint32_t chiffre;
      	
      	for(size=1 ; (int)(x/pow(10,size))>0 ; size++);   // calcul de size
      	
      	o= calloc(size, sizeof(uint8_t));
      	
      	for(i=0 ; i<size ; i++) {
      		chiffre= x / pow(10,size-i-1);   // tronque les chiffres à droite de celui qui nous intéresse
      		chiffre= chiffre - (chiffre/10)*10;   // tronque les chiffres à gauche de celui qui nous intéresse
      		switch(chiffre) {
      			case 0:
      				o[i]= SEG_a | SEG_b | SEG_c | SEG_d | SEG_e | SEG_f;
      				break;
      			case 1:
      				o[i]= SEG_b | SEG_c;
      				break;
      			case 2:
      				o[i]= SEG_a | SEG_b | SEG_d | SEG_e | SEG_g;
      				break;
      			case 3:
      				o[i]= SEG_a | SEG_b | SEG_c | SEG_d | SEG_g;
      				break;
      			case 4:
      				o[i]= SEG_b | SEG_c | SEG_f | SEG_g;
      				break;
      			case 5:
      				o[i]= SEG_a | SEG_c | SEG_d | SEG_f | SEG_g;
      				break;
      			case 6:
      				o[i]= SEG_a | SEG_c | SEG_d | SEG_e | SEG_f | SEG_g;
      				break;
      			case 7:
      				o[i]= SEG_a | SEG_b | SEG_c;
      				break;
      			case 8:
      				o[i]= SEG_a | SEG_b | SEG_c | SEG_d | SEG_e | SEG_f | SEG_g;
      				break;
      			case 9:
      				o[i]= SEG_a | SEG_b | SEG_c | SEG_d | SEG_f | SEG_g;
      				break;
      			default: break;
      		}
      	}
      	
      	printf("\n");
      	for(i=0 ; i<size ; i++) {
      		printf(" ");
      		PRINTHSEG(o[i], SEG_a);
      		printf("  ");
      	}
      	printf("\n");
      	for(i=0 ; i<size ; i++) {
      		PRINTVSEG(o[i], SEG_f);
      		PRINTHSEG(o[i], SEG_g);
      		PRINTVSEG(o[i], SEG_b);
      		printf(" ");
      	}
      	printf("\n");
      	for(i=0 ; i<size ; i++) {
      		PRINTVSEG(o[i], SEG_e);
      		PRINTHSEG(o[i], SEG_d);
      		PRINTVSEG(o[i], SEG_c);
      		printf(" ");
      	}
      	printf("\n");
      	
      	free(o);
      }
      


      Je ne suis pas très fier de mes 4 boucles for identiques, mais je ne vois pas trop comment faire autrement...
      J'ai fais un long switch pour que ce soit clair, mais je peux facilement simplifier en remplaçant tous les SEG_a | SEG_b | ... par leur résultat, puis en mettant ces résultats dans un tableau de 10 cases (1 par chiffre) et en remplaçant le switch par :
      o[i]= tableauValeurs[chiffre];

      int main(int argc, char** argv) {
      	int start, end;
      	int i,j;
      	
      	if(argc==2) {
      		zLCD( strtol(argv[1], NULL, 10) );
      	}
      	else if(argc>=3) {
      		for(i=1 ; i<argc ; i++) {
      			if(argv[(i<argc-1)*(i+1)][0]=='-') {
      				start= strtol(argv[i], NULL, 10);
      				end= strtol(argv[i+2], NULL, 10);
      				for(j=start ; j<end+1 ; j++)
      					zLCD(j);
      				i+=2;
      			} else
      				zLCD( strtol(argv[i], NULL, 10) );
      		}
      	}
      	else	zLCD(1234567890);
      	
      	return 0;
      }
      


      J'ai fais le main à l'arrache. Il est fais de telle sorte qu'on puissse appeler le programme en console ainsi :
      zLCD 834 397
      Il affichera alors tous les chiffres passés en paramètre.
      On peut aussi faire ceci :
      zLCD 20 - 30
      Il affichera alors tous les chiffres entre 20 et 30.
      On peut combiner ces 2 possibilités : zLCD 36 564 0 - 15
      Sans paramètres, il affiche 1234567890.

      X:\SecretPath>zLCD 128 20 - 25 255
      
           _   _
        |  _| |_|
        | |_  |_|
      
       _   _
       _| | |
      |_  |_|
      
       _
       _|   |
      |_    |
      
       _   _
       _|  _|
      |_  |_
      
       _   _
       _|  _|
      |_   _|
      
       _
       _| |_|
      |_    |
      
       _   _
       _| |_
      |_   _|
      
       _   _   _
       _| |_  |_
      |_   _|  _|
      • Partager sur Facebook
      • Partager sur Twitter
        7 décembre 2014 à 16:43:17

        bon un sujet qui commence à dater mais je l'ai trouvé cool. Je poste ma solution

         main.c

        #include <stdio.h>
        #include <stdlib.h>
        #include "constante.h"
        #include "affichage.h"
        
        
        //on definit le nombres à afficher ainsi que sa taille
        int LE_NOMBRE =78521;
        int tAILLE =5;
        
        int main(int argc, char const *argv[])
        
        {
        	Nombresegment * nb_segmente=malloc(tAILLE*sizeof(Nombresegment));
        	int * contenu=malloc(tAILLE*sizeof(int));
        	int J,k,passage=1;
        	char ligne=1;
        
        	decomposer(LE_NOMBRE,tAILLE,contenu);
        	for ( J = 0; J < tAILLE; ++J)
        	{
        		nb_segmente[J]=affecter_valeur_segment(contenu[J]);
        		//printf("J=%d\n",contenu[J]);
        	}
        
        
        	while(ligne<6) //affiche chaque niveau du segment , niveau 1 = a ,niveau 2=b et f ,niv3=g ,niv 4=c et e,niveau 5 = d
        	{
        		while(passage<=2) //permet d'afficher les segments dans le bon ordre et de respecter les sauts de lignes
        		{
        			if(ligne==1 || ligne==3 || ligne==5) //on n'affiche une seule barre pour l'affichage horizontale
        			{
        				for(k=0;k<tAILLE;k++)
        				{
        				afficher_nb(nb_segmente[k],ligne,passage);
        				}
        				passage=3;
        			}else //on affiche verticalement donc besoin de sauter des lignes et de double afficher la barre horizontale
        			{
        				for(k=0;k<tAILLE;k++)
        				{
        				afficher_nb(nb_segmente[k],ligne,passage);
        				}
        				printf("\n");
        				passage++;
        			}
        			
        		}
        			if (ligne==1 ||ligne == 3 || ligne == 5) // saut de ligne pour passer au niveau suivant d'affichage(ie :ligne 2 ou 3 ...) 
        				{
        					printf("\n");
        				}
        			ligne++;
        			passage=1;
        			//printf("\n");
        	}
        	return 0;
        }



        -
        Edité par zaurel 8 décembre 2014 à 15:53:09

        • Partager sur Facebook
        • Partager sur Twitter
          7 décembre 2014 à 16:45:22

          constante.h

          #ifndef CONSTANTE
          #define CONSTANTE
          
          #include <stdio.h>
          #include <stdlib.h>
          
          
          
          typedef struct Nombresegment Nombresegment;
          struct Nombresegment //representation du segment
          {
          	int a;
          	int b;
          	int c;
          	int d;
          	int e;
          	int f;
          	int g;
          };
          
          #endif 



          • Partager sur Facebook
          • Partager sur Twitter
            7 décembre 2014 à 16:46:17

            affichage.h
            #ifndef AFFICHAGE
            #define AFFICHAGE
            
            #include <stdio.h>
            #include <stdlib.h>
            #include "constante.h"
            #include <math.h>
            
            
            void   decomposer(int nb_a_decomposer,int taille, int *tab_sortie ); //decompose le nombre et range ses valeurs dans un tableau  
            Nombresegment  affecter_valeur_segment(int nb) ; //Se charge d'affecter à chaque chiffre le nombre de segment qui doivent etre allumer
            void afficher_nb(Nombresegment B,char lettre,int passage); //affiche le nombre 
            
            
            #endif

            -
            Edité par zaurel 7 décembre 2014 à 16:46:35

            • Partager sur Facebook
            • Partager sur Twitter
              7 décembre 2014 à 16:47:19

              affichage.c

              #include "constante.h"
              #include <math.h>
              
              void   decomposer(int nb_a_decomposer,int taille, int *tab_sortie )
              {
              	int i=0,j=0;
              	int puissance=1;
              	int taille_1=taille;
              	for(i=0;i<taille_1;i++)
              	{
              		for( j=0;j<taille_1-1-i;j++ )
              		{
              			puissance=puissance*10;
              		}
              		tab_sortie[i]=nb_a_decomposer/puissance;
              		nb_a_decomposer=nb_a_decomposer-tab_sortie[i]*puissance;
              		puissance=1;
              	}
              }
              
               Nombresegment affecter_valeur_segment(int nb)
              {
              	 Nombresegment Al;
              
              	if (nb==1)
              	{
              		Al.a=0;
              		Al.b=1;
              		Al.c=1;
              		Al.d=0;
              		Al.e=0;
              		Al.f=0;
              		Al.g=0;
              	}else if(nb==2)
              	{
              		Al.a=1;
              		Al.b=1;
              		Al.c=0;
              		Al.d=1;
              		Al.e=1;
              		Al.f=0;
              		Al.g=1;
              	} else if(nb==3)
              	{
              		Al.a=1;
              		Al.b=1;
              		Al.c=1;
              		Al.d=1;
              		Al.e=0;
              		Al.f=0;
              		Al.g=1;
              	}else if(nb==4)
              	{
              		Al.a=0;
              		Al.b=1;
              		Al.c=1;
              		Al.d=0;
              		Al.e=0;
              		Al.f=1;
              		Al.g=1;
              	}else if(nb==5)
              	{
              		Al.a=1;
              		Al.b=0;
              		Al.c=1;
              		Al.d=1;
              		Al.e=0;
              		Al.f=1;
              		Al.g=1;
              	}else if(nb==6)
              	{
              		Al.a=1;
              		Al.b=0;
              		Al.c=1;
              		Al.d=1;
              		Al.e=1;
              		Al.f=1;
              		Al.g=1;
              	}else if(nb==7)
              	{
              		Al.a=1;
              		Al.b=1;
              		Al.c=1;
              		Al.d=0;
              		Al.e=0;
              		Al.f=0;
              		Al.g=0;
              	}else if(nb==8)
              	{
              		Al.a=1;
              		Al.b=1;
              		Al.c=1;
              		Al.d=1;
              		Al.e=1;
              		Al.f=1;
              		Al.g=1;
              	}else if(nb==9)
              	{
              		Al.a=1;
              		Al.b=1;
              		Al.c=1;
              		Al.d=1;
              		Al.e=0;
              		Al.f=1;
              		Al.g=1;
              	}else if(nb==0)
              	{
              		Al.a=1;
              		Al.b=1;
              		Al.c=1;
              		Al.d=1;
              		Al.e=1;
              		Al.f=1;
              		Al.g=0;
              	}
              	return Al;
              }
              
              void afficher_nb(Nombresegment B,int ligne,int passage)
              {
              
              
              	if (ligne==1) //affiche la premier ligne grace à la valeur de a 
              	{
              		if (B.a==1)
              		{
              			printf("....");
              			printf("   ");	
              		}else 
              		{
              			printf("   ");
              			printf("    ");	
              		}
              	}else if(ligne==2) //puis la deuxime en gerant toutes les valeurs possibles de f et b
              	{
              		if(B.f==1 && B.b==1)
              		{
              			printf("|  |");
              			printf("   ");	
              		}else if(B.f==0 && B.b==1)
              		{
              			
              			printf("   |");
              			printf("   ");	
              		}else if(B.f==1 && B.b==0)
              		{
              			
              			printf("|   ");
              			printf("   ");	
              					
              		}else
              		{
              			printf("   ");
              			printf("   ");
              		}	
              	}else if(ligne==3)//puis la troisieme grace à la valeur de g
              	{
              		if(B.g==1)
              		{
              			printf("....");
              			printf("   ");
              		}else
              		{
              			printf("   ");
              			printf("    ");	
              		}
              	}else if(ligne==4) //puis la 4ieme en gerant toutes les valeurs possibles de e et c
              	{ 
              		if(B.e==1 && B.c==1)
              		{
              			printf("|  |");
              			printf("   ");	
              		}else if(B.e==0 && B.c==1)
              		{
              			printf("   |");
              			printf("   ");	
              				
              		}else if(B.e==1 && B.c==0)
              		{
              			printf("|   ");
              			printf("   ");	
              				
              		}else
              		{
              			printf("   ");
              			printf("   ");	
              		}
              	} else if (ligne==5) //enfin la 5ieme grace à la valeur de d
              	{
              		if(B.d==1)
              		{
              			printf("....");
              			printf("   ");	
              		}else
              		{
              			printf("   ");
              			printf("    ");
              		}
              	}
              }



              -
              Edité par zaurel 8 décembre 2014 à 15:42:43

              • Partager sur Facebook
              • Partager sur Twitter
                7 décembre 2014 à 16:51:50



                Une petite capture du resultat. Le main est vraiment mal foutu car je l'ai fait à l'arrache . On defint au debut du pr le nombre et et la taille du nombre à afficher,je l'ai un peu bidouillé pour que l'affichage se passe bien , donc niveau lisibilité du code,c'est pas enorme

                -
                Edité par zaurel 8 décembre 2014 à 15:44:44

                • Partager sur Facebook
                • Partager sur Twitter

                zLCD

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown