Vous êtes sur la page 1sur 8

Premier cycle

Vendredi 29 Juin 2007

I3 - Algorithmique et Langage C
Dur e : 3h00 e Documents autoris s : AUCUN (calculatrice comprise) e Remarques : Veuillez lire attentivement les questions avant de r pondre. e Le bar` me donn est un bar` me indicatif qui pourra evoluer lors de la correction. e e e Rendez une copie propre.

Position dune sous-chane (4 points)

Donnez le corps de la fonction suivante qui retourne lindice de la premi` re occurrence de sousChaine e dans chaine. Si sousChaine nest pas pr sente dans chaine, alors la fonction retourne -1. e fonction position (chaine,sousChaine : Chane de caract` res) : Entier e Vous pouvez utiliser les fonctions suivantes : fonction longueur (uneChaine : Chane de caract` res) : Naturel e . . .avec longueur() = 0 fonction iemeCaractere (uneChaine : Chane de caract` res, iemePlace : Naturel) : Caract` re e e . . .avec 0 < iemeP lace longueur(uneChaine) Solution propos e : e fonction position (chaine,sousChaine : Chane de caract` res) : Entier e D claration i,j : Entier e trouve : Bool en e d but e i1 j1 trouve FAUX tant que i<longueur(chaine)-longueur(sousChaine) et non trouve faire si j>longueur(sousChaine) alors trouve VRAI sinon si iemeCaractere(chaine,i+j-1)=iemeCaractere(sousChaine,j) alors j j+1 sinon i i+1 j1 nsi nsi ntantque si trouve alors 1

retourner i sinon retourner -1 nsi n

Palindrome (3 points)

` ` Une chane de caract` res est un palindrome si la lecture de gauche a droite et de droite a gauche e est identique. Par exemple radar, t , rotor, etc. ee En plus des deux fonctions p c dentes, vous pouvez utiliser la fonction suivante : e e fonction sousChaine (uneChaine : Chane de caract` res, debut, longueur : Naturel) : Chane e de caract` res e . . .avec : 0 < debut longueur(uneChaine), debut + longueur longueur(uneChaine), sousChaine(s,d,0)="" Ecrire une fonction r cursive qui permet de savoir si une chane est un palindrome. e Solution propos e : e fonction estUnPalindrome (uneChaine : Chane de caract` res) : Bool en e e d but e si longueur(uneChaine)=0 ou longueur(uneChaine)=1 alors retourner VRAI sinon si iemeCaractere(uneChaine,1)=iemeCaractere(uneChaine,longueur(uneChaine)) alors retourner FAUX sinon retourner estUnPalindrome(sousChaine(uneChaine,2,longueur(uneChaine)-2)) nsi nsi n

Pile et expression arithm tique (8 points) e


On suppose dans cet exercice que lon poss` de : e Le type Operateur : Type Operateur = {addition,soustraction,multiplication,division} e Le type ElementEA (pour El ment dune Expression Arithm tique) avec les op rations suie e vantes : fonction creerElementEAAPartirDUnReel (a : R el) : ElementEA e fonction creerElementEAAPartirDUnOperateur (op : Operateur) : ElementEA fonction estUnOperateur (e : ElementEA) : Bool en e fonction obtenirOperateur (e : ElementEA) : Operateur 2

fonction obtenirNombre (e : ElementEA) : R el e

3.1

Pile d l ments dexpression arithm tique (3,5 points) ee e

D nition e e Une pile est un type de donn es qui permet de stocker des el ments avec un acc` s LIFO (Last In e e First Out, Dernier Entr Premier Sortie). Il peut etre sch matis a laide de la gure 1 (ici les nombres e e e` e 1 puis 2 ont et empil s). e

empiler

dpiler

2 1
F IG . 1 une pile

3.1.1

Utilisation dune pile d l ments dexpression arithm tique (0,5 points) ee e

Soit le type PileDElementsEA avec les fonctions et proc dures suivantes : e fonction creerPileDElementsEA () : PileDElementsEA . . .qui permet de cr er une pile vide e fonction estVide (laPile : PileDElementsEA) : Bool en e . . .qui permet de savoir si une pile est vide proc dure empiler ( E/S laPile : PileDElementsEA , E e : ElementEA ) e . . .qui permet dempiler e dans laPile proc dure depiler ( E/S laPile : PileDElementsEA , S e : ElementEA ) e e ` . . .qui permet de d piler le sommet de la pile (on obtient cet el ment a laide du param` tre e e formel e). ` Soit p de type PileDElementsEA. Dessinez p (` limage de la gure 1) a lissue des instructions a suivantes : p creerPileDElementsEA() empiler(p,creerElementEAAPartirDUnReel(5)) empiler(p,creerElementEAAPartirDUnReel(3)) empiler(p,creerElementEAAPartirDUnOperateur(addition)) empiler(p,creerElementEAAPartirDUnReel(2)) empiler(p,creerElementEAAPartirDUnOperateur(multiplication))

Solution propos e : e

* 2 + 3 5

3.1.2

Conception (3 points)

` On se propose de concevoir le type PileDElementsEA a laide dune structure : Type PileDElementsEA = Structure lesElementsEA : Tableau[1. . .MAX] dElementEA nbElementsEA : Naturel nstructure Donnez le corps des fonctions et proc dures pr c dentes : creerPileDElementsEA, estVide, empie e e ler, depiler (on consid` re quon utilise correctement la pile, on ne traite pas les cas derreurs). e Solution propos e : e fonction creerPileDElementsEA () : PileDElementsEA D claration resultat : PileDElementsEA e d but e resultat.nbElementsEA 0 retourner resultat n fonction estVide (laPile : PileDElementsEA) : Bool en e d but e retourner laPile.nbElementsEA=0 n proc dure empiler ( E/S laPile : PileDElementsEA , E e : ElementEA ) e d but e laPile.nbElementsEA laPile.nbElementsEA+1 laPile.lesElementEA[laPile.nbElementsEA] e n proc dure depiler ( E/S laPile : PileDElementsEA , S e : ElementEA ) e d but e l laPile.lesElementsEA[laPile.nbElementsEA] laPile.nbElementsEA laPile.nbElementsEA-1 n 4

3.2 Evaluation dune expression arithm tique (4,5 points) e


Comme lindique la section 3.1.1, on peut stocker une expression arithm tique en notation poloe ` naise invers e (nomm e aussi postxe) a laide dune pile. e e 1. Donnez la repr sentation en notation polonaise invers e de lexpression arithmetique (2 + 3) e e (4 + 5). 2. Dessinez une pile stockant cette expression. ` 3. A limage de la suite dinstructions de la section 3.1.1, donnez la liste dinstructions qui permet de stocker lexpression arithm tique (2 + 3) (4 + 5). e 4. Donnez le corps de la proc dure suivante qui permet d valuer une expression arithm tique e e e e stock e dans une pile en d pilant ses el ments. Le param` tre erreur permet de savoir si lexe e e pression arithm tique stock e dans la pile est correcte. e e proc dure evaluer ( E/S lExpression : PileDElementsEA , S valeur : R el, erreur : Bool en e e e ) Solution propos e : e 1. 2 3 + 4 5 + 2.

* + 5 4 + 3 2
3. p creerPileDElementsEA() empiler(p,creerElementEAAPartirDUnReel(5)) empiler(p,creerElementEAAPartirDUnReel(4)) empiler(p,creerElementEAAPartirDUnOperateur(addition)) empiler(p,creerElementEAAPartirDUnReel(3)) empiler(p,creerElementEAAPartirDUnReel(2)) empiler(p,creerElementEAAPartirDUnOperateur(addition)) empiler(p,creerElementEAAPartirDUnOperateur(multiplication)) 4. proc dure evaluer ( E/S lExpression : PileDElementsEA , S valeur : R el, erreur : e e Bool en ) e 5

D claration e : ElementEA e opG,opD : R el e d but e si estVide(lExpression) alors erreur Vrai sinon depiler(lePile,e) si non estUneOperation(e) alors valeur obtenirNombre(e) erreur Faux sinon evaluer(laPile,opG,erreur) si non erreur alors evaluer(laPile,opD,erreur) si non erreur alors ` cas ou obtenirOperation(e) vaut addition: valeur opG+opD soustraction: valeur opG-opD multiplication: valeur opG*opD division: valeur opG/opD ncas nsi nsi nsi nsi n

4
1 2 3 4 5 6 7 8 9 10

Un peu de C (2 points)
Soit le programme C suivant :

# i n c l u d e < s t d l i b . h> # i n c l u d e < s t d i o . h> # d e f i n e TAILLE BUFFER 100 char s a i s i r C h a i n e ( ) { char b u f f e r [ TAILLE BUFFER ] ; s c a n f ( %s , b u f f e r ) ; return b u f f e r ; }

11 12 13 14 15 16 17 18

v o i d a f f i c h e r C h a i n e ( char c h a i n e ) { p r i n t f ( Vous a v e z t a p e %s \n , c h a i n e ) ; } i n t main ( i n t a r g c , char a r g v ) { afficherChaine ( saisirChaine ( ) ) ; r e t u r n EXIT SUCCESS ; } On compile ce programme : > g c c c Wall p e d a n t i c main . c main . c : I n f u n c t i o n s a i s i r C h a i n e : main . c : 8 : w a r n i n g : f u n c t i o n r e t u r n s a d d r e s s o f l o c a l v a r i a b l e R pondez aux questions suivantes (` chaque fois en 10 lignes maximum) : e a 1. Que signient les options -c, -Wall et -pedantic de gcc ? 2. Que signie le warning afch par gcc ? Expliquez comment r soudre ce probl` me (donnez le e e e code C) ? Solution propos e : e 1. -c pour compiler, -Wall pour afcher tous les warning, -pedantic pour avoir du code compatible ISO 2. Le warning pr vient que le pointeur retourn pointe sur une variable locale (zone m moire de e e e la pile) qui nexistera plus en sortie de la fonction. Solution : faire une allocation dynamique (zone m moire du tas). e

Et pour nir, encore du C (3 points)


Quafche le programme C suivant :

# i n c l u d e < s t d l i b . h> # i n c l u d e <s t d i o . h> void f1 ( i n t a , i n t b ) { a = b ; } v o i d f 2 ( i n t b , i n t c ) { b = c ; } void f3 ( i n t a , i n t c ) { a=c + 1 ; } i n t main ( i n t a r g c , char a r g v ) { i n t v1 , v2 , v3 ; v1 = 5 ; v2 = 8 ; v3 = 1 0 ;

p r i n t f ( Au d e p a r t : v1 = %d v2 = %d v3 = %d \ n f 1 ( v1 , &v2 ) ; p r i n t f ( A p r e s f 1 : v1 = %d v2 = %d v3 = %d \ n , f 2 (&v3 , (& v1 ) ) ; p r i n t f ( A p r e s f 2 : v1 = %d v2 = %d v3 = %d \ n , f 3 (&v3 , v2 ) ; p r i n t f ( A p r e s f 3 : v1 = %d v2 = %d v3 = %d \ n , r e t u r n EXIT SUCCESS ; }

, v1 , v2 , v3 ) ; v1 , v2 , v3 ) ; v1 , v2 , v3 ) ; v1 , v2 , v3 ) ;

Solution propos e : e Au depart : v1 = 5 v2 = 8 v3 = 10 Apres f1 : v1 = 5 v2 = 8 v3 = 10 Apres f2 : v1 = 5 v2 = 8 v3 = 5 Apres f3 : v1 = 5 v2 = 8 v3 = 9

Vous aimerez peut-être aussi