bool JJOO::mismoCronograma(const JJOO& j) const { bool igual = true; // Verifico misma cantidad de días. if(cantDias() == j.cantDias()) { // Recorro el cronograma día por día. int i = 1; while(i < cantDias()) { // Verifico misma cantidad de competencias en la jornada i-ésima. if(cronograma(i).longitud() == j.cronograma(i).longitud()) { // Recorro competencias de la instancia de JJOO a comparar. int k = 0; while(k < j.cronograma(i).longitud()) { // Verifico que ambos cronogramas tengan las mismas competencias. if(!cronograma(i).pertenece(j.cronograma(i).iesimo(k))) { igual = false; } k++; } } else { igual = false; } i++; } } else { igual = false; } return igual; }
bool JJOO::mismosAtletas(const JJOO& j) const { bool igual = true; // Verifico misma cantidad de atletas. if(_atletas.longitud() == j.atletas().longitud()) { // Recorro lista de atletas de instancia a comparar. int i = 0; while(i < _atletas.longitud()) { // Verfico que ambas instancias tengan los mismos atletas. if(!j.atletas().pertenece(_atletas.iesimo(i))) { igual = false; } i++; } } else { igual = false; } return igual; }
Atleta atletaProdigio(const JJOO & j) { Atleta a = j.competenciasFinalizadasConOroEnPodio().cabeza().ranking().iesimo(0); int i= 1; // vale Pc: |competenciasConOroEnPodio(j)| > 0 && i == 1 && |competenciasConOroEnPodio(j)| >0 // && a == cab ([campeon(c)| c <- competenciasConOroEnPodio(j)]); // Quiero ver: Pc -> I; // implica 1 <= i <= |competenciasConOroEnPodio|; // implica (∀c ∈ competenciasConOroEnPodio(j)[0..1)) añoNacimiento(a) >= añoNacimiento(campeon(c)); // implica 1 <= i <= |competenciasConOroEnPodio| && esCampeon(a,j) // && (∀c ∈ competenciasConOroEnPodio(j)[0..i)) añoNacimiento(a) >= añoNacimiento(campeon(c)); // Luego, Pc -> I; while (i<j.competenciasFinalizadasConOroEnPodio().longitud()) { // B: i < |competenciasConOroEnPodio(j)| // I: 1 <= i <= |competenciasConOroEnPodio(j)| && esCampeon(a,j) //&& (∀c ∈ competenciasConOroEnPodio(j)[0..i)) añoNacimiento(a) >= añoNacimiento(campeon(c)); // variante V: |competenciasConOroEnPodio(j)| - i; // cota C: 0; // Estado E1; // vale I && B; if (a.anioNacimiento() <= j.competenciasFinalizadasConOroEnPodio().iesimo(i).ranking().iesimo(0).anioNacimiento() ) { // Estado IF1; // vale i == i@E1 // && añoNacimiento(a@E1) <= añoNacimiento(campeon(competenciasConOroEnPodio(j)[i])); a = j.competenciasFinalizadasConOroEnPodio().iesimo(i).ranking().iesimo(0); // Estado G // vale i == i@E1 // && añoNacimiento(a@E1) <= añoNacimiento(campeon(competenciasConOroEnPodio(j)[i])) // && a == campeon(competenciasConOroEnPodio(j)[i]); } // Estado E2; // vale G || H; // implica (añoNacimiento(a@E1) <= añoNacimiento(campeon(competenciasConOroEnPodio(j)[i])) // && a == campeon(competenciasConOroEnPodio(j)[i])) // || (añoNacimiento(a@E1) > añoNacimiento(campeon(competenciasConOroEnPodio(j)[i])) // && a == a@E1); // implica añoNacimiento(a) > añoNacimiento(campeon(competenciasConOroEnPodio(j)[i])); // implica esCampeon(a,j); // implica (∀c ∈ competenciasConOroEnPodio(j)[0..i]) añoNacimiento(a) >= añoNacimiento(campeon(c)) i++; // Estado E3; // vale i == i@E2 + 1 && esCampeon(a,j) // && (∀c ∈ competenciasConOroEnPodio(j)[0..i@E2]) // añoNacimiento(a) >= añoNacimiento(campeon(c)); // implica 1 < i; // implica i == i@E2 + 1 < |competenciasConOroEnPodio(j)| + 1 <= |competenciasConOroEnPodio(j)|; // implica 1 <= i <= |competenciasConOroEnPodio(j)|; // implica i@E2 == i - 1; // implica (∀c ∈ competenciasConOroEnPodio(j)[0..i - 1]) // añoNacimiento(a) >= añoNacimiento(campeon(c)); // implica 1 <= i <= |competenciasConOroEnPodio(j)| && esCampeon(a) // && (∀c ∈ competenciasConOroEnPodio[0..i)) añoNacimiento(a) >= añoNacimiento(campeon(c)); // Luego, E3 -> I; // (El invariante se mantiene) // // Quiero ver que la función variante disminuye // vale V = |competenciasConOroEnPodio(j)| - i@E3; // implica V = |competenciasConOroEnPodio(j)| - (i@E1 + 1); // implica V = |competenciasConOroEnPodio(j)| - i@E1 - 1 < // |competenciasConOroEnPodio(j)| - i@E1 == V@E1; // luego, V@E3 < V@E1. // Quiero Ver: (I && (V <= C)) -> ¬B. // Si V <= C, entonces vale I && (V <= C); // implica 1 <= i <= |competenciasConOroEnPodio(j)| && esCampeon(a,j) //&& ((∀c ∈ competenciasConOroEnPodio(j)[0..i)) añoNacimiento(a) >= añoNacimiento(campeon(c))) // && (|competenciasConOroEnPodio(j)| - i <= 0); // implica |competenciasConOroEnPodio(j)| <= i; // implica i == |competenciasConOroEnPodio(j)|; // implica ¬(i < |competenciasConOroEnPodio(j)|); // // Luego, (I && (V <= C)) -> ¬B. } // vale Qc: i == |competenciasConOroEnPodio(j)| && esCampeon(a,j) // && (∀c ∈ competenciasConOroEnPodio(j)) añoNacimiento(a) >= añoNacimiento(campeon(c)); // Quiero Ver: (I && ¬B) -> Qc. // vale I && ¬B // implica 1 <= i <= |competenciasConOroEnPodio(j)| && esCampeon(a,j) //&& ((∀c ∈ competenciasConOroEnPodio(j)[0..i)) añoNacimiento(a) >= añoNacimiento(campeon(c))) // && ¬(i < |competenciasConOroEnPodio(j)|) // implica i >= |competenciasConOroEnPodio(j)| // implica i == |competenciasConOroEnPodio(j)| // implica (∀c ∈ competenciasConOroEnPodio(j)[0..|competenciasConOroEnPodio(j)|)) añoNacimiento(a) >= // añoNacimiento(campeon(c)) // implica (∀c ∈ competenciasConOroEnPodio(j)) añoNacimiento(a) >= añoNacimiento(campeon(c)) // implica i == |competenciasConOroEnPodio(j)| && esCampeon(a,j) // && (∀c ∈ competenciasConOroEnPodio(j)) añoNacimiento(a) >= añoNacimiento(campeon(c)) // luego, (I && ¬B) -> Qc. return a; // vale result == a // implica esCampeon(result,j) // && (∀c ∈ competenciasConOroEnPodio(j)) añoNacimiento(result) >= añoNacimiento(campeon(c)) }
bool JJOO::operator==(const JJOO& j) const { return _anio == j.anio() && _jornadaActual == j.jornadaActual() && mismosAtletas(j) && mismoCronograma(j); }
void MenuJJOO() { int maximaOpcion = 2; cout << "Creando competencia" << endl << "0. Volver al Menu Principal" << endl << "1. Crear JJOO" << endl << "2. Cargar JJOO" << endl; if (jjooCreado) { maximaOpcion = 19; cout << "3. Transcurrir dia" << endl << "4. StevenBradbury" << endl << "5. LiuSong" << endl << "6. Los mas fracasados" << endl << "7. Medallero" << endl << "8. De paseo" << endl << "9. Sequia olimpica" << endl << "10. ¿Ordenados asi hay un patron?" << endl << "11. Boicot por disciplina" << endl << "12. Guardar" << endl << "13. Mostrar" << endl << "14. Ver anio" << endl << "15. Ver Jornada actual" << endl << "16. Ver atletas" << endl << "17. Cantidad de dias" << endl << "18. Atleta Prodigio" << endl << "19. Deportes no olimpicos" << endl; } int opt = LeerOpcion(maximaOpcion); LimpiarPantalla(); switch(opt) { case 0: { LimpiarPantalla(); break; } case 1: { LimpiarPantalla(); jjoo = MenuCrearJJOO(); jjooCreado = true; LimpiarPantalla(); MenuJJOO(); break; } case 2: { LimpiarPantalla(); ifstream archivoEntrada; AbrirArchivoParaLeer(archivoEntrada); jjoo.cargar(archivoEntrada); archivoEntrada.close(); jjooCreado = true; LimpiarPantalla(); MenuJJOO(); break; } case 3: { LimpiarPantalla(); cout << "Comenzando a transcurrir dia" << endl; jjoo.transcurrirDia(); cout << "Dia transcurrido" << endl; Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 4: { LimpiarPantalla(); cout << "Nombre: " << jjoo.stevenBradbury().nombre() << "CIA Number: " << jjoo.stevenBradbury().ciaNumber() << endl; Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 5: { int id; string pais; LimpiarPantalla(); MostrarAtletas(jjoo.atletas(), "Atletas del Juego Olimpico: "); cout << "Indique el atleta y el pais al cual sera nacionalizado :" << endl; cin >> id; cin >> pais; jjoo.liuSong(jjoo.atletas().iesimo(id), pais); Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 6: { string pais; cout << "Indique el pais del cual desea conocer sus atletas mas fracasados: "; cin >> pais; MostrarAtletas(jjoo.losMasFracasados(pais), "Los mas fracasados: "); Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 7: { cout << "Medallero olimpico" << endl; cout << "Pais" << " " << "Medallas" << endl; for (int i = 0; i < jjoo.medallero().longitud(); i++) { cout << jjoo.medallero().iesimo(i).first << " " << jjoo.medallero().iesimo(i).second << endl; } Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 8: { MostrarAtletas(jjoo.dePaseo(), "Atletas de paseo :"); Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 9: { cout << "Sequia olimpica: " << endl; for (int i = 0; i < jjoo.sequiaOlimpica().longitud(); i++) { cout << jjoo.sequiaOlimpica().iesimo(i) << " "; } Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 10: { cout << "¿Hay un patron? " << jjoo.uyOrdenadoAsiHayUnPatron() << endl; Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 11: { string deporte, sexo, pais; Sexo sexoFinal; cout << "Indique el deporte y sexo de la categoria y el pais que desea boicotear : "; cin >> deporte; cin >> sexo; cin >> pais; if (sexo == "f" || sexo == "F" || sexo == "femenino" || sexo == "Femenino") { sexoFinal = Femenino; } if (sexo == "m" || sexo == "M" || sexo == "masculino" || sexo == "Masculino") { sexoFinal = Masculino; } jjoo.boicotPorDisciplina(pair<Deporte, Sexo>(deporte, sexoFinal), pais); cout << "Boicot aplicado" << endl; Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 12: { LimpiarPantalla(); ofstream archivoSalida; AbrirArchivoParaEscribir(archivoSalida); jjoo.guardar(archivoSalida); archivoSalida.close(); LimpiarPantalla(); MenuJJOO(); break; } case 13: { LimpiarPantalla(); jjoo.mostrar(cout); Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 14: { cout << "Anio: " << jjoo.anio() << endl; Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 15: { cout << "Jornada actual: " << jjoo.jornadaActual() << endl; Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 16: { MostrarAtletas(jjoo.atletas(), "Atletas del Juego olimpico: "); Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 17: { cout << "Cantidad de dias: " << jjoo.cantDias() << endl; Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 18: { cout << "El Atleta prodigio es: " << endl; atletaProdigio(jjoo).mostrar(cout); Pausar(); LimpiarPantalla(); MenuJJOO(); break; } case 19: { cout << "Deportes no olimpicos" << endl; Lista<Deporte> deportes = jjoo.deportesNoOlimpicos(); cout << "[ "; for(int i = 0; i < deportes.longitud(); i++) { cout << deportes.iesimo(i) << " "; } cout << "]"; } } }