Durée : 2 h. Documents autorisés : notes de cours, documents manuscrits ou fournis par Mr Trau.
Dans un certain nombre d'entreprises, on cherche à optimiser le stockage d'un grand nombre de produits : matière première, bruts, composants, outillages, produits finis ou semi-finis... Le stockage horizontal revient cher par la surface au sol qu'il mobilise (stockage pur mais aussi les allées permettant à un chariot élévateur d'accéder partout) que par sa difficulté de gestion (car le contenu du stock change sans arrêt car ce ne sont que des stockages temporaires, on ne stocke plus aujourd'hui du matériel qui ne va pas servir rapidement), devant donc toujours être "rangé".
Une solution intéressante est le stockage vertical (un peu comme les HLM) : le magasin ressemble à une étagère composée de rangées de "cases". Chaque case peut contenir une palette normalisée. Il y a L cases dans un "étage", et il y a H étages dans un magasin. On dispose deux magasins en parallèle, séparés par une allée dans laquelle se déplace un porte palette totalement automatisé (il peut avancer / reculer sur les L cases, monter / descendre aux H étages, prendre ou poser une palette dans le magasin de droite ou de gauche, et évidement peut aussi accéder au poste d'entrée-sortie du stock ). On peut bien évidement accoler plusieurs couples de magasins associés chacun à un porte palette, mais dans ce sujet nous nous limiterons à un seul porte palette et son couple de magasins.
Les avantages de cette méthode sont le gain en surface au sol, mais aussi en volume (moins de pertes qu'avec des allées), et la possibilité d'automatiser toutes les manipulations : un système informatique gère tous les déplacements, les seules interventions extérieures se limitent à la commande du système (dire ce qu'on veut ranger ou ressortir du magasin) et à sa maintenance. En particulier, l'opérateur ne dit jamais où il veut accéder mais quel type de pièce il veut ranger ou ressortir, c'est au système informatique de décider du lieu de stockage. Au niveau des sorties, le système cherche toujours les plus vieilles pièces (du type désiré), afin d'éviter que certaines pièces ne restent trop longtemps et ne se détériorent. Sur certains systèmes, le système calcule statistiquement les fréquences de mouvements pour chaque type de pièces, et range plus près les types les plus demandés. D'autres profitent des moments d'inactivité entre deux demandes pour réorganiser le stock, par exemple rapprocher les pièces les plus anciennes. Ce type de décision ne peut se faire avec un automate classique, il faut une gestion par ordinateur, nous le programmerons en C.
Qu'appelle-t-on en C un indentificateur ? Qu'est-ce qui le sépare de ce qui l'entoure ? (en 1 à 5 lignes)
1) Supposons que L vaille 15 et que H vaille 8. Ces deux constantes sont importantes, et serviront dans toutes les parties de notre programme. Elles ne changeront jamais en cours de programme. Comment proposez vous de les définir ?
2) Les cases sont toutes numérotées (ce numéro s'appellera "indice", il va de 0 à 239 dans notre cas) : on commence à 0 pour la première de l'étage le plus bas du magasin de gauche, puis jusqu'à 14 sur le même étage, puis on recommence à 15 pour la première de l'étage suivant, etc, puis de même pour le magasin de droite. Ecrivez une fonction qui demande à l'opérateur (avec des printf / scanf) de désigner une case : quel magasin (gauche ou droite), n° d'étage (le premier sera appelé 1 par l'opérateur) et n° de case dans l'étage (entre 1 et L), et cette fonction calculera puis retournera l'indice (numéro) de cette case. Vous pourrez décomposer cela en deux fonctions, l'une qui effectue le calcul, l'autre qui fait la saisie et appelle la première .
3) A l'inverse, écrivez une fonction qui reçoit en argument un entier correspondant à cet indice de case, et qui affiche en clair sa position.
4) Un tableau de L*H*2 entiers, nommé DUREE (en majuscules), contient pour chaque case le nombre de jours de stockage du produit. Les cases vides correspondent à une durée de -1. Quand on entre une nouvelle palette dans une case d'un magasin, sa durée est mise à 0. Déclarez le tableau DUREE (en variable globale par exemple), et écrivez une fonction que vous supposerez appelée automatiquement toutes les nuits, qui ajoute 1 à la durée de toutes les cases non vides.
5) Ecrivez une fonction qui recherche l'indice de la case contenant la pièce la plus récente du stock et l'affiche (s'il y en a plusieurs de la même durée, affichez celle(s) que vous voulez, par exemple la première trouvée).
6) Chaque type de pièce est codifié, dans la pratique ce code (nommé "référence") est en général composé d'un certain nombre de lettres et de chiffres. Mais pour simplifier nous supposerons ici que c'est un entier entre 1 et 32000. Un second tableau sera donc nommé "REF" (en majuscules) et contiendra pour chaque case la référence de la pièce s'y trouvant (-1 pour une case vide). Déclarez ce tableau, puis (en supposant que les tableaux sont à jour) écrivez une fonction qui demande à l'opérateur (scanf) une référence de pièce, recherche puis affiche la position (en clair) de la (d'une des) case contenant les plus vielles pièces de ce type.
7) Ecrivez une fonction qui reçoive en argument une référence de pièce, compte puis retourne le nombre de cases contenant des pièces de ce type.
8) L'entrée et la sortie du stock sont du côté de la première case du premier étage. Si les cases sont carrées, la distance de la nième case de l'étage e jusqu'au poste de sortie est proportionnelle à sqrt(n*n+e*e) (sqrt calcule la racine carrée et est défini dans <math.h>). Améliorez la fonction de la question 6 en sélectionnant, dans le cas de plusieurs cases contenant des pièces de même durée, la plus proche du poste de sortie.
Remarques : Si vous n'arrivez pas à écrire des fonctions, vous pouvez supposer que tout le programme serait écrit à l'intérieur de main, et vous limiter à l'écriture des instructions correspondant à la question posée (évidement, vous gagnerez moins de points). Ne répondez à la question 8 que quand vous aurez tenté de répondre aux précédentes. Ne passez pas plus de 3 mn sur la question préliminaire.
pour retourner au sommaire des sujets d'examen, cliquez ici. Pour une idée de solution, cliquez là.
Patrick TRAU, ULP - IPST juillet 02