• Aucun résultat trouvé

Université de Nice-Sophia Antipolis POLYTECH

N/A
N/A
Protected

Academic year: 2022

Partager "Université de Nice-Sophia Antipolis POLYTECH"

Copied!
3
0
0

Texte intégral

(1)

Université de Nice-Sophia Antipolis POLYTECH

Elec3 2018–2019

Examen de Info C

Durée : 1h

Aucun document autorisé

Mobiles interdits Nom : Prénom :

I1. Dans la fonction suivante, insérez les affirmations qui donnent sa sémantique et qui prouvent la validité de l’énoncé itératif.

// Antécédent: ...

// Conséquent: ...

i n t mystere (i n t n) { i n t i=0 , j=1 , s =0;

// Invariant : ....

w h i l e(i <= n) {

// ...

// ...

s = s + j;

// ...

// ...

j = j + 2;

// ...

// ...

i = i + 1;

// ...

// ...

}

// ...

1

r e t u r n s;

}

// Antécédent:n>0 // Conséquent: carre(n) =n2

i n t carre (i n t n) { assert (n >=0);

i n t i=0 , j=1 , s =0;

//s=i2etj= 2i+ 1 w h i l e(i <n) {

// invariant :s=i2etj= 2i+ 1eti < n //s+j=i2+j=i2+ 2i+ 1 = (i+ 1)2 s = s + j;

//s= (i+ 1)2etj= 2i+ 1j+ 2 = 2(i+ 1) + 1 j = j + 2;

//s= (i+ 1)2etj= 2(i+ 1) + 1 i = i + 1;

//s=i2etj= 2i+ 1 }

//s=i2eti=ns=n2 r e t u r n s;

}

La finitude de la boucle est garantie par la fonction strictement décroissanten−iqui tend vers 0, valeur pour laquelle son prédicat d’achèvement sera vérifier.

. . . . I 2. Écrivez la fonction symétrique qui teste si une matrice carréen×npassée en paramètre est symétrique ou non par rapport à la diagonale principale. Par exemple, la matrice suivante est

symétrique : 

1.1 2.5 3.2 2.5 −8.9 7.1 3.2 7.1 9

L’en-tête de la fonction est le suivant : // Antécédent : ....

// Conséquent : ....

i n t symetrique (i n t n , double mat [][ n ])

/*

* Antécédent : mat matrice carré initialisée

* Conséquent : renvoie 1 si la matrice est symétique et 0 sinon

* Note : seule la demi - matrice inférieure ( sans la diagonale ) est parcourue .

*/

i n t symetrique (c o n s t i n t n , i n t mat [][ n ]) { f o r (i n t i =1; i <n; i ++) {

f o r (i n t j =0; j <i; j ++) i f ( mat [i ][ j] != mat [j ][ i ])

// mat matrice non symétrique r e t u r n 0;

//i, j[0, i], mat[i, j] =mat[j, i]

}

//i, j[0, n1], mat[i, j] =mat[j, i]

r e t u r n 1;

}

2

(2)

. . . . I3. Écrivez la fonctionlireReelqui lit sur l’entrée standard caractère à caractère (à l’aide de la fonctiongetchar(),à l’exclusionde toute autre fonction), un réel (positif ou négatif) et qui renvoie la valeur réelle (de typedouble) que représente la suite de caractères. Un réel sera formé d’une partie entière, éventuellement suivie d’un point (.), et dans ce cas, obligatoirement suivie d’une partie décimale. On ne traitera pas les cas d’erreur. Quelques exemples valides :

0.123 +34.345 -567 -230.0999 77.0 +10000.1 -234.255865 123

/*

* Rôle : renvoie le prochain réel lu sur l ’ entrée standard

*/

double lireReel (v oi d) { i n t c , negatif =0;

double n = 0;

// sauter les éventuels espaces de tête w h i l e ( isspace (c= getchar ())) ; // c est un chiffre ou + ou -

i f (c ==’+ ’ || c ==’-’) { negatif = c == ’-’;

c = getchar ();

}

// c est un chiffre do {

n = n * 10 + c - ’0 ’;

} w h i l e ( isdigit (c = getchar ()));

// c n’est pas un chiffre. Est-ce un ’.’ ? i f (c ==’. ’) {

// calculer la partie décimale c = getchar ();

// c est un chiffre i n t d =1;

do { //

n = n * 10 + c - ’0 ’;

d *=10;

} w h i l e ( isdigit (c = getchar ()));

n=n/d;

}

//r e t u r n negatif ? -n : n;

}

