elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Mensajes
Páginas: 1 [2] 3 4
11  Programación / Programación C/C++ / Re: Clase pila estática en: 30 Octubre 2019, 10:20 am
Lo del return es que lo estaba copiando a mano y me he equivocado  :-X. Las funciones implicadas son:

Código:
void Pila::Vaciar()
{
  while(!Vacia())
    Desapilar();
}

Código:
void Pila::Copiar(Pila p)
{
  Pila aux;
  while (!p.Vacia())
  {
    aux.Apilar(p.Cimapila());
    p.Desapilar();
  }
  while (!aux.Vacia())
  {
    Apilar(aux.Cimapila());
    aux.Desapilar();
  }
}

Código:
void Pila::Apilar(int n)
{
    accesos++;
    
    if (cima >= max)
        throw Pilallena();
    else
    {
      cima ++;
      v[cima] = n;
    }
        
}

void Pila::Desapilar()
{
    accesos++;
    
    if (cima == -1)
        throw Pilavacia();
    else
        cima--;
}

int Pila::Cimapila()
{
    int res;
    v[cima] = res;
    accesos++;
    
    return res;
}

EDIT: dejo también el constructor de la clase, constructor de copia y desrtuctor.

Código:
Pila::Pila()
{
    cima = -1;
    max = 3;
    accesos = 0;
   
    v = new int[max];
   
}

Pila::Pila (const Pila & p)
{
  cima = -1;
  Copiar(p);
}

Pila::~Pila()
{
  Vaciar();
}
12  Programación / Programación C/C++ / Re: Clase pila estática en: 29 Octubre 2019, 21:22 pm
Vengo con la última duda, pensaba que había acabado pero no :(. He intentado hacer la sobrecarga del operador =. Tengo esto:

Código:
const Pila& Pila::operator= (const Pila & p)
{
    Vaciar(); //vacía la pila objeto
    Copiar(p); //copia la p en la pila objeto.
    Return p;
}

Creo que está bien, pero al compilar la línea p = p2 (siendo p una pila llena con valores {1...4} y p2 una pila vacía), salta el error "exited, segmentation fault".
13  Programación / Programación C/C++ / Re: Clase pila estática en: 29 Octubre 2019, 18:59 pm
Muchas gracias. No había pensado que podía usar las funciones sobre el propio objeto, muchas horas delante de esto xD.
14  Programación / Programación C/C++ / Re: Clase pila estática en: 29 Octubre 2019, 17:07 pm
Gracias, la recursividad ya la he entendido. El problema lo sigo teniendo con la función Copiar, ya que al ser una array la pila, he planteado lo siguiente:
- La cima de inicio está en la posición -1.
- Desapilar resta 1 a la variable privada ”cima”, y apilar suma 1 y en esa posición siguiente sobreescribe el dato.

Por lo tanto mi función Copiar es así:
Código:
void Pila::Copiar(const Pila &p)
{
  Pila p1;
  int i = 0;
  while (!p.Vacia()) //Vacia devuelve true si la cima == -1
  {
    p1.Apilar(p.Cimapila());
    p.Desapilar();
    i++;
   }
}
15  Programación / Programación C/C++ / Clase pila estática en: 29 Octubre 2019, 12:46 pm
Buenas, necesito implementar una clase pila estática, aunque la pila ne sí no es un array, sino un puntero a un array de enteros. El problema es que no sé cómo implementar la función copiar. Tengo un constructor de copia declarado como : Pila(const Pila&), y una sobrecarga del = tal que así const Pila& operator= (const Pila&);

Entonces, la cabecera de la función copiar debería de ser void Copiar(const Pila &), pero al intentar utilizar = para asignar las posiciones de la pila que le paso por referencia a otra y así realizar la copia me dice que al ser const no lo puede modificar (obviamente, pero es que solo estoy leyendo, no he cambiado nada). Luego viene el problema de que no puedo desapilar sobre la que paso por referencia, menudo lío llevo xD:

También me gustaría que alguien me explicara la recursividad con un ejemplo que no fuera el factorial xD. Tengo que implementar de manera recursiva una función que devuelva el tamaño de la pila, pero solo le paso por argumento una pila, no lo entiendo. Lo único que se me ocurre es poner en el caso base i = 0, y en el caso recursivo después de cada llamada a la función i++, pero no sé si funcionaría como en prolog.
16  Programación / Programación C/C++ / Re: Colocar una expresión aritmética en un vector en: 15 Abril 2019, 18:29 pm
Bueno, de momento tengo esto, pero no hace nada, o eso parece xD:

Código:
void Expresion::PonerExpresion (string c)
{
    int i, j;
    string x, y;
   
    for (i = 0; i < c.length(); i++)
    {

    if(y == "+" || y == "-" || y == "*" || y == "/" || y == "(" || y == ")")
{
infija.push_back(y);
cout << y << " Signos " << endl;
}

while (isdigit(c[i]))
{
x += c[i];
cout << x << " while isdigit " << endl;
i++;
}

infija.push_back(x);
x = "";
y = c[i];

    for (j = 0; j < infija.size(); j++) //muestra el vector para verificar el resultado.
{
cout << infija[j];
}
}
    return;
}

Edit: Arreglado :)
17  Programación / Programación C/C++ / Colocar una expresión aritmética en un vector en: 15 Abril 2019, 15:06 pm
Buenas, ya tengo arreglado el código de las notaciones, pero revisando el resto del programa, me he dado cuenta de que hice una cosa mal. Mi intención era guardar en un vector cada elemento de una expresión aritmética, pero lo que estaba haciendo en realidad era guardar toda la expresión en un elemento:

