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: ");
Advertisement
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)
Advertisement
{
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
Advertisement
//---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':
Advertisement
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