#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. |
lminuscule ou
Omajuscule, car il y a risque de les confondre avec les chiffres 1 et 0.
lreprésente à elle seule 5 problèmes!
ecriture()et
lecture()ont échangé leur corps!!! Le code commence donc bizarrement en affichant un texte, puis en en demandant le contenu!
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.
iest le dernier caractère de la chaîne.
i++n'est pas à faire car on est déjà passé au prochain caractère différent à cet instant.
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.