Vous êtes sur la page 1sur 4

Page 1/4

PREAMBULE : La question de cours, lexercice les deux problmes


qui composent ce sujet sont indpendants et peuvent tre traits
par les candidats dans un ordre quelconque
PROBLEME I: Compression et Algorithme RLE
Dfinitions prliminaires
- La compression de donnes est le traitement informatique utilisant un algorithme
particulier, qui permet de transformer une suite de bits A en une suite de bits B plus
courte. Les suites A et B contiennent les mmes informations, mais codes dune
manire diffrente
- La dcompression est lopration inverse de la compression
- Lalgorithme RLE (Run-Length Encoding), appel en franais le codage par
plages, est un algorithme de compression informatique qui consiste reprer et
liminer la redondance des donnes. Toute suite de bits ou de caractres identiques
est remplace par un couple (caractre rpt suivi de son nombre doccurrences
(son nombre de rptitions)). Exemple: CCCCBBBRCC donne: C4B3R1C2
Dans ce qui suit, on se propose dtudier lalgorithme RLE pour compresser
des chanes de caractres :
- On appelle chane dorigine, toute chane de caractres avant sa compression.
- On appelle chane compresse de la chane dorigine ch, la chane de
caractres contenant une occurrence unique (un seul caractre) de toute suite de
caractres identiques conscutifs se trouvant dans la chane dorigine ch .
Exemple :- si ch = AAARTTAAVVTTT ,sa chane compresse = ARTAVT
- Soient ch une chane dorigine et s sa chane compresse. On appelle tableau
doccurrences de s dans ch, un tableau dentiers contenant le nombre des
rptions successives de chaque caractre de s dans la chane dorigine ch
Exemple :- Si la chane dorigine ch = BBBXXXXXXBBBYYYYYB et s sa chane
compresse, alors le tableau doccurrences de s dans ch est {:3, 6, 3, 5,1}
Mise en uvre de lalgorithme RLE en langage C
Dans ce problme, il sagit dcrire des fonctions en langage C utilisant
lalgorithme RLE pour la compression et la dcompression de chanes de caractres
Rappels :
- Une chane de caractres en langage C est un tableau de caractres se terminant
par le caractre spcial \0 (\0 ne fait pas partie de la chane mais indique sa fin)
- Le premier lment dun tableau en langage C a pour indice zro ( 0)
Remarques
- Aucune fonction de la bibliothque du langage C ne peut tre utilise. Toute
fonction doit tre dclare et dfinie avant son appel.
- On suppose que toutes le chanes de caractres manipules dans ce problme, ont
des longueurs strictement infrieurs 255.
Partie I- 1)
Dans cette partie, on se propose dcrire des fonctions en langage C sans
paramtres pour la compression et la dcompression de chane de caractres
- On suppose avoir dclar comme suit les variables globales ch pour la chane
dorigine et ch_compress pour sa chane compresse)
Page 2/4
char ch [255]; // chane dorigine
char ch_compress[255] ; // chane compresse de ch
Question I- 1 -1) Dclarer en langage C une variable globale tableau de nom
occur destine contenir le tableau doccurrences de ch_compress dans ch,
Question I- 1 -2) Ecrire le code dune fonction dentte : void compresser()
qui met dans la chane ch_compress , la chane compresse de ch
Exemple : - Si la chane ch = AAAXRRZZZAAAA
- Aprs lappel de la fonction compresser() , ch_compress =AXRZA
Question I- 1 -3) Ecrire le code dune fonction dentte: void occurrence()
qui remplit le tableau occur (occurrences de ch_compress dans ch)
Exemple
- Si la chane dorigine ch = DDDRRRRDTTYYYY,
- Aprs lappel de la fonction occurrence (), les lments du tableau occur
sont : occur[0]=3, occur[1]=4, occur[2]=1, occur[3]=2, occur[4]=4
Question I- 1-4) Ecrire le code dune fonction dentte : void decompresser() qui
permet de dcompresser la chane ch_compress en chane dorigine ch
Exemple :
- Si la chane ch_compress = BACB et occur={3,5,4,1}
- Aprs lappel de la fonction decompresser(),ch=BBBAAAAACCCCB
Partie I- 2)
Dans cette partie, on se propose de compresser une chane de caractres
sans utiliser le tableau doccurrences et en crivant des fonctions avec des
paramtres
- On appelle chane code dune chane dorigine, la chane de caractres
contenant une occurrence unique de toute suite de caractres identiques conscutifs
se trouvant dans la chane dorigine, suivie du nombre doccurrence du caractre
dans la chane dorigine
Question I- 2-1) Ecrire le code dune fonction dentte :
void coder(char *s,char *s_codee) qui permet de mettre dans la chane
dadresse s_codee , la chane code de s,
Exemple : - Si la chane s = EEEEEAAACCCCAAX
- Aprs lappel de la fonction coder(s,s_codee) , s_codee=E5A3C4A2X1
Question I- 2-2) Ecrire le code dune fonction en langage C dentte :
void transformer(char *s) qui permet de transformer le contenu de la chane
dorigine s pour quelle devienne sa chane code.
Exemple :
- Si la chane s= EEEEEAAACCCCAAX
- Aprs lappel de la fonction transformer(s) s=E5A3C4A2X1
PROBLEME II : Mise jour des factures dun magasin
On se propose dcrire une application en langage C qui permet de mettre
jour des factures dun magasin qui nont pas encore t payes. Chaque facture est
dfinie selon le type facture suivant :
typedef struct
Page 3/4
{ int num ; // numro de la facture
char nom[20]; // le nom du client
float prix ; // le prix payer en dirhams
int anlimite ; // anne limite de paiement
} facture ;
Pour ce faire :
- on suppose avoir dj cre dans la mmoire dynamique (le tas) une liste
chane reprsentant ces factures. Cette liste est dfinie comme suit :
typedef struct tlist
{ facture info ;
struct tliste *suiv; // adresse de llment suivant
} liste; // liste chane qui contiendra la liste des factures
- On suppose aussi avoir les dclarations globales suivantes :
const int ancourant=2010 ; // anne en cours
liste *premier; // pointeur sur le premier lment de la liste
- Dans cette liste les lments sont relis par ordre croissant danne limite
de paiement. Chaque lment reprsentant une facture de numro i contient dans
son champ suiv, ladresse de llment suivant reprsentant une facture de numro
(i+1). En plus, lanne limite de paiement de la facture numro i est strictement
infrieur lanne limite de paiement de la facture numro( i+1).
Remarques :
- La premire facture de la liste a le numro 1
- La dernire facture de la liste a dans son champ suiv la valeur NULL
Exemple de reprsentation de cette liste de factures
premier
num=1
nom=.....
prix=....
anlimite=2005
num=2
nom=.......
prix=...
anlimite=2007
.................... num=n-1
nom=......
prix=
anlimite=2010
num=n
nom=......
prix=
anlimite=2012
suiv suiv suiv NULL
Remarque : Aucune fonction de la bibliothque du langage C ne sera utilise
Question II- 1) Ecrire le code dune fonction dentte int nombre() qui retourne le
nombre de factures reprsentes dans la liste chane identifie par ladresse
premier qui est ladresse de son premier lment
Question II- 2) Ecrire le code dune fonction dentte void supprimer(int val) qui
supprime de la liste la facture de numro val (cette facture vient dtre paye) et met
jour les numros des factures de telle sorte garder la proprit ( une facture de
numro i est reli llment suivant reprsentant une facture de numro (i+1)).
Dans le cas o val ne correspond aucun numro dune facture de la liste, la
fonction ne fait rien
Page 4/4
Exemple
Etat de la liste avant lappel de la fonction supprimer
premier
num=1
nom=..x
prix=.400
anlimite=2005
num=2
nom=d.
prix=5000
anlimite=2007
. num=3
nom=a.
prix=1000
anlimite=2008
num=4
nom=f.
prix=3000
anlimite=2010
num=5
nom=.s
prix=2500
anlimite=2012
suiv suiv suiv suiv NULL
Etat de la liste aprs lappel de la fonction supprimer(3)
premier
num=1
nom=..x
prix=.400
anlimite=2005
num=2
nom=d.
prix=5000
anlimite=2007
num=3
nom=f.
prix=3000
anlimite=2010
num=4
nom=.s
prixt=2500
anlimite=2012
suiv suiv suiv NULL
Question II- 3) Ecrire le code dune fonction dentte : int numero() qui
retourne le plus petit numro dune facture dont lanne limite est suprieure ou
gale lanne en cours (le plus petit numro dune facture en rgle)
Cette fonction doit retourner 0 si toutes les factures de la liste ont une anne
limite de paiement strictement infrieure lanne en cours
Exemple dexcution
- Soit la liste suivante :
premier
num=1
nom=..x
prix=.400
anlimite=2005
num=2
nom=d.
prix=5000
anlimite=2007
num=3
nom=f.
prix=3000
anlimite=2010
num=4
nom=.s
prix=2500
anlimite=2012
suiv suiv suiv NULL
- Lappel de la fonction numero() retourne 3
Question II- 4) Ecrire le code dune fonction dentte void maj () qui permet
daugmenter de 10% par an de retard les prix de toutes les factures de la liste dont
lanne limite de paiement est strictement infrieure lanne en cours
Exemple:
Soit la facture ayant lanne limite de paiement 2008 et le prix=100dh
- Si lanne en cours est 2010 , le nouveau prix deviendra 121 dh
(De 2008 2009 on augmente le prix de 10% soit 110, de 2009 2010(lanne en
cours), on augmente 110dh de 10% soit 121 dh)
/************************FIN DE Lpreuve ********************************/

Vous aimerez peut-être aussi