csansoon

Sessio 3 P1 (3/5)

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