Advertisement
JosepRivaille

X68173: Conjunt d'estudiants amb imax

Oct 5th, 2015
2,405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.93 KB | None | 0 0
  1. #include "Cjt_estudiants.hh"
  2. #include <algorithm>
  3.  
  4. Cjt_estudiants::Cjt_estudiants() {
  5.   nest = 0;
  6.   vest = vector<Estudiant>(MAX_NEST);
  7.   imax = -1;
  8. }
  9.  
  10. Cjt_estudiants::~Cjt_estudiants() {}
  11.  
  12.  
  13. void Cjt_estudiants::afegir_estudiant(const Estudiant& est) {
  14.   if (nest >= MAX_NEST) throw PRO2Excepcio("Conjunt ple");
  15.   int i = nest-1;
  16.   bool b = false;
  17.   int dni = est.consultar_DNI();
  18.   while (i >= 0 and not b) {  
  19.     if (dni> vest[i].consultar_DNI()) b = true;
  20.     else {
  21.       if (i == imax) ++imax;
  22.       vest[i+1]=vest[i];
  23.       --i;
  24.     }
  25.   }
  26.   // i es la posicio mes avancada amb el DNI mes petit que dni, si n'hi ha;
  27.   // si no, i=-1
  28.   vest[i+1] = est;
  29.   ++nest;
  30.   recalcular_posicio_imax();
  31. }
  32.  
  33. int Cjt_estudiants::cerca_dicot(const vector<Estudiant> &vest, int left, int right, int x) {
  34. /* Pre: vest esta ordenat */
  35.   int i;
  36.   bool found = false;
  37.   while (left <= right and not found) {
  38.     i = (left + right)/2;
  39.     if (x < vest[i].consultar_DNI()) right = i - 1;
  40.     else if (x > vest[i].consultar_DNI()) left = i + 1;
  41.     else found = true;
  42.   }
  43.   // i es la posicio, si l'element existeix
  44.   if (found) return i;
  45.   else return -1;  
  46. }
  47.  
  48. void Cjt_estudiants::recalcular_posicio_imax() {
  49.   double nota_aux = -1;
  50.   int pos_aux = -1;
  51.   for (int i = 0; i < nest; ++i) {
  52.     if (vest[i].te_nota()){
  53.       if (vest[i].consultar_nota() > nota_aux) {
  54.     nota_aux = vest[i].consultar_nota();
  55.     pos_aux = i;
  56.       }
  57.       else if (vest[i].consultar_nota() == nota_aux) {
  58.     if (vest[i].consultar_DNI() < vest[pos_aux].consultar_DNI()) {
  59.       nota_aux = vest[i].consultar_nota();
  60.       pos_aux = i;
  61.     }
  62.       }
  63.     }
  64.   }
  65.   imax = pos_aux;
  66. }
  67.  
  68. void Cjt_estudiants::modificar_estudiant(const Estudiant& est) {
  69.   /* Pre: existeix un estudiant al parametre implicit amb el dni d'est  */
  70.   int x = est.consultar_DNI();
  71.   int i = cerca_dicot(vest,0,nest-1,x);
  72.   vest[i] = est;
  73.   recalcular_posicio_imax();
  74. }    
  75.        
  76. void Cjt_estudiants::modificar_iessim(int i, const Estudiant& est) {
  77.   if (i < 1 or i > nest) throw PRO2Excepcio("Index no valid per a modificar_iessim");
  78.   if (est.consultar_nota() > vest[imax].consultar_nota()) imax = i-1;
  79.   vest[i-1] = est;
  80.   ordenar_cjt_estudiants();
  81.   recalcular_posicio_imax();
  82. }
  83.  
  84. void Cjt_estudiants::esborrar_estudiant(int dni) {
  85.   int i = 0;
  86.   bool b = false;
  87.   bool recalc = false;
  88.   while (!b && i < nest) {
  89.     if (vest[i].consultar_DNI() == dni) b = true;
  90.     ++i;
  91.   }
  92.   if (!b) throw PRO2Excepcio("No existeix cap estudiant amb aquest dni");
  93.   if (i-1 == imax) recalc = true;
  94.   for (int j = i; j < nest; ++j) {
  95.     vest[j-1] = vest[j];
  96.   }
  97.   --nest;
  98.   if (recalc) recalcular_posicio_imax();
  99. }
  100.  
  101. int Cjt_estudiants::mida() const {
  102.   return nest;
  103. }
  104.  
  105. int Cjt_estudiants::mida_maxima() {
  106.   return MAX_NEST;
  107. }
  108.  
  109. bool Cjt_estudiants::existeix_estudiant(int dni) const {
  110.   int i= cerca_dicot(vest,0,nest-1,dni);
  111.   return (i != -1);
  112. }
  113.  
  114. Estudiant Cjt_estudiants::consultar_estudiant(int dni) const {
  115.   int i=cerca_dicot(vest,0,nest-1,dni);
  116.   return vest[i];
  117. }
  118.  
  119. Estudiant Cjt_estudiants::consultar_iessim(int i) const {
  120.  if (i < 1 or i > nest) throw PRO2Excepcio("Index no valid per a consultar_iessim");
  121.   return vest[i-1];
  122. }
  123.  
  124. bool comp(const Estudiant &e1, const Estudiant &e2){
  125.   return (e1.consultar_DNI() < e2.consultar_DNI());
  126. }
  127.  
  128. void Cjt_estudiants::ordenar_cjt_estudiants() {
  129.   sort(vest.begin(),vest.begin()+nest,comp);
  130. }
  131.  
  132. Estudiant Cjt_estudiants::estudiant_nota_max( ) const {
  133.   if (imax == -1) throw PRO2Excepcio("Cap estudiant te nota");
  134.   return vest[imax];
  135. }
  136.  
  137. void Cjt_estudiants::llegir() {
  138.   cin >> nest;
  139.   if (nest > MAX_NEST) throw PRO2Excepcio("El conjunt no pot ser mes gran que la mida maxima");
  140.   for (int i = 0; i < nest; ++i) vest[i].llegir();
  141.   ordenar_cjt_estudiants();
  142.   recalcular_posicio_imax();
  143. }
  144.  
  145.  
  146. void Cjt_estudiants::escriure() const {
  147.   for (int i = 0; i < nest; ++i)
  148.     vest[i].escriure();
  149. }
  150.  
  151. //JosepRivaille
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement