Warrior2 Zapatillas Línea En Gym Adidas comprar OmvN08nw
Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym

Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Infijo a postfijo

Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym Estas en el tema de Infijo a postfijo en el foro de C/C++ en Foros del Web. Hola, estoy haciendo un programa que me convierta una expresion infijo a postfijo. El programa funcionar funciona, pero añade caracteres extraños al final de la ...
  #1 (permalink)  
25/07/2011, 09:40
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 7 años, 9 meses
Puntos: 3
Infijo a postfijo

Hola, estoy haciendo un programa que me convierta una expresion infijo a postfijo. El programa funcionar funciona, pero añade caracteres extraños al final de la cadena a veces o imprime un intro o cosas asi.

Código C: Get Lawn'Nuevos Celebrar Off My Productos Para De El Merchandising lF1J3TcK
Ver original
  1. //##############################################################################
  2.  
  3. //Encabezados necesarios para el programa:
  4.  
  5. #include <stdio.h>
  6.  
  7. #include <stdlib.h>
  8.  
  9. #include <E:\C\encabezados\estructuras.h>
  10.  
  11. //##############################################################################
  12.  
  13. //Este programa recibe una expresion "infijo" y la devuelve en formato
  14. //"postfijo"
  15.  
  16. //##############################################################################
  17.  
  18. //#############################PROTOTIPOS#######################################
  19.  
  20. int tam_infijo (char * array);
  21.  
    1 Nike Trainers Air Hair Force Lo Pony Leather c34Aq5RjLS
  22. char * scan_infijo ();
  23.  
  24. int esOperador (char c);
  25.  
  26. int esParentesis (char c);
  27.  
  28. int precedencia (char operador1, char operador2);
  29.  
  30. voidEspaña Adidas Boost 350 Outlet Yeezy WHD9IE2 inFijo2postFijo (char inFijo[], char postFijo[]);
  31.  
  32. //##############################################################################
  33.  
  34. //##############################FUNCIONES#######################################
  35.  
  36. int tam_infijo (char * array){
  37.    
  38.     int cont = 0;
  39.    
  40.     while ( *( array + cont ) != '\0' ){
  41.          
  42.          
  43.     }
  44.    
  45.     return cont - 1;
  46.    
  47. }
  48.  
  49. char * scan_infijo (){
  50.    
  51.     char * expresion;
  52.    
  53.     expresion = (char*) calloc (200, sizeof (char));
  54.    
  55.     scanf("%s", expresion);
  56.    
  57.     getchar();
  58.    
  59.     expresion = (char*) realloc (expresion, sizeof(charAzul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym) *
  60.    
  61.     ( tam_infijo (expresion) + 1) );
  62.    
  63. }
  64.  
  65. int esOperador (char c){
  66.    
  67.     return c == '+' || c == '-' || c == '*' || c == '/';
  68.     Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym
  69. }
  70.  
  71. int esParentesis (char c){
  72.    
  73.     if ( c == '(' ){
  74.          
  75.          return 1;
  76.    
  77.    
  78.     else if ( c == ')' ){
  79.          
  80.          return -1;
  81.          
  82.     }
  83.    
  84.     else return 0;
  85.    
  86. }
  87.  
  88.    
  89.     if ( ( operador1 == '*' || operador1 == '/' ) && ( operador2 == '+'
  90.    
  91.     || operador2 == '-' ) ) return 1; //Precedencia del operador 1 mayor
  92.    
  93.     else if ( ( operador1 == '+' || operador1 == '-' ) && ( operador2 == '*'
  94.    
  95.     || operador2 == '/' ) )

    Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym

    return 0; //Precedencia del operador 1 menor
  96.    
  97.     else return -1; //Precedencia del operador 1 igual que la del operador 2
  98.  
  99. }
  100.  
  101. void inFijo2postFijo (char inFijo[], char postFijo[]){
  102.      
  103.      ptrNuevaPila pila = NULL;
  104.      
  105.      int i = 0, j = 0;
  106.      
  107.      empujar_pila Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym( &pila, '(' );
  108.      
  109.      inFijo = (char*)
  110.      
  111.      realloc (inFijo, ( ( ( tam_infijo (inFijo)Quality Uk Blackgrey Official Nike Huarache Men's Air 8vmnNwO0 ) + 2 ) * sizeof (char) ) );
  112.      
  113.      inFijo [tam_infijo (inFijo)] = ')';
  114.      
  115.      
  116.      while ( pila != NULL ){
  117.            
  118.            if ( esOperador ( inFijo [i] ) ){
  119.                
  120.                 while ( ( esOperador ( pila->dato ) ) && (
  121.                
  122.                 precedencia (inFijo [i], pila->dato ) == 0 ||
  123.                
  124.                 precedencia (inFijo [i], pila->dato ) == -1 ) ) {
  125.                            
  126.                             postFijo [j] = pila->dato;
  127.                            
  128.                             j++;
  129.                            
  130.                             sacar_pila(Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym &pila );
  131.                            
  132.                 }
  133.                
  134.                 empujar_pila ( &pila, inFijo [i] );
  135.                
  136.            }
  137.            else if ( esParentesis ( inFijo [i] ) ){
  138.                
  139.                 if ( esParentesis ( inFijo [i] ) == 1 ){
  140.                      
  141.                      empujar_pila ( &pila, inFijo [i] );
  142.                      
  143.                 }
  144.                
  145.                 else{
  146.                      
  147.                      while ( pila->dato Para B00she90oi Zapatillas W Mujer Adidas Run9tis Deportivas roxeBWdC!= '(' && esOperador ( pila->dato ) ){
  148.                            
  149.                            postFijo [j] = pila->dato;
  150.                            
  151.                            j++;
  152.                            
  153.                            sacar_pila ( &pila );
  154.                            
  155.                      }Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym
  156.                      
  157.                      sacar_pila ( &pila );
  158.                      
  159.                 }
  160.                
  161.            }
  162.            
  163.            else{
  164.  
  165.                 postFijo [j] = inFijo [i];
  166.                
  167.                 j++;
  168.                
  169.            }
  170.            
  171.            i++;
  172.            
  173.      }
  174.      
  175.      postFijo [j] == '\0';
  176.      
  177. }
  178. 80s Dlx Black Online Superstar Classics White Suede Adidas Originals Nvm0wO8n
  179.  
  180. //##############################################################################
  181.  
  182. //##############################MAIN############################################
  183.  
  184. int main (){
  185.    
  186.     char * infijo = scan_infijo ();
  187.    
  188.     char postFijo [tam_infijo(infijo)+1];
  189.    
  190.     inFijo2postFijoDe Deporte 10kZapatillas Adidas Para Hombre jLA5q34R(infijo, postFijo);
  191.    
  192.     printf ("%s", postFijo);
  193.    
  194.     getchar();
  195.    
  196.     return 0;
  197.    
  198. }
  199.  
  200. //##############################################################################

Un saludo!!
  #2 (permalink)  
25/07/2011, 12:13
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 8 años, 8 meses
Puntos: 228
Respuesta: Infijo a postfijo

Podrias compartir el archivo estructura.h. Asi lo puedo compilar y probar....sino es complicado ver donde esta el error.

Mientras pregunto, el dato de la pila es un caracter??
  #3 (permalink)  
25/07/2011, 13:58
Adidas Adidas Superstar Superstar Paula Echevarria N0wOyv8mnP
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 7 años, 9 meses
Puntos: 3
Respuesta: Infijo a postfijo

Si el dato es un caracter.
Air Del Zoom Disfruta Compra Envío Gratuito Y En JT1cFKl3
Ahí te va el enlace del cabecero:

http://www.megaupload.com/?d=N31B614Z
  #4 (permalink)  
25/07/2011, 16:24
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 8 años, 8 meses
Puntos: 228
Respuesta: Infijo a postfijo

Tienes dos errores graves. En la linea 46 no debes devolver cont -1 solamente cont. Si le restas uno te quedas con menos espacio del que tiene la cadena.

Luego en la linea 179 utilizas el operador == ese solo compara no asigna.Asi que ahi esta mal usado. Probe un par de ejemplo y ahora parece funcionar.

Fijate en el include que si usas las "" (comillas) no necesitas poner todo el path del archivo. Solo necesitas que este en la misma carpeta. Aglo asi

#include "estructuras.h"

Saludos
  #5 (permalink)  
25/07/2011, 20:17
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 7 años, 9 meses
Puntos: 3
Respuesta: Infijo a postfijo

Tienes razón tio, taba asignando con ==, que tontería, y encima lo revisé y no me daba cuenta :S

7 ~ Reino 5 Original Entrenadores Unido Ver Cero Para Max Detalles Air Blanco De Título Mujer 857661 104 Nike CWxodrBe En cuanto a lo de devolver cont y no cont - 1, creo que está bien así. Siempre cuenta uno más.
Pureboost Running Zapatillas Gris Hombre El Fruugo Adidas De Dpr 54Sqc3RjAL
  #6 (permalink)  
25/07/2011, 20:24
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 8 años, 8 meses
Puntos: 228
Respuesta: Infijo a postfijo

Yo lo probe ingresaba "123" y me devolvia longitud 2. Primero modifique eso y se resolvio casi todo. Despues modifique la doble igualdad y se arreglo entero.

Saludos
White Trainers Air Nike 1 Force IbE2W9eDHY
  #7 (permalink)  
25/07/2011, 20:39
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 7 años, 9 meses
Puntos: 3
Nike 5 0 Boot Air 7 2 Max Goaterra Mens m D Acg Tamaño u15lJcTFK3
Respuesta: Infijo a postfijo

Cita:
Iniciado por sam90
Yo lo probe ingresaba "123" y me devolvia longitud 2. Primero modifique eso y se resolvio casi todo. Despues modifique la doble igualdad y se arreglo entero.

Saludos
Sisi tienes razón, lo probé yo ahora y lo tenía mal, usted disculpe :P
Zapatillas Nike Huarache Infantil Ultra QCoeEBWxrd
  #8 (permalink)  
25/07/2011, 20:41
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 8 años, 8 meses
Puntos: 228
Respuesta: Infijo a postfijo

No hay que disculparse, es para aprender!
  #9 (permalink)  
26/07/2011, 06:16
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 7 años, 9 meses
Puntos: 3
Respuesta: Infijo a postfijo

Bueno, ya que estamos, te pregunto también por esta función que acabo de hacer. Mi intención es que evalue una expresión postfijo:

Código C:
Ver original
  1. int evaluar_postFijo (char * postFijo){Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym
  2.    
  3.     int i = 0;
  4.    
  5.     ptrNuevaPila pila = NULL;
  6.    
  7.     while ( postFijo [i] != '\0' )
    {
  8.          
  9.           if ( esOperador ( postFijo [i] ) ){
  10.                
  11.                char b = pila->dato;
  12.                
  13.                sacar_pila ( &pila );
  14.                
  15.                char a = pila->dato;
  16.                
  17.                sacar_pila ( &pila );
  18.                
  19.                    
  20.                     empujar_pila ( &pila, ( a+b ) );
  21.                    
  22.                }
  23.                
  24.                else if ( postFijo [i] == '-' ){
  25.                    
  26.                     empujar_pila ( &pila, ( a-b ) );
  27.                    
  28.                }
  29.                
  30.                else if ( postFijo [i] == '*' ){
  31.                    
  32.                     empujar_pila ( &pila, ( a*b ) );
  33.                    
  34.                }
  35.                
  36.                else if ( postFijo [i] == '/' ){
  37.                    
  38.                     empujar_pila ( &pila, ( a/b ) );
  39.                    
  40.                }
  41.                
  42.           }
  43.          
  44.           else empujar_pila ( &pila, postFijo [i] );
  45.          
  46.           i++;
  47.          
  48.     }
  49.    
  50.     int a = pila->dato;
  51.    
  52.     free (pila);
  53.    
  54.     return a;
  55.    
  56. }

El problema es que al asignar a las variables "a" y "b" el caracter de pila->dato toma los enteros en formato decimal ¿?

Un saludo!
  #10 (permalink)  
26/07/2011, 10:40
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 8 años, 8 meses
Puntos: 228
Respuesta: Infijo a postfijo

Por mas que veas un 1,2,3.... son caractereas qeu a la vez son numeros. Pero tienen otro orden. no coincide el "1" con el 1 entero.
Lo que si coincide es el orden. "0" "1" "2"...etc lo que puedes hacer es restarle el caracter cero. '0'.

int b = pila->dato -'0';
  #11 (permalink)  
26/07/2011, 11:06
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 7 años, 9 meses
Puntos: 3
Respuesta: Infijo a postfijo

Si, me pispe de eso, pero esque me parece raro que se ¿"transformen"? esque al imprimir la cadena postfijo la imprime con los caracteres normales, pero después al utilizar la función empiezan a funcionar así. Además después si utilizo número mayores de 9 cómo hago?

Un saludo!
Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym
  #12 (permalink)  
26/07/2011, 11:25
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 8 años, 8 meses
Puntos: 228
Respuesta: Infijo a postfijo

Es que no se transforman. Por algo te pregunte si el campo dato era tipo char. Porque la verdad que para algo asi no me cerraba que sean del tipo char.
El tipo char solo tiene caracteres. Al imprimir en pantalla imprimis esos caracteres por eso lo ves bien. EL tipo int tiene enteros al imprimirlo en pantalla la funcion solo te lo pasa a caracteres para imprimirlo.

Si quieres numeros mayores a nueve para empezar tiener que trabajar con enteros y no con char. Debes realizar una forma de leer el numero completo. Tu en este caso solo lees un digito.
  #13 (permalink)  
26/07/2011, 11:30
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 7 años, 9 meses
Puntos: 3
Respuesta: Infijo a postfijo

El campo dato es de tipo char si. En cuanto a lo de trabajar con enteros, tienes razón, pero esque además de leer enteros tengo que leer caracteres: + - * / ()
  #14 (permalink)  
26/07/2011, 11:42
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 8 años, 8 meses
Puntos: 228
Respuesta: Infijo a postfijo
Azul Zapatillas Felicidad 750 Negro Verde Zx Originals Adidas Mujer v7b6fgIYym
Yo este tipo de ejercio ya lo he hecho. Y cuando me enseñaron lo de infijo postfijo y prefijo tambien me mostraron como representarlos con una estructura de datos. Vos simplementes lo copias a otra cadena.
Lo recomendable para esto es crear un arbol binario.
Cada nodo guarda si es un operador o si es un numero . Si es un operador tiene dos hijos que son dos expresiones nuevas.

Para obtener el orden postFijo simplemente recordes el arbol de esa manera.

Busca en internet que hay mucha data sobre esto.
  #15 (permalink)  
26/07/2011, 11:57
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 7 años, 9 meses
Puntos: 3
Respuesta: Infijo a postfijo

Me pondré a hacerlo como tú dices. De todas formas me sigue quedando la espina de por qué pasa eso con los números :S

Un saludo!
  #16 (permalink)  
26/07/2011, 12:15
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 8 años, 8 meses
Puntos: 228
Respuesta: Infijo a postfijo

Ya te lo explique los diogitos representados como caracteres empiezan con la numeracion 48 hasta el 58.
Cuando sumas o restas multiplicas o divides se usa ese numero...el codigo ASCII seria. Si le resta el valor del cero '0' con eso lo llevas a la numeroacion 0 1 2 3 4 5.....

Prueba imprimir un caracter como si fuese un entero:
printf("%d",'0');

Mira lo que sale.
  #17 (permalink)  
26/07/2011, 13:15
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 7 años, 9 meses
Puntos: 3
Respuesta: Infijo a postfijo

Tienes razón, muchas gracias sam90!

Etiquetas: caracteres, funcion, programa, cadenas
¿Tienes una mejor respuesta a este tema? ¿Quiéres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.


« Tema Anterior | Próximo Tema »


La zona horaria es GMT -6. Ahora son las 20:09.

Contáctenos - Archivo - Política de Privacidad - Políticas de uso - Arriba

Foros del Web Un proyecto de Maestros del Web Licencia de contenidos: Creative Commons BY-NC-SA