Vous êtes sur la page 1sur 6

Examen de Principe et Méthode (PRM2)

1ère Session - Juin 2016


Nom - prénom : Groupe :
Ne répondez pas à deux questions différentes sur une même feuille!

Question 1) Le programme suivant demande à l’utilisateur d’entrer des nombres, les classe en 2
catégories (petits et grands) et présente un histogramme montrant la répartition des nombres entre
ces catégories.
Les catégories sont définies préalablement par l’utilisateur. Les petits vont de 0 à une valeur
maxPetits choisie par l’utilisateur et les grands vont de maxPetits + 1 à maxGrands, valeur elle
aussi choisie par l’utilisateur et quoiqu’il en soit, inférieure ou égale à 100.

int main() {
const int MAX = 100;
int maxPetits = introVal("Borne sup. pour les petits", 0, MAX - 1);
int maxGrands = introVal("Borne sup. pour les grands", maxPetits + 1, MAX);
int nbValeurs = introVal("Nombre total de valeurs", 0, 20);
int nbDePetits, nbDeGrands;
saisieValeurs(maxPetits, maxGrands, nbValeurs, nbDePetits, nbDeGrands);
afficheHisto(nbDePetits, nbDeGrands);
}

Voir des exemples d’exécution de ce programme ci-dessous.

Vous devez écrire 3 fonctions : introVal, saisieValeurs et afficheBarre. La fonction afficheBarre


est utilisée dans afficheHisto que voici :

void afficheHisto(int nbDePetits, int nbDeGrands) {


afficheBarre("Petits", nbDePetits);
afficheBarre("Grands", nbDeGrands);
}

• La fonction introVal reçoit un string et deux valeurs entières, une valeur minimale et une valeur
maximale. Elle affiche le message et renvoie un entier entré par l’utilisateur en assurant qu’il est
compris entre les deux valeurs (incluses). Tant que la valeur introduite n'est pas correcte, un
message d’erreur est affiché et la fonction redemande une nouvelle valeur à l'utilisateur (voir
exemple ci-dessous). Veillez à reproduire exactement le même comportement.
• La fonction saisieValeurs demande à l’utilisateur de rentrer un certain nombre de valeurs
(nbValeurs) et compte, en fonction des bornes des deux catégories, combien il y a de petits
(nbDePetits) et de grands (nbDeGrands).
• La fonction afficheBarre reçoit un string et un entier et affiche le string suivi sur la même ligne
d’un nombre de croix correspondant à l’entier.
Remarques :
• Utilisez le passage de paramètres par référence à bon escient, c'est à dire quand cela est nécessaire
(dans le cadre de cette question, si on a le choix, on privilégiera le passage de paramètres par
valeur).
• Vous ne pouvez pas modifier la fonction main.
(Suite page suivante…)

EPFC - ULB
er
Bachelier en Informatique 1 niveau page 1/6
Examen de Principe et Méthode (PRM2)
1ère Session - Juin 2016
Nom - prénom : Groupe :
Ne répondez pas à deux questions différentes sur une même feuille!

(Suite Question 1)
Exemples d'exécutions du programme :

Borne sup. pour les petits (de 0 a 99) : 40↵


Borne sup. pour les grands (de 41 a 100) : 70↵
Nombre total de valeurs (de 0 a 20) : 10↵
Nouvelle valeur (de 0 a 70) : 35↵
Nouvelle valeur (de 0 a 70) : 12↵
Nouvelle valeur (de 0 a 70) : 62↵
Nouvelle valeur (de 0 a 70) : 40↵
Nouvelle valeur (de 0 a 70) : 55↵
Nouvelle valeur (de 0 a 70) : 6↵
Nouvelle valeur (de 0 a 70) : 29↵
Nouvelle valeur (de 0 a 70) : 17↵
Nouvelle valeur (de 0 a 70) : 41↵
Nouvelle valeur (de 0 a 70) : 20↵
Petits: XXXXXXX
Grands: XXX

Borne sup. pour les petits (de 0 a 99) : 750↵


Incorrect! Doit etre de 0 a 99 : 40↵
Borne sup. pour les grands (de 41 a 100) : 30↵
Incorrect! Doit etre de 41 a 100 : 70↵
Nombre total de valeurs (de 0 a 20) : 3↵
Nouvelle valeur (de 0 a 70) : 80↵
Incorrect! Doit etre de 0 a 70 : 70↵
Nouvelle valeur (de 0 a 70) : 0↵
Nouvelle valeur (de 0 a 70) : 55↵
Petits: X
Grands: XX

Remarques : Les valeurs introduites par l'utilisateur sont soulignées. Il s’agit juste de vous faciliter
la compréhension de l’exemple. Vous ne devez bien entendu pas reproduire ce soulignement ni la
mise en évidence des cas incorrects.

EPFC - ULB
er
Bachelier en Informatique 1 niveau page 2/6
Examen de Principe et Méthode (PRM2)
1ère Session - Juin 2016
Nom - prénom : Groupe :
Ne répondez pas à deux questions différentes sur une même feuille!

Question 2) Ecrivez une fonction qui reçoit une séquence et qui détermine la somme des longueurs
des plateaux de longueur impaire.

Consignes :
• Donnez l'analyse du problème, c'est à dire utilisez la méthode des tableaux, indiquez clairement
les invariants utilisés, la façon de les initialiser et la façon de les restaurer, etc.
• Nommez convenablement vos invariants et donnez en une définition (par exemple : « prec =
élément précédent »)
• Utilisez obligatoirement la méthode des hypothèses inductives.
• Veillez à ce que votre fonction ne fasse qu'un seul parcours de la séquence.

Exemples :
• si S = {5, 2, 3, 3, 6, 6, 6, 6, 7, 4, 4, 4, 2, 2, 3}, alors le résultat est 7.

• si S = {}, le résultat est 0.

EPFC - ULB
er
Bachelier en Informatique 1 niveau page 3/6
Examen de Principe et Méthode (PRM2)
1ère Session - Juin 2016
Nom - prénom : Groupe :
Ne répondez pas à deux questions différentes sur une même feuille!

Question 3) Le CIO (Comité International Olympique) maintient une liste (un vector) avec le
nombre total de médailles gagnées par pays.
struct MedaillePays {
string pays;
unsigned medailles;
};

Cette liste ne comporte que les pays ayant gagné au moins une médaille.
La liste est ordonnée par nombre de médailles de façon à ce que les pays ayant obtenus le plus grand
nombre de médailles apparaissent en premier.
Après une compétition, la fonction nouvelleMedaille est utilisée pour ajouter une médaille à un pays
donné dans la liste.

void nouvelleMedaille(const string & nomPays, vector<MedaillePays> & ls);

Si le pays n’apparaît pas encore dans la suite, il y est ajouté. La liste doit rester ordonnée sur le
nombre de médailles. Le morceau de programme suivant :
void affiche(const vector<MedaillePays> & ls) {
for(unsigned k = 0; k < ls.size(); ++k)
cout << ls[k].pays << ": " << ls[k].medailles << endl;
cout << endl;
}

int main() {
vector<MedaillePays> ls;
string nom;
do {
cout << "Entrer le nom d'un pays (fini pour terminer): "; cin >> nom;
if(nom != "fini") {
nouvelleMedaille(nom, ls);
affiche(ls);
}
} while(nom != "fini");
}

pourrait produire l’exécution montrée à la page suivante.


Ecrivez la fonction nouvelleMedaille.
(Suite page suivante…)

EPFC - ULB
er
Bachelier en Informatique 1 niveau page 4/6
Examen de Principe et Méthode (PRM2)
1ère Session - Juin 2016
Nom - prénom : Groupe :
Ne répondez pas à deux questions différentes sur une même feuille!

(Suite Question 3)

Entrer le nom d'un pays (fini pour terminer): France↵


France: 1

Entrer le nom d'un pays (fini pour terminer): Belgique↵


France: 1
Belgique: 1

Entrer le nom d'un pays (fini pour terminer): Belgique↵


Belgique: 2
France: 1

Entrer le nom d'un pays (fini pour terminer): France↵


Belgique: 2
France: 2

Entrer le nom d'un pays (fini pour terminer): France↵


France: 3
Belgique: 2

Entrer le nom d'un pays (fini pour terminer): Espagne↵


France: 3
Belgique: 2
Espagne: 1

Entrer le nom d'un pays (fini pour terminer): Espagne↵


France: 3
Belgique: 2
Espagne: 2

Entrer le nom d'un pays (fini pour terminer): Belgique↵


France: 3
Belgique: 3
Espagne: 2

Entrer le nom d'un pays (fini pour terminer): Belgique↵


Belgique: 4
France: 3
Espagne: 2

Entrer le nom d'un pays (fini pour terminer): Pays-Bas↵


Belgique: 4
France: 3
Espagne: 2
Pays-Bas: 1

...

EPFC - ULB
er
Bachelier en Informatique 1 niveau page 5/6
Examen de Principe et Méthode (PRM2)
1ère Session - Juin 2016
Nom - prénom : Groupe :
Ne répondez pas à deux questions différentes sur une même feuille!

Question 4) Ecrire une fonction récursive qui calcule la somme des entiers entre bi, la borne
inférieure incluse, et bs, la borne supérieure exclue.
Par exemple :

somme(4, 9); // 30
somme(7, 7); // 0
somme(9, 4); // 0

EPFC - ULB
er
Bachelier en Informatique 1 niveau page 6/6