#include #include #include #include #include #include #include template class Tfile{ private: tavenir* tab;//tableau contenant les elements de la file tavenir poubelle; int taille;//nb rangee dans la file int devant; int derriere; int enleveuneplacedevant(void); void faitUnePlaceDerriere(int &); tavenir rempliladerniercase(tavenir valeur,int& nbrangeevide,int nb); int initialisation (int); int initialise(int,int); int fileVide(void); public: Tfile(int anode); Tfile(); Tfile(int,long); ~Tfile(void); int refroidis(int nbminute,int,int);//Quand une rangee est pleine, la fait refroidir et quand elle est froide, l'enleve int enfile(tavenir valeur,int&,int); tavenir defile(tavenir,int&); void afficherTous(); void coulecreset(int pas,int& longeurfile,int);//Coule l'aluminium dans le creset void enlevecreset(int pas,int& longeurfile,int nb);//Quand le creset est plein, on l'enleve tavenir& operator[](int i); void afficher(); }; class fonderie{ private: Tfile filecreset; int taille; int longeurfile; public: fonderie(int); void travaille(int);//Coule creset et enleve creset void afficher(); }; class entrepot{ private: Tfile filecabanode;//L'entrepot contient differente file Tfile filecabmegot; Tfile filebennevide; Tfile filebennepleine; int nbrangeevide;//Nombre de rangee vide dans l'espace reserve aux cabarets int rangeebennevide;//Nombre de rangee vide dans l'espace reserve aux bennes double megot; double anode; double bennesvides; double bennespleines; void bennerefroidi(int);//Refroidis les bennes pleines pendant 15 heures public: entrepot(int nbrangee,long anode,long benne,long,int,int); void afficher() const; int recoitanode(int cab);//Recoit les anode reparees provenant de la salle de scellement int recoitbenne(int,int);//Recoit les bennes pleines de la salle d'electrolyse void travailler(int nbminute); int recoitcab(int nbcab);//Recoit les cabarets de megot de la salle d'electrolyse et les enfile void setanode(double); double getanode(void) const; void setmegot(double); double getmegot(void) const; int envoitcab(int);//Envoit des cabarets d'anodes a la salle d'electrolyse int megotrefroidis(int nbminute);//Refroidis les megots pendant 4 heures }; class scellement{ private: double anode; int minutesnontravaille; const int tauxreparation;//defini par l'usager double megot; int travaillestu; void retourneanode(entrepot& x);//Retourne les anodes reparees en entrepot int horaire(int);//Sommes nous dans des heures de travail ou de repos public: scellement(double); void travailler(int,entrepot&); void afficher(void) const; void setanode(double); double getanode(void) const; void setmegot(double); double getmegot(void) const; }; class electrolyse{ private: int cab; double megot; double anode; double bennespleines; const double prodanode;//defini par l'usager int envoitbenne(entrepot&,int);//envoit les bennes pleines a l'entrepot int recoitcab(int nbcab,entrepot& x);//Recoit les cabarets d'anode de l'entrepot public: electrolyse(double); int travaille(int nbminute,entrepot& x);//temps qui s'ecoule entre chaque coup d'horloge void envoitcab(int nbcab,entrepot& x);//Envoie les cabarets de megot en entrepot void recoitanode(entrepot&);//Recoit des anodes s'il y a eu un manque en entrepot plus tot void afficher (void) const; void setanode(double); double getanode(void) const; }; int main(void){ int arret,pas,nbrangee,anode,nbbennes,creset,nbrangeereste,nbrangeebennevide; char tonnes,jump; double prodanodes,tauxreparation,heure; long meg,i; do{ clrscr(); cout<<"Quel est le nombre de tonnes/heure?\n"; cout<<"A: 40 tonnes/heure ?\n"; cout<<"B: 60 tonnes/heure ?\n"; cout<<"C: 120 tonnes/heure ?\n"; cin>>tonnes; } while((tonnes!='a')&&(tonnes!='A')&&(tonnes!='b')&&(tonnes!='B') &&(tonnes!='c')&&(tonnes!='C')); if((tonnes == 'a')||(tonnes=='A')){ pas = 15; prodanodes = 19.9; creset = 6; } if((tonnes == 'b')||(tonnes=='B')){ pas = 10; prodanodes = 60*(19.9/40); creset = 9; } if((tonnes == 'c')||(tonnes=='C')){ pas = 5; prodanodes = 120*(19.9/40); creset = 18; } fonderie f(creset); electrolyse alu(prodanodes); do{ cout<<"Taux de reparation des anodes en salle de scellement"<>tauxreparation; if(tauxreparation<=0) cerr<<"Ce taux doit etre superieur a zero"<>nbrangee; }while(nbrangee>36 || nbrangee<0); do{ cout<<"Combien d'anode voulez-vous mettre au depard dans l'entrepot (multiple de 6): \n"; cin>>anode; }while(anode%6 || anode<=0); do{ cout<<"Nombre de megots dans l'entrepot au depart (multiple de 6)"<>meg; }while(meg%6 || meg<0); if(anode%36) nbrangeereste=nbrangee-((anode/36)+1); else nbrangeereste=nbrangee-(anode/36); if(meg==0) nbrangeereste-=1; else{ if(meg%36) nbrangeereste-=((meg/36)+1); else nbrangeereste-=(meg/36); } if(nbrangeereste<0) cout<<"Il n'y a pas assez de rangees pour le nombre de cabaret!!!"<>nbbennes; if(nbbennes%14) nbrangeebennevide=36-nbrangee-((nbbennes/14)+1); else nbrangeebennevide=36-nbrangee-(nbbennes/14); if(nbrangeebennevide<0) cout<<"Il y atrop de bennes vides pour le nombre de rangees restantes"<>heure; for(i=0;i Tfile::Tfile(int nbelement){ tab = 0; devant = 0; int rangee; if(nbelement%36)//calcule le nombre de rangees necessaire pour le nb d'element rangee=(nbelement/36)+1; else rangee=(nbelement/36); if(rangee==0) rangee=1; tab = (tavenir*)malloc(rangee*sizeof(tavenir)); if (tab){ taille = rangee; derriere=initialisation(nbelement); } else{ cout<<"Probleme dans le constructeur de filecab\n"; getch(); } } /*------------------------ TFILE::INITIALISATION--------------------------- Rempli la file suivant le nombre d'element qu'on veut y entrer. Ne s'applique que pour les files de cabarets. anode=nombre d'element a entrer dans la file*/ template int Tfile::initialisation(int anode){ for(int i=0;i0){ anode-=6; tab[i]=tab[i]+1; if(tab[i]==6){ derriere++; i++; } } }while(anode); return derriere; } /***************************** CONSTRUCTEUR TFILE *************************** Initialise la file de benne pleine et la file de creset*/ template Tfile::Tfile(){ tab = 0; devant = 0; derriere = 0; tab =(tavenir*)malloc(1*sizeof(tavenir)); if (tab){ taille = 1; tab[0]=0; } else{ cout<<"Probleme dans le constructeur de file vide\n"; getch(); } } /*---------------------------- CONSTRUCTEUR TFILE --------------------------- C'est le constructeur pour la file de benne vide */ template Tfile::Tfile(int nbvoulu,long benne){ tab = 0; devant = 0; int rangee; if(benne%14) rangee=(benne/14)+1; else rangee=(benne/14); if(rangee==0) rangee=1; tab = (tavenir*)malloc(rangee*sizeof(tavenir)); if (tab){ taille = rangee; derriere=initialise(benne,14); } else{ cout<<"Probleme dans le constructeur de filebennevide\n"; getch(); } } /************************** TFILE::INITIALISE ******************************** Initialise la file de benne vide suivant le nombre desire de bennes vides*/ template int Tfile::initialise(int benne,int nb){ for(int i=0;inb){ benne-=nb; tab[i]=tab[i]+nb; if(tab[i]==nb){ derriere++; i++; } } else{ tab[i]=benne; benne=0; } }while(benne); return derriere; } template tavenir& Tfile:: operator[](int i){ if (i>=taille){ cout<<"Vous etes a l'exterieur du tableau \n"; getch(); return poubelle; } return tab[i]; } template Tfile::~Tfile(void) { if (tab) free(tab); } /***************************** TFILE::FILEVIDE **************************** Retourne 0 s'il ne reste plus rien sinon retourne un autre chiffre */ template int Tfile::fileVide(void){ if(taille<=1) return tab[0]; return 1; } /*********************** TFILE::FAITUNEPLACEDERRIERE ****************** Rallonge la file et initialise la dernier case a 0. nbrangeevide est le nombre de rangees vides en entrepot*/ template void Tfile::faitUnePlaceDerriere(int& nbrangeevide){ taille++; nbrangeevide--; tab=(tavenir*)realloc(tab,taille*sizeof(tavenir)); derriere++; tab[derriere]=0; } /********************** TFILE::REMPLILADERNIERECASE ************************* Remplis la derniere case suivant le nombre d'element que l'on veut mettre et retourne le nombre d'element non enfile valeur correspond au nombre de bennes ou de cabaret a enfiler nbrangeevide est le nombre de rangees vides en entrepot nb correspond au nombre d'element que l'on peut mettre dans une rangee */ template tavenir Tfile::rempliladerniercase(tavenir valeur,int& nbrangeevide,int nb){ tavenir temp=tab[derriere]; if ((tab[derriere]+valeur)>=nb){//Si tout ne rentre pas dans la derniere rangee valeur-=(nb-tab[derriere]);//met ce que tu peut tab[derriere]=nb; if(nbrangeevide) faitUnePlaceDerriere(nbrangeevide); else{//Si on ne peut pas agrandir le tableau : PROBLEME !!! cout<<"Il n'y a plus de place dans la file !!\n"; tab[derriere]=temp; return -1; } } return valeur; } /******************************* Tfile:: enfile ************************* Met des elements dans la file. Retourne -1 si la file est pleine sinon retourne le nombre d'element enfile valeur correspond au nombre de bennes ou de cabaret a enfiler nbrangeevide est le nombre de rangees vides en entrepot nb correspond au nombre d'element que l'on peut mettre dans une rangee */ template int Tfile::enfile(tavenir valeur,int& nbrangeevide,int nb){ tavenir cab=valeur; valeur=rempliladerniercase(valeur,nbrangeevide,nb); if(valeur==-1)//C'est qu'il n'y a plus de place dans la file PROBLEME !!! return -1; tab[derriere] += valeur; return (cab); } /************************** TFILE::DEFILE *********************************** Enleve valeur elements de la file. valeur=nombre de cabaret ou de bennes a defiler nbrangeevide=nombre de rangeevide en entrepot*/ template tavenir Tfile::defile(tavenir valeur,int& nbrangeevide) { tavenir cab=valeur; while(fileVide() && valeur!=0){//Si la file n'est pas vide if(tab[devant]>valeur){ //defile tab[devant]-=valeur; valeur=0; } else{ valeur-=tab[devant]; //if(taille>1){ enleveuneplacedevant(); nbrangeevide++; tab[devant]-=valeur; valeur=0; //} /* else{ valeur+=tab[devant]; return -1; }*/ } } if(valeur){ if (!fileVide()) {//Si la file est vide retourne -1 cout<<"la file est vide\n"; return -1; } } return (cab-valeur); } /***************************** TFILE::AFFICHERTOUS**************************/ template void Tfile::afficherTous(){ for (long i = 0; i < taille; i++) cout << "\ntab[" << i << "] = " << tab[i]; cout<<"\n"; getch(); } /***************************** TFILE::REFROIDIS*************************** Refroidis ce qu'il y a dans la file et retourne le nombre de rangee refroidies nbminute est le pas de simulation, largeur la quantite de cabarets ou de bennes que l'on peut mettre dans une rangee, temps le temps d'attente plus taille de la file pleine a attendre avant que la rangee soit refroidie*/ template int Tfile::refroidis(int nbminute,int largeur,int temps){ int nb=0; for(int i=0;i=largeur){ tab[i]+=nbminute; } } i=0; for(;i=temps) nb++; } int temp=nb; if(temp){//S'il y a une rangee froide do{ if(enleveuneplacedevant());//alors enleve la rangee de la file temp--; }while(temp); } if(!temp) return nb; return (nb-temp); } /********************* TFILE::ENLEVEUNEPLACEDEVANT ************************* Enleve le premier element de la file et racourci le file*/ template int Tfile::enleveuneplacedevant(){ for(int i=devant;i=1){ tab=(tavenir*)realloc(tab,taille*sizeof(tavenir)); derriere--; return 1; } cout<<"La file est totalement libre"; getch(); return 0; } /************************** TFILE::COULECRESET ***************************** Coule l'aluminium dans les cresets. pas= pas de simulation longeurfile= nb d'element present sur la file nb= nombre d'element que peut au maximum avoir la file*/ template void Tfile::coulecreset(int pas,int& longeurfile,int nb){ for(int i=0;i void Tfile::enlevecreset(int pas,int& longeurfile,int nb){ for(int i=0;i=nb*pas){ enleveuneplacedevant(); taille++; derriere++; tab=(tavenir*)realloc(tab,longeurfile*sizeof(int)); tab[derriere]=0; } } } /**************************** TFILE::AFFICHER *******************************/ template void Tfile::afficher(){ cout<<"Temps de remplissage des cresets: ["; for(int i=0;i=0) anode=n; else cout<<"Le nombre d'anode ne peut pas etre negatif \n"; } //*********************** Salle de scellement:Get anode double scellement::getanode() const{ return anode; } //*********************** Salle de scellement:Set megot void scellement::setmegot(double n){ if(n>=0) megot=n; else cout<<"Le nombre de megot ne peut pas etre negatif \n"; } //*********************** Salle de scellement:Get megot double scellement::getmegot() const{ return megot; } /********************** SCELLEMENT::HORAIRE ******************************** Retourne 1 si on est en heure de travaille 0 sinon */ int scellement::horaire(int pas){ if(travaillestu<0){ travaillestu+=pas; return 0; } if(travaillestu==420){//420 = 7*60 Apres 7 heures, une heure de repos travaillestu = (pas-60); return 0; } travaillestu += pas; return 1; } //*************************fonction afficher*********************************** void scellement::afficher(void) const{ cout<<"Nombre de megots restants en salle de scellement : "<=repare){ megot=megot-(repare); anode=anode+(repare); retourneanode(x); } else{ //cout<<"C'est plutot tranquille en salle de scellement\n"; //getch(); minutesnontravaille=minutesnontravaille+nbminute; } int nombre=x.megotrefroidis(nbminute);//retourne la quantite de rangee refroidites if (nombre) megot+=nombre*36; } //attention anode scellement et entrepot } /******************* SCELLEMENT::RETOURNEANODE ********************* Retourne les anodes reparees en entrepot*/ void scellement::retourneanode(entrepot& x){ int cab; cab=(int)anode/6; x.recoitanode(cab);//envoit les cabarets en entrepot anode=anode-6*cab;//Les anodes quittent la salle de scellement } /************************* CONSTRUCTEUR DE L'ENTREPOT ************************ Initialise l'entrepot suivant : -le nombre de rangee desire pour stocker les cabarets. Le nombre de rangee disponible pour stocker les bennes se trouve a correspondre au nombre de rangees restantes. -le nombre d'anode desirees -le nombre de megots desires -et le nombre de bennes desirees */ entrepot::entrepot(int nbrangee,long anod,long benne,long meg,int nbrangeereste,int nbrangeebenne): filecabanode(anod),//Appelle un constructeur Tfile filecabmegot(meg), filebennevide(36-nbrangee,benne), filebennepleine() { megot=meg;anode=anod;bennesvides=benne;bennespleines=0.0; nbrangeevide=nbrangeereste; rangeebennevide=nbrangeebenne; } //*************************fonction getmegot*********************************** double entrepot::getmegot() const{ return megot; } //*************************fonction getanode*********************************** double entrepot::getanode() const{ return anode; } //*********************** Entrepot:Set megot void entrepot::setmegot(double n){ if(n>=0) megot=n; else cout<<"Le nombre de megot ne peut pas etre negatif \n"; } //*********************** Entrepot:Set anode void entrepot::setanode(double n){ if(n>=0) anode=n; else cout<<"Le nombre d'anode ne peut pas etre negatif \n"; } //************************* ENTREPOT::AFFICHER ****************************** void entrepot::afficher(void) const{ cout<<"Nombre de megots restants en entrepot : "<