[C con Clase] 2. Ayuda con la plantilla <vector> (David Reza)
mil100
atltras en gmail.com
Mie Nov 11 10:35:23 CET 2009
Hola.
He leido el código un poco por encima y lo que observo es lo siguiente:
*Puede que este no sea el problema, pero para iterar sobre el
vector mediante bulces for o while, yo usaría un
vector::iterator.
*Respecto a que la clase no este accesible para las demás
funciones puede deberse a que los prototipos de las funciones le
dicen al compilador que van a usar una clase que este no conoce
hasta el momento, debido a que la has declarado después de los
prototipos.
Prueba a colocar el código de la clase nodo antes de los
prototipos.
Un saludo espero haber sido de ayuda.
>
> ------------------------------
>
> Message: 2
> Date: Tue, 10 Nov 2009 18:32:05 -0600
> From: David Reza <l.fix3r.l en gmail.com>
> Subject: [C con Clase] Ayuda con la plantilla <vector>
> To: "Lista de correo sobre C y C++" <cconclase en listas.conclase.net>
> Message-ID:
> <fe9a00e10911101632v796f2a0cmd1f6563e1fb6032a en mail.gmail.com>
> Content-Type: text/plain; charset="iso-8859-1"
>
> Hola a todos, me gustaría que me ayudaran a explicarme un poco el código que
> hice sobre el problema de las 3 jarras. Lo que sucede es que casi no sé
> mucho de clases y me da muchos errores de que la clase Nodo no está al
> alcance de las demás funciones que tengo. Espero contar con su ayuda; a
> continuación el código
>
> =============================== CODE ===============================
>
> #include <iostream>
> #include <vector>
>
> #define JARRA1 8
> #define JARRA2 5
> #define JARRA3 3
>
> using namespace std;
>
> // Prototipos
> bool comprobarNodoEnClose(Nodo nodo, vector <Nodo> Close );
> bool nodoMeta(Nodo nodo);
> void CrearNodo(vector <Nodo> &Open, int jar1, int jar2, int jar3);
> void expandirNodo(Nodo nodo, vector <Nodo> Close, vector <Nodo> &Open);
> void pasarAgua(int cant1, int cant2, int jar1, int jar2, int jar3, vector
> <Nodo> &Open);
> void tirarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo>
> &Open);
> void llenarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo>
> &Open);
> void meterEnOpen(Nodo nodo, vector <Nodo> &Open);
> void meterEnClose(Nodo nodo, vector <Nodo> &Close);
> Nodo sacarNodoDeOpen(vector <Nodo> &Open);
> Nodo primerNodoDeOpen(vector <Nodo> Open);
>
> class Nodo{
> public:
> int j[3];
> Nodo(int j1, int j2, int j3) { // Constructor
> j[0] = j1;
> j[1] = j2;
> j[2] = j3;
> }
> };
>
> bool comprobarNodoEnClose(Nodo nodo, vector <Nodo> Close ){ //
> Comprueba si el nodo está en CLOSE
> int cont = 0; // Contador para recorrer la lista
>
> if (Close.empty())
> return false;
> else {
> while (cont < Close.size()) {
> if(Close.operator==(nodo)) // Comparar elementos de un vector
> return true;
> cont++;
> }
> }
> }
>
> bool nodoMeta(Nodo nodo){
> if (nodo.j[0] == 4 || nodo.j[1] == 4 || nodo.j[2] == 4)
> return true;
> }
>
> void CrearNodo(vector <Nodo> &Open, int jar1, int jar2, int jar3) { //
> Crea un nodo y lo mete en Open
> Nodo nuevo(jar1, jar2, jar3);
> meterEnOpen(nuevo, Open);
> }
>
> void expandirNodo(Nodo nodo, vector <Nodo> Close, vector <Nodo> &Open){
> //Close para comprobar que no está en Close
> if (!comprobarNodoEnClose(nodo, Close)){ // Si NO está en Close
> -> Expandir
> if (nodo.j[0] > 0 && nodo.j[1] != JARRA2)
> pasarAgua(nodo.j[0], nodo.j[1], 1, 2, 0, Open);
> if (nodo.j[0] > 0 && nodo.j[2] != JARRA3)
> pasarAgua(nodo.j[0], nodo.j[2], 1, 0, 2, Open);
> if (nodo.j[1] > 0 && nodo.j[0] != JARRA1)
> pasarAgua(nodo.j[1], nodo.j[0], 2, 1, 0, Open);
> if (nodo.j[1] > 0 && nodo.j[2] != JARRA3)
> pasarAgua(nodo.j[1], nodo.j[2], 0, 1, 2, Open);
> if (nodo.j[2] > 0 && nodo.j[0] != JARRA1)
> pasarAgua(nodo.j[2], nodo.j[0], 2, 0, 1, Open);
> if (nodo.j[2] > 0 && nodo.j[1] != JARRA2)
> pasarAgua(nodo.j[2], nodo.j[1], 0, 2, 1, Open);
> // Si la jarra tiene agua, tirarla
> if (nodo.j[0] != 0)
> tirarAgua(nodo, 1, 0, 0, Open);
> if (nodo.j[1] != 0)
> tirarAgua(nodo, 0, 1, 0, Open);
> if (nodo.j[2] != 0)
> tirarAgua(nodo, 0, 0, 1, Open);
> // Si la jarra no está llena, llenarla
> if (nodo.j[0] != JARRA1)
> llenarJarra(nodo, 1, 0, 0, Open);
> if (nodo.j[1] != JARRA2)
> llenarJarra(nodo, 0, 1, 0, Open);
> if (nodo.j[2] != JARRA3)
> llenarJarra(nodo, 0, 0, 1, Open);
> }
> }
>
> void pasarAgua(int cant1, int cant2, int jar1, int jar2, int jar3, vector
> <Nodo> &Open){ // Necesita la lista open parar pasarla
> int cant2copia =
> 0;
> // a la función CrearNodo() el cual mete el
> nodo en Open
> if (jar1 == 1 && jar2 == 2){
> cant2copia = cant2;
> cant2 += cant1;
> if(cant2 > JARRA2) cant2 = JARRA2;
> cant2copia = cant2 - cant2copia;
> cant1 -= cant2copia;
> CrearNodo(Open, cant1, cant2, jar3);
> }
> if (jar1 == 1 && jar3 == 2){
> cant2copia = cant2;
> cant2 += cant1;
> if(cant2 > JARRA3) cant2 = JARRA3;
> cant2copia = cant2 - cant2copia;
> cant1 -= cant2copia;
> CrearNodo(Open, cant1, jar2, cant2);
> }
> if (jar2 == 1 && jar1 == 2){
> cant2copia = cant2;
> cant2 += cant1;
> if(cant2 > JARRA1) cant2 = JARRA1;
> cant2copia = cant2 - cant2copia;
> cant1 -= cant2copia;
> CrearNodo(Open, cant2, cant1, jar3);
> }
> if (jar2 == 1 && jar3 == 2){
> cant2copia = cant2;
> cant2 += cant1;
> if(cant2 > JARRA3) cant2 = JARRA3;
> cant2copia = cant2 - cant2copia;
> cant1 -= cant2copia;
> CrearNodo(Open, jar1, cant1, cant2);
> }
> if (jar3 == 1 && jar1 == 2){
> cant2copia = cant2;
> cant2 += cant1;
> if(cant2 > JARRA1) cant2 = JARRA1;
> cant2copia = cant2 - cant2copia;
> cant1 -= cant2copia;
> CrearNodo(Open, cant2, jar2, cant1);
> }
> if (jar3 == 1 && jar2 == 2){
> cant2copia = cant2;
> cant2 += cant1;
> if(cant2 > JARRA2) cant2 = JARRA2;
> cant2copia = cant2 - cant2copia;
> cant1 -= cant2copia;
> CrearNodo(Open, jar1, cant2, cant1);
> }
> }
>
> void tirarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo>
> &Open){
> if (jar1 == 1) CrearNodo(Open, 0, jar2, jar3);
> if (jar2 == 1) CrearNodo(Open, jar1, 0, jar3);
> if (jar3 == 1) CrearNodo(Open, jar1, jar2, 0);
> }
>
> void llenarAgua(Nodo nodo, int jar1, int jar2, int jar3, vector <Nodo>
> &Open){
> if (jar1 == 1) CrearNodo(Open, JARRA1, jar2, jar3);
> if (jar2 == 1) CrearNodo(Open, jar1, JARRA2, jar3);
> if (jar3 == 1) CrearNodo(Open, jar1, jar2, JARRA3);
> }
>
> void meterEnOpen(Nodo nodo, vector <Nodo> &Open){
> Open.push_back(nodo);
> }
>
> void meterEnClose(Nodo nodo, vector <Nodo> &Close){
> Close.push_back(nodo);
> }
>
> Nodo sacarNodoDeOpen(vector <Nodo> &Open){
> Nodo temporal = Open[0];
> for (int cont = 0; cont < Open.size(); cont++) {
> Open[cont] = Open[cont + 1];
> }
> Open.pop_back();
> return temporal;
> }
>
> Nodo primerNodoDeOpen(vector <Nodo> Open) {
> return Open[0];
> }
>
>
> // INICIO
> int main()
> {
> vector <Nodo> Open; //
> LISTAS
> vector <Nodo> Close;
>
> Nodo principal(0,0,0);
> meterEnOpen(principal, Open);
>
> while (!Open.empty()) {
>
>
> if (nodoMeta(primerNodoDeOpen(Open))) {
> cout << "META ENCONTRADA!" << endl;
> return 0;
> }
> else {
> meterEnClose(primerNodoDeOpen(Open)); // Metemos nodo en Close
> expandirNodo(sacarNodoDeOpen(Open), Close, Open); // Expandimos y
> sacamos de Open
> }
> }
>
> cout << endl << endl << "No se encontró solución" << endl;
>
> return 0;
> }
>
Más información sobre la lista de distribución Cconclase