Problema 1 public: void distribucio(Cua& c) { /* Pre: El parámetro implícito es vacío, y c = C. */ /* Post: Los elementos de C están distribuidos de forma justa entre c y el parámetro implícito. */ int tpi = 0; int t = 0; node* a = c.primer; c.primer = c.ultim = NULL; longitud = 0; c.longitud = 0; while (a != NULL) { if (t <= tpi) { if (c.ultim == NULL) c.primer = a; else c.ultim->seguent = a; c.ultim = a; t += a->temps; c.longitud++; } else { if (ultim == NULL) primer = a; else ultim->seguent = a; ultim = a; tpi += a->temps; longitud++; } a = a->seguent; } if (c.ultim != NULL) c.ultim->seguent = NULL; if (ultim != NULL) ultim->seguent = NULL; } Problema 2 private: static void avalua_node(node* n, bool& definit, int& result) { /* Pre: n apunta al primer nodo de una jerarquía de nodos que representa una expresión aritmética bien parentizada y no vacía. */ /* Post: Si el valor de la expresión artimética representada por la jerarquía de nodos a la que apunta n está definido, definit es true y result es el resultado de evaluar dicha expresión aritmética; en otro caso, definit es false. */ bool es_entero; string_a_entero(n->info, es_entero, result); if (es_entero) definit = true; else { string op = n->info; if (not (op == "+" or op == "-" or op == "*" or op == "/" or op == "==" or op == "<" or op == "abs" or op == "if")) definit = false; else { int ari = n->seg.size(); if (op == "abs" and ari != 1) definit = false; else if (op == "if" and ari != 3) definit = false; else if (op != "abs" and op != "if" and ari != 2) definit = false; else { if (n->info == "if") { bool defi; int rif; avalua_node(n->seg[0],defi,rif); if (not defi) definit = false; else { if (rif == 1) avalua_node(n->seg[1],definit,result); else if (rif == 0) avalua_node(n->seg[2],definit,result); else definit = false; } } else { vector r(ari); bool d = true; for (int i = 0; d and i < ari; ++i) { avalua_node(n->seg[i],d,r[i]); } if (d) { definit = true; if (op == "+") result = r[0] + r[1]; else if (op == "-") result = r[0] - r[1]; else if (op == "*") result = r[0] * r[1]; else if (op == "abs") result = abs(r[0]); else if (op == "<") result = r[0] < r[1]; else if (op == "==") result = r[0] == r[1]; else { if (r[1] != 0) result = r[0]/r[1]; else definit = false; } } else definit = false; } } } } } public: void avalua(bool& def, int& result) const { /* Pre: El p.i. es un árbol de expresión que representa una expresión aritmética bien parentizada y no vacía. */ /* Post: Si la expresión aritmética asociada al p.i. está definida, asigna el valor true al parámetro def y el resultado de evaluar el p.i. al parámetro result; en otro caso, asigna el valor false al parámetro def. */ avalua_node(primer_node,def,result); }