Examen final - LabUnix

30 avr. 2006 ... Examen Final ... 1ère étape : on enlève les espaces en fin de chaîne */ ... Veuillez
donner une stratégie de tests (liste des cas de tests) en boîte ...

Part of the document

Examen Final
INF3135 Dimanche 30 avril 2006, 9h30 - 12h30 | |Question 1:| |15 |
| | | |points |
|Nom et Prénom : | | | |
| |Question 2:| |2 points|
|Code Permanent : | | | |
| |Question 3:| |5 points|
|Groupe & professeur (cochez) : | | | |
|20 - Bruno Malenfant |Question 4:| |8 points|
|30 - Emmanuel Chieze | | | |
| | | | |
| | | | |
| |Total: | |/30 |
Directives pédagogiques : . Tous les documents sont autorisés.
. Vous devez répondre aux questions sur l'énoncé et remettre ce dernier
à la fin de l'examen.
. Dans toutes les questions de programmation, vous pouvez faire appel
sans réserve aux fonctions de la bibliothèque standard, qui incluent
entre autres :
o stdio.h : sscanf, sprintf, scanf, sprintf ...
o string.h : strcat, strcpy, strcmp, strlen ... (15 pts) Vous trouverez ci-dessous le code de la fonction enleverEspaces, qui retire
les espaces au début et à la fin d'une chaîne de caractères. Cette fonction
est disponible, sous une forme légèrement différente, dans le module
outils.c du logiciel Biblio utilisé dans le TP3. void enleverEspaces(char* chaine) {
int i, longueur = strlen(chaine); /* 1ère étape : on enlève les espaces en fin de chaîne */
while ((longueur > 0) && (chaine[longueur - 1] == ' ')) {
chaine[longueur - 1] = '\0';
longueur--;
} /* 2ème étape : on enlève les espaces en début de chaîne */
while (chaine[0] == ' ') {
i = 0;
while (chaine[i] != '\0') {
chaine[i] = chaine[i + 1];
i++;
}
}
return;
} Les sous-questions (1.1, 1.2 et 1.3) font toutes références à cette
fonction, mais sont indépendantes les unes des autres. Question 1.1 : Tests en boîte noire (4 pts)
Veuillez donner une stratégie de tests (liste des cas de tests) en boîte
noire de la fonction, en la justifiant.
Question 1.2 : Tests en boîte blanche (6 pts)
1. Représentez le graphe de flux de contrôle associé à la fonction (2
pts) 2. Quelle est la complexité cyclomatique associée à cette fonction ? (1
pt) 3. Donnez une famille minimale de chemins indépendants permettant de
reconstituer tous les parcours possibles du graphe. (1 pt) 4. Donnez les cas de tests correspondant à chaque chemin. Dans les cas où
il est impossible d'associer un cas de test à un chemin, veuillez
expliquer brièvement pourquoi. (2 pts)
Question 1.3 : Optimisation algorithmique (4 pts)
La deuxième section du code n'est pas optimale. Expliquez brièvement
pourquoi puis décrivez une meilleure approche pour mettre en ?uvre cette
section du code. Écrivez ensuite le code C correspondant à la mise en ?uvre
de votre approche.
void enleverEspaces(char* chaine) {
int i, longueur = strlen(chaine); /* 1ère étape : on enlève les espaces en fin de chaîne */
while ((longueur > 0) && (chaine[longueur - 1] == ' ')) {
chaine[longueur - 1] = '\0';
longueur--;
} /* 2ème étape : on enlève les espaces en début de chaîne */ return;
}
Question 1.4 : Programmation défensive (1 pt) Soit le programme C suivant qui fait appel à la fonction enleverEspaces.
Veuillez rajouter dans le code de ce programme la vérification des
postconditions du contrat à l'aide d'assertions. #include int main (int argc, char *argv[]) { if (argc != 2) {
fprintf (stderr, "Usage : %s chaine\n", argv[0]);
exit(1);
} enleverEspaces(argv[1]); printf("%s\n", argv[1]);
} (2 pts) Vous trouverez ci-dessous le code d'une fonction C, qui calcule le nombre
de combinaisons possibles de k éléments pris parmi n éléments. Une
définition mathématique de la fonction est la suivante : [pic]
Cette fonction n'est définie que lorsque n >= 0, k >= 0 et n >= k
(préconditions du contrat). Le code ci-dessous implémente de façon optimisée l'algorithme précédent.
Veuillez y ajouter la vérification des préconditions du contrat. int C(int n, int k) {
int numerateur = 1, denominateur = 1, i;
if (k < n/2)
k = n-k;
for (i = k+1; i