Durée : 2h, documents personnels et calculatrice autorisés. Les documents sont tirés du concours PLP2 Génie électrique session 2003. Ce sujet comporte trois pages de texte, plus une figure. En cas d'informations insuffisantes, vous pouvez faire toute supposition qui vous arrange (et ne contredise pas le sujet), à condition de le préciser.
La chaîne de fabrication analysée ici est capable de produire des blocs manufacturés, en béton, type parpaings ou hourdis. Elle est constituée de sept parties principales :
Le
service qualité cherche à améliorer les produits
et en particulier à maîtriser la régularité
des caractéristiques des blocs produits. Pour cela, ils
effectuent différents essais (destructifs ou non) sur des
produits prélevés de la production, ainsi que des
mesures en continu, grâce à de nombreux capteurs, dont
les données sont centralisées sur un ordinateur qui les
analyse.
Au niveau
de la fabrication du béton, on mesure la densité et
l'humidité du béton produit à chaque gâchée.
Ces deux paramètres doivent varier le moins possible. On
peut reporter sur un graphe les différents points de mesure,
comme ci-contre. L'idéal serait que tous les points de mesure
soient au même endroit. Ou du moins qu'ils soient tous
regroupés dans une zone suffisamment petite. Pour cela, nous
allons rechercher l'enveloppe de ces points (c'est un polygone). Les
programmes seront tous écrits en C++.
Chaque point (un par mesure) est un couple de deux flottants (humidité, densité). Définissez l'objet « point », sachant que les seules actions que l'on désire effectuer sur ces points sont de définir les deux valeurs (par mesure des capteurs) par une méthode nommée « mesurer » (que vous ne détaillerez pas ici), et de pouvoir récupérer (mais pas modifier) ces deux valeurs grâce à deux méthodes (que vous détaillerez ici) nommées « humidité » et « densité » qui retournent chacune le flottant correspondant.
L'ensemble des points de mesure sont regroupés en un objet dont voici une partie de la déclaration :
#define DIM 100 class ensemble {private: int nb; //nombre de points, inférieur à DIM. point tableau[DIM]; public: void initialiser(void); void afficher(void); float humidité(int); float densité(int); etc... };
Ecrivez en C++ la méthode « afficher » qui affiche toutes les valeurs des nb points d'un ensemble. On suppose (sans le vérifier) qu'on ne demandera jamais l'affichage sans que l'initialisation (c'est à dire l'appel des nb mesures) n'ait été demandée auparavant. Ecrivez également les deux méthodes nommées « humidité » et « densité » qui reçoivent en argument un entier (un numéro de point, entre 0 et nb-1), et retournent chacune la valeur correspondante (si E est un ensemble, E.humidité(0) retourne l'humidité du premier point de mesure).
Vous allez rechercher la courbe enveloppe de ces points. C'est un polygone convexe, que l'on définira par ses sommets.
Il existe un plusieurs
méthodes pour déterminer le polygone convexe englobant
tous les points. Je vous propose d'utiliser la suivante : on analyse
tous les couples de points possibles. Pour chacun de ces couples, on
détermine la droite passant par ces deux points, et l'on teste
la position de tous les autres points. S'ils sont tous du même
côté, et uniquement dans ce cas, le couple forme un
segment de la frontière.
Par exemple, le segment AB fait partie de l'enveloppe car tous les autres points sont du même côté de la droite AB, mais le segment AC n'en fait pas partie car B et D sont de part et d'autre de la droite AC.
Bien que vous sachiez tous comment vérifier de quel côté d'une droite est un point, je vais vous en rappeler une méthode : tous les points (de coordonnées X,Y) situés du même côté d'une droite AB (coordonnées du point A : XA,YA, de B : XB,YB) génèrent tous une valeur VAL= (XA-X)(YB-YA) - (YA-Y)(XB-XA) du même signe. (On pourrait le démontrer par un simple produit vectoriel).
reçoit en entrée trois entiers : les indices (entre 0 et nb-1), dans l'ensemble des mesures, de deux points (A et B) définissant un segment, et d'un troisième (C) dont on veut connaître le côté par rapport à la droite AB,
retourne la valeur notée VAL ci-dessus.
ajoutez à la classe « ensemble » une méthode nommée est_frontiere qui reçoit en argument d'entrée deux entiers : les indices, dans l'ensemble des mesures, de deux points (A et B) définissant un segment; et retourne un entier valant 1 si tous les autres points sont du même côté du segment AB (donc ont une valeur VAL de même signe), et valant 0 dans le cas contraire. Rappel : deux réels sont de même signe si leur produit est positif.
L'ordinateur faisant les analyses des mesures et leurs statistiques est relié au réseau de l'entreprise (utilisant TCP/IP). Son nom (local) est « statistiques », il tourne sous Unix. Expliquez en quelques lignes ce qu'il faut faire pour récupérer un fichier de données de cet ordinateur depuis un autre poste de l'entreprise. Le réseau de l'entreprise étant connecté à internet, que faut-il faire pour récupérer ce fichier depuis un PC personnel, connecté par exemple au réseau « wanadoo.fr » ?
Remarques : si vous avez du mal avec les objets, supposez que l'on utilise des variables simples. Si vous avez du mal avec les méthodes et leurs arguments, notez simplement les instructions en C qui effectuent la tâche demandée, en supposant que toutes les variables nécessaires sont connues. Dans ce sujet, on ne vous demande pas le programme principal qui utilise les différents objets et méthodes demandés (entre autres), c'est tant mieux car il est compliqué. On ne vous demande pas non plus de créer des méthodes supplémentaires, comme la saisie ou l'affichage des données, sauf si c'est explicitement demandé. Le serveur web de l'entreprise est supposé être à l'adresse http://www.superbeton.fr.
pour quelques pistes de solution, cliquez ici, pour retourner au sommaire des sujets d'examen, cliquez là
Patrick
TRAU, ULP - IPST
mars 04