Anda di halaman 1dari 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 1/4

char ch [255];

// chane dorigine // chane compresse de ch

char ch_compress[255] ;

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 d'crire 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 2/4

{ int num ; char nom[20]; float prix ; int anlimite ; } facture ;

// numro de la facture // le nom du client // le prix payer en dirhams // anne limite de paiement

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 suiv num=2 nom=....... prix=... anlimite=2007 suiv .................... num=n-1 nom=...... prix= anlimite=2010 suiv num=n nom=...... prix= anlimite=2012 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 3/4

Exemple Etat de la liste avant lappel de la fonction supprimer premier num=1 nom=..x prix=.400 anlimite=2005 suiv num=2 nom=d. prix=5000 anlimite=2007 suiv . num=3 nom=a. prix=1000 anlimite=2008 suiv num=4 nom=f. prix=3000 anlimite=2010 suiv num=5 nom=.s prix=2500 anlimite=2012 NULL

Etat de la liste aprs lappel de la fonction supprimer(3) premier num=1 nom=..x prix=.400 anlimite=2005 suiv num=2 nom=d. prix=5000 anlimite=2007 suiv num=3 nom=f. prix=3000 anlimite=2010 suiv num=4 nom=.s prixt=2500 anlimite=2012 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 num=2 num=3 nom=..x nom=d. nom=f. prix=.400 prix=5000 prix=3000 anlimite=2005 anlimite=2007 anlimite=2010 suiv suiv suiv - Lappel de la fonction numero() retourne 3 num=4 nom=.s prix=2500 anlimite=2012 NULL

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 ********************************/

Page 4/4

Anda mungkin juga menyukai