Aide moi langage c
Résolu/Fermé
allel90
Messages postés
4
Date d'inscription
jeudi 24 mai 2012
Statut
Membre
Dernière intervention
27 mai 2012
-
24 mai 2012 à 18:03
allel90 Messages postés 4 Date d'inscription jeudi 24 mai 2012 Statut Membre Dernière intervention 27 mai 2012 - 25 mai 2012 à 14:06
allel90 Messages postés 4 Date d'inscription jeudi 24 mai 2012 Statut Membre Dernière intervention 27 mai 2012 - 25 mai 2012 à 14:06
A voir également:
- Aide moi langage c
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Dev-Pascal - Télécharger - Édition & Programmation
4 réponses
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
25 mai 2012 à 13:28
25 mai 2012 à 13:28
Bonjour allel90,
Désolé de ma franchise, j'espère que tu ne te fâchera pas.
Cependant, ce code vient d'Internet, pas de ton cerveau. Ce n'est pas en le modifiant un peu "au feeling" que tu vas arriver à quelque chose (ou à nous faire croire que tu en es l'auteur).
Si tu essayes déjà de comprendre les erreurs de syntaxe que tu as introduites, tu progresseras.
Par exemple remplacer la déclaration de fonction du code d'origine
par
montre que tu ne comprends pas des concepts essentiels de définition de paramètres de fonction, de définition de variables, ou même de représentation de chaînes de caractères.
Nous ne pouvons pas faire ce travail à ta place, ni t'aider à plagier le travail d'autres personnes.
Une autre aide : sous Windows, le caractère séparateur des répertoires est l'antislash : c'est "\" et non "/". Et comme il se trouve que c'est un caractère d'échappement en C, tu dois le doubler dans tes chaînes de caractères.
Donc : "D:\\fich1.txt" et non pas "D://fich1.txt" (même si Windows peut être tolérant à ce type de représentations, mais alors on ne comprend pas pourquoi il est doublé).
https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/
Dal
Désolé de ma franchise, j'espère que tu ne te fâchera pas.
Cependant, ce code vient d'Internet, pas de ton cerveau. Ce n'est pas en le modifiant un peu "au feeling" que tu vas arriver à quelque chose (ou à nous faire croire que tu en es l'auteur).
Si tu essayes déjà de comprendre les erreurs de syntaxe que tu as introduites, tu progresseras.
Par exemple remplacer la déclaration de fonction du code d'origine
int compter(char * nom_fichier, Noeud * table[256])
par
int compter(char * D://fich1.txt, Noeud * table[256])
montre que tu ne comprends pas des concepts essentiels de définition de paramètres de fonction, de définition de variables, ou même de représentation de chaînes de caractères.
Nous ne pouvons pas faire ce travail à ta place, ni t'aider à plagier le travail d'autres personnes.
Une autre aide : sous Windows, le caractère séparateur des répertoires est l'antislash : c'est "\" et non "/". Et comme il se trouve que c'est un caractère d'échappement en C, tu dois le doubler dans tes chaînes de caractères.
Donc : "D:\\fich1.txt" et non pas "D://fich1.txt" (même si Windows peut être tolérant à ce type de représentations, mais alors on ne comprend pas pourquoi il est doublé).
https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/
Dal
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
24 mai 2012 à 18:33
24 mai 2012 à 18:33
Courage, tu vas y arriver !
Sinon, ton exercice ne serait pas plutôt en relation avec l'algorithme de compression de Huffman ?
Dal
Sinon, ton exercice ne serait pas plutôt en relation avec l'algorithme de compression de Huffman ?
Dal
allel90
Messages postés
4
Date d'inscription
jeudi 24 mai 2012
Statut
Membre
Dernière intervention
27 mai 2012
25 mai 2012 à 02:33
25 mai 2012 à 02:33
svp aide moi
exercice:
1-implémenter une fonction permattant de calculer les fréquences contenus dans une chaine de caracteres
2-implémenter une fonction permattant de calculer les fréquences contenus dans un fichier texte (nom de fichier fich1.txt et adrresse d://fich1.txt).
3-implementer l'algorithme de hoffman pour calculer les codes des caracteres selon un tableau de frequences
4-implimenter l'algorithme de hoffman permattant le decodage
5-rediger un rapport concernant votre implimentation
et voila mon essaye
ou es l erreur
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct noeud
{
unsigned char lettre;
int nb_occ;
struct noeud * f_g, * f_d;
} Noeud;
Noeud * nouveau_noeud(unsigned char lettre, int nb_occ,
Noeud * gauche, Noeud * droite);
void initialiser(Noeud * table[256]);
int compter(char * nom_sortie, Noeud * table[256]);
int trier_eliminer(Noeud * table[256]);
void inserer(Noeud * table[256], Noeud * cle, int taille);
Noeud * calculer_arbre(Noeud * table[256], int nb_non_nul);
int profondeur(Noeud * arbre);
void remplir_table(Noeud * arbre, char ** table_code, char * chaine, int hauteur);
void afficher(FILE * sortie, char ** table_code);
int nb_0_1(Noeud * arbre, int hauteur);
int main(int argc, char ** argv)
{
Noeud * table[256];
Noeud * arbre;
char * table_code[256];
char * chaine;
int max, i, nb_non_nul;
int longueur_non_code;
int longueur_code;
int nb;
FILE * sortie;
initialiser(table);
longueur_non_code = compter(argv[1], table);
nb_non_nul = trier_eliminer(table);
arbre = calculer_arbre(table, nb_non_nul);
max = profondeur(arbre);
printf("max = %d\n", max);
for (i = 0; i < 256; i++) table_code[i] = NULL;
chaine = (char *) malloc((max + 1) * sizeof(char));
if (chaine == NULL)
{
printf("plus de place pour chaine\n");
exit(1);
}
remplir_table(arbre, table_code, chaine, 0);
sortie = fopen(argv[2], "w");
if (sortie == NULL)
{
printf("fichier inexistant\n");
exit(1);
}
afficher(stdout, table_code);
afficher(sortie, table_code);
fclose(sortie);
printf("longueur du texte non code = %d\n", longueur_non_code);
nb = longueur_code = nb_0_1(arbre, 0);
longueur_code = nb / 8 + (nb % 8 != 0 ? 1 : 0);
printf("longueur du texte code = %d\n", longueur_code);
return 0;
}
Noeud * nouveau_noeud(unsigned char lettre, int nb_occ,
Noeud * gauche, Noeud * droite)
{
Noeud * nouveau;
nouveau = (Noeud *) malloc(sizeof(Noeud));
if (nouveau == NULL)
{
printf("plus de place dans nouveau_noeud\n");
exit(1);
}
nouveau -> lettre = lettre;
nouveau -> nb_occ = nb_occ;
nouveau -> f_g = gauche;
nouveau -> f_d = droite;
return nouveau;
}
void initialiser(Noeud * table[256])
{
int i;
for (i = 0; i < 256; i++) table[i] = nouveau_noeud(i, 0, NULL, NULL);
}
/* Compte les nombres d'occurrences de chaque lettre
et renvoie le nombre total de lettres du texte */
int compter(char * D://fich1.txt, Noeud * table[256])
{
unsigned char caractere;
int nb = 0;
FILE * fichier;
fichier = fopen(D://fich1.txt, "r");
if (fichier == NULL)
{
printf("fichier inexistant\n");
exit(1);
}
while (fscanf(fichier, "%c", &caractere) != EOF)
{
table[caractere] -> nb_occ++;
nb++;
}
fclose(fichier);
return nb;
}
/* insere le noeud cle dans le tableau de noeuds table trié par ordre
décroissant entre les indices 0 à taille - 1
en respectant l'ordre décroissant
*/
void inserer(Noeud * table[256], Noeud * cle, int taille)
{
int i = taille;
while ((i >= 1) && (table[i - 1] -> nb_occ < cle -> nb_occ))
{
table[i] = table[i - 1];
i = i - 1;
}
table[i] = cle;
}
int trier_eliminer(Noeud * table[256])
{
int i;
int nb_non_nul = 0;
for (i = 1; i < 256; i++)
if (table[i] -> nb_occ > 0)
{
inserer(table, table[i], nb_non_nul);
nb_non_nul++;
}
else free(table[i]);
return nb_non_nul;
}
Noeud * calculer_arbre(Noeud * table[256], int nb_non_nul)
{
int nb;
Noeud * n1, * n2, * nouveau;;
for (nb = nb_non_nul; nb > 1; nb--)
{
n1 = table[nb - 2];
n2 = table[nb - 1];
nouveau = nouveau_noeud('_', n1 -> nb_occ + n2 -> nb_occ, n1, n2);
inserer(table, nouveau, nb - 2);
}
return table[0];
}
int profondeur(Noeud * arbre)
{
int g, d;
if (arbre == NULL) return -1;
g = profondeur(arbre -> f_g);
d = profondeur(arbre -> f_d);
if (g >= d) return g + 1;
return d + 1;
}
void remplir_table(Noeud * arbre, char ** table_code, char * chaine, int hauteur)
{
unsigned char lettre;
if (arbre -> f_g == NULL)
{
lettre = arbre -> lettre;
chaine[hauteur] = '\0';
table_code[lettre] = (char *) malloc((hauteur + 1) * sizeof(char));
if (table_code[lettre] == NULL)
{
printf("plus de place dans remplir_table\n");
exit(1);
}
strcpy(table_code[lettre], chaine);
}
else
{
chaine[hauteur] = '0';
remplir_table(arbre -> f_g, table_code, chaine, hauteur + 1);
chaine[hauteur] = '1';
remplir_table(arbre -> f_d, table_code, chaine, hauteur + 1);
}
}
void afficher(FILE * sortie, char ** table_code)
{
int i;
for (i = 0; i < 256; i++)
if (table_code[i] != NULL) fprintf(sortie, "%c (%d) : %s\n", i, i, table_code[i]);
}
/* Retourne le nombre de 0 et de 1 correspondant au codage dans le texte codé
des lettres contenus dans arbre */
int nb_0_1(Noeud * arbre, int hauteur)
{
if (arbre -> f_g == NULL) return hauteur * arbre -> nb_occ;
return nb_0_1(arbre -> f_g, hauteur + 1) + nb_0_1(arbre -> f_d, hauteur + 1);
}
exercice:
1-implémenter une fonction permattant de calculer les fréquences contenus dans une chaine de caracteres
2-implémenter une fonction permattant de calculer les fréquences contenus dans un fichier texte (nom de fichier fich1.txt et adrresse d://fich1.txt).
3-implementer l'algorithme de hoffman pour calculer les codes des caracteres selon un tableau de frequences
4-implimenter l'algorithme de hoffman permattant le decodage
5-rediger un rapport concernant votre implimentation
et voila mon essaye
ou es l erreur
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct noeud
{
unsigned char lettre;
int nb_occ;
struct noeud * f_g, * f_d;
} Noeud;
Noeud * nouveau_noeud(unsigned char lettre, int nb_occ,
Noeud * gauche, Noeud * droite);
void initialiser(Noeud * table[256]);
int compter(char * nom_sortie, Noeud * table[256]);
int trier_eliminer(Noeud * table[256]);
void inserer(Noeud * table[256], Noeud * cle, int taille);
Noeud * calculer_arbre(Noeud * table[256], int nb_non_nul);
int profondeur(Noeud * arbre);
void remplir_table(Noeud * arbre, char ** table_code, char * chaine, int hauteur);
void afficher(FILE * sortie, char ** table_code);
int nb_0_1(Noeud * arbre, int hauteur);
int main(int argc, char ** argv)
{
Noeud * table[256];
Noeud * arbre;
char * table_code[256];
char * chaine;
int max, i, nb_non_nul;
int longueur_non_code;
int longueur_code;
int nb;
FILE * sortie;
initialiser(table);
longueur_non_code = compter(argv[1], table);
nb_non_nul = trier_eliminer(table);
arbre = calculer_arbre(table, nb_non_nul);
max = profondeur(arbre);
printf("max = %d\n", max);
for (i = 0; i < 256; i++) table_code[i] = NULL;
chaine = (char *) malloc((max + 1) * sizeof(char));
if (chaine == NULL)
{
printf("plus de place pour chaine\n");
exit(1);
}
remplir_table(arbre, table_code, chaine, 0);
sortie = fopen(argv[2], "w");
if (sortie == NULL)
{
printf("fichier inexistant\n");
exit(1);
}
afficher(stdout, table_code);
afficher(sortie, table_code);
fclose(sortie);
printf("longueur du texte non code = %d\n", longueur_non_code);
nb = longueur_code = nb_0_1(arbre, 0);
longueur_code = nb / 8 + (nb % 8 != 0 ? 1 : 0);
printf("longueur du texte code = %d\n", longueur_code);
return 0;
}
Noeud * nouveau_noeud(unsigned char lettre, int nb_occ,
Noeud * gauche, Noeud * droite)
{
Noeud * nouveau;
nouveau = (Noeud *) malloc(sizeof(Noeud));
if (nouveau == NULL)
{
printf("plus de place dans nouveau_noeud\n");
exit(1);
}
nouveau -> lettre = lettre;
nouveau -> nb_occ = nb_occ;
nouveau -> f_g = gauche;
nouveau -> f_d = droite;
return nouveau;
}
void initialiser(Noeud * table[256])
{
int i;
for (i = 0; i < 256; i++) table[i] = nouveau_noeud(i, 0, NULL, NULL);
}
/* Compte les nombres d'occurrences de chaque lettre
et renvoie le nombre total de lettres du texte */
int compter(char * D://fich1.txt, Noeud * table[256])
{
unsigned char caractere;
int nb = 0;
FILE * fichier;
fichier = fopen(D://fich1.txt, "r");
if (fichier == NULL)
{
printf("fichier inexistant\n");
exit(1);
}
while (fscanf(fichier, "%c", &caractere) != EOF)
{
table[caractere] -> nb_occ++;
nb++;
}
fclose(fichier);
return nb;
}
/* insere le noeud cle dans le tableau de noeuds table trié par ordre
décroissant entre les indices 0 à taille - 1
en respectant l'ordre décroissant
*/
void inserer(Noeud * table[256], Noeud * cle, int taille)
{
int i = taille;
while ((i >= 1) && (table[i - 1] -> nb_occ < cle -> nb_occ))
{
table[i] = table[i - 1];
i = i - 1;
}
table[i] = cle;
}
int trier_eliminer(Noeud * table[256])
{
int i;
int nb_non_nul = 0;
for (i = 1; i < 256; i++)
if (table[i] -> nb_occ > 0)
{
inserer(table, table[i], nb_non_nul);
nb_non_nul++;
}
else free(table[i]);
return nb_non_nul;
}
Noeud * calculer_arbre(Noeud * table[256], int nb_non_nul)
{
int nb;
Noeud * n1, * n2, * nouveau;;
for (nb = nb_non_nul; nb > 1; nb--)
{
n1 = table[nb - 2];
n2 = table[nb - 1];
nouveau = nouveau_noeud('_', n1 -> nb_occ + n2 -> nb_occ, n1, n2);
inserer(table, nouveau, nb - 2);
}
return table[0];
}
int profondeur(Noeud * arbre)
{
int g, d;
if (arbre == NULL) return -1;
g = profondeur(arbre -> f_g);
d = profondeur(arbre -> f_d);
if (g >= d) return g + 1;
return d + 1;
}
void remplir_table(Noeud * arbre, char ** table_code, char * chaine, int hauteur)
{
unsigned char lettre;
if (arbre -> f_g == NULL)
{
lettre = arbre -> lettre;
chaine[hauteur] = '\0';
table_code[lettre] = (char *) malloc((hauteur + 1) * sizeof(char));
if (table_code[lettre] == NULL)
{
printf("plus de place dans remplir_table\n");
exit(1);
}
strcpy(table_code[lettre], chaine);
}
else
{
chaine[hauteur] = '0';
remplir_table(arbre -> f_g, table_code, chaine, hauteur + 1);
chaine[hauteur] = '1';
remplir_table(arbre -> f_d, table_code, chaine, hauteur + 1);
}
}
void afficher(FILE * sortie, char ** table_code)
{
int i;
for (i = 0; i < 256; i++)
if (table_code[i] != NULL) fprintf(sortie, "%c (%d) : %s\n", i, i, table_code[i]);
}
/* Retourne le nombre de 0 et de 1 correspondant au codage dans le texte codé
des lettres contenus dans arbre */
int nb_0_1(Noeud * arbre, int hauteur)
{
if (arbre -> f_g == NULL) return hauteur * arbre -> nb_occ;
return nb_0_1(arbre -> f_g, hauteur + 1) + nb_0_1(arbre -> f_d, hauteur + 1);
}
allel90
Messages postés
4
Date d'inscription
jeudi 24 mai 2012
Statut
Membre
Dernière intervention
27 mai 2012
25 mai 2012 à 14:06
25 mai 2012 à 14:06
merçi