Algo de shannon fano

Algo de shannon fano - Algo - Programmation

Marsh Posté le 16-04-2004 à 17:56:24    

Bonjour je cherche le code source de l'algorithme de Shannon fano (c presque comme huffman) en C  
est-ce que qqn l'a?
J'ai compris le raisonnement mais je veux bien voir ce que ça donne en C.
J'ai essayé de le faire.
Je lis un fichier, je calcule la frequence des elements dans ce fichier et jobtiens un code avec dees 0 et des 1. Ca j'ai su le faire.
Mais patr contre la suite je n'ai aps pu le faire...la phase de decompression là.
Quelqu'un peut m'aider?
Je vous remercie.

Reply

Marsh Posté le 16-04-2004 à 17:56:24   

Reply

Marsh Posté le 16-04-2004 à 18:14:44    

ben si t'as le code tout est fait  [:proy]

Reply

Marsh Posté le 16-04-2004 à 18:17:22    

regarder ce que j('ai fait:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <ctype.h>
 
//enum booleen {faux, vrai};
 
struct tabascii{
 long cumul;
 char code[65];
 int carac;
 int codifie;
};
 
struct tabascii ASCII[255];
 
struct tabascii ASCIIBIS[255];
int dimascii=0;
 
 
 
void miseazero(struct tabascii ASCII[])
{
 int i;
 for(i=0;i<255;i++){
  ASCII[i].cumul=0;
  ASCII[i].codifie=0;
  ASCII[i].carac=i;
  strcpy(ASCII[i].code,"" );
 }
}
 
 
 
int calculfrequence(struct tabascii ASCII[], FILE *fic)
{
 int c;
 int dimascii=-1;//attention car espace!!
 
 fseek(fic,0L,SEEK_SET);
 while(!feof(fic)){
  c=fgetc(fic);
 
  if(!ASCII[c].cumul){
   dimascii=dimascii+1;
   ASCII[c].cumul=(ASCII[c].cumul)+1;
 
  }else{
 
   ASCII[c].cumul=(ASCII[c].cumul)+1;
  }
 }
 return dimascii;
 
}
 
/*tri de ASCII tri par insertion qui fait en meme temps le classement en ascii*/
void tritable(struct tabascii ASCII[])
{  
 
 int j,i ;
 struct tabascii v;
 for (i = 2; i < 255 ;i++)
 {  
    v = ASCII[i];
    j = i;
 
    while ((ASCII[j-1].cumul<v.cumul)&&(j>0))
   {
     ASCII[j] = ASCII[j-1];
     j--;
 
   }
 
     ASCII[j] = v;
  }
 
}
 
long cumul_freq(struct tabascii ASCII[]){
 int i;
 long cumulfreq=0;
 for(i=0;ASCII[i].cumul!=0;i++){
  cumulfreq=cumulfreq+ASCII[i].cumul;
 }
 return cumulfreq;
 
}
 
 
/*Construction du code*/
 
 
void Creation_Codage(struct tabascii ASCII[],int Deb,int Fin, long Tot)
{ printf("deb=%d", Deb);
 printf("fin=%d", Fin);
printf("Tot=%d", Tot);
 
 
 int j;
 int k;
 long Cumul = 0;          
    long CumulPrec = 0;      
    long  DemiTot = Tot / 2;
    int i  = Deb;
    int FinS;          
 int Finc = 1;  
 
 
      do
      {    
     
  CumulPrec = Cumul;
     Cumul = Cumul+ASCII[i].cumul;
      if ( (Cumul >= DemiTot) && (i != Deb))
    Finc = 0;
   
   
      i++;
      } while((Finc==1)&&(i!= Fin));
 
 
 
      if ((i > Deb) && ((Cumul - DemiTot) >(DemiTot - CumulPrec)))
      {
  i--;
   Cumul = CumulPrec;
      }
 
   
      FinS = i-1;
 
 
   
      for (j = Deb; j <= FinS; j++)
     {
   strcat(ASCII[j].code,"0" );
   ASCII[j].codifie=1;
      }
 
     
           
      if (Deb != FinS){
   Creation_Codage(ASCII,Deb,FinS,Cumul);
   }
 
 
       for (k = (FinS+1); k <=Fin&&ASCII[k].cumul!=0; k++)
      {
   strcat(ASCII[k].code, "1" );
   ASCII[k].codifie=1;
      }
 
   
    if ((FinS+1) != Fin){
   Creation_Codage(ASCII,(FinS+1),Fin,(Tot-Cumul));
    }
 
}
 
 
 
 
 
/*transfert vers une autre table*/
/* elle retourne en plus la vraie longueur de ASCII*/
 
int transfert(struct tabascii ASCII[],struct tabascii ASCIIBIS[]){
 int i;
 for(i=0;i<255&&ASCII[i].codifie==1;i++){
 strcpy(ASCIIBIS[i].code,ASCII[i].code);
 ASCIIBIS[i].codifie=ASCII[i].codifie;
 ASCIIBIS[i].carac=ASCII[i].carac;
 }
 return i;
}
 
 
/*Ecriture de la table dans le fichier cible*/
void ecrituretable(FILE *fic, struct tabascii ASCIIBIS[]){
 int byte=0
 int nbbit=0;
 int taillebit;
 int c;
 int i;
 while(!feof(fic)){
  c=fgetc(fic);  
  taillebit=strlen(ASCIIBIS[c].code);
  for(i=0:i<taillebit;i++){
   byte=byte+ASCIIBIS[i].code;
   nbbit=nbbit+1;
   if (nbbit==8){
    byte=0;
    nbbit=0;
   }
  }
 }
}
 
 
byte = vide
nbbit = 0
tant que pas fin source faire
    lire(octet)
Recherche Ind dans Tcodage
tailleBit = nbr de bit de Tcodage(ind).code
    pour i = 1 jusqu'à tailleBit faire
        byte = byte + Tcodage(ind).code[i]
        nbbit = nbbit + 1
        si nbbit = 8 alors
            ecrire(byte)
            byte = vide
            nbbit = 0
        finsi
    fin pour
fin tant que
*/
 
 
 
 
void main(){
 //int i;
 int j;
 FILE *fic;
 char nomfich[40];
 
 
 printf("Nom du fichier à ouvrir?" );
 
 
 scanf("%s", nomfich);
 
 if ((fic=fopen(nomfich,"r" ))==NULL){
  printf("***************Erreur douverture de fichier**************" );
  exit(0);
 }
 
 
 miseazero(ASCII);
 int dimascii;
 int dimasciibis;
 
 dimascii=calculfrequence(ASCII,fic);
 dimasciibis=dimascii-1;
 
 
 
 /*for(i=0;i<255;i++){
  printf("carac= %d \t",ASCII[i].carac);
  printf("cumul=%d\n",ASCII[i].cumul);
 }
*/
 
 //printf("carac= %d \t",ASCII[0].cumul);
 
 
 tritable(ASCII);
 
 long cumulfreq;
 
 cumulfreq=cumul_freq(ASCII);
 
 
 
 /*for(j=0;j<255;j++){
  printf("carac= %d\t",ASCII[j].carac);
  printf("cumul=%d\t",ASCII[j].cumul);
  printf("codifie=%d\n",ASCII[j].codifie);
 
 }*/
 
 printf("dimascii=%d\n",dimascii);
 printf("cumulfreq=%d\n",cumulfreq);
 
 
 
 Creation_Codage(ASCII,0,dimasciibis,cumulfreq);
 
 
 
 int lgascii;
 
 lgascii=transfert(ASCII, ASCIIBIS);
 
 
 for(j=0;j<lgascii;j++){
 
  printf("cumul=%d\t",ASCIIBIS[j].codifie);
  printf("code=%s\n",ASCIIBIS[j].code);
  printf("carac=%d\n",ASCIIBIS[j].carac);
 }
 
 
 
 /*for(j=0;j<255;j++){
  printf("carac= %d\t",ASCII[j].carac);
  printf("cumul=%d\t",ASCII[j].cumul);
  printf("code=%s\n",ASCII[j].code);
 }*/
 
 
 
 
 
}

Reply

Marsh Posté le 16-04-2004 à 18:18:36    

jme suis insprirer du code de ce site, mais le code est chelou et unn moment le gars il fait un arbre....est-ce que c moi qui ait mal compris?
http://www.alphabeta-net.com/Fano_Shannon.html

Reply

Marsh Posté le 16-04-2004 à 18:23:47    

J'esperes que c'est pas pour un TP :)
http://programasencgratis.webcinda [...] /Shannon.c

Reply

Marsh Posté le 16-04-2004 à 18:27:51    

hé franchement toto78 t mon pote!
Jte remercie grave!
mais j'aimerais bien en avoir plusieurs de sources!
Donc les autres si vous en avez, ce serait sympa!:-)
Mais jte remercie toto78!

Reply

Marsh Posté le 16-04-2004 à 18:35:47    

devildeiss a écrit :

jme suis insprirer du code de ce site, mais le code est chelou et unn moment le gars il fait un arbre....est-ce que c moi qui ait mal compris?
http://www.alphabeta-net.com/Fano_Shannon.html


 
un abre peut etre utilisé pour une définisssion récursive de huffman.
 
pour les sources >> google  [:proy]

Reply

Marsh Posté le 16-04-2004 à 18:44:13    

ben pour cshannon fano jvois aps l'interet de faire un arbre.
mais que des tablos...
cependant c la seule source que j'ai trouvé sur google tu sais...Huffman c plus facile mais shannon fano je trouve aps facilement.

Reply

Marsh Posté le 16-04-2004 à 19:03:56    

dites moi...gotoxy c avec la biblio conio.h?
mais sous visual ça marche pas? il est ou le pbm?

Reply

Sujets relatifs:

Leave a Replay

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