Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: pakleisito en 18 Marzo 2011, 07:25 am



Título: nueva duda pila en C
Publicado por: pakleisito en 18 Marzo 2011, 07:25 am
Esta es mi nueva duda ... al compilar me sale error en la funcion convertir cuando llamo a las funciones push y pop.

Código
  1. #include <iostream.h>
  2. int num=0,base=0,val=0,x=0;
  3. typedef struct datos{
  4.        int dato;
  5.        struct datos *siguiente;
  6.        }tipoNodo;
  7.  
  8. typedef tipoNodo *pNodo;
  9. typedef tipoNodo *Pila;
  10. typedef Pila *pila;
  11.  
  12. void push (Pila *l,int val);
  13. int pop (Pila *l);
  14.  
  15. void push(Pila *pila,int val){
  16.     pNodo nuevo;
  17.     nuevo = (pNodo) malloc (sizeof(tipoNodo));
  18.     nuevo->dato = val;
  19.     nuevo->siguiente =*pila;
  20.     *pila = nuevo;
  21.     }
  22.  
  23. int pop(Pila *pila){
  24.     pNodo aux;
  25.     int v;
  26.     aux = *pila;
  27.     if (!aux) cout<<"\npila vacia\n";
  28.     *pila = aux->siguiente;
  29.     v = aux->dato;
  30.     free (aux);
  31.     return v;
  32.     system ("pause");
  33.     }
  34.  
  35. void convertir(int num,int base){
  36.            int x=0,val=0,aux=0;
  37.                  aux=num;
  38.                  do{
  39.                  val=num%base;
  40.                  aux=aux/base;
  41.                  void push(&pila,val);
  42.                  cout<<"el elemento insertado es:"<<val;
  43.                  x=pop(&pila);
  44.                  cout<<x;
  45.                  system("pause");
  46.                  }while(aux>base);
  47.  
  48.            }    
  49.  
  50.  
  51.  
  52. int main (){
  53.     Pila pila = NULL;
  54.     cout << "Codigo binario de un numero\nDigita el numero\n";
  55.     cin>>num;
  56.     cout << "Digita la base que deseas\n";
  57.     cin >>base;
  58.     void convertir (int num,int base);
  59.  
  60. }
  61.  

Saludos


Título: Re: nueva duda pila en C
Publicado por: Akai en 18 Marzo 2011, 13:16 pm
Cuando dices "error al compilar" podrías al menos poner el error. Pero bueno, me siento generoso y voy a intentar compilar tu código ¬¬

1) Iostream se incluye sin el .h

2) usas malloc y free sin incluir cstdlib

3) La implementación de tus funciones, debería ir debajo del main, o no poner las declaraciones.

4) en convertir haces esto:
Código
  1. void push(&pila,val);
y eso, NO se hace.


Título: Re: nueva duda pila en C
Publicado por: pakleisito en 18 Marzo 2011, 15:33 pm
si mis problemas son exactamente con esas lineas.
pero me podrias decir entonces como SI se hace porfavor
Gracias :)


Título: Re: nueva duda pila en C
Publicado por: Akai en 18 Marzo 2011, 15:36 pm
sin el void

Código
  1. push(&pila,val);

El void lo utilizas cuando declaras una función, cuando la invocas no lo necesitas.


Título: Re: nueva duda pila en C
Publicado por: pakleisito en 18 Marzo 2011, 15:39 pm
pero por que me sale este error en la funcion convertir exactamente al llamar a push y pop
42 expected primary-expression before ',' token
44 expected primary-expression before ')' token

Gracias =)


Título: Re: nueva duda pila en C
Publicado por: Akai en 18 Marzo 2011, 18:36 pm
Básicamente porque tu código está mal. Usas typedef como quien no quiere la cosa y sin saber lo que hace, tengo la impresión.

Código
  1. typedef tipoNodo *Pila;
  2. typedef Pila *pila;

NO TIENES DEFINIDO PILA!!!


Título: Re: nueva duda pila en C
Publicado por: pakleisito en 18 Marzo 2011, 20:08 pm
ahora tengo este
Código
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <cstdlib>
  4. int x=0,val=0,num=0,base=0;
  5. typedef struct datos{
  6.        int dato;
  7.        struct datos *siguiente;
  8.        }tipoNodo;
  9.  
  10. typedef tipoNodo *pNodo;
  11. typedef tipoNodo *Pila;
  12. Pila *pila;
  13.  
  14. void push (Pila *l,int val);
  15. int pop (Pila *l);
  16. void convertir (int num,int base);
  17.  
  18. main (){
  19.     Pila pila = NULL;
  20.     cout << "Codigo binario de un numero\nDigita el numero\n";
  21.     cin>>num;
  22.     cout << "Digita la base que deseas(2-5)\n";
  23.     cin >>base;
  24.     convertir (num,base);}
  25.  
  26. void push(Pila *pila,int val){
  27.     pNodo nuevo;
  28.     nuevo = (pNodo) malloc (sizeof(tipoNodo));
  29.     nuevo->dato = val;
  30.     nuevo->siguiente =*pila;
  31.     *pila = nuevo;
  32.     }
  33.  
  34. int pop(Pila *pila){
  35.     pNodo aux;
  36.     int v;
  37.     aux = *pila;
  38.     if (!aux) cout<<"\npila vacia\n";
  39.     *pila = aux->siguiente;
  40.     v = aux->dato;
  41.     free (aux);
  42.     return v;
  43.     system ("pause");
  44.     }
  45.  
  46. void convertir(int num,int base){
  47.                  int aux=0;
  48.                  aux=num;
  49.                  do{
  50.                  val=num%base;
  51.                  num=num/base;
  52.                  push(&pila,val);
  53.                  }while (num>base);
  54.                  cout<<"el numero es:" <<num;
  55.                  do{
  56.                  x=pop(&pila);
  57.                  cout<<x;
  58.                  }while (*pila!=NULL);
  59.                  system("pause");
  60. }


Pero tengo errores en las lineas:
Código
  1. 52 E:\Estructuras\incompletos\Pila_binario.cpp cannot convert `tipoNodo***' to `tipoNodo**' for argument `1' to `void push(tipoNodo**, int)'
  2.  
  3. 56 E:\Estructuras\incompletos\Pila_binario.cpp cannot convert `tipoNodo***' to `tipoNodo**' for argument `1' to `int pop(tipoNodo**)'
  4.  


Título: Re: nueva duda pila en C
Publicado por: Akai en 18 Marzo 2011, 20:13 pm
te sobra el &.

Aun así, te sigo diciendo, no sabes como funciona el typedef, y lo usas sin ton ni son.


Título: Re: nueva duda pila en C
Publicado por: pakleisito en 18 Marzo 2011, 20:20 pm
ya se que no se usarlos correctamente ... pero me podrías explicar entonces que es lo que tengo que hacer para solucionarlo??

y si le quito los & entonces seria como si los apuntadores estuvieran de mas y el programa se truncaría.


Título: Re: nueva duda pila en C
Publicado por: Akai en 18 Marzo 2011, 20:36 pm
Typedef: define un tipo. Simple y llanamente. le dice al compilador que un tipo se refiere a otro.
Código
  1. typedef int mis_enteros
  2. mis_enteros a;
  3. //equivalente a
  4. int a;

Tu problema?:

Código
  1. typedef struct datos{
  2.        int dato;
  3.        struct datos *siguiente;
  4.        }tipoNodo;
  5.  
  6. typedef tipoNodo *pNodo;
  7. typedef tipoNodo *Pila;
  8. Pila *pila;

tiponodo lo defines como un struct de nombre dato.

defines el tipo pNodo como tiponodo* y lo mismo con Pila

Y luego, defines una Pila* (tipo no definido) como pila.

Resultado? tu pila es un tiponodo**

Posible solución?

Código
  1. typedef struct datos{
  2.        int dato;
  3.        struct datos *siguiente;
  4.        }tipoNodo;
  5.  
sin ninguna definición mas.

y luego, en el main o donde necesites usar un puntero a dicha estructura:
Código
  1. tipoNodo *nombre_que_quieras;


Título: Re: nueva duda pila en C
Publicado por: Suzume en 24 Mayo 2011, 05:24 am
thanks por los concjos q dist m sirvieron mucho. kisiera saber si akai m puedes ayudar en otra ocasion t lo agradcria mucho :)

EI: juntando mensajes.

/*hice st programa y m salen errores q no c que son intent corregirlos pro nada!!!
errores:
-cannot convert `tiponodo***' to `tiponodo**' for argument `1' to `void push(tiponodo**, int)'
-In function `float media(tiponodo**)':
-In function `int impardelete(tiponodo*)':

Y muchos otros mas!!!!!! talz vz puedan ayudarm xfa!!!!!  */
 
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define Null  0
//declaracion de pila y funciones
typedef struct nodo{
  int dato;
  struct nodo *siguiente;
}tiponodo;

typedef tiponodo *pNodo;
typedef tiponodo *pila;

float media(pila *);
int impardelete(pila *);
int empty(pila *);
int pop(pila *);
void push(pila *,int);
void menu(void);
int main()
{
   
 int op,z=0,x,popvalue;
 pila  *pl=Null;
 menu();
 scanf("%i",&op);
 while(z==0){           
 switch(op){
 case 1: printf("\n ingrese el valor que agregara a la pila");
         scanf("%i",&x);
         push(pl,x);
         break;
 case 2: if(empty(*pl)=Null)
           printf("\n error la pila esta vacia");   
         pop(&pl);
           printf("\n el valor eliminadio es: %i",popvalue);
         break;
 case 3: media(pl);
         break;
 case 4: impardelete(pl);
         break;
 case 5: z=1;
 default: printf("error!!! elija la opcion de nuevo");
          menu();
          scanf("%i",&op);
          break;
 }//fin switch
}//fin while

 getch();
}//fin main
 

//funciones
int empty(pila *ps)
{
return ((*ps)== Null);
}

void push(pila *ps, int a)
{
pNodo nuevo;
nuevo = (pNodo) malloc(sizeof(tiponodo));
if (nuevo != Null)
{
nuevo->dato = a;
nuevo->siguiente = *ps;
*ps = nuevo;
}
else
printf("No se pudo insertar el elemento. Falta de memoria\n");
}

int pop(pila * ps)
{   
pNodo temp;
int popvalue;
temp = *ps;
popvalue = (*ps)->dato;
*ps = (*ps)->siguiente;
free(temp);
return popvalue;
}
//funcion que calcular la media
float media(pila *ps){
int x,i=0,total=0;
float media;
pila aux=Null;
while(ps!=Null){
x=pop(*ps);
total+=x;
i++;
push(aux,x);
}
media=total/i;
while(aux!=Null){  //reestablecer la pila
x=pop(aux);
push(ps,x);
}
}//fin media

int impardelete(pila ps)//funcion que elimina los numeros impares de la pila
{
 int x,num=0;
 pila aux=Null;
 while(ps!=Null){
 if((ps.dato)%2)!=0){
  x=pop(ps);
  num++;
 else{
  x=pop(ps);
  push(aux, x);
  }
 return num;
 }//fin while
}                     

void menu(void)
{
  printf("\nElija la opcion que desea utilizar");
  printf("\n insertar un dato                1");
  printf("\n eliminar un dato                2");
  printf("\n calcular la media               3");
  printf("\n calcular el numero de impares   4");
  printf("\n salir del programa              5");
}


Título: Re: nueva duda pila en C
Publicado por: D4RIO en 24 Mayo 2011, 17:25 pm
1) Deberías abrir otro tema si tienes dudas, no resucitar un tema que lleva más de un mes sin posts.
2) Usa resaltado para el código, por favor.
3) Escribe en un español que todos entendamos. Es decir: ¿Realmente se supone que interpretemos esto?
Código
  1. /*hice st programa y m salen errores q no c que son intent corregirlos pro nada!!!
  2. errores:
  3. -cannot convert `tiponodo***' to `tiponodo**' for argument `1' to `void push(tiponodo**, int)'
  4. -In function `float media(tiponodo**)':
  5. -In function `int impardelete(tiponodo*)':
  6.  
  7. Y muchos otros mas!!!!!! talz vz puedan ayudarm xfa!!!!!  */
No estamos escribiendo un SMS ni nada por el estilo. Nadie te cobra por los carácteres que completan las palabras.

Saludos


Título: Re: nueva duda pila en C
Publicado por: Suzume en 28 Mayo 2011, 05:24 am
sino vas a ayudar mjor no respondas y si el post lleva tanto tiempo para q t metist en ste tema???


Título: Re: nueva duda pila en C
Publicado por: D4RIO en 28 Mayo 2011, 16:50 pm
Citar
sino vas a ayudar mjor no respondas
Ayudé. Te dije qué deberías abrir un nuevo tema. A demás, aplicando ese mismo concepto, no deberías haber posteado en primer instancia  ;)
Lo ideal es que pongas tu propio tema, para que la gente lo vea en el tablón, o que mandes un privado a akai, si deseas hacerle una pregunta personal.

Citar
y si el post lleva tanto tiempo para q t metist en ste tema???
Como comentaba antes, resucitaste el tema. Cuando posteas en un tema, este queda en la parte superior del tablón nuevamente. Por eso es que no es buena idea resucitar un tema cuando tiene más de 1 mes (2 meses por reglamento, pero en 1 mes habrás levantado un tema viejo).

Tomalo a modo de consejo. No necesitas defenderte cuando te dan un consejo. Por otra parte, el consejo de escribir adecuadamente también vale.

PD: No dejes pasar 4 días solo para postear una antítesis no fundamentada.

Saludos.