/*Examen blanc - Combat de Robots Carlo Piussi - le 17 décembre 2017*/ #include #include #include #include #include #include #include using namespace std; class boule { private: int numero; char couleur; public: void saisie(); void affiche(); bool operator==(boule); int getVal(){ return numero; }; char getCouleur(){ return couleur; } boule(){ cout<<"Constructeur boule par défaut"<>couleur; cout<<"\nValeur\n=? "<>numero; }; void boule::affiche(){ cout<&robot1){ int N=0; cout<<"Combien de boules voulez-vous que Robot1 saisisse ?"<>N; for (int i = 0; i < N; i++) { boule tmp; tmp.saisie(); robot1.insert(robot1.begin(),tmp); } } //Saisie Robot2 vector void saisieRobot2Vector(vector&robot2){ int N=0; cout<<"Combien de boules voulez-vous que Robot2 saisisse ?"<>N; for (int i = 0; i < N; i++) { boule tmp; tmp.saisie(); robot2.insert(robot2.begin(),tmp); } } //template saisie template void saisieRobot(X &robot, Y S) { int N=0; robot.clear();//si l'on veut recommencer à saisir le container de zéro à chaque appel de la fonction cout<>N; for (int i = 0; i < N; i++) { boule tmp;//à mettre ici seulement si on utilise l'autro-incrément, sinon il peut aller en amont du for cout << endl; tmp.saisie(); robot.insert(robot.begin(),tmp); } } //Affiche Robot1 list void afficheRobot1List(listrobot1){ cout<<"Robot1 - List"<::iterator it; for (it=robot1.begin(); it!=robot1.end(); it++){ it->affiche(); } } //Affiche Robot2 vector void afficheRobot2Vector(vectorrobot2){ cout<<"Robot2 - vector"<::iterator it; for (it=robot2.begin(); it!=robot2.end(); it++){ it->affiche(); } } //template affiche template void afficheRobot(T robotLV, U itlv, V S){ cout<< S <affiche(); } } //Qui est le gagnant /*void somme(list robot1,vector robot2,int &sommeRobot1,int &sommeRobot2){ list::iterator itl; vector::iterator itv; for (itl = robot1.begin(); itl !=robot1.end(); itl++) { if (itl->getCouleur()=='R') { sommeRobot1=sommeRobot1 + (*itl).getVal(); } else { sommeRobot1=sommeRobot1 - (*itl).getVal(); } } for (itv = robot2.begin(); itv !=robot2.end(); itv++) { if (itv->getCouleur()=='B') { sommeRobot2=sommeRobot2 + itv->getVal(); } else { sommeRobot2=sommeRobot2 - itv->getVal(); } } cout<<"Somme Robot1 - list\t=\t"< int somme(T robot, U it, V RB) { // U it; int som = 0; // V RB; for (it = robot.begin(); it!=robot.end(); it++){ if (it->getCouleur()==RB) { som=som+it->getVal(); } else{ som=som-it->getVal(); } } return som; } */ template int somme(T robot, U iter ,V RB) { U it; int som = 0; // V RB; for (it = robot.begin(); it!=robot.end(); it++){ if ((*it).getCouleur()==RB) { som=som+it->getVal(); } else{ som=som-it->getVal(); } } return som; } //Case 4 - Mettre de l'ordre //template void ordre(T &Robot1L, V &Robot2V){ //Ne pas faire de template, ce n'est pas utile void ordre(list &Robot1L, vector &Robot2V, list::iterator itl, vector::iterator itv){ //U itl; //W itv; for (itl = Robot1L.begin(); itl!=Robot1L.end(); itl++){ if (itl->getCouleur() == 'N') { //Au lieu de ce code, on pourrait écrire : it=find(tab.begin(), tab.end(), 'n'); Robot1L.erase(itl); itl=Robot1L.begin(); } if (itl->getCouleur() == 'B') { Robot2V.insert(Robot2V.begin(), *itl); Robot1L.erase(itl); itl=Robot1L.begin(); } } for (itv = Robot2V.begin(); itv!=Robot2V.end(); itv++){ if (itv->getCouleur() == 'N') { Robot2V.erase(itv); itv=Robot2V.begin(); } if (itv->getCouleur() == 'R') { Robot1L.insert(Robot1L.begin(), *itv); Robot2V.erase(itv); itv=Robot2V.begin(); } } } /* void ordre(list &tab1, vector &tab2) {//bugge list::iterator it1; vector::iterator it2; cout<<"Début, on entre dans la fonction ordre"<getCouleur() == 'N') { if ((*it1).getCouleur() == 'N'){ cout << "il faut faire tab1.erase(it1), car It1 sera le Noir" << endl; //visiblement on ne passe pas dans cette branche en premier lieu mais en second lieu ! Normal car la Noire est en 3e position // tab1.erase(it1); //Suppression des boules noires //c'est le erase qui fait bugger // destruction de l'élément tab1.erase(it1); // et on quitte la boucle immédiatement puisqu'on a trouvé break; //avec une liste on utilise la fonction remove() ? } else if (it1->getCouleur() == 'B') { cout << "il faut faire tab2.insert(tab2.begin(),*it1), car It2 sera le Bleu" << endl; //ici on passe bien dedans en premier lieu ! tab2.insert(tab2.begin(),*it1); //transfert des eventuelles boules bleues pénalisantes vers le vecteur (Robot2) cout << "attention c'est à la prochaine instruction pour supprimer la boule Bleue de Robot1 que ca va planter !" << endl; tab1.erase(it1);//Suppression de la boule bleu de la list (Robot1) bugge mais pourquoi donc ? //et il insère bien le contenu de it1 dans le vector Robot 2 //2e problème : Il n'écrase pas car il faut //2 4 4 3 ==> 1 2 4 3 mais il y a 1 2 4 4 3 } } //Même processus pour le robot2 for (it2 = tab2.begin(); it2 != tab2.end(); it2++) { // if (it2->getCouleur() == 'N') { if ((*it2).getCouleur() == 'N'){ cout << "il faut faire tab2.erase(it2), car It2 sera le Noir" << endl; //on ne passe pas du tout dedant ! mais c'est normal car pas de boule noire dans robot2 //tab2.erase(it2);//c'est le erase qui fait bugger // destruction de l'élément tab2.erase(it2); //ca bugge là aussi mais pourquoi donc ? } else if (it2->getCouleur() == 'R') { cout << "il faut faire tab1.insert(tab1.begin(),*it2), car It2 sera le Rouge" << endl; //on passe dedans en 3e lieu ! tab1.insert(tab1.begin(), *it2); //Et il faut supprimer la boule Rouge de Robot2 après l'avoir transférée dans Robot1 cout << "attention c'est à la prochaine instruction pour supprimer la boule Rouge de Robot2 que ca va planter !" << endl; tab2.erase(it2);//Bugg mais pourquoi donc ? // et on a bien ajouté le contenu de it2 soit donc R4 au début de robot 1 } } } */ void ordre(list &tabRob1, vector &tabRob2) {//bugge list::iterator it1; vector::iterator it2; cout<<"Début, on entre dans la fonction ordre"<getCouleur() == 'N') { if ((*it1).getCouleur() == 'N'){ cout << "il faut faire tab1.erase(it1), car It1 sera le Noir" << endl; //visiblement on ne passe pas dans cette branche en premier lieu mais en second lieu ! Normal car la Noire est en 3e position // tab1.erase(it1); //Suppression des boules noires //c'est le erase qui fait bugger // destruction de l'élément tabRob1.erase(it1); it1=tabRob1.begin(); // et on quitte la boucle immédiatement puisqu'on a trouvé break; //avec une liste on utilise la fonction remove() ? } else if (it1->getCouleur() == 'B') { cout << "il faut faire tab2.insert(tab2.begin(),*it1), car It2 sera le Bleu" << endl; //ici on passe bien dedans en premier lieu ! tabRob2.insert(tabRob2.begin(),*it1); //transfert des eventuelles boules bleues pénalisantes vers le vecteur (Robot2) cout << "attention c'est à la prochaine instruction pour supprimer la boule Bleue de Robot1 que ca va planter !" << endl; tabRob1.erase(it1);//Suppression de la boule bleu de la list (Robot1) bugge mais pourquoi donc ? //et il insère bien le contenu de it1 dans le vector Robot 2 it1=tabRob1.begin(); //2e problème : Il n'écrase pas car il faut //2 4 4 3 ==> 1 2 4 3 mais il y a 1 2 4 4 3 } } //Même processus pour le robot2 for (it2 = tabRob2.begin(); it2 != tabRob2.end(); it2++) { // if (it2->getCouleur() == 'N') { if ((*it2).getCouleur() == 'N'){ cout << "il faut faire tab2.erase(it2), car It2 sera le Noir" << endl; //on ne passe pas du tout dedant ! mais c'est normal car pas de boule noire dans robot2 //tab2.erase(it2);//c'est le erase qui fait bugger // destruction de l'élément tabRob2.erase(it2); //ca bugge là aussi mais pourquoi donc ? } else if (it2->getCouleur() == 'R') { cout << "il faut faire tab1.insert(tab1.begin(),*it2), car It2 sera le Rouge" << endl; //on passe dedans en 3e lieu ! tabRob1.insert(tabRob1.begin(), *it2); //Et il faut supprimer la boule Rouge de Robot2 après l'avoir transférée dans Robot1 cout << "attention c'est à la prochaine instruction pour supprimer la boule Rouge de Robot2 que ca va planter !" << endl; tabRob2.erase(it2);//Bugg mais pourquoi donc ? // et on a bien ajouté le contenu de it2 soit donc R4 au début de robot 1 } } } //Case 5 - Copie list copie (list robot1,vector robot2/*, list &liste2*/){//ne pas passer liste2 par paramètres !on fait la copie dans le main list::iterator itl1; vector::iterator itv2; list listeValeurs; //d'abord copier le vector Robot2 for (itv2 = robot2.begin(); itv2 != robot2.end(); itv2++) { listeValeurs.insert(listeValeurs.end(),itv2->getVal()); } //ensuite copier la list Robot1 for (itl1 = robot1.begin(); itl1 != robot1.end() ; itl1++) { listeValeurs.insert(listeValeurs.end(),itl1->getVal()); } return listeValeurs; } void copieNum(vectorV, listL, list&list2){ list2.clear(); vector::iterator itv; list::iterator itl; for (itv = V.begin(); itv!=V.end(); itv++){ list2.push_back(itv->getVal()); } for (itl = L.begin() ; itl!= L.end(); itl++){ list2.push_back(itl->getVal()); } } /* template void copieNumT(X tab, list&list2){ // list2.clear();//surtout pas avec le template sinon après le 1er appel, au 2e rien ne sera sauvé X::iterator it; for (it = tab.begin(); it!=tab.end(); it++){ list2.push_back(it->getVal()); } } */ void afficherListe2(list liste2){ list ::iterator it; for (it = liste2.begin(); it != liste2.end(); it++) { cout<<*it< list2, string S){//j'avais pas mis #include dans l'entête donc erreur suivante : //Erreur 1 error C2679: '<<' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'std::string' (ou il n'existe pas de conversion acceptable) list ::iterator it; for (it = list2.begin(); it != list2.end(); it++) { cout <<"List2 après"< L, vector V){ list Robot1, tmperm1; vector Robot2, tmperm2; tmperm2=Robot2; //pour ne pas perdre les données tmperm1=Robot1; //avant de resizer Robot1.resize(Robot2.size()); //redéfinition de la taille copy(Robot2.begin(), Robot2.end(), Robot1.begin()); //algorithm Robot2.resize(tmperm1.size()); //redéfinition de la taille copy(tmperm1.begin(), tmperm1.end(), Robot2.begin()); //algorithm } //Fct de comparaison pour l'ordre décroissant bool cmp(int a, int b){ return a>b;//sens du TRI décroissant } void menu(int &choix){ cout << "Votre choix?...= " << endl; cout << "1- SaisieRobot1_L et Affichage" << endl; cout << "2- SaisieRobot2_V et Affichage" << endl; cout << "3- Qui est le gagnant?" << endl; cout << "4- Mettre de l'ordre" << endl; cout << "5- Copie des numeros de Robot1 et Robot2 dans la liste2 + tri + Affichage, supprimer les doublons + Affichage" << endl; cout << "6- Permuter Robot1_L et Robot2_V" << endl; cout << "7- Affichage Robot1_L et Robot2_V" << endl; cout << "8- Quitter" << endl; cin>>choix; if (cin.fail()){ cin.clear(); cin.ignore(); cin>>choix; } } int main(){ setlocale(LC_ALL, "fra"); //Pour les accents //déclaration des variables int choix, sommeRobot1=0, sommeRobot2=0; boule robot1, robot2; list L; vector V; list::iterator itl; vector::iterator itv; list liste2; list list2; string S=0; // char RB='v'; int somRobot1=0, somRobot2=0; int som=0; //Sélection d'un choix par l'utilisateur do{ menu(choix); switch(choix) { case 1: cout << "C'est bien le choix 1- SaisieRobot1_L et Affichage" << endl; // saisieRobot1List(L); saisieRobot, string >(L,"Combien de boules voulez-vous que Robot1 saisisse ?"); // afficheRobot1List(L); afficheRobot, list::iterator>(L,itl,"Affichage Robot1_L"); break; case 2: cout << "C'est bien le choix 2- SaisieRobot2_V et Affichage" << endl; // saisieRobot2Vector(V); saisieRobot, string >(V,"Combien de boules voulez-vous que Robot2 saisisse ?"); // afficheRobot2Vector(V); afficheRobot, vector::iterator>(V,itv,"Affichage Robot2_V"); break; case 3: cout << "C'est bien le choix 3- Qui est le gagnant?" << endl; // somme(L,V,sommeRobot1,sommeRobot2); somme,list::iterator,const char[2]>(L,itl,"R"); // somme,char>(L,"R"); somRobot1=som; somme,vector::iterator,const char[2]>(V,itv,"B"); // somme,char>(V,"B"); somRobot2=som; if (somRobot1>somRobot2) { cout<<"Le gagnant est Robot1"<sommeRobot2) { cout<<"Le gagnant est Robot1"<