Código:
void Expresion :: SetExp (string x)
{
    infija.push_back(x); // infija es un vector de la clase Expresion
}

Lo que yo había pensado era recorrer el string x carácter a carácter con un bucle, pero eso tiene un inconveniente, y es que para números mayores de una cifra estaría mal el algoritmo. Entonces, tengo esto:

Código:
void Expresion :: SetExp (string x)
{
    unsigned int i, j = 0;
    for (i = 0; x[i] < x.length(); i++)
    {
         while (isdigit(c[j]))
         {
              /* aquí hacer algo de tal forma que se guarden todos los numeros, que es lo
               que vengo a preguntar. Se me ha ocurrido crear una string vacía e ir
               guardando los numeros ahí para al salir del bucle while almacenarlo en el
               vector, pero no sé cómo hacerlo realmente. Ahora que pienso esto necesitaría
               además, antes del while, un if con la misma condición para realizar el
               guardado correctamente. Como véis tengo una idea más o menos clara pero
               no lo sé implementar*/
         }
         j = 0;
         infija.push_back[x[i]]
18  Programación / Programación C/C++ / Ayuda con la conversión de notación infija a postfija en: 14 Abril 2019, 19:36 pm
Buenas, tengo un código que supuestamente pasa una expresión aritmética escrita con notación infija a postfija, pero la realidad es que no hace nada, o eso parece:

Código:
void Expresion :: ConvertirEnPostfija ()
{
    Pila p;
   
    string chara, aux;
   
    for (unsigned int i = 0; i < infija.size(); i++)
    {
       
        chara = infija[i];
       
        if (chara == "(")
        {
            p.Apilar(chara); 
}

else
if (chara == ")")
{
p.CimaPila(aux);
while (!(p.PilaVacia() && aux == "("))
        {
        p.Desapilar();
        postfija.push_back(aux);
        p.CimaPila(aux);
}

if (aux == "(")
   p.Desapilar();
   
else
cerr << "ERROR";     
}

else
if (chara == "+" || chara == "-" || chara == "*" || chara == "/" || chara == ")")
{
p.CimaPila(aux);

while (!p.PilaVacia() && !(chara == "(" && aux >= chara))
{
p.Desapilar();
postfija.push_back(aux);
p.CimaPila(aux);
}

p.Apilar(chara);
}

else
   postfija.push_back(chara);
     
while (!p.PilaVacia())
    {
          p.CimaPila(aux);
p.Desapilar();
postfija.push_back(aux);   
    }
    }
     
    return;
}

También necesito ayuda para que deje introducir la expresión con espacios en blanco, ya que usando "cin" salta al último caso del switch en el main, pero el getline me da error.
Código:
switch (opcion) 
{

case 1:
cin >> aritmetica;
exp.PonerExpresion(aritmetica); 
break;


/*Mas opciones que no vienen al caso*/

case 0:
cout << "fin del programa." // salta directamente aquí
break;

default:
            cout << "Opcion no valida" << endl;
}
19  Programación / Programación C/C++ / Re: Me ayudais con esta funcion? en: 9 Enero 2019, 22:32 pm
El primer of parece tener las condiciones al reves
Efectivamente xD. Además tenía que añadir varias condiciones más, un poco raro.
20  Programación / Programación C/C++ / Me ayudais con esta funcion? en: 9 Enero 2019, 19:24 pm
Buenas, se supone que esta funcion tiene que mostrar los libros de una struct entre dos fechas introducidas por el usuario:

Código
  1. void MostrarLibrosFechas (Libros libros)
  2.    {
  3.        Fecha fm, fM;
  4.        Libro lib;
  5.        int i = 1;
  6.  
  7.        cout << "Escribe la fecha menor: " << endl << endl;
  8.  
  9.        fm = PedirFecha ();
  10.  
  11.        cout << "Escribe la fecha mayor: " << endl << endl;
  12.  
  13.        fM = PedirFecha ();
  14.  
  15.        for (int j = 0; j <= libros.num; j++)
  16.        {
  17.            if (fm.anyo >= libros.vect[j].fecha.anyo && fM.anyo <= libros.vect[j].fecha.anyo)
  18.            {
  19.            cout << "Libro " << i << " : " << endl << endl;
  20.                lib = libros.vect[j];
  21.                MostrarLibro (lib);
  22.  
  23.                i++;
  24.            }
  25.  
  26.            else if (fm.anyo == libros.vect[j].fecha.anyo)
  27.            {
  28.                if (fm.mes >= libros.vect[j].fecha.mes)
  29.                {
  30.                    cout << "Libro " << i << " : " << endl << endl;
  31.                    lib = libros.vect[j];
  32.                    MostrarLibro (lib);
  33.  
  34.                    i++;
  35.                }
  36.  
  37.                else if (fm.mes == libros.vect[j].fecha.mes)
  38.                {
  39.                    if (fm.dia >= libros.vect[j].fecha.dia)
  40.                    {
  41.                    cout << "Libro " << i << " : " << endl << endl;
  42.                        lib = libros.vect[j];
  43.                        MostrarLibro (lib);
  44.  
  45.                        i++;
  46.                    }
  47.                }
  48.            }
  49.  
  50.            else if (fM.anyo == libros.vect[j].fecha.anyo)
  51.            {
  52.                if (fM.mes <= libros.vect[j].fecha.mes)
  53.                {
  54.                        cout << "Libro " << i << " : " << endl << endl;
  55.                        lib = libros.vect[j];
  56.                        MostrarLibro (lib);
  57.  
  58.                        i++;
  59.                }
  60.  
  61.                else if (fM.mes == libros.vect[j].fecha.mes)
  62.                {
  63.                    if (fM.dia <= libros.vect[j].fecha.dia)
  64.                    {
  65.                    cout << "Libro " << i << " : " << endl << endl;
  66.                        lib = libros.vect[j];
  67.                        MostrarLibro (lib);
  68.  
  69.                        i++;
  70.                    }
  71.                }
  72.            }
  73.     }
  74.  
  75.     return;
  76. }
  77.  

Por si alguien lo quiere ver, los struct son:

Código
  1. struct Fecha
  2. {
  3.    int dia,mes,anyo;
  4.    };
  5.  
  6. struct Libro
  7. {
  8. Fecha fecha;
  9.    string titulo, autor;
  10.    float precio;
  11.    };
  12.  
  13.    const string NOM_FICH="PracticaFinal_opcion1.libros.dat";
  14.    const int MAX=2000;
  15.    typedef Libro VecLibros[MAX];
  16.  
  17.    struct Libros
  18. {
  19.    int num;
  20.    VecLibros vect;
  21.    };
  22.  

La funcion PedirFecha()

Código:
Fecha PedirFecha ()
    {
        Fecha fecha;
        
        cout << " Dia: ";
        cin >> fecha.dia;
        cout << endl;
        cout << " Mes: ";
        cin >> fecha.mes;
        cout << endl;
        cout << " Anyo: ";
        cin >> fecha.anyo;
        cout << endl;
        
        return fecha;
    }

Y por ultimo la funcion MostrarLibro:

Código:
void MostrarLibro (Libro libro)
{
     cout << "  Titulo del libro:";
        cout << libro.titulo;
        cout << endl;
        cout << "  Nombre del autor:";
        cout << libro.autor;
        cout << endl;
        cout << "  Precio de adquisicion:";
        cout << libro.precio;
        cout << endl;
        cout << "    Dia de compra:";
        cout << libro.fecha.dia;
        cout << endl;
        cout << "    Mes de compra:";
        cout << libro.fecha.mes;
        cout << endl;
        cout << "    Anyo de compra:";
        cout << libro.fecha.anyo << endl << endl;
        
        return;
    }
Páginas: 1 [2] 3 4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines