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


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Duda] token/strtok /Notacion Polaca Inversa
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Duda] token/strtok /Notacion Polaca Inversa  (Leído 2,451 veces)
digitalx2

Desconectado Desconectado

Mensajes: 1


Ver Perfil
[Duda] token/strtok /Notacion Polaca Inversa
« en: 22 Septiembre 2013, 22:31 pm »

necesito seprarar una cadena de caracteres, que enrealidad seran numeros y operadores matematicos
pero no logro asignar lso valores de *prt a una cadena para despues haceres push (meterlos a mi estructura/pila  A") el strtok no lo se usar muy bien , soy nuevo en cadenas y se me complica mucho ._ . todo lo que esta comentado es por que no funciona.. osea deja de funcionar el programa...


por ejemplo (para los que no conozcan la notacion polaca inversa)

mi input es:

5 6 9 + 8 5 *
esto quedaria como
5 11 40
siempre el operador matematico se aplicara a los dos ultimos valores
entonces necesito separar la cadena inicial para saber si es digito o un operador matematico
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <conio.h>
  5. #include <string.h>
  6. #define MAX 100 /* max size of operand or operator */
  7. typedef int stackEntry;
  8. typedef struct {stackEntry data[MAX]; int index; }Stack;
  9.  
  10. int isFull(Stack);
  11. int isEmpty(Stack);
  12. void push(Stack*,stackEntry);
  13. stackEntry pop(Stack*);
  14.  
  15.  
  16. void create(Stack *s){s->index=-1;}
  17.  
  18. int main(void)
  19. {
  20. Stack A;
  21. int type,i;
  22. stackEntry k;
  23. stackEntry op2;
  24. char s[MAX],aux[MAX];
  25. create(&A);
  26. /* if(A.index==-1){printf(" Pila Inicializada index: %d" ,A.index);} solo una prueba*/
  27. push(&A,6);push(&A,5);push(&A,7);pop(&A);pop(&A);pop(&A);
  28. printf("\nPush y Pop funcionan correctamente");
  29. getche();
  30. system("cls");
  31. printf("Escribe\n"); i=0;
  32. {
  33. char s2[4] = " \n\t";
  34. char *ptr;
  35. fgets(s,MAX,stdin);
  36. /*system("cls");
  37. /* printf( "A stack = %s\n", s );*/
  38.  
  39. ptr = strtok( s, s2);    /* Primera llamada => Primer token*/
  40. printf( "%s\n", ptr );
  41. while( (ptr = strtok( NULL, s2 )) != NULL )    /*Posteriores llamadas*/
  42.  
  43. /*strcpy(aux,ptr); i++; printf("\n aux var = %s",aux);
  44.  
  45. /*if(isdigit(*ptr)){ k=atoi(ptr);push(&A,k);}
  46. /*if(ptr=='+'){push(&A,pop(&A)+pop(&A));}
  47. if(ptr=='*'){push(&A,pop(&A)*pop(&A));}
  48. */
  49. printf( "%s\n", ptr);
  50. /*printf("\npop:%d",A.data[A.index]);*/
  51. return 0;
  52. }
  53.  
  54. }
  55.  
  56. int isFull(Stack s){
  57. if (s.index==MAX-1)
  58. return 1;
  59. else
  60. return 0;}
  61.  
  62. int isEmpty(Stack s){
  63. if(s.index==-1)
  64. return 1;
  65. else  return 0;
  66. }
  67.  
  68. void push(Stack *s, stackEntry dato)
  69. {
  70. if(isFull(*s)){printf("\nError pila llena"); return;}
  71. s->index+=1;
  72. s->data[s->index] = dato;
  73. printf("\ndato:%d ",dato)/*use este printf para comprobar que mi push y pop funcionaran adecuadamente*/;
  74. }
  75.  
  76.  
  77. stackEntry pop(Stack*s)
  78. {
  79. if(isEmpty(*s)){printf("error: stack empty\n"); return -1;}
  80. printf("\npop: %d\n",s->data[s->index--]);
  81. return 1;
  82.  
  83. }
  84.  
  85.  
  86.  
  87.  
  88.  


« Última modificación: 22 Septiembre 2013, 22:57 pm por digitalx2 » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [Duda] token/strtok /Notacion Polaca Inversa
« Respuesta #1 en: 23 Septiembre 2013, 19:10 pm »

mi input es:

5 6 9 + 8 5 *
esto quedaria como
5 11 40

O se me ha olvidado sumar o esto debería quedar tal que:
5 15 40

Es importante porque si no puedes ponerte a buscar errores donde no los hay.

Más cosillas. Como norma general los índices se tiende a incrementarlos despues de añadir el elemento al vector... no antes. Básicamente porque si se produce un problema mientras añades el elemento al vector al final tienes que acordarte de volver a reducir el valor del puntero... y es preferible perder un dato a recuperar un valor no inicializado. Esto te lo digo por el uso que haces de index.

Código
  1. ptr = strtok( s, s2);    /* Primera llamada => Primer token*/
  2. printf( "%s\n", ptr );
  3. while( (ptr = strtok( NULL, s2 )) != NULL )    /*Posteriores llamadas*/

El problema que te va a generar esta estructura es que el primer token lo vas a perder... prueba a meter esta secuencia 5 5 +... no funciona.

Si quieres convservar el primer token, que imagino que sí, usa un bucle dowhile...

Código
  1. ptr = strtok( s, s2);    /* Primera llamada => Primer token*/
  2. printf( "%s\n", ptr );
  3.                do
  4.                {
  5.                  // Aqui aun conservas el primer token, en las siguientes pasadas
  6.                  // tendras los siguientes tokens
  7.  
  8.                 // ...
  9.                }
  10. while( (ptr = strtok( NULL, s2 )) != NULL )    /*Posteriores llamadas*/

Otra cosa más. La función 'isdigit' solamente comprueba un caracter... luego si tienes pensado permitir la entrada de números de dos o más dígitos tendrás que comprobar todo el token para evitar errores.

Y para terminar un último fallo:

Código
  1. stackEntry pop(Stack*s)
  2. {
  3. if(isEmpty(*s)){printf("error: stack empty\n"); return -1;}
  4. printf("\npop: %d\n",s->data[s->index--]);
  5. return 1;
  6.  
  7. }

Mola esta función... imagínate una pila con elementos aleatorios... haz un pop y te adivino lo que te va a devolver esta función: siempre 1... bueno, al menos mientras queden elementos en el stack.

ese return 1 no debería estar así... la función más bien debería tener una forma tal que:

Código
  1. stackEntry pop(Stack*s)
  2. {
  3. if(isEmpty(*s)){printf("error: stack empty\n"); return -1;}
  4.        stackEntry dato = s->data[s->index--];
  5. printf("\npop: %d\n",dato);
  6. return dato;
  7. }

Y para rematar unos consejos:

* no pongas varias instrucciones en la misma línea... queda feo, generas código menos legible y que además es más complicado de depurar y no vas a ganar espacio. Una línea, una instrucción... hazme caso que lo vas a agradecer.

* Elimina variables sin uso: no aportan nada al código y dificultan su lectura: i, op2, type.

Un saludo.



En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Notacion Polaca Inversa
Ejercicios
gabymar 2 13,500 Último mensaje 9 Mayo 2023, 11:20 am
por mcpelos
Notación Polaca Inversa
Programación C/C++
Rudy21 0 6,322 Último mensaje 15 Septiembre 2010, 07:37 am
por Rudy21
Notacion polaca « 1 2 »
Java
xAgramonx 14 33,430 Último mensaje 21 Octubre 2012, 09:09 am
por Rocio Sol
notación polaca inversa
Programación C/C++
david_BS 0 4,566 Último mensaje 31 Marzo 2012, 19:26 pm
por david_BS
Duda sobre sscanf y strtok
Programación C/C++
antolinalvaro 1 1,502 Último mensaje 1 Agosto 2018, 15:11 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines