예제 #1
0
파일: pro2.cpp 프로젝트: AitorSanchez/PRO2
/** @brief El progrma utilizara las clases Especie, Area, Cjt_especies y Cjt_areas
*/
int main() {
	Cjt_especies c;
	c.leer_cjt_especies();	
	int R = readint();
	int n = c.num_especies();
    Cjt_areas E(R,n) ;
	E.leer_cjt_areas();
    int accion = readint();
    while (accion != -6) {
		if (accion == -1) {
			E.lucha_especies(c);
		}
		else if (accion == -2) {
			int t = readint();
			int r = readint();
			int e = readint();
			int h = readint();
			int g = readint();
			Arbre<int> b = E.arbol_areas();
			if (t == 1) {
				if (r != b.arrel()) {
						Arbre <int> a1;
						Arbre <int> a2;
						b.fills(a1, a2);
					while (a1.arrel() != r and a2.arrel() != r) {
						Arbre <int> a3;
						a1 = a3;
						a2 = a3;
						b.fills(a1, a2);
					}
					if (a1.arrel() == r) b = a1;
					else b = a2;
				}	
				E.anade_especimenes(r, e, h*(-1));	
				E.migracion_a(b, r, e, h, g);
			}
			else {
				pair<bool, int> x;
				x = E.migracion_b(b, r, e, h, g);
			}
		}

		else if (accion == -3) {
			int m = readint();
			int e = readint();
			int r = readint();
			E.anade_especimenes(r, e, m);
		}
		else if (accion == -4) {
			int e = readint();
			int n = readint();
			c.cambia_preferencias(e, n);
		}
		else if (accion == -5) {
			E.escribir_cjt_areas();
		}
		cin >> accion;
    }
}
예제 #2
0
Arbre* Syntaxe::niv0() {
  //  std::wcout << "niv 0" << std::endl;

  Arbre *a;
  switch (lex.GetId()) {
  case PGAUCHE :
    lex.Read();
    a = nivn(7);
    if (lex.GetId() != PDROITE) {
      // ERREUR : PDROITE
      std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"')' attendu." << std::endl;
      err = true;
    } else lex.Read();
    break;

  case ID :
    if (isData) {
      // ERREUR
      std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"la taille des zones de données ne doivent pas dépendre de labels." << std::endl;
      err = true;
      if (lex.GetSymb().GetInit())
	a = new Arbre(NOMBRE, lex.GetSymb().GetValue(), lex.GetLine(), lex.GetColumn());
      else 
	a = new Arbre(UNDEFINED, 0, lex.GetLine(), lex.GetColumn());
      break;
    }
    a = new Arbre(ID, 0, lex.GetLine(), lex.GetColumn());
    a->SetSymbole(lex.GetSymb());
    lex.Read();
    break;
  case NOMBRE :
    a = new Arbre(NOMBRE, lex.GetIdbis(), lex.GetLine(), lex.GetColumn());
    lex.Read();
    break;
    
  case MOINS:
    a = new Arbre(MOINS, 0, lex.GetLine(), lex.GetColumn());
    lex.Read();
    a->SetFilsGauche(new Arbre(NOMBRE, 0, 0, 0)); // car -x = 0-x
    a->SetFilsDroit(niv0());
    break;

  case NON:
    a = new Arbre(NON, 0, lex.GetLine(), lex.GetColumn());
    lex.Read();
    a->SetFilsGauche(niv0());
    break;

  default :
    err = true;
    std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"nombre attendu." << std::endl;
    a = new Arbre(UNDEFINED, 0, lex.GetLine(), lex.GetColumn());
  }
  return a;
}
예제 #3
0
Arbre* Syntaxe::nivnbis(Arbre *prec, int niveau) {
  Arbre* res; // résultat a envoyer
  Arbre* suiv; // pour l'associativité à gauche
  bool b = false;
  unsigned int t = lex.GetId();
  //  std::wcout << "niv " << niveau << "'" << std::endl;

  switch(niveau) {
  case 1:
    b = (t == EXP);
    break;
  case 2:
    switch (t) {
    case FOIS:
    case DIV:
    case MODULO:
      b = true;
    }
    break;
  case 3:
    switch (t) {
    case PLUS:
    case MOINS:
      b = true;
    }
    break;
  case 4:
    switch (t) {
    case DECG:
    case DECD:
      b = true;
    }
    break;
  case 5:
    b = (t == ET);
    break;
  case 6:
    b = (t == OUX);
    break;
  case 7:
    b = (t == OU);
    break;
  }

  if (b) {
    lex.Read();
    suiv = new Arbre(t, 0, lex.GetLine(), lex.GetColumn());
    suiv->SetFilsGauche(prec);
    suiv->SetFilsDroit(nivn(niveau-1));
    res = nivnbis(suiv, niveau);
  } else res = prec;

  return res;
}
예제 #4
0
void ManagerArbre::add(Arbre &node)
{
    if(node.feuille())
    {
        if(node.parent())
        {
            Arbre parent(node.parent());
            get(parent);
            if(parent.feuille())
            {
                if(node.num())
                    throw std::invalid_argument("Le premier descendnat doit avoir un numéro nul.");
                else
                    ManagerSqlArbre::add(node);
                parent.setFeuille(false);
                ManagerSqlArbre::modify(parent);
            }
            else
            {
                int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent());
                if(node.num() < 0 || node.num() > max)
                {
                    node.setNum(max+1);
                    ManagerSqlArbre::add(node);
                }
                else
                {
                    ListPtr<Arbre> nodes(getList(Arbre::Parent,node.parent(),
                                                 Arbre::Num,node.num(),
                                                 Arbre::Num,
                                                 bdd::Condition::Egal,bdd::Condition::SupEgal,
                                                 false));
                    for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i)
                    {
                        (*i).setNum((*i).num() + 1);
                        ManagerSqlArbre::modify(*i);
                    }
                    ManagerSqlArbre::add(node);
                }
            }
        }
        else
        {
            if(node.num())
                throw std::invalid_argument("Une racine doit avoir un numéro nul.");
            else
                ManagerSqlArbre::add(node);
        }
    }
    else
        throw std::invalid_argument("Le nouveau noeud ajouté doit être une feuille.");
}
예제 #5
0
int Organigrama::assign_offi_less_level(Arbre<int> &a, Agenda &agenda, int day, int& level_aux, int level, bool &found, int& depth)
{
    int id;
    if (level_aux <= level and not a.es_buit()) {
        int root = a.arrel();
        int id_cita;
        agenda.consultar_cita(root, day, id_cita);
        if (id_cita == 0) {
            found = true;
            depth = 0;
            id = root;
        }
        else {
            ++level_aux;
            Arbre<int> a1, a2;
            a.fills(a1, a2);
            int depth1, depth2;
            bool found1, found2;
            int id_1, id_2;
            id_1 = assign_offi_less_level(a1, agenda, day, level_aux, level, found1, depth1);
            id_2 = assign_offi_less_level(a2, agenda, day, level_aux, level, found2, depth2);

            if (found1 and found2) {
                depth1 = depth1 + 1;
                depth2 = depth2 + 1;
                if (depth1 <= depth2) {
                    depth = depth1;
                    id = id_1;
                }
                else {
                    depth = depth2;
                    id = id_2;
                }
            }

            else if (found1) {
                depth = depth1 + 1;
                id = id_1;
            }
            else if (found2) {
                depth = depth2 + 1;
                id = id_2;
            }
            found = found1 or found2;
            --level_aux;
            a.plantar(root, a1, a2);
        }
    }
    else found = false;
    if (found) return id;
    else return -1;
}
예제 #6
0
파일: ArbIOint.hpp 프로젝트: Outer2g/PRO2
void escriure_arbre_int( Arbre<int> &a) {
  if (not a.es_buit()) { 
    Arbre<int> a1;
    Arbre<int> a2;
    int x = a.arrel();
    a.fills(a1,a2);
    escriure_arbre_int(a1); 
    cout << " " << x;
    escriure_arbre_int(a2); 
    a.plantar(x,a1,a2);
  }
 
}
예제 #7
0
void ManagerArbre::modifyUnstable(const Arbre & node)
{
    Arbre nodeBdd(node.id());
    get(nodeBdd);
    int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent());
    if(node.num() < 0 || node.num() > max)
        ManagerSqlArbre::modify(Arbre(nodeBdd.feuille(),max+1,node.parent(),node.id()));
    else
    {
        if(deplace(node))
            ManagerSqlArbre::modify(node);
    }

    if(node.parent() != nodeBdd.parent())
    {
        if(!exists(Arbre::Parent,nodeBdd.parent()))
        {
            Arbre nodeBddParent(nodeBdd.parent());
            get(nodeBddParent);
            nodeBddParent.setFeuille(true);
            ManagerSqlArbre::modify(nodeBddParent);
        }

        Arbre nodeParent(node.parent());
        get(nodeParent);
        if(nodeParent.feuille())
        {
            nodeParent.setFeuille(false);
            ManagerSqlArbre::modify(nodeParent);
        }
    }
}
예제 #8
0
void Syntaxe::lignesdonnees() {
  Symbole s;
  Arbre *a;
  while (lex.GetId() == FIN_LIGNE) {
    lex.Read();
  }

  switch (lex.GetId()) {
  case ID :
    // initialisation de la valeur de l'ID
    s = lex.GetSymb();
    if (s.GetInit()) {
      // Erreur : symbole déjà rencontré
      std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"le label " << s.GetText() << " est déjà déclaré." << std::endl;
      err = true;
    } else s.SetValue(cData);
    lex.Read();
    if (lex.GetId() != DEUX_POINTS) {
      // ERREUR : il faut :
      std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"':' attendu." << std::endl;
      err = true;
    } else lex.Read();
    lignesdonnees();
    break;

  case NOMBRE :
  case MOINS:
  case NON:
  case PGAUCHE :
    a = nivn(7);
    a->Evaluate();
    if (a->GetType() != UNDEFINED) 
      cData += a->GetValue(); // met à jour le compteur de données.
    delete a;
    if (lex.GetId() != FIN_LIGNE) {
      // ERREUR : il faut un saut de ligne
      std::wcerr << L"Erreur ligne " << lex.GetLine() << L" colonne " << lex.GetColumn() << L"\u00a0: " << L"la déclaration d'une zone de données doit être suivie d'un saut de ligne." << std::endl;
      err = true;
      while (lex.GetId() != FIN_LIGNE) lex.Read();
    }
    lex.Read();
    lignesdonnees();
    break;

  default :
    // cas epsilon
    break;
  }
}
예제 #9
0
bool ManagerArbre::deplace(const Arbre & node)
{
    Arbre nodeBdd(node.num(),node.parent());
    if(existsUnique(nodeBdd))
    {
        if(nodeBdd.id() != node.id())
        {
            nodeBdd.setNum(-nodeBdd.num());
            ManagerSqlArbre::modify(nodeBdd);
            return true;
        }
        else
            return false;
    }
    else
        return true;
}
예제 #10
0
void ManagerArbre::modifyStableUnstable(const Arbre & node)
{
    Arbre nodeBdd(node.id());
    get(nodeBdd);
    int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent());
    if(node.num() < 0 || node.num() > max)
        ManagerSqlArbre::modify(Arbre(nodeBdd.feuille(),max+1,node.parent(),node.id()));
    else
    {
        if(deplace(node))
            ManagerSqlArbre::modify(node);
    }

    if(nodeBdd.parent() != 0 && nodeBdd.parent() != node.parent())
    {
        if(exists(Arbre::Parent,nodeBdd.parent()))
        {
            ListPtr<Arbre> nodes(getList(Arbre::Parent,nodeBdd.parent(),Arbre::Num,nodeBdd.num(),Arbre::Num,bdd::Condition::Egal,bdd::Condition::Sup));
            for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i)
            {
                (*i).setNum((*i).num() - 1);
                ManagerSqlArbre::modify((*i));
            }
        }
        else
        {
            Arbre parent(nodeBdd.parent());
            get(parent);
            parent.setFeuille(true);
            ManagerSqlArbre::modify(parent);
        }
    }
}
예제 #11
0
bool ManagerArbre::del(const Arbre & node)
{
    if(!node.feuille() || !ManagerSqlArbre::del(node.id()))
        return false;
    if(node.parent())
    {
        if(exists(Arbre::Parent,node.parent()))
        {
            ListPtr<Arbre> nodes(getList(Arbre::Num,node.num(),Arbre::Parent,node.parent(),Arbre::Num,bdd::Condition::Sup));
            for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i)
            {
                (*i).setNum((*i).num() - 1);
                ManagerSqlArbre::modify(*i);
            }
        }
        else
        {
            Arbre parent(node.parent());
            get(parent);
            parent.setFeuille(true);
            ManagerSqlArbre::modify(parent);
        }
    }
    return true;
}
예제 #12
0
void Organigrama::leer_arbol(Arbre<int> &a, int marca) {
  int r; 
  cin >> r; 
  if (r != marca) {
      Arbre<int> hi, hd; 
      leer_arbol(hi,marca);
      leer_arbol(hd,marca);
      a.plantar(r,hi,hd);
  }
}
예제 #13
0
파일: ArbIOint.hpp 프로젝트: Outer2g/PRO2
void llegir_arbre_int(Arbre<int>& a, int marca)
//Pre: a es buit
//Post: a conté l'abre llegit de l'entrada
{
  Arbre<int> a1;
  Arbre<int> a2;
  int x;
  cin >> x;
  if (x!= marca) {
    llegir_arbre_int(a1, marca);
    llegir_arbre_int(a2, marca);
    a.plantar(x,a1,a2);
  }
}
예제 #14
0
void Red::leer_red_recursivo(Arbre<int> &a, vector<int> &estaciones, int id_estacion, int tiempo_acumulado) {

  int tiempo = readint();
  if (tiempo >= 0) {

    tiempo_acumulado += tiempo;
    estaciones[id_estacion] = tiempo_acumulado;

    Arbre<int> a1, a2;
    leer_red_recursivo(a1, estaciones, id_estacion * 2 + 1, tiempo_acumulado);

    leer_red_recursivo(a2, estaciones, id_estacion * 2 + 2, tiempo_acumulado);

    a.plantar(tiempo_acumulado, a1, a2);
  }
}
예제 #15
0
void ManagerArbre::addUnstable(Arbre &node)
{
    if(node.feuille())
    {
        if(node.parent())
        {
            Arbre parent(node.parent());
            get(parent);
            if(parent.feuille())
            {
                if(node.num())
                    throw std::invalid_argument("Le premier descendnat doit avoir un numéro nul.");
                else
                    ManagerSqlArbre::add(node);
                parent.setFeuille(false);
                ManagerSqlArbre::modify(parent);
            }
            else
            {
                int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent());
                if(node.num() < 0 || node.num() > max)
                {
                    node.setNum(max+1);
                    ManagerSqlArbre::add(node);
                }
                else
                {
                    deplace(node);
                    ManagerSqlArbre::add(node);
                }
            }
        }
        else
        {
            if(node.num())
                throw std::invalid_argument("Une racine doit avoir un numéro nul.");
            else
                ManagerSqlArbre::add(node);
        }
    }
    else
        throw std::invalid_argument("Le nouveau noeud ajouté doit être une feuille.");
}
예제 #16
0
void ManagerArbre::modify(const Arbre & node)
{
    Arbre nodeBdd(node.id());
    get(nodeBdd);
    int idParentBdd = nodeBdd.parent();
    int numBdd = nodeBdd.num();
    if(node.parent())
    { 
        if(nodeBdd.parent() == node.parent())
        {
            int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent());
            int num = node.num();
            if(num < 0 || num > max)
                num = max;
            if(numBdd != num)
            {
                nodeBdd.setNum(-numBdd);
                ManagerSqlArbre::modify(nodeBdd);
                if(std::abs(numBdd - num) == 1)
                {
                    Arbre nodeSuivant(num,node.parent());
                    getUnique(nodeSuivant);
                    nodeSuivant.setNum(numBdd);
                    ManagerSqlArbre::modify(nodeSuivant);
                }
                else if(num < numBdd)
                {
                    ListPtr<Arbre> nodes(getList(Arbre::Parent,node.parent(),Arbre::Num,num,Arbre::Num,numBdd,
                                                Arbre::Num,bdd::Condition::Egal,bdd::Condition::SupEgal,bdd::Condition::Inf,false));
                    for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i)
                    {
                        (*i).setNum((*i).num() + 1);
                        ManagerSqlArbre::modify((*i));
                    }
                }
                else
                {
                    ListPtr<Arbre> nodes(getList(Arbre::Parent,node.parent(),Arbre::Num,numBdd,Arbre::Num,num,
                                                Arbre::Num,bdd::Condition::Egal,bdd::Condition::Sup,bdd::Condition::InfEgal));
                    for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i)
                    {
                        (*i).setNum((*i).num() - 1);
                        ManagerSqlArbre::modify((*i));
                    }
                }
                nodeBdd.setNum(num);
            }
        }
        else
        {
            nodeBdd.setParent(node.parent());
            Arbre parent(nodeBdd.parent());
            get(parent);
            if(parent.feuille())
            {
                parent.setFeuille(false);
                ManagerSqlArbre::modify(parent);
                nodeBdd.setNum(0);
            }
            else
            {
                int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent());
                if(node.num() < 0 || node.num() > max)
                    nodeBdd.setNum(max + 1);
                else
                {
                    ListPtr<Arbre> nodes(getList(Arbre::Parent,node.parent(),Arbre::Num,node.num(),
                                                Arbre::Num,bdd::Condition::Egal,bdd::Condition::SupEgal,false));
                    for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i)
                    {
                        (*i).setNum((*i).num() + 1);
                        ManagerSqlArbre::modify((*i));
                    }
                    nodeBdd.setNum(node.num());
                }
            }
        }
        ManagerSqlArbre::modify(nodeBdd);
    }
    else
    {
        nodeBdd.setParent(0);
        nodeBdd.setNum(0);
        ManagerSqlArbre::modify(nodeBdd);
    }

    if(idParentBdd != 0 && idParentBdd != nodeBdd.parent())
    {
        if(exists(Arbre::Parent,idParentBdd))
        {
            ListPtr<Arbre> nodes(getList(Arbre::Parent,idParentBdd,Arbre::Num,numBdd,Arbre::Num,bdd::Condition::Egal,bdd::Condition::Sup));
            for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i)
            {
                (*i).setNum((*i).num() - 1);
                ManagerSqlArbre::modify((*i));
            }
        }
        else
        {
            Arbre parent(idParentBdd);
            get(parent);
            parent.setFeuille(true);
            ManagerSqlArbre::modify(parent);
        }
    }
}