[C con Clase] ejercicio

Steven Davidson srd4121 en njit.edu
Jue Dic 15 04:28:55 CET 2011


Hola Abdel,

On Thu, Dec 15, 2011 at 2:25 AM, abdel <caponelly-21 en hotmail.com> wrote:
> que mas tengo que realizar en el siguiente ejercicio, para poder ingresar mi nombre y que a su vez este lo de vuelta o lo escriba al reves
>

Como has implementado una pila, entonces apila (push) los primeros
caracteres de la cadena en una pila. Ahora tendrás los primeros
caracteres como los últimos, y los últimos de la cadena como los
primeros. Ahora puedes sacar (pop) los caracteres y guardarlos en
orden en una cadena de caracteres. Ten cuidado de no apilar el
carácter nulo de la cadena. Cuando reconstruyas la cadena, sacando los
caracteres de la pila, entonces agrega el carácter nulo al final de la
cadena.

> #include <stdio.h>
> #include <stdlib.h>
>
> void opcion (void);
>

En C++, no necesitas indicar 'void' para crear una lista vacía de
parámetros de una función.

> class pila
> { char buf[10];
> int n;
> void errorllena(void);
> void errorvacia(void);
> public:
>       void ini(void);

Deberías eliminar esta función y en su lugar, implementar el
constructor de 'pila'. Esto es,

pila();

>       void push(char a);
>       char pop(void);
>       };
>
>       void pila::errorllena (void){
>            printf("ERROR.LA PILA ESTA LLENA\n");}
>
>       void pila::errorvacia (void){
>           printf("ERROR.LA PILA ESTA VACIA\n");}
>
>       void pila::ini(void)
>           { n=0; }
>

Nuevamente, deberías implementar el constructor y no esta función
miembro. Esto sería,

pila::pila()
{
  n = 0;
}

La verdad es que sería mejor inicializar este dato miembro, que sería,

pila::pila() : n(0)  { }

>       void pila::push (char a)
>       {if (n<3) buf[n++] = a;

Creo que querías escribir:

n < 10

>       else errorllena(); }
>

No aconsejo usar este mensaje de error, porque sólo sirve para
informar al usuario y no a tu programa que ha habido algún error.
Sugiero retornar un valor booleano para indicar un resultado correcto
('true') o para indicar que la pila está completamente llena
('false').

Por otra parte, deberías haber creado una función miembro para
determinar si la pila se ha llenado por completo.

>       char pila::pop(void)
>       {if (n=0) {errorvacia(); return 0;}

Esto es un error lógico. Usas el operador = de asignación y no el
operador == de comparación de igualdad, que es lo que te interesa.
Esto es,

if( 0 == n )

Aconsejo lo mismo que en el caso de 'push()', pero sugiero escoger un
valor inválido para 'char', como por ejemplo, -1, para indicar un
resultado erróneo o como es el caso, para indicar que la pila está
vacía.

Por otra parte, deberías haber creado una función miembro para
determinar si la pila está vacía.

>       else return buf[--n]; }
>
>       void opcion (void) {
>            printf("\n 1. Agregar\n"); printf("\n 2. Extraer\n");
>            printf("\n 3. Fin \n\n"); printf("\n Opcion: \n");}
>
>            main()

Debes indicar el tipo de retorno explícitamente: 'int'.

>            { pila p; int op=1;  p.ini();
>            while(op!=3)
>            { opcion();
>            scanf("%d",&op);
>            switch(op) {
>                       case 1: printf("Ingrese un caracter: ");
>                       scanf("%s",&op);  p.push(op);

Esto es incorrecto; tienes dos errores.

En primer lugar, 'op' es de tipo 'int', mientras que especificas para
'scanf()' que va a leer y guardar una cadena de caracteres: %s. En
segundo lugar, la función miembro 'push()' acepta valores de tipo
'char' y no 'int', que es el tipo de 'op'.

Lo que tienes que hacer es,
1.  leer una cadena del teclado -> cadena
2.  tam <- tamaño de "cadena"
3.  Para: i <- 0 hasta tamaño-1, repetir
4.      p.push( cadena[i] )
5.  Terminar.

Como dije antes, tienes que apilar cada carácter de la cadena, en la pila.

>                       break;
>                       case 2: printf("El caracter extraido es: ");
>                       printf("%c\n",p.pop());

Aquí extraes un solo carácter, pero lo que te interesa es extraer
todos los caracteres en la pila, para mostrar la cadena en el sentido
inverso. Si no quieres copiar los caracteres a una cadena primero,
puedes mostrar cada uno directamente a la pantalla. Esto significa que
necesitas un bucle para ir sacando, hasta que no haya más.

>                       //printf("\n");
>                       break;
>                       case 3: printf("\n\nFin\n\n");
>                       break;  }  }
>                       system("pause");
>                      return 0; }


Espero haber aclarado las dudas.

Steven




Más información sobre la lista de distribución Cconclase