IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Codage arbre en binaire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Par défaut Codage arbre en binaire
    bonjour, j'ai un petit souci, j'ai un exo a faire en C et je suis bloqué. Je vous expose vite fai le,truc : On doit lire un fichier, créer un tabelau contenant le nombre d'occurence (nombre de fois qu'apparait le caractere) et son code ASCII. Ensuite on doit faire une chaine pointant sur chaque caractere et son nombre d'occurrences et ensuite je doit divisé cette chaine en 2 puis ensuite les 2 moitiés en 2, puis les 4 moitiés en 2 etc.. jusqu'à ce qu'il ne reste que des éléments 1 à 1 pour pouvoir construire un arbre et là je vous avoue que je suis un peu perdu!!

    Si qqn à une idée n'hésitez pas ce sera avec grande joie!!

    Merci d'avance encore. je vous met mon code que j'ai fai pour créer ma chaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    void Compression(char *nomFichierAcompresser)
    {
    FILE *fichierCourant, *fichierCompresser;
    char nomfichierCompresser[25];
    char rep;
    int b=0, nbfeuille=0;
     
    /*********************Vérification si le fichier Ã* compresser existe bien et si oui alors ouverture************************************************************/
    if((fichierCourant = fopen(nomFichierAcompresser,"r"))==NULL)
    	{
    	fprintf(stderr,"Impossible d'ouvrir le fichier donnees en lecture\n\n");
    	exit(1);
    	}
     
    /******************** Création du nom du fichier compressé *******************/
     
    strcpy(nomfichierCompresser, nomFichierAcompresser);
    strcat(nomfichierCompresser,".shf");
    printf("\nLe nom du fichier compresser sera : %s \n\n",nomfichierCompresser);
     
    /*********************************************************************** Vérification si le fichier de sortie n'existe pas, et s'il existe demander Ã* l'utilisateur si il veut l'écraser ou non **********************************************************/
     
    if((fopen(nomfichierCompresser,"r"))==NULL)
    	{
    	fichierCompresser = fopen(nomfichierCompresser,"w");
    	}
    else
    	{
    	printf("Le fichier %s existe deja voulez-vous le remplacer ? (o/n)  ", nomfichierCompresser);
    	scanf("%c", &rep);
    	if(rep=='o')		/* Vérification de la reponse */
    		{
    		/* On efface le contenu du fichier de sortie => fichierCompresser */	
    		if((fichierCompresser = fopen(nomfichierCompresser,"w"))==NULL)
    			{
    			fprintf(stderr,"Impossible d'ouvrir le fichier donnees en lecture\n\n");
    			exit(1);
    			}
    		printf("\nLe contenu du fichier %s a ete efface.\n\n",nomfichierCompresser);	
    		}
    	else
    		{
    		if (rep=='n')		/* Vérification de la reponse */
    			{
    			printf("\nVeuillez alors deplacer ou renommer le fichier appele : %s \n\n", nomfichierCompresser);
    			fclose(fichierCourant);
    			exit(1);
    			}		
    		else
    			{
    			printf("Erreur dans la saisie. Fin du programme. Veuillez renouvelez votre operation.\n\n");
    			exit(1);
    			}
    		}
    	}
     
    	/* Comptage du nombre d'occurences */
    int Tab_occ[256] = {0};
    Comptage_occ(fichierCourant, Tab_occ);
     
    	/* Creation des feuilles de l'arbre */
    for (b =0; b<256; b++)
    	{
    	if(Tab_occ[b] != 0)
    		nbfeuille++;
    	}
     
    ARBRE feuille[nbfeuille];
     
    Creation_feuille(feuille, Tab_occ);		/* Fonction Creation des feuilles de l'arbre */
     
    	/* Tri des occurences par ordre décroissant */
    Tri_feuille(feuille, nbfeuille);
     
    return;
    }
     
     
    /********************************************************************/
    /********************************************************************/
    /************************ Fonction Comptage_occ *********************/
    /********************************************************************/
    /********************************************************************/
    void Comptage_occ(FILE* FichierCourant, int* Tab_occ)
    {
    int caractere = 'z';
    		/* Création et initialisation Ã* 0 de toutes les cases du tableau */
    while(caractere != EOF)
    	{
    	caractere = fgetc(FichierCourant);
    	/* Ligne de test pour la verification de ce qui est contenu dans le fichier
    	printf("%c", caractere);*/
    	Tab_occ[caractere] = Tab_occ[caractere]+1;
    	}
    /* Boucle d'affichage pour la verification de la lecture du fichier
    int i;
    for(i=0;i<256;i++)
    	{
    	if(Tab_occ[i] != 0)
    		{
    		printf("\ncarac ascii : %d\tvaleur : %d \n",i,Tab_occ[i]);
    		}
    	}
    */
    }
     
    /********************************************************************/
    /********************************************************************/
    /********************* Fonction Creation_feuille*********************/
    /********************************************************************/
    /********************************************************************/
    void Creation_feuille(ARBRE* feuille, int* Tab_occ)
    {
    int i=0, j=0;
     
    for(i=0; i<256; i++)
    	{
    	if(Tab_occ[i] != 0)
    		{
    		feuille[j].caractere = i;
    		feuille[j].occurence = Tab_occ[i];
    		feuille[j].fg = NULL;
    		feuille[j].fd = NULL;
    		/* Boucle d'affichage pour la verification de la lecture du fichier
    		printf("carac=%d\tocc=%d\n",feuille[j].caractere,feuille[j].occurence);
    		*/
    		j++;
    		}
     
    	}
    }
     
    /********************************************************************/
    /********************************************************************/
    /************************ Fonction Tri_Tab_occ** ********************/
    /********************************************************************/
    /********************************************************************/
    /* Fonction de TRI PAR INSERTION */
    void Tri_feuille(ARBRE* feuille, int nbfeuille)
    {
    int i, j;
    ARBRE feuille_temp;	
     
    	for(i=1; i<nbfeuille; i++)
    		{
       	feuille_temp.caractere = feuille[i].caractere;		/* Sauvegarde l'élément qui est comparé */
       	feuille_temp.occurence = feuille[i].occurence;
    		j=i-1;
    		while ((j>=0)&&(feuille[j].occurence)<(feuille_temp.occurence))
    			{
    /* Deplace toutes les cases qui sint plus petite que celle que l'on vien de sauvegarder */
    			feuille[j+1].caractere = feuille[j].caractere;
    			feuille[j+1].occurence = feuille[j].occurence;
    			feuille[j+1].fg = NULL;
    			feuille[j+1].fd = NULL;
    			j=j-1;
    			}
    /* Place l'élément sauvegardé Ã* gauche des éléments plus petits que lui */
    		feuille[j+1].caractere = feuille_temp.caractere;
    		feuille[j+1].occurence = feuille_temp.occurence;
    		feuille[j+1].fg = NULL;
    		feuille[j+1].fd = NULL;
       	}
    /* Boucle d'affichage pour la verification de la lecture du fichier
    printf("\n\n nombre de feuille :%d \n\n Apres le tri:\n\n",nbfeuille);
    for(i=0; i<nbfeuille; i++)
    	{
    	if(feuille[i].occurence != 0)
    		{
    		printf("carac=%d\tocc=%d\t\n",feuille[i].caractere,feuille[i].occurence);
    		i++;
    		}
     
    	}
    */
    }

  2. #2
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Par défaut C tt bon
    salut, en fait j'ai réussi à trouver mon pb c'est que je ne pointé pas sur le bon élément, donc j'ai réussit à découper ma chaine de caractere puis à partir de ce découpage j'ai créer mon arbre.

    Par contre un autre problème se pose à moi : je doit coder chaque feuille de mon arbre avec un code binaire propre à chaque feuille. Plus précisemment, je doit lorsque je lit le fils gauche du noeud dire que c'est '0' et quand je lit le fils droit dire que c'est '1'.

    Si qqn peut m'aider se sera avec grand plaisir que je lirai son aide.

    Merci d'avance.

    Gis

Discussions similaires

  1. [JTree]recherche dans un arbre (non binaire ?)
    Par biozaxx dans le forum Composants
    Réponses: 3
    Dernier message: 07/05/2013, 13h32
  2. Algo Génétique, Codage réels en binaire
    Par Giansolo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 23/06/2010, 17h16
  3. hauteur arbre non binaire, ou placer le return
    Par Acidmaster dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 31/01/2009, 20h10
  4. Afficher un arbre binaire avec sa structure
    Par PhoneKilleR dans le forum C
    Réponses: 7
    Dernier message: 23/04/2008, 23h24
  5. Codage/ décodage réels binaires
    Par modaffar dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 10/07/2007, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo