Compression RLE [Résolu]

katouc 4 Messages postés vendredi 2 mars 2018Date d'inscription 3 mars 2018 Dernière intervention - 2 mars 2018 à 13:53 - Dernière réponse : katouc 4 Messages postés vendredi 2 mars 2018Date d'inscription 3 mars 2018 Dernière intervention
- 3 mars 2018 à 22:00
Bonjour , jai besoin d'aide concernat la compression d'une chaîne de caractère avec la méthode RLE en langage C
merci davance
Afficher la suite 

Votre réponse

6 réponses

NHenry 14267 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 11 octobre 2018 Dernière intervention - 2 mars 2018 à 18:27
0
Merci
Nous ne feront pas votre exercice à votre place.
Merci de décrire précisément votre problème et en postant le code déjà réalisé.

Cliquez ici pour des conseils d'écriture des messages et ici concernant les devoirs scolaires ou PFE.

Pour poster votre code, merci de penser à la coloration syntaxique.
Commenter la réponse de NHenry
katouc 4 Messages postés vendredi 2 mars 2018Date d'inscription 3 mars 2018 Dernière intervention - Modifié par NHenry le 3/03/2018 à 17:46
0
Merci
voila le code de départ donc jai un problème lorsque je donne la chaîne source sous cette forme "ababababab" normalement il m'affiche 10ababababab mais c'est pas le cas


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


char first[36],
med[36],
last[36];
int i, occ,s, j,z, deb, vrai = 1, entrer = 0;
int l, k;
float taux,y;
//char chaine[37];

//Fonction qui lit une chaine de caracteres
void ecriture(char t[], int n)
{
    printf("\nDonner la chaine : ");
    scanf("%s",first);
    printf("\n");
    l=strlen(first);
}

//Fonction qui permet d'afficher la chaine
 void lecture(char t[],int n)
 {
    printf("\nAffichage de la chaine initiale :  ");
    for(i = 0 ; i < n ; i++)
     printf("%c",t[i]);
    printf("\n\n");
}

//Fonction de compression en RLE
void compressionRLE()
{
 i = 0; j = 0;
 printf("\nAffichage de la chaine intermediaire :  ");
 while(i < l)//Tant que ce n'est pas la fin de la chaine
 {
  occ = 1;
  //Tant que les caracteres se ressemblent et que ce n'est pas la fin du tableau
  while(first[i] == first[i+1] && i < l)
  {//On calcule le nombre d'occurrence
   occ++;
   i++;
  }

  med[j] = occ;
  printf("%d",med[j]);
  med[j+1] = first[i];
  printf("%c",med[j+1]);
  j = j + 2;
  i++;
 }
 printf("\n\n");

 printf("\nAffichage de la chaine finale :  ");
 i = 0; k = 0, deb = 0;
 while(i < j)
 {
  if(med[i] >= 3)
  {
   //Traiter le cas de non repetition
   if(entrer == 1)
   {
    occ = 0;
    s = deb;
    while(s < i)
    {
     occ = occ + med[s];
     s = s + 2;
    }
    last[k] = occ;
    printf("%d",last[k]);
    k++;
    s = deb;

    while(s < j && med[s] < 3)
    {
     for(z = 0; z < med[s]; z++)
     {
      last[k] = med[s+1];
      printf("%c", last[k]);
      k++;
     }
     s = s + 2; 
    }
    entrer = 0;//On la remet a zero puisqu'on a traiter la sequence
   }

   //traiter le cas de redondance
   occ = med[i] + 128;
   printf("%d",occ);
   //last[k] = occ;
   //printf("%d",last[k]);
   last[k+1] = med[i+1];
   printf("%c", last[k+1]);
   k = k + 2;
  }
  else
  {
   if(vrai == 1)//Si c'est le 1er nbr < 3 de la sequence
   deb = i;//On garde le debut de la chaine qui se repete pas
   entrer = 1;//Variable qui permet de savoir si on est entre dans ce bloc
   vrai = 0;
  }
  i = i + 2; 
 }

 //Si il reste des caracteres qui se repetent pas a la fin
 if(entrer == 1)
 {
  occ = 0;
  s = deb;
  while(s < i)
  {
   //printf("occ :  %d\n",occ);
   //printf("med[%d] :  %d\n",s,med[s]);
   occ = occ + med[s];
   s = s + 2;
  }
  last[k] = occ;
  printf("%d", last[k]);
  k++;
  for(s = deb; s < l; s++)
  {
   last[k] = med[s];
   printf("%c",last[k]);
   k++;
  }
  entrer = 0;//On la remet a zero puisqu'on a traiter la sequence
 }
 printf("\n\n\n");
 printf("lespace iniale est %d \n",l);
 printf("lespace copresse est %d \n",k);
 y=(k/l);
 taux=1-y;
 printf("le taux est %f",taux);
 printf("\n\n");
} 

int main()
{
    lecture(first,l);
    ecriture(first,l);
    compressionRLE();
    return 0;
}


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Commenter la réponse de katouc
katouc 4 Messages postés vendredi 2 mars 2018Date d'inscription 3 mars 2018 Dernière intervention - 3 mars 2018 à 16:38
0
Merci
DSL pour la façon de poser la question .
je suis nouvelle sur ce forum cest pour ca
Commenter la réponse de katouc
NHenry 14267 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 11 octobre 2018 Dernière intervention - 3 mars 2018 à 17:49
0
Merci
On commence donc avec quelques questions :
" normalement il m'affiche 10ababababab mais c'est pas le cas ", il t'affiche quoi alors ?
As-tu essayé en pas à pas pour voir les valeurs des variables et faire le diagnostique ?

Je ne code pas en C (mais j'ai de bonne base quand même), mais 2 problèmes semblent visibles :
- Variables déclarées en global alors que pour pas mal d'être elles, une déclaration local serait plus adaptées.
- Noms de variables trop court : s i occ, ... donnes des noms explicites à tes variables.
Commenter la réponse de NHenry
Dalfab 357 Messages postés dimanche 7 février 2016Date d'inscription 2 octobre 2018 Dernière intervention - 3 mars 2018 à 18:55
0
Merci
Il y a "quelques" erreurs.
  • On ne doit pas utiliser de variables globales.
  • Les variables doivent avoir un nom significatif.
  • Ne pas utiliser de noms de variables commençant ou finissant par
    l
    minuscule ou
    O
    majuscule, car il y a risque de les confondre avec les chiffres 1 et 0.
  • Eviter de mettre la longueur d'une chaîne dans une variable car en C on utilise le fait que la fin est reconnue par le caractère '\0'.
  • Donc ta variable
    l
    représente à elle seule 5 problèmes!
  • Les 2 fonctions
    ecriture()
    et
    lecture()
    ont échangé leur corps!!! Le code commence donc bizarrement en affichant un texte, puis en en demandant le contenu!
  • Ces fonctions reçoivent des paramètres mais ne s'en servent pas vraiment. Elle utilisent directement des globales.
  • La fonction
    compressionRLE()
    devrait recevoir 3 paramètres, la chaîne à convertir et un tableau pour recevoir le résultat et sa taille maximum. Elle devrait mettre à jour le tableau résultat et en retourner la taille utilisée.
  • Ligne 42, il y a un problème quand
    i
    est le dernier caractère de la chaîne.
  • Ligne 53, ce
    i++
    n'est pas à faire car on est déjà passé au prochain caractère différent à cet instant.
  • Ligne 58, attention à l'utilisation de la virgule et du point virgule. Mettre une instruction par ligne est moins risqué. Coup de bol, ce code fait ce que tu souhaitais mais certainement pour la raison que tu crois.
  • Ensuite on entre dans l'algorithme effectif. Il doit y avoir des erreurs mais c'est trop pénible à lire pour moi.

Je t'encourage donc à prendre en compte nos conseils, à mettre à jour ton code, à bien te relire. Et vu la complexité, l'utilisation d'un debuggeur est surement une piste à creuser.
Commenter la réponse de Dalfab
katouc 4 Messages postés vendredi 2 mars 2018Date d'inscription 3 mars 2018 Dernière intervention - 3 mars 2018 à 22:00
0
Merci
merci pour vos conseils
Commenter la réponse de katouc

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.