Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   !!Ayuda, programa que convierta operacion infija a prefija o postfija en delphi!!! (https://www.clubdelphi.com/foros/showthread.php?t=61468)

Reinaldo08 08-11-2008 23:27:35

!!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.:)

duilioisola 09-11-2008 20:30:16

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.

TOPX 10-11-2008 03:05:31

Tal vez sea sobre esto, pero tal vez no.

Reinaldo08 10-11-2008 06:37:45

Cita:

Empezado por TOPX (Mensaje 324942)
Tal vez sea sobre esto, pero tal vez no.

topx, lamentablemente no es eso, me refiero a los tipos de expresiones que existen, ejemplo:

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.

Lepe 10-11-2008 07:48:51

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.

duilioisola 10-11-2008 08:50:32

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.

Ñuño Martínez 10-11-2008 12:00:21

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... :rolleyes:;):D

Reinaldo08 11-11-2008 01:57:08

hey gracias, por tratar de ayudar, tengo un pseudocodigo hecho en C de esto pero no se pasarlo a delphi:confused:, si alguien me confirma saber los dos tipos de programacion, por favor, necesito su ayuda, inmediatamente le pasare el codigo.

duilioisola 11-11-2008 09:01:31

Postea aquí tu código en C y lo que hayas traducido a Delphi.
Comenta luego la parte donde tengas dudas y te ayudaremos.

Reinaldo08 11-11-2008 17:40:31

aqui esta el codigo en C:
esta un poquito largo no!!!:eek:

//-----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++;
}
}

Ñuño Martínez 11-11-2008 18:01:12

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++;
  }
}

Respecto al problema en cuestión, a ver si mañana tengo algo claro (no tengo Internet en casa y ahora acabo el trabajo :( ).


La franja horaria es GMT +2. Ahora son las 15:44:34.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi