Académique Documents
Professionnel Documents
Culture Documents
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.
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
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
3.1
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
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
* + 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
, v1 , v2 , v3 ) ; v1 , v2 , v3 ) ; v1 , v2 , v3 ) ; v1 , v2 , v3 ) ;