//*******************************PROGRAMME C++ INF-115******************************** // PREPARE PAR: Simon Martineau, Julie Cogne et Josee Chantigny. // Ce programme simule une aluminerie. L'aluminerie comporte 4 salles, c'est-a-dire; // la salle d'electrolyse,l'entrepot, scellement et fonderie. #include #include #include #include //Pour vérifier le fonctionnement du programme, laisser soit le //define tst_display pour voir le fonctionnement général ou le //define entrepot_display pour voir dans le détail ce qui se passe dans //l'entrepot. #define tst_display //#define entrepot_display #define init_anodes 10560 // nombre d'anodes ds la salle d'electrolyse avant la simulation. #define max_temps 24 // en heures. Temps total de la simulation. #define sim_temps 15 // en minutes.Temps d'intervalle. #define anodes_heure 19.9 // Consommation d'anodes par la salle d'électro. #define croutes_heure 3.5 // Production de croute par la salle d'électro. #define aluminium_heure 40.0 // Production d'aluminium par la salle d'électro. #define anodes_cabaret 6 // Nombre d'anodes par cabaret. #define croutes_benne 2 // Nombre de bennes en transport en meme temps. #define megots_cabaret 6 // Nombre de megots par cabaret. #define benne_rangee 14 // Nombre de bennes par rangee dans l'entrepot. #define cabaret_rangee 6 // Nombre de cabarets par rangee dans l'entrepot. #define nb_rangee_cabaret 10 // Nombre de rangee de cabaret dans l'entrepot. #define nb_rangee_benne 5 // Nombre de rangee de bennes dans l'entrepot. #define refroidissement_megot 240 // Temps de refroidissement en minutes #define refroidissement_benne 900 // Temps de refroidissement en minutes #define scellement_heure 67 // Production d'anodes dans une heure. #define attente_creuset 90 // Délais dans la fonderie. #define max_parallel 20 // Nombre max de creusets en parallel ds fonderie. #define aluminium_creuset 10 // Tonnes d'aluminium par creuset. void fond_ecran(void); //*****PROTOTYPE DES CLASSES****** class Centrepot; class Cfonderie; //*****DECLARATION DES CLASSES**** class Csalle_scellement { private: double anode_scellement; //Nbr d'anodes double megot_scellement; //Nbr de megots Centrepot& entrepot_1; //Entrepot utilise par la salle de scellement. Csalle_scellement(void); //Constructeur sans arguments non implemente. public: Csalle_scellement(Centrepot & entrepot_ref); void temps (void); //Tout ce qui se passe dans la salle dans un intervalle de temps. }; class Csalle_electrolyse { private: double croutes_electro; //Nbr de croutes double megots_electro; //Nbr de megots double anodes_electro; //Nbr d'anodes double aluminium_electro; //Tonnes d'aluminium Centrepot& entrepot_1; //Entrepot utilise par la salle d'electrolyse. Cfonderie& fonderie_1; //Fonderie ou on envoie l'aluminium. Csalle_electrolyse(void); //Constructeur sans arguments non implemente. public: Csalle_electrolyse(Centrepot& entrepot_ref, Cfonderie& fonderie_ref); void temps (void); //Tonnes d'aluminium }; class Cfonderie { private: int aluminium_fonderie; //Tonnes d'aluminium int attente[max_parallel]; //Tableau de gestion d'attente des creusets. public: Cfonderie(void); void arrivee_creuset(int nbr); //Place un creuset en attente. void temps(void); //Tout ce qui se passe dans la salle dans un intervalle de temps. }; class Crangee { private: int espace_occupe; //nbr d'objet dans la rangee. int temps_restant; //temps restant de refroidissement ds la rangee. int type; //0=anodes, 1=mégots, 2=bennes public: Crangee (void) {espace_occupe=temps_restant=type=0;} void set_type(int sorte); //0=anodes, 1=mégots, 2=bennes int delais_ecoule(void); //Verifie si le temps restant est ecoule. void ajouter (int nbr); //ajoute des elements dans une rangee. void enlever (int nbr); //enleve des elements dans une rangee void temps (void); //Tout ce qui se passe dans la salle dans un intervalle de temps. int espace_restant(void); //retourne l'espace qui reste dans une rangee. int get_type(void); //retourne le type des elements dans une rangee. int get_temps(void); //retourne le temps restant de refroidissement d'une rangee. int get_quantite(void); //retourne le nbr d'elements presents dans la rangee. void claire (void); //Vide la rangee. }; class Centrepot { private: Crangee * rangee_cabaret; //Tableau de rangees de cabarets Crangee * rangee_benne; //Tableau de rangee de bennes. void vide_benne(void); //Vide les rangees de bennes refroidies. void display_all(void); //Affiche le contenu de l'entrepot. public: Centrepot(void); ~Centrepot(void); void temps(void); //Tout ce qui se passe dans la salle dans un intervalle de temps. void ajouter_croutes(int nbr); void ajouter_megots(int nbr); int prendre_megots(int nbr); void prendre_anodes(int nbr); void ajouter_anodes(int nbr); void trier_cabaret(int nbr); //trie le tableau de rangee. Du +grand temps restant au +petit. void trier_benne(int nbr); //trie le tableau de rangee. Du +grand temps restant au +petit. void trier_anodes(int nbr); //trie le tableau de rangee. Du +grand espace restant au +petit. int get_inventaire_anode(void); //retourne le nbr total de cabarets d'anodes dans l'entrepot. int get_inventaire_megot(void); //retourne le nbr total de cabarets de megots dans l'entrepot. int get_inventaire_benne(void); //retourne le nbr total de bennes dans l'entrepot. }; //**********DEFINITION DES FONCTIONS****************************************** int mod(double N1,int N2) //fonction externe aux classes. Calcule le modulo d'un double. { return((int)N1-((int)(N1/N2))*N2); } void Csalle_scellement::temps(void) { //************affichage de test*********************************************** #ifdef tst_display cout<<"Mégots scellement:"< void echanger(type_a_venir &x, type_a_venir & y) { type_a_venir temp; temp=x; x=y; y=temp; } void Crangee::claire(void) { espace_occupe=0; } int Crangee::get_quantite() { return(espace_occupe); } int Crangee::get_temps(void) { return(temps_restant); } int Crangee::get_type(void) { return(type); } int Crangee::espace_restant(void) { if (type==0 || type==1) return(cabaret_rangee-espace_occupe); if (type==2) return(benne_rangee-espace_occupe); cout<<"erreur de type dans l'entrepot"; exit(1); } void Crangee::temps(void) { temps_restant-=sim_temps; temps_restant=temps_restant<0?0:temps_restant; } void Crangee::enlever (int nbr) { espace_occupe-=nbr; } void Crangee::ajouter (int nbr) { espace_occupe+=nbr; if (nbr!=0) { if (type==1) temps_restant=refroidissement_megot; if (type==2) temps_restant=refroidissement_benne; } } int Crangee::delais_ecoule(void) { return (!temps_restant); } void Crangee::set_type(int sorte) { type=sorte; } int Centrepot::get_inventaire_megot(void) { int tmp=0; for (int fois=0;fois rangee_cabaret[fois1].espace_restant()) echanger(rangee_cabaret[fois],rangee_cabaret[fois1]); } void Centrepot::trier_benne(int nbr) { for (int fois=1; fois rangee_benne[fois1].get_temps()) echanger(rangee_benne[fois],rangee_benne[fois1]); } void Centrepot::trier_cabaret(int nbr) { for (int fois=1; fois rangee_cabaret[fois1].get_temps()) echanger(rangee_cabaret[fois],rangee_cabaret[fois1]); } void Centrepot::temps(void) { for (int fois=0;fois0;nbr--) { for(int i=0;attente[i];i++); if (i>=max_parallel) { //************affichage de test*********************************************** #ifdef tst_display cout<<"Débordement de capacité au niveau de la fondrie"<0 ? attente[i]-sim_temps:0); } //************affichage de test*********************************************** #ifdef tst_display cout<<"Aluminium coulé: "<