FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
!!Ayuda, programa que convierta operacion infija a prefija o postfija en delphi!!!
necesito que alguien me ayude con esto, quisiera pasar de una operacion infija a una prefija o postfija, cualquiera de las dos.
gracias de antemano. |
#2
|
||||
|
||||
No se que quieres con esto. No se que es una operacion infija, prefija o postfija. Si explicas lo que es, quizás alguien pueda ayudarte.
|
#3
|
||||
|
||||
Tal vez sea sobre esto, pero tal vez no.
__________________
"constructive mind, destructive thoughts" |
#4
|
|||
|
|||
Cita:
INFIJA: 3+5=8 es una operacion normal, comun y corriente, pero aqui viene lo bueno PREFIJA +3 5= 8 como ven pre, significa antes, y de lo que trata esto es de cambiar el valor operador de posicion, osea, en este caso el signo. POSTFIJA 3 5+=8 en esta, post significa despues. esto es lo que quiero hacer, si alguien me entendio, necesito su ayuda, se los agradecere mucho. |
#5
|
||||
|
||||
Y obviamente desde donde quieres usar eso.
Porque si quieres aplicarloa a C++ yo no sé. Si estás haciendo un compilador ya es otra cosa. Si estás haciendo un programa en C++ y quieres dar la posibilidad de usar esa notaciones, no es tanto ¿no? sólo buscar espacios, operadores y números. Pd:Revisa la guía de estilo: dedica el tiempo necesario para exponer tu duda, si quieres que alguien dedique su tiempo a contestarla.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#6
|
||||
|
||||
Si metes la operación en un string:
- Con la función pos() podrás saber donde está el operador (+-*/) y el igua. - Con la función copy() podrás dividir el string en sus partes. - Luego las mezclas como más te guste. |
#7
|
||||
|
||||
Yo iría hacia la recursión. Tal vez debas buscar algo sobre los analizadores recursivos descendentes. Yo tengo uno al que estoy dándole un repaso y que espero publicar en pocos días. Es código abierto y está escrito en C. Eso sí, el analizador que estoy haciendo realiza cálculos, pero no creo que cueste mucho modificarlo para que devuelva una cadena con la nueva notación. Es más, lo estoy haciendo precisamente para eso, porque quiero publicar un proyecto que hace años estoy persiguiendo y que incluye un compilador. No puedo decir más o tendría que mataros...
|
#8
|
|||
|
|||
hey gracias, por tratar de ayudar, tengo un pseudocodigo hecho en C de esto pero no se pasarlo a delphi, si alguien me confirma saber los dos tipos de programacion, por favor, necesito su ayuda, inmediatamente le pasare el codigo.
|
#9
|
||||
|
||||
Postea aquí tu código en C y lo que hayas traducido a Delphi.
Comenta luego la parte donde tengas dudas y te ayudaremos. |
#10
|
|||
|
|||
aqui esta el codigo en C:
esta un poquito largo no!!! //-----Dependencias #include <stdio.h> #include <conio.h> //-----Declaración de funciones void limpiar(char[],int), pasar(char[],char[]), conv_pre(char[],char[]), conv_pos(char[],char[]), rec_exp(char[]), inver(char[],char[]); int verif(char[]), tama(char[]), sim(char), prio(char,char); //-----Variables globales char Simb[4][2]={{'(',')'},{'-','+'},{'/','*'},{'$','\0'}}, expr[50], pila[50], expr_c[50], epre[50], epos[50], elem, simb; int i, j, n, tope, val, cont1, cont2, v; //-----Inicio del programa main(){ clrscr(); limpiar(expr,50); limpiar(pila,50); limpiar(expr_c,50); limpiar(epre,50); limpiar(epos,50); do{ printf("Introduzca la expresión infija: "); for(i=0;(expr[i]=getchar())!='\n';++i); if(expr[i]=='\n'){ expr[i]='\0'; } if(verif(expr)!=3){ printf("\nLa expresión %s no es valida, ",expr); switch(verif(expr)){ case 0: printf("esta mal la función."); case 1: printf("le faltan paréntesis derechos."); case 2: printf("le faltan paréntesis izquierdos."); } getche(); clrscr(); } }while(verif(expr)!=3); inver(expr_c,expr); conv_pre(expr_c,epre); printf("\nLa conversión a Prefija es: %s",epre); pasar(expr_c,expr); conv_pos(expr_c,epos); printf("\nLa conversión a Posfija es: %s",epos); getche(); } //-----Limpia la variable void limpiar(char a[], int n){ for(i=0;i<n;i++){ a[i]='\0'; } } //-----Pasa de una variable a otra void pasar(char a[], char b[]){ int n1, n2; n1=tama(a); n2=tama(b); if(n1>n2){ for(i=0;i<n1;i++){ a[i]=b[i]; } } if(n1<n2){ for(i=0;i<n2;i++){ a[i]=b[i]; } } } //-----Cuenta cuantos caracteres hay en la variable int tama(char var[]){ for(n=0;var[n]!='\0';++n); return(n); } //-----Verifica si no le faltan paréntesis a la función int verif(char ex[]){ val=0; n=tama(ex); if(n>0){ tope=0; cont1=cont2=0; for(i=0;i<n;i++){ elem=ex[i]; if(elem=='('){ pila[tope]=elem; tope+=1; pila[tope]='\0'; } else{ if(elem==')'){ if(tope>0){ if(pila[tope-1]=='('){ tope-=1; pila[tope]='\0'; } } else{ pila[tope]=elem; tope+=1; pila[tope]='\0'; } } } } if(tope>0){ for(i=0;i<tope;i++){ if(pila[i]=='('){ cont1+=1; } if(pila[i]==')'){ cont2+=1; } } if(cont1<cont2){ val=2; } if(cont1>cont2){ val=1; } } else{ val=3; } } else{ val=0; } return(val); } //-----Conversión de la función a prefija void conv_pre(char ex[], char epre[]){ char expre[50]; limpiar(expre,50); conv_pos(ex,expre); inver(epre,expre); } //-----Conversión de la función a postfija void conv_pos(char ex[], char epos[]){ tope=-1; n=tama(ex); while(ex[0]!='\0'){ simb=ex[0]; rec_exp(ex); n-=1; if(simb=='('){ tope+=1; pila[tope]=simb; } else{ if(simb==')'){ while(pila[tope]!='('){ int x=tama(epos); epos[x]=pila[tope]; pila[tope]='\0'; tope-=1; } pila[tope]='\0'; tope-=1; } else{ if(sim(simb)==0){ int x=tama(epos); epos[x]=simb; } else{ if(tama(pila)>0){ while(prio(simb,pila[tope])<=0){ int x=tama(epos); epos[x]=pila[tope]; pila[tope]='\0'; tope-=1; if(tope<0){ break; } } } tope+=1; pila[tope]=simb; } } } } while(tope>=0){ int x=tama(epos); epos[x]=pila[tope]; pila[tope]='\0'; tope-=1; } } //-----Recorre los caracteres un lugar void rec_exp(char a[]){ int x=tama(a); for(i=0;i<(x-1);i++){ a[i]=a[i+1]; } a[i]='\0'; } //-----Verifica si es un operador int sim(char s){ v=0; for(i=0;i<4;i++){ for(j=0;j<2;j++){ if(s==Simb[i][j]){ v=1; } } } return(v); } //-----Verifica la prioridad para colocar en la pila int prio(char s1, char s2){ int p1, p2; p1=p2=0; for(i=0;i<4;i++){ for(j=0;j<2;j++){ if(s1==Simb[i][j]){ p1=i; } if(s2==Simb[i][j]){ p2=i; } } } if(p1<p2){ i=-1; } else{ if(p1==p2){ i=0; } else{ i=1; } } return(i); } //-----Invierte la función completa void inver(char a[], char b[]){ int x=tama(b); n=0; for(i=(x-1);i>=0;i--){ simb=b[i]; if(simb==')'){ a[n]='('; } else{ if(simb=='('){ a[n]=')'; } else{ a[n]=simb; } } n++; } } |
#11
|
||||
|
||||
Pues sí es largo, sí. La próxima vez utiliza las etiquetas [code]...[/code], que quedará mejor. Mira (pulsa el botón "Citar", abajo a la derecha, para que veas cómo se utiliza):
Código:
//-----Dependencias #include <stdio.h> #include <conio.h> //-----Declaración de funciones void limpiar(char[],int), pasar(char[],char[]), conv_pre(char[],char[]), conv_pos(char[],char[]), rec_exp(char[]), inver(char[],char[]); int verif(char[]), tama(char[]), sim(char), prio(char,char); //-----Variables globales char Simb[4][2]={{'(',')'},{'-','+'},{'/','*'},{'$','\0'}}, expr[50], pila[50], expr_c[50], epre[50], epos[50], elem, simb; int i, j, n, tope, val, cont1, cont2, v; //-----Inicio del programa main(){ clrscr(); limpiar(expr,50); limpiar(pila,50); limpiar(expr_c,50); limpiar(epre,50); limpiar(epos,50); do{ printf("Introduzca la expresión infija: "); for(i=0;(expr[i]=getchar())!='\n';++i); if(expr[i]=='\n'){ expr[i]='\0'; } if(verif(expr)!=3){ printf("\nLa expresión %s no es valida, ",expr); switch(verif(expr)){ case 0: printf("esta mal la función."); case 1: printf("le faltan paréntesis derechos."); case 2: printf("le faltan paréntesis izquierdos."); } getche(); clrscr(); } }while(verif(expr)!=3); inver(expr_c,expr); conv_pre(expr_c,epre); printf("\nLa conversión a Prefija es: %s",epre); pasar(expr_c,expr); conv_pos(expr_c,epos); printf("\nLa conversión a Posfija es: %s",epos); getche(); } //-----Limpia la variable void limpiar(char a[], int n){ for(i=0;i<n;i++){ a[i]='\0'; } } //-----Pasa de una variable a otra void pasar(char a[], char b[]){ int n1, n2; n1=tama(a); n2=tama(b); if(n1>n2){ for(i=0;i<n1;i++){ a[i]=b[i]; } } if(n1<n2){ for(i=0;i<n2;i++){ a[i]=b[i]; } } } //-----Cuenta cuantos caracteres hay en la variable int tama(char var[]){ for(n=0;var[n]!='\0';++n); return(n); } //-----Verifica si no le faltan paréntesis a la función int verif(char ex[]){ val=0; n=tama(ex); if(n>0){ tope=0; cont1=cont2=0; for(i=0;i<n;i++){ elem=ex[i]; if(elem=='('){ pila[tope]=elem; tope+=1; pila[tope]='\0'; } else{ if(elem==')'){ if(tope>0){ if(pila[tope-1]=='('){ tope-=1; pila[tope]='\0'; } } else{ pila[tope]=elem; tope+=1; pila[tope]='\0'; } } } } if(tope>0){ for(i=0;i<tope;i++){ if(pila[i]=='('){ cont1+=1; } if(pila[i]==')'){ cont2+=1; } } if(cont1<cont2){ val=2; } if(cont1>cont2){ val=1; } } else{ val=3; } } else{ val=0; } return(val); } //-----Conversión de la función a prefija void conv_pre(char ex[], char epre[]){ char expre[50]; limpiar(expre,50); conv_pos(ex,expre); inver(epre,expre); } //-----Conversión de la función a postfija void conv_pos(char ex[], char epos[]){ tope=-1; n=tama(ex); while(ex[0]!='\0'){ simb=ex[0]; rec_exp(ex); n-=1; if(simb=='('){ tope+=1; pila[tope]=simb; } else{ if(simb==')'){ while(pila[tope]!='('){ int x=tama(epos); epos[x]=pila[tope]; pila[tope]='\0'; tope-=1; } pila[tope]='\0'; tope-=1; } else{ if(sim(simb)==0){ int x=tama(epos); epos[x]=simb; } else{ if(tama(pila)>0){ while(prio(simb,pila[tope])<=0){ int x=tama(epos); epos[x]=pila[tope]; pila[tope]='\0'; tope-=1; if(tope<0){ break; } } } tope+=1; pila[tope]=simb; } } } } while(tope>=0){ int x=tama(epos); epos[x]=pila[tope]; pila[tope]='\0'; tope-=1; } } //-----Recorre los caracteres un lugar void rec_exp(char a[]){ int x=tama(a); for(i=0;i<(x-1);i++){ a[i]=a[i+1]; } a[i]='\0'; } //-----Verifica si es un operador int sim(char s){ v=0; for(i=0;i<4;i++){ for(j=0;j<2;j++){ if(s==Simb[i][j]){ v=1; } } } return(v); } //-----Verifica la prioridad para colocar en la pila int prio(char s1, char s2){ int p1, p2; p1=p2=0; for(i=0;i<4;i++){ for(j=0;j<2;j++){ if(s1==Simb[i][j]){ p1=i; } if(s2==Simb[i][j]){ p2=i; } } } if(p1<p2){ i=-1; } else{ if(p1==p2){ i=0; } else{ i=1; } } return(i); } //-----Invierte la función completa void inver(char a[], char b[]){ int x=tama(b); n=0; for(i=(x-1);i>=0;i--){ simb=b[i]; if(simb==')'){ a[n]='('; } else{ if(simb=='('){ a[n]=')'; } else{ a[n]=simb; } } n++; } } |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Crear aviso "Espere unos minutos" durante operacion con mucha carga de CPU . AYUDA | Cheerpipe | Varios | 7 | 18-01-2007 19:32:38 |
Ayuda con programa de chat en delphi | zanyodark | Internet | 6 | 17-09-2006 20:25:24 |
Ayuda En Login Y Pass Para Ingresar En un programa creado en Delphi | Solojuegospc.tk | Conexión con bases de datos | 8 | 07-07-2005 03:18:28 |
Ejecutar un programa externo desde un programa de Delphi | Roger_Fernandez | Varios | 3 | 02-09-2004 18:05:36 |
Ayuda con programa de C | megadanzig | C++ Builder | 7 | 19-03-2004 19:26:48 |
|