Algo de shannon fano - Algo - Programmation
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);
}*/
}
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
Marsh Posté le 16-04-2004 à 18:23:47
J'esperes que c'est pas pour un TP
http://programasencgratis.webcinda [...] /Shannon.c
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!
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? |
un abre peut etre utilisé pour une définisssion récursive de huffman.
pour les sources >> google
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.
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?
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.