. . . . On lit l’entrée standard (uniquement avecgetchar,à l’exclusionde toute autre fonction) qui contient une suite de caractères1,2,−,3et4, et uniquement ces 5 caractères. Dans cette suite, on souhaite reconnaître des sous-suites qui commencent par un ou plusieurs12, suivis d’un nombre (>0) de tirets (−), suivis par un ou plusieurs34.

I4. Écrivez un programme qui lit toute l’entrée standard et qui écrit sur la sortie standard le nombre de sous-suites, appelées motifs, reconnus bâtis sur le modèle précédent. Pensez à programmer un automate fini. Par exemple, votre programme écrira2, si l’entrée standard contient :

121--341212---343434--12-343412-3 les motifs reconnus sont en rouge ci-dessous : 121--341212---343434--12-343412-3

3

L’automate qui représente les motifs à reconnaître est donné ci-dessous.

E_1 E_2

2

1

FINAL INIT

1 non 1

non 1 et non −

E_M

non 3 et non −

E_3

3 4

3

E_4

non 3 non 3

Sa programmation est simple et elle est donnée par la fonctionprochain_etatqui donne toutes les transitions.

#i n c l u d e < stdio .h >

#i n c l u d e < stdlib .h >

enum ETAT { ETAT_INIT , ETAT_1 , ETAT_2 , ETAT_M , ETAT_3 , ETAT_4 , ETAT_FINAL };

/*

* Rôle : fonction de transition qui renvoie le prochain

* état en fonction de l ’état et du caractère courant

*/

enum ETAT prochain_etat (i n t c , enum ETAT etat ) { s w i t c h ( etat ) {

c a s e ETAT_INIT :

i f (c ==’1 ’) etat = ETAT_1 ; break;

c a s e ETAT_1 :

etat = (c ==’2 ’) ? ETAT_2 : ETAT_INIT ; break;

c a s e ETAT_2 :

i f (c ==’1 ’) etat = ETAT_1 ; e l s e

etat = (c ==’-’) ? etat = ETAT_M : ETAT_INIT ; break;

c a s e ETAT_M :

i f (c ==’3 ’) etat = ETAT_3 ; e l s e

i f (c !=’-’) etat = ETAT_INIT ; break;

c a s e ETAT_3 :

etat = (c ==’4 ’) ? ETAT_4 : ETAT_INIT ; break;

c a s e ETAT_4 :

i f (c ==’3 ’) etat = ETAT_3 ; e l s e etat = ETAT_FINAL ; }r e t u r n etat ;

}

i n t main (v oi d) {

4

(3)

enum ETAT etat = ETAT_INIT ; i n t nbMotifs = 0, c , fini =0;

w h i l e (! fini )

i f ( etat == ETAT_FINAL ) { // on a reconnu un nouveau motif etat = ETAT_INIT ; nbMotifs ++;

} e l s e

i f (( c= getchar ()) == EOF ) fini =1;

e l s e

// calculer le prochain état

etat = prochain_etat (c , etat );

// EOF : on a parcouru toute l’entrée std printf (" nbMotifs = %d\n", nbMotifs );

r e t u r n EXIT_SUCCESS ; }

. . . .

5

Références

Documents relatifs

Avec la notation de pointeur, écrivez en C la fonction somme qui prend en paramètre une chaîne de caractères qui représente un entier naturel et qui renvoie la somme de ses

Écrivez de façon itérative la fonction itos qui renvoie la conversion d’un entier positif ou nul passé en paramètre, en sa représentation sous forme d’une chaîne de

Écrivez un programme qui lit sur l’entrée standard une opération arithmétique formée de 2 entiers et d’un caractère ( ’+’ , ’-’ , ’*’ ou ’/’ ) et qui écrit sur

Écrivez la fonction creerFichDates qui lit un fichier de texte contenant la suites d’entiers, et qui crée un fichier de dates valides (de type Date ).. Sans l’écrire, vous

Au lieu de retirer, à chaque itération, 1 diviseur au dividende et d’incrémenter de 1 le quotient, le diviseur est multiplié successivement par 2 pour trouver son plus grand

qui prend en paramètre une chaîne de caractères, et qui remplace chaque chiffre par le caractère ’_’ dans celle-ci.. La fonction renvoie un pointeur sur le 1er caractère de

Il est nécessaire d’écrire un destructeur pour libérer explicitement la mémoire occupée par le tableau et les 3 points du triangle

En utilisant, la classe std::ifstream et ses méthodes is_open , get , eof et close , écrivez la classe FileInputStream qui permet de lire un fichier d’octets (et uniquement