¿Cómo programar una calculadora sencilla?
Este tipo de operación es más problemática, pero los cuatro símbolos de operación tienen la misma prioridad y deben escribirse de manera simple. ¿Tengo aquí un algoritmo que puede realizar cuatro operaciones aritméticas simples, en Delphi, como referencia?
Función Math_Evaluate(S0:string):Extendido;?
Función Evaluate(S0:String):Extendido;Adelante;?
Limpieza de procedimiento(var s0: string);?
Var?
I:entero;?
¿Comenzar?
S0:=LowerCase(s0);?
I:=Pos(' ',s0);?
¿Mientras I>0 hago?
¿Empezar?
Eliminar( S0,I,1 );?
I:=Pos(' ',S0);?
Fin;?
Fin;?
Función GetFirstOpp(Tot:Integer;S0:String):Integer;?
Const?
Sopps:String=('+-*/^');?
Var?
I:Entero;?
¿Comenzar?
Si Tot=0 Entonces Tot:=Longitud(S0); ?
Para I:=1 a 5 ¿Hacer?
¿Comenzar?
Resultado:=Pos(Sopps[i],S0);?
Si ((I<3) y (Resultado>0)) ¿entonces?
Si ((Resultado=1) o (Pos(S0[Resultado-1],Sopps)>0) ) ¿Entonces?
p>Resultado:=0;?
Si Resultado>0 Entonces?
Si Resultado Salir;? Fin;? Si Resultado>Tot Entonces? Resultado:=0;? Fin;? Función EspecialF(P1:Entero;S0:Cadena):Extendido;? Var? Operstr:Cadena;? Arg:Extendido;? p> ¿Comenzar? Resultado:=0;? Operstr:=Copiar(S0,1,P1-1);? Si S0[Longitud(S0)]<>')' ¿Entonces? Salir;? Operstr:=LowerCase(Operstr);? Arg:= Evaluar(Copiar(S0,P1+1,Longitud(S0)-P1-1));? if Operstr ='sin' ¿Entonces? Resultado:=Sin(Arg )? Si no, Operstr ='cos' ¿Entonces? Resultado:=Cos(Arg)? Si no, Operstr ='tan' ¿Entonces? Resultado:=Sin(Arg)/Cos(Arg)? Si no, si Operstr ='arctan' ¿Entonces? Resultado :=Arco tan(Arg)? De lo contrario, si Operstr ='log' ¿Entonces? Resultado:=Ln(Arg)/Ln(10)? De lo contrario, si Operstr ='ln' ¿Entonces? Resultado:=Ln(Arg)? ¿O si Operstr ='exp' Entonces? Resultado:=Exp( ¿Arg)? Si no, si Operstr ='sqrt' ¿entonces? Resultado:=Sqrt(Arg)? {ingrese funciones adicionales aquí}? p> Otro Salir;? Fin;? Función GetValue(S0:String):Extendido;? ¿Comenzar? Resultado:=0;? Si Longitud(S0)<1 Entonces Salir;? Si Longitud(S0)=1 Entonces? Resultado:=StrToFloat(S0)? ¿Otro? Caso s0[1] de? 'x':Resultado:=1;? p> p> 'y':Resultado:=1;? 'z':Resultado:=1;? Else Resultado:=StrToFloat(S0); ? Fin;? Fin;? Procedimiento MatchBracket(Var I:Integer;S0:String);? Var ? J,Len:Entero;? ¿Comenzar? J:=1;? Len:=Longitud(S0 ? Repetir Inc(I);? Si I>Len entonces salir;? Si S0[I]='(' Entonces Inc (J );? Si S0[I]=')' Entonces Dec(J);? Si J<0 Entonces Salir;? Hasta J =0;? Fin;? Función Calcular(P1:Integer;S0:String):Extendido;? Var? V1,V2:Extendido;? ¿Comenzar? Resultado:=0;? V1:=Evaluar(Copiar(S0,1 ,P1 -1));? V2:=Evaluar(Copiar(S0,P1+1,Longitud(s0)-P1));? Caso S0[P1] De? '+': Resultado:=V1+V2;? '-': Resultado:=V1-V2;? '/' : Resultado :=V1/V2;? '*': Resultado:=V1*V2;? '^': Resultado:=Exp(V2*Ln(V1) ); ? Else Salir;? Fin;? Fin;? Función Evaluar (S0:string):Extendido ;? Var? P1,P2,Q1:Entero;? ¿Comenzar? P1:=Pos('( ' ,S0);? P2:=P1;? Si P2>0 entonces? MatchBracket(P2,S0);? Si P1=1 ¿entonces? ¿Empezar? Si P2=Longitud(S0) ¿entonces? ¿Empezar? Eliminar(S0,P2,1);? Eliminar(S0,1,1);? Resultado:=Evaluar(S0);? ¿Finalizar si no? Resultado:=Calcular(P2+1,S0);? Salir;? Fin;? Q1:=GetFirstOpp(P1,S0);? Si (P1+Q1=0) Entonces? ¿Comenzar? Resultado:=GetValue(S0) );? Salir;? Fin;? Si Q1<>0 Entonces? Resultado:=Calcular(Q1 ,S0)? ¿Otro si Longitud(S0)>P2 Entonces? Resultado:=Calcular(P2+1,S0)? ¿Otro? Resultado:=EspecialF(P1,S0);? Fin;? ¿Comenzar? ¿Intentar? Limpiar(S0);? Resultado:=Evaluar(S0);? ¿Excepto? Resultado:=0;? Fin;? Fin;