Examen de GL1 - Université de la Manouba

Informatique, Programmation, Méthodes de développement · exam

Voir tous les documents en programmation

Universit de la Manouba

cole Nationale des Sciences de lInformatique

Examen

Classe : II2

Module : GL1

Enseignantes : H. H. BEN GHEZALA, N. BEN YAHIA, H. BENALI, S. ZBIDI

Dur e : 2 heures

Documents : non autoris s

Date : 19 Janvier 2013

Question de cours (5pts) (0.5 * 10)

1. Quest-ce quun mod le ? En donner deux types.

2. Quest-ce quun langage ? En donner deux types.

3. Quest-ce quune m thode ? Par quoi est-elle d finie ?

4. Quelle diff rence y-a-t-il entre une m thode et un mod le ?

5. Choisir la ou les bonnes r ponses (chaque r ponse non justifi e ne sera pas not e)

5.1 Un processus de d veloppement :

a) Fixe un cadre rigoureux pour le d veloppement de projet de taille importante.

b) Est une perte de temps.

c) Doit sappliquer la lettre.

d) Peut tre it r .

e) Peut sappuyer sur plusieurs mod les de processus.

5.2 Cest le r le dun chef de projet :

a) De programmer les composants dun logiciel.

b) De v rifier le bon d roulement des t ches.

c) Dorganiser lencha nement des t ches.

d) De fournir une visibilit globale sur un projet.

e) D crire la sp cification du logiciel.

5.3 Parmi les choix suivants, indiquez lesquels sont des principes de conception :

a) Transaction.

b) Abstraction.

c) Raffinement.

d) It ration.

e) Modularit .

5.4 Le couplage faible permet de :

a) comprendre le fonctionnement d'une classe sans en analyser d'autres

b) modifier une classe sans affecter les autres.

c) am liorer la maintenabilit .

5.5 La duplication de code :

a) est un indicateur de mauvaise conception.

b) rend la maintenance plus difficile.

c) peut conduire l'introduction d'erreurs lors de la maintenance.

5.6 Une bonne coh sion implique que :

a) Une m thode doit tre responsable d'une et une seule t che bien d finie.

b) Chaque m thode effectue sa t che de fa on ind pendante du reste du programme.

c) Une classe doit repr senter une seule entit bien d finie.

Exercice 1 (3pts) (2pts + 1pt)

Le cahier des charges d'une application de location de cassettes vid o pr cise que :

le client peut

"

louer et rapporter des cassettes; les locations sont enregistr es ainsi que les clients

le g rant peut

" ajouter/supprimer des cassettes au catalogue

" changer les prix des cassettes au tarif

l'application

" calcule le prix d'une location selon le tarif des cassettes emprunt es et la dur e de l'emprunt

" g n re des tats de caisse en fin de journ e.

1/6

1. Utiliser les diagrammes de flots de donn es pour sp cifier les fonctionnalit s de cette application :

a) Dessiner le diagramme de contexte.

b) Raffiner ce diagramme en faisant appara tre une fonction de gestion des locations de

cassettes, entour e d'autres fonctions, flots et stockages.

c) Raffiner un deuxi me niveau la fonction de gestion des locations de cassettes.

2. Donner une architecture fonctionnelle de lapplication de location de cassettes vid o en pr cisant

clairement la circulation et les changes des donn es.

Exercice 2 : Couplage/Coh sion (4pts)

2/6

1. Quels sont les probl mes de coh sion li s au code C1. Proposer une solution pour corriger C1.

(2pts)

2. Quels sont les probl mes de couplage li s au code C2. Proposer une solution pour corriger C2.

(2pts)

C1

C2

public static void circonferenceCercle()

{

// Lecture du rayon

System.out.print("Entrer le rayon du cercle: ");

double rayon = Keyboard.readDouble();

while(Keyboard.error() || rayon < 0)

{

System.err.println("Mauvaise valeur de rayon.");

System.out.print("Entrer le rayon du cercle: ");

Publicité

rayon = Keyboard.readDouble();

}

// Calcul du circonference

double circonference = 2 Math.PI rayon;

// Affichage du circonference

System.out.println("La

circonference);

}

circonference

est

" +

