SoloCodigo

Programación General => Delphi => Mensaje iniciado por: althenna en Lunes 31 de Mayo de 2004, 19:00

Título: Yo Otravez Con Una Pregunta Sobre Tmemo
Publicado por: althenna en Lunes 31 de Mayo de 2004, 19:00
bueno tengo un tmemo donde quiero revisar las operaciones matematicas estan correctas o no... con un case pude hacer que  en caso de que existieran ciertos errores saliera un mensaje

por ejemplo

te falta un parentesis o dos operaciones (/*-+) seguidas no es permitido


-------------


entre otros pero mi problema es que no se como ponerle el siguiente problema es decir no puedo hacer que el programa lo reconozca

ejemplo

(98+1)/(3.4.4-7)

aqui el error esta en 3.4.4 no puede existir un numero asi en una operacion ... ayuda por favor y gracias
Título: Re: Yo Otravez Con Una Pregunta Sobre Tmemo
Publicado por: BlackTigerX en Martes 1 de Junio de 2004, 00:15
tu lo que quieres es un parser completo... esta un tanto dificil decirte "se hace asi"... se requiere algo de codigo, y algo complicado tambien... mejor echa un vistazo aqui:
http://www.efg2.com/Lab/Library/Delphi/Mat...ons/Parsers.htm (http://www.efg2.com/Lab/Library/Delphi/MathFunctions/Parsers.htm)
Título: Re: Yo Otravez Con Una Pregunta Sobre Tmemo
Publicado por: GatoSoft en Miércoles 2 de Junio de 2004, 15:21
Hola, aqui esta un ejemplo, es mas o menos parecido a la solucion anterior que te di con los listbox.
Pero BlackTigerX tiene razón, Si lo que estas hacienod es un evaluador de expresiones, te va a tocar mucho trabajo, pero si lo que quieres es un corrector sintactico, no es tan complicado, aunque no deja de ocupar bastante de tu tiempo y lineas de codigo.

Código: Text
  1.  
  2. Procedure Verificar_Numeros(pExpresion:String);
  3. var i:Integer;
  4.     vestoy_leyendo_numero:Boolean;
  5.     vError_con_decimal:Boolean;
  6.     vCaracter:Char;
  7.     vNumero_str:String;
  8. Begin
  9.    vError_con_decimal:=false;
  10.    vestoy_leyendo_numero:=false;
  11.    for i:=1 to length(pExpresion) do
  12.      begin
  13.      vCaracter:=pExpresion[i];
  14.      case vCaracter of
  15.      '0'..'9','.':begin
  16.                   vestoy_leyendo_numero:=True;
  17.                   if vCaracter='.' then
  18.                      if POS('.',vNumero_str)>0 then
  19.                         vError_con_decimal:=True;
  20.                   vNumero_str:=vNumero_str+vCaracter;
  21.                   end;
  22.      else
  23.          begin
  24.            if vestoy_leyendo_numero then
  25.            begin
  26.              form1.Memo1.Lines.Add('Numero: '+vNumero_str);
  27.              //Haces lo que nececites hacer con el numero, otras validaciones, por ejemplo
  28.              if vError_con_decimal then
  29.                 begin
  30.                 form1.Memo1.Lines.Add('Hay mas de un punto decimal en el numero: '+vNumero_str);
  31.                 vError_con_decimal:=False;
  32.                 end;
  33.              vestoy_leyendo_numero:=false;
  34.              vNumero_str:='';
  35.            end;
  36.          end;
  37.      end; //Case
  38.      end;//for
  39.  
  40.  
  41.            if vestoy_leyendo_numero then
  42.            begin
  43.              form1.Memo1.Lines.Add('Numero: '+vNumero_str);
  44.              //Haces lo que nececites hacer con el numero, otras validaciones, por ejemplo
  45.              if vError_con_decimal then
  46.                 begin
  47.                 form1.Memo1.Lines.Add('Hay mas de un punto decimal en el numero: '+vNumero_str);
  48.                 vError_con_decimal:=False;
  49.                 end;
  50.              vestoy_leyendo_numero:=false;
  51.              vNumero_str:='';
  52.            end;
  53.  
  54. end;
  55.  
  56. procedure TForm1.Button1Click(Sender: TObject);
  57. begin
  58. verificar_Parentesis(edit1.text);
  59. Verificar_signos(edit1.text);
  60. Verificar_Numeros(edit1.text);
  61. end;
  62.  
  63.