INF123 - Examen
12 mai 2016
´
El´ements de correction
Partie 1 : Ensembles de mots (5 points)
Question 1 :
(0,5 point) Dessinez un exemple de valeur de la variable noms (d´eclar´ee ligne 21) repr´esentant l’ensemble
{crayon, chat, papillon, gendarme, potage, bateau}.
crayon
chat
papillon
gendarme
potage
bateau
6
tab card
Question 2 :
(2,5 points)´
Ecrivez les fonctions :
init vide (lignes 23-25) qui initalise un ensemble vide.
est vide (lignes 27-29) qui retourne 1si e est vide,0sinon.
chercher (lignes 31-33) qui recherche le mot mdans l’ensemble eet qui retourne
l’indice o`u se trouve ms’il est pr´esent dans e,
-1 sinon.
ajouter (lignes 35-37) qui ajoute le mot m`a l’ensemble e, s’il n’est pas d´ej`a pr´esent.
void i n i t v i d e ( ens mots e ) {
e>card=0 ;
}
i n t e s t v i d e ( en s m o ts e ) {
return e>card==0 ;
}
i n t c h e r c h e r ( e ns m o ts e , char m [ ] ) {
i n t i =0 ;
while (i<e>card && strcmp ( e>tab [ i ] , m) ) {
i++ ;
}
i f ( i==e>c a rd ) r e t u r n 1 ;
e l s e r e t u r n i ;
}
void a j o u t e r ( e ns mots e , char m[ ] ) {
i n t i ;
i=c h e r c h e r ( e , m) ;
i f ( i ==1) {
s t r c p y ( e>tab [ e>card ] , m) ;
e>card++ ;
}
}
Question 3 :
(2 points)´
Ecrivez la fonction initialiser (lignes 39-41) qui initialise l’ensemble de mots m`a partir des
mots contenus dans le fichier de nom nom fich. Si l’ouverture du fichier est impossible, un message d’erreur
appropri´e est affice et le programme se termine.
void i n i t i a l i s e r ( ens mots e , c har no m fich [ ] ) {
FILE f ;
char mot [LG MAX MOTS] ;
f=f o pen ( nom fich , ” r ” ) ;
i f ( f==NULL) {
f p r i n t f ( s t d e r r , o u ve rt ur e de %s i m p o s s i b l e \n ” , n om f i ch ) ;
e x i t ( 2) ;
}
i n i t v i d e ( e ) ;
f s c a n f ( f , %s , mot ) ;
w h i l e ( ! f e o f ( f ) ) {
a j o u t e r ( e , mot ) ;
f s c a n f ( f ,% s , mot ) ;
}
f c l o s e ( f ) ;
}
Partie 2 : Lignes (5 points)
Question 4 :
(2 points)´
Ecrivez la fonction lire ligne (lignes 43-46) dont la sp´ecification est la mˆeme que la fonction
lire ligne de l’interpr´eteur : f´etant un descripteur de fichier ouvert en lecture, la fonction lit et stocke dans
phrase la prochaine ligne de ce fichier sous la forme d’une chaˆıne de caract`eres, c’est-`a-dire en rempla¸cant
le \n’ par \0’. Elle renvoie 0si la fin de fichier est atteinte sans qu’aucun caract`ere n’ait ´et´e lu, 1sinon.
i n t l i r e l i g n e ( FILE f , char phrase [ ] ) {
char c ;
i n t i =0 ;
f s c a n f ( f , %c ” , &c ) ;
w h i l e ( ! f e o f ( f ) && c ! = \n ’ ) {
p hr a s e [ i ]= c ;
i++ ;
f s c a n f ( f , %c ” , &c ) ;
}
phrase [ i ]= ’\0 ’ ;
i f ( f e o f ( f ) && ( i ==0)) r e t u r n 0 ;
e l s e r e t u r n 1 ;
}
Question 5 :
(3 points)´
Ecrivez la fonction prochain mot.
void proc h a i n m ot ( char phrase [ ] , i n t in d c ou r , char mot [ ] ) {
i n t i =0 ;
i n t j =ind cour ;
w h i l e ( p h r a se [ j ]== ’ ’ ) {
j++ ;
}
w h i l e ( p h r a se [ j ] ! = \0 && p h ra s e [ j ] ! = ’ ) {
mot [ i ]= p h r a s e [ j ] ;
i ++;
j ++;
}
mot [ i ] = \0 ’ ;
i n d c o u r=j ;
}
Partie 3 : Automate reconnaisseur (5 points)
Question 6 :
(1 point) Dessinez l’automate obtenu en ajoutant un nouvel ´etat de num´ero 6 vers lequel vont toutes les
transitions qui ne sont pas dessin´ees sur l’automate de la figure 3, en particulier les transitions ´etiquet´ees
par INCONNU.
Indication : l’´etat 6 est un ´etat puits, c’est-`a-dire que toutes les transitions issues de l’´etat 6 m`enent `a
l’´etat 6.
2
0 1 2 3 4 5
ARTICLE VERBE ARTICLE NOM
NOM
6
<> ARTICLE
<>NOM
<>VERBE
<>ARTICLE
<>NOM
TOUT
TOUT
Question 7 :
(1 point) En consid´erant l’ensemble d’entr´ees {ARTICLE, ADJECTIF, NOM, VERBE, CONJONCTION, INCONNU},
compl´etez l’automate pour tenir compte des adjectifs et des conjonctions. Veillez `a ce que de chaque ´etat
soit issue une et une seule transition pour chaque entr´ee possible.
0 1 2 3 4 5
ARTICLE VERBE ARTICLE NOM
NOM
6
<> ARTICLE
<>ARTICLE
TOUT
ADJECTIF ADJECTIF ADJECTIF
ADJECTIF
CONJONCTION
<.>{NOM, ADJECTIF}
<.>{NOM, ADJECTIF}
<>{VERBE, ADJECTIF}
<>{CONJONCTION, ADJECTIF}
Question 8 :
(1 point) Repr´esentez la fonction de transition de votre automate par un tableau `a deux dimensions dont
les lignes sont index´ees par les num´eros des ´etats (de 0`a 6), et les colonnes par les entr´ees.
Etat\Entree ARTICLE ADJECTIF NOM VERBE CONJONCTION INCONNU
01 6 6 6 6 6
16 1 2 6 6 6
26 2 6 3 6 6
34 6 6 6 6 6
46 4 5 6 6 6
56 5 6 6 0 6
06 6 6 6 6 6
Question 9 :
(2 points) La fonction analyse renvoie 1si la chaˆıne phrase en argument est reconnue par l’automate, 0
sinon. `
A l’aide des fonctions prochain mot et nature mot, compl´etez cette fonction.
i n t a n a l y s e ( c ha r p h r as e [ ] ) {
i n t t r a n s i t i o n [ 7 ] [ 6 ] ={
/de 0 /{1 , 6 , 6 , 6 , 6 , 6},
/de 1 /{6 , 1 , 2 , 6 , 6 , 6},
/de 2 /{6 , 2 , 6 , 3 , 6 , 6},
/de 3 /{4 , 6 , 6 , 6 , 6 , 6},
/de 4 /{6 , 4 , 5 , 6 , 6 , 6},
/de 5 /{6 , 5 , 6 , 6 , 0 , 6}, /t o ut bon /
/de 6 /{6 , 6 , 6 , 6 , 6 , 6}/p o u b e l l e /
};
i n t i =0 ;
char mot [LG MAX MOTS] ;
i n t e t a t c o u r =0 ;
3
i n t e t a t s u i v ;
i n t e n t r e e ;
w h i l e ( p hr a s e [ i ] ! = \0 ’ ) {
p ro ch a in m o t ( p hr as e , &i , mot ) ;
e n t r e e=n at ur e mo t ( mot ) ;
e t a t s u i v=t r a n s i t i o n [ e t a t c o u r ] [ e nt re e ] ;
e t at c o u r=e t a t s u i v ;
}
r e t u r n ( e t a t c o u r ==5) ;
}
Partie 4 : Shell (2 points)
Question 10 :
(2 points)´
Ecrivez un script shell qui prend en arguments un ou plusieurs noms de fichiers contenant des
phrases et qui affiche pour chacun d’eux :
les phrases du fichier <nom du fichier> sont correctes
si toutes les phrases du fichier son correctes
le fichier <nom du fichier> contient au moins une phrase incorrecte
sinon.
De plus, le script affichera un message d’erreur si aucun argument ne lui est fourni, ou si un des arguments
n’est pas le nom d’un fichier existant.
Indications : Si toutes les phrases du fichier analys´e sont correctes, le programme analyser ne produit
pas d’affichage. Sinon, une ligne est afficee par l’instruction de la ligne 113. On rappelle (cf memo-bash)
que le test [ -n <cha^ıne> ] vaut vrai si la chaˆıne n’est pas vide.
#!/ b in / bash
i f [ $# eq 0 ]
then
echo $0 n e c e s s i t e au moins un argument
e x i t
f i
f o r f i l e i n $
do
i f [ ! f $ f i l e ]
then
echo $ f i l e n ’ e x i s t e pas ”
e l s e
i n c o r r e c t=$ ( . / a n al ys e r A r t i c l e s Noms A d j e c t i f s Verbes C onj o nc tio n s $ f i l e
|grep pa s c o r r e c t e )
i f [ n ”$incorrect ]
then
echo $ f i l e c o n t i e n t au moins une phrase i n c o r r e c t e
e l s e
echo l e s ph ra se s du f i c h i e r $ f i l e s on t c o r r e c t e s
f i
f i
done
Partie 5 : Intersection d’ensembles (3 points)
Question 11 :
(2 points)´
Ecrivez une fonction de profil
void intersection(ens mots *A, ens mots *B, ens mots *C) (lignes 80-82)
qui construit dans Cl’intersection des ensembles Aet B.
Indications
Utilisez les fonctions sur les ensembles de mots de la partie 1.
Les ensembles ne sont pas tres. Un algorithme possible est le suivant : pour chaque ´el´ement de A, on
cherche s’il est dans B, si oui, on l’ajoute `a C.
void i n t e r s e c t i o n ( e n s m o ts A, ens mo t s B, ens m o t s C) {
4
i n t i ;
i n i t v i d e (C) ;
f o r ( i =0 ; i <A>c ar d ; i ++) {
i f ( c h e r c h e r (B , A>tab [ i ] ) != 1) {
a j o u t e r (C, A>tab [ i ] ) ;
}
}
}
Question 12 :
(1 point) Compl´etez la fonction main en signalant par un message si les ensembles des noms et des
adjectifs, ou si les ensembles des noms et des verbes, ont une intersection non vide (on ne teste pas d’autres
intersections d’ensembles). Ne recopiez pas toute la fonction main, indiquez les modifications apport´ees `a
l’aide des num´eros de lignes.
ens mots InterNomsAdjs , InterNomsVerbes ;
i n t e r s e c t i o n (&noms , &a d j e c t i f s , &InterNomsAdjs ) ;
i n t e r s e c t i o n (&noms , &v e r b e s , &InterNomsVerbes ) ;
i f ( ! e s t v i d e (& InterNomsAdjs ) ) {
p r i n t f ( At t en ti on : homonymies e nt r e noms e t a d j e c t i f s \n ” ) ;
}
i f ( ! e s t v i d e (& InterNomsVerbes ) ) {
p r i n t f ( At t en ti on : homonymies e nt r e noms e t ver b es \n ” ) ;
}
Bonus : intersection de s´equences tri´ees (2 points)
Question 13 :
(2 points)a) La fonction intersection que vous avez ´ecrite `a la question 11 r´epond-elle au probl`eme
(c’est-`a-dire, si Aet Bsont tri´es, est-ce que Cl’est) ? Justifiez votre r´eponse
b) En tirant parti du fait que Aet Bsont tri´es, ´ecrivez une nouvelle fonction C intersection triee
(lignes 84-86) plus efficace.
On rappelle que la comparaison selon l’ordre lexicographique des chaˆınes de caract`eres s’effectue avec la
fonction int strcmp(char ch1[], char ch2[]) dont le r´esultat est n´egatif, nul ou positif selon que ch1
est avant ch2, ´egal `a ch2, ou apr`es ch2 dans l’ordre lexicographique.
a) Oui : les mots de A, tri´es par ordre croissants sont examin´es dans cet ordre et ins´er´es le cas ´ech´eant selon le
mˆeme ordre.
void i n t e r s e c t i o n t r i e e ( e n s m o t s A, ens mo t s B, ens m o t s C) {
i n t i , j , k ;
i n t rescomp ;
i n i t v i d e (C) ;
i =0 ; j =0 ; k=0 ;
while ( i <A>ca r d && j <B>card ) {
rescomp= strcmp (A>tab [ i ] , B>tab [ j ] ) ;
i f ( rescomp==0) {
s t r c p y (C>tab [ k ] , A>tab [ i ] ) ;
i++ ; j++ ; k++ ;
}
e l s e i f ( rescomp <0)
i++ ;
e l s e
j ++;
}
C>card=k ;
}
5
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !