Examen GL1

Programming and Software Engineering · exam

Université de la Manouba École Nationale des Sciences de l’Informatique

Examen

Classe : II2 Module : GL1 Enseignantes : L. BEN AYED JEMNI, R. DRIRA, N. BEN YAHIA, S. ZBIDI Date : 23 Janvier 2014

Durée : 2 heures Documents : non autorisés

Questions de réflexion (5pts)

1. Expliquer pourquoi est ce qu’on teste des programmes? Quand s’arrêter de tester ? 2. Définir ce que représente un module logiciel. Quel est l’objectif de la décomposition modulaire. 3. A votre avis quels sont les critères à respecter dans la décomposition modulaire qui participent à la

décision de l’arrêt de la décomposition.

4. Quelle est la différence entre les styles d’architecture MVC et 3-tiers? Dans quel cas on choisit la

première et/ou la deuxième. Donner un exemple.

5. Pour avoir une bonne cohésion, une méthode doit être responsable d’une et une seule tâche bien définie et une classe doit représenter une seule entité bien définie. Donner un cas, illustré par un exemple, où une méthode qui concerne une classe bien définie n’apparaît pas dans cette classe?

Exercice 1 (6pts)

Le cahier des charges d'une application de réservation de places sur un vol précise que : – Un utilisateur peut

 Réserver et annuler une réservation d’une place sur un vol. Les réservations sont enregistrées  Une réservation peut être effectuée par internet ou dans une agence

–

le gérant peut

 Ajouter/supprimer un vol  Changer les prix des places au tarif

–

l'application

 Calcule le prix d'une place sur un vol selon la période  Actualise les états des vols (complets ou non)  Actualise les états des réservations (annuler, confirmer ou date limite de confirmation

Publicité

différée)

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 réservations

2. Proposer une architecture pour l’application de réservation de places sur un vol. Justifier vos choix.

entourées d'autres fonctions, flots et stockages.

Exercice 2 (5pts)

1. Identifier les problèmes de couplage et ceux de cohésion liés à la classe Java Anonyme. Expliquer. 2. Proposer une solution pour résoudre ces problèmes.

Import java.beans.Statement; Import java.sql.Connection; Import java.sql.DriverManager; Import java.sql.ResultSet; Import java.sql.SQLException;

public class Anonyme {

public Connection connexion; public Statement instruction; public ResultSet résultat; public int id; public String Nom; public String login; public String psw;

1/3

public void ConnexionBD() {

try { Class.forName("com.mysql.jdbc.Driver"); connexion =

DriverManager.getConnection("jdbc:mysql://localhost:3306/Projet", "root", "admin");

instruction = (Statement) connexion.createStatement(); } catch (ClassNotFoundException ex) { System.err.println("Problème de pilote"); } catch (SQLException ex) { System.err.println("Base de données non trouvée ou requête incorrecte"); } }

Public ResultSet lire(String requête) { try { résultat = ((java.sql.Statement) instruction).executeQuery(requête); } catch (SQLException ex) { System.err.println("Requête incorrecte "+requête); }

Return résultat;

}

Public Boolean authentification(){

Publicité

Connexion BD(); boolean auth = false; ResultSet résultat = lire("select psw from Identification where

login = '" + login + "'");

try {

if (!résultat.isBeforeFirst()) { auth = false ; } else {

while(résultat.next()){ if(résultat.getString(1).equals(psw))

{ auth = true ; } else { auth = false ; }

} } }

catch (SQLException e1) {

// TODO Auto-generated catch block e1.printStackTrace();

} arrêt(); return auth; }

Public void AjouterPersonne(){

ConnexionBD(); try { ((java.sql.Statement) instruction).executeUpdate("insert into

Personnels values ("+"'"+id+"'"+ ","+"'"+Nom+"')");

} catch (SQLException ex) { System.err.println("Requête incorrecte"); } arrêt(); }

Public void SupprimerPersonne(){

ConnexionBD(); try {

((java.sql.Statement) instruction).executeUpdate("delete from Personnels where

matricule = '"+ id+"'");

} catch (SQLException ex) { System.err.println("Requête incorrecte"); }

Publicité

arrêt();}

2/3

Public void arrêt() {

try { connexion.close(); } catch (SQLException ex) { System.err.println("Erreur sur l'arrêt de la connexion à la base de données"); } }

}

Exercice 3 (4pts)

Soit le programme suivant de « recherche dichotomique dans un tableau trié d’entiers » en langage Java :

1 /* Input : tab_trie : tableau d’entiers triés dans l’ordre croissant 2 * cle : valeur entière qu’on recherche dans le tableau 3 * Output = true si cle a été trouvé dans le tableau 4 * = false si cle n’a pas été trouvé dans le tableau 5 */ 6 public boolean recherche_dico(int[] tab_trie, int cle) 7 { 8 int m; int g = 0; int d = tab_trie.length-1; Boolean trouv = false; 9 while (g <= d && !trouv) 10 { 11 m = (d+g)/2; 12 if (tab_trie[m] == cle) 13 trouv = true; 14 else if (tab_trie[m] >cle) d = m-1; 15 else 16 17 g = m+1; 18 } 19 return trouv; 20 } 1. Donner le graphe de contrôle correspondant à ce programme en numérotant les nœuds. 2. Trouver des données de test pour couvrir toutes les instructions (toute instruction doit être exécutée au

moins une fois).

3. Ces données de test assurent-elles la couverture de tous les arcs du graphe (tout arc est traversé au moins

une fois) ? Sinon ajouter de nouvelles données de test pour couvrir tous les arcs.

4. Ajouter des données de test pour assurer :

- qu’on exécute la fonction sans passer dans la boucle while, - qu’on exécute la fonction en passant une fois dans la boucle while, - qu’on exécute la fonction en passant deux ou plusieurs fois dans la boucle while.

Bon courage !

3/3