public class Triangle {

// Colonne courante, ligne courante et nombre total de

lignes

public static int colonne, ligne, total;

// Affiche un triangle de nbLignes lignes.

public static void afficheTriangle(int nbLignes) {

total = nbLignes;

for(ligne = 0; ligne < total; ++ligne) {

colonne = 0;

afficheEspaces();

afficheLettres();

System.out.println(); }

}

// Affiche les espaces au debut de la ligne courante.

public static void afficheEspaces() {

while(colonne < ligne) {

System.out.print( );

++colonne; }

}

// Affiche les etoiles de la ligne courante.

public static void afficheLettres() {

while(colonne < total) {

System.out.print((char)(a + ligne));

++colonne; }

}

}

Probl mes de coh sion

" trois taches ind pendantes : lecture, calcul et affichage.

" r p tition du code

" Probl mes de r utilisation et de maintenabilit

Solution : Fractionnement en m thodes plus coh sives et plus r utilisables

// Lit le rayon (positif) dun cercle au clavier.

public static double lireRayon()

{

System.out.print("Entrer le rayon du cercle: ");

double rayon = Keyboard.readDouble();

while(Keyboard.error() || rayon < 0)

{

System.err.println("Mauvaise valeur de rayon.");

System.out.print("Entrer le rayon du cercle: ");

rayon = Keyboard.readDouble();

}

return rayon;

}

// Calcule la circonference dun cercle de rayon donne.

public static double circonferenceCercle(double rayon)

{

return 2 Math.PI rayon;

}

// Affiche la circonference dun cercle

public static void afficheCirconference(double circonference)

{

3/6

System.out.println("La circonference est " + circonference);

}

Probl mes de couplage

" ces m thodes ne sont pas r utilisables

" maintenabilit : le changement dune m thode ou variable affectera le comportement dautres m thodes

" afficheEspaces() et afficheLettres() d pendent des variables globales colonne, ligne et total

" afficheEspaces() d pend dafficheTriangle()

" afficheLettres() d pend dafficheEspaces() et dafficheTriangle()

Solution : Ecrire des m thodes ind pendantes

Eviter autant que possible les variables globales (statiques de classe)

R crire afficheEspaces() pour enlever son couplage

public static void afficheEspaces(int combien)

{

int i;

for(i = 0; i < combien; ++i)

System.out.print( );

}

R crire afficheLettres() pour enlever son couplage et G n raliser afficheEspaces() pour

repeteCaracteres()

public static void repeteCaracteres(char c, int combien)

Publicité

{

int i;

for(i = 0; i < combien; ++i)

System.out.print(c);

}

R crire afficheTriangle() pour enlever son couplage

public static void afficheTriangle(int nbLignes)

{

int ligne;

for(ligne = 0; ligne < nbLignes; ++ligne)

{

repeteCaracteres( , ligne);

repeteCaracteres((char)(a + ligne), nbLignes - ligne);

System.out.println();

}

}

Exercice 3 : Couplage (4pts) (1 + 3pts)

1. Expliquer le principe des diff rents niveaux de couplage suivants : contenu, global, contr le,

structure de donn es, donn es.

2. Pour chacun des sc narios A, B et C (pages 3, 4, 5) identifiez le niveau de couplage parmi les cinq

niveaux pr c dents. Justifiez vos r ponses en indiquant les l ments qui ont motiv votre choix.

Sc nario A et B : couplage globale (utilisation des variables globales (extern string gEntete;

extern string gPiedDePage; ))

Sc nario C : couplage de donn es (utilisation des variables locales string gEntete = "";string gPiedDePage

= "Copyright 2004"; )

NB : Si on souhaite quun objet (une fonction, une variable, etc.) soit utilisable dans tous les fichiers

du projet, il faut le d clarer externe, en utilisant le mot-cl extern .

Exercice 4 : Tests (4pts) (1 * 4)

4/6

Soit le programme suivant :

lire(x)

lire(y)

z = 0

signe = 1

si x < 0 alors

signe = -1

x = - x

finsi

si y < 0 alors

signe = - signe

y = - y

finsi

tant que x >= y faire

x = x - y

z = z + 1

fin

z = signe * z

1. Dessiner le graphe de contr le associ ce programme en num rotant ses nSuds.

2. Par quelle suite de nSuds faut-il passer pour satisfaire le crit re de couverture des instructions ?

Donner un jeu dessai minimum qui satisfasse ce crit re.

5/6

3. Par quelle suite de nSuds faut-il passer pour satisfaire le crit re de couverture des arcs ? Donner

un jeu dessai minimum qui satisfasse ce crit re.

4. On appelle crit re de couverture des i-chemins, le crit re qui garantit que lon passe sur tous les

chemins possibles en r p tant de 0 i fois chaque boucle. Par quelle suite de nSuds faut-il passer

pour satisfaire le crit re de couverture des 1-chemins? Donner un jeu dessai minimum qui

satisfasse ce crit re.

6/6

Sc nario A

Module Menu

Module Imprime

//---Menu.h---------------------------

#ifndef MENU_H

#define MENU_H

//---Imprime.h---------------------------

#ifndef IMPRIMME_H

#define IMPRIMME_H

#include <string>

#include <ostream>

void Imprime(ostream &ost, int x);

#endif

//---Imprime.cpp-------------------------

#include <ostream>

using namespace std;

#include "menu.h"

void Imprime(ostream &ost, int x)

{

ost << gEntete << endl;

Calcul_et_affiche(ost, x);

ost << gPiedDePage << endl;

}

extern string gEntete;

extern string gPiedDePage;

#endif

Publicité

//---Menu.cpp-------------------------

#include <iostream>

#include <string>

using namespace std;

#include "imprime.h"

string gEntete = "";

string gPiedDePage = "Copyright 2004";

void menu(void)

{

for(;;)

{

cout << endl

<< "Menu:" << endl

<< " 1- Changer l'entete" << endl

<< " 2- Changer le pied de page" << endl

<< " 3- Imprimer" << endl

<< " 4- Quitter" << endl;

char c;

cin >> c;

switch( c)

{

case '1':

cout << "Entete: " << endl;

cin >> gEntete;

break;

case '2':

cout << "Pied de page: " << endl;

cin >> gPiedDePage;

break;

case '3':

cout << "Quel mois: " << endl;

int x;

cin >> x;

Imprime(cout, x);

break;

case '4':

return;

}

}

}

7/6

Sc nario B

Module Menu

Module Imprime

//---Menu.cpp-------------------------

#include <iostream>

#include <string>

using namespace std;

//---Imprime.h---------------------------

#ifndef IMPRIMME_H

#define IMPRIMME_H

#include "imprime.h"

#include <ostream>

extern string gEntete;

extern string gPiedDePage;

void Imprime(ostream &ost, int x);

#endif

//---Imprime.cpp-------------------------

#include <ostream>

#include <string>

using namespace std;

string gEntete = "";

string gPiedDePage = "Copyright 2004";

void Imprime(ostream &ost, int x)

{

ost << gEntete << endl;

// Calcul_et_affiche(ost, x);

ost << gPiedDePage << endl;

}

void menu(void)

{

for(;;)

{

cout << endl

<< "Menu:" << endl

<< " 1- Changer l'entete" << endl

<< " 2- Changer le pied de page" << endl

<< " 3- Imprimer" << endl

<< " 4- Quitter" << endl;

char c;

cin >> c;

switch( c)

{

case '1':

Publicité

cout << "Entete: " << endl;

cin >> gEntete;

break;

case '2':

cout << "Pied de page: " << endl;

cin >> gPiedDePage;

break;

case '3':

cout << "Quel mois: " << endl;

int x;

cin >> x;

Imprime(cout, x);

break;

case '4':

return;

}

}

}

8/6

Sc nario C

Module Menu

Module Imprime

//---Imprime.h---------------------------

#ifndef IMPRIMME_H

#define IMPRIMME_H

#include <ostream>

#include <string>

void Imprime(ostream &ost, int x,

string entete, string piedDePage);

#endif

//---Imprime.cpp-------------------------

#include <ostream>

#include <string>

using namespace std;

void Imprime(ostream &ost, int x, string

entete, string piedDePage)

{

ost << entete << endl;

// Calcul_et_affiche(ost, x);

ost << piedDePage << endl;

}

//---Menu.cpp-------------------------

#include <iostream>

#include <string>

using namespace std;

#include "imprime.h"

string gEntete = "";

string gPiedDePage = "Copyright 2004";

void menu(void)

{

for(;;)

{

cout << endl

<< "Menu:" << endl

<< " 1- Changer l'entete" << endl

<< " 2- Changer le pied de page" << endl

<< " 3- Imprimer" << endl

<< " 4- Quitter" << endl;

char c;

cin >> c;

switch( c)

{

case '1':

cout << "Entete: " << endl;

cin >> gEntete;

break;

case '2':

cout << "Pied de page: " << endl;

cin >> gPiedDePage;

break;

case '3':

cout << "Quel mois: " << endl;

int x;

cin >> x;

Imprime(cout, x,

gEntete, gPiedDePage);

break;

case '4':

return;

}

}

}

9/6