En la programación en lenguaje C, ¿cómo generar los operadores de suma, resta, multiplicación y división?
#includelt; stdio.hgt;
#includelt; string.hgt
#define N 100
estructura typedef{ / /operando pila
float d[N];
int len; //len es equivalente a top
}pilas, *lists;
typedef struct{ //Pila del operador
char c[N];
int len; //len es equivalente a la pila superior
}, *list;
int init(list p); //inicialización de pila
int inits(lists p); //inicialización de pilas
int pushs(lists) p, float m); //pilas empujadas a la pila
int push(list p, char c); //pilas empujadas a la pila
int pops(lists p, float *m) ; //apila elementos de la pila
int pop(list p, char *c); //apila elementos de la pila
int in(char c) ; //determina si C es datos Si es así, devuelve 1; de lo contrario, devuelve 0
char pre(char s, char c); //Juzga la prioridad de s c return 'gt;'; return 'lt;'; s =c return '='
float operar(float a, char t, float b); //Realizar la operación t (-*/) en a b return a b o a-b , a*b, a/ b
float value(char s[]); //Encontrar el valor de la expresión S
void main(){
char s[N]; int n; float f;
printf("************************Evaluación rápida* *************** **********\n");
mientras(1){
printf ("Por favor ingrese un expreso\n");
scanf("s", s); //Ingrese la expresión
n=strlen(s); de expresión
printf("express length =d\n", n); // Muestra la longitud de la expresión
s[n]='#'; '#' al final de la expresión Nota: # indica el final de la operación
p>f=value(s); //Calcular la longitud de la expresión
printf ("f=.5f\n", f); //Muestra el valor de la expresión. Nota solo salida Los primeros cinco decimales
printf("continuar entrada 1, interrumpir entrada 0\n") ;
scanf("d", amp; n); printf("\n" );
Si desea continuar la operación, ingrese 1, de lo contrario ingrese 0
if(!n) break }
}
int init(list p) {
if(!p) {printf("Error, pila inicial NULL\n" return 0;}
p-gt;len=0;
return 1;
}
int inits(listas p){
if(!p) {printf("Error, pilas de inicio NULL\ n" ); devuelve 0; }
p-gt; len=0;
devuelve 1;
}
int empuja (lista p, float m){
if(!p) {printf("Error, empuja pilas NULL\n");}
p-gt; [p -gt; len ]=m; devolver 1;
}
int push(lista p, char c){
if(!p) {printf ("Error, enviar pila NULL\n"); devuelve 0;}
p-gt; c[p-gt;len]=c; }
int pops(lists p, float *m){
if(!p) {printf("Error, empujar pilas NULL\n"); /p >
*m=p-gt; d[--p-gt; len]; devolver 1;
}
int pop(lista p, char * c) {
if(!p) {printf("Error, empujar la pila NULL\n");}
*c=p-gt; -p -gt; len]; return 1;
}
int in(char c){ // Juzga si C son datos, devuelve 1, de lo contrario devuelve 0
if(cgt;='0'amp;amp;clt;='9'||c=='.') return 1; return 0;}
char pre(char s , char c){ // Determinar la prioridad de s c sgt; c return 'gt;'; c return 'lt;'; ;' , n= '=' , k='gt;' ,
si((s=='-')||(s==' ')){
if((c=='*')||(c=='(')||(c=='/'))
r=m;
else r=k; }
if((s=='*')||(s=='/')){
if((c== '( ')) r=m;
más r=k }
if(s=='('){
if(c= =' )') r=n;
más r=
m; }
if(s==')')
r=k
if(s=='#') {
if(c=='#') r=n;
else r=m; }
devolver
} p>
float operar(float a, char t, float b){ //Realizar la operación t (-*/) en a b return a b o a-b, a*b, a/b
if (t=='-') devuelve a-b; si(t==' ') devuelve a b;
if(t=='*') devuelve a*b; ') devolver a/b; }
valor flotante(char s[]){
pilas opnd; pila optr; , b, m=0;
inits(amp; opnd); init(amp; optr); int k=0, i, tp=10; optr,'#'); //Empuje '#' en la pila optr como marca final
p=pr=s //Inicializa el puntero p pr para que pr p apunte a la expresión
while(*p!='#'||optr.c[optr.len-1]!='#'){//Cuando el operador señalado por p y el elemento superior de la pila en optr son ambos' #'La operación finaliza
if(in(*p)) //Si p apunta a un número, convierte la cadena numérica en datos de tipo real (flotantes) y guárdalos en el pila opnd
{
m=0; k=0;
while(in(*p)) //Hacer p; apunta al siguiente operador p>
while(pr!=p)
{
if(*pr!='.') //Si pr apunta a el punto decimal, omitir
m=(m *(pr )-'0')*10 //Convierte un solo carácter alfanumérico en datos y suma poco a poco
else{ //Como 12.3 -gt; 1230
k=p-pr; pr }
}
for(i=0, tp= 10; ilt; k; i) //Encontrar Encuentra el divisor tp de modo que 1230 dividido por tp (100) sea igual a 12,3
{
tp=tp*10;
if(i==k-1)
tp=tp/10
}
empuja(amp; opnd, m/tp ); //Entrar pila opnd
}
else switch(pre(optr.c[optr.len-1], *p)){
caso 'lt;': push(amp;optr, *p); pr=p
case'=': pop(amp; opt;
r,amp; pops(amp;opnd,amp;a); // Genera un operador y dos datos
pushs(amp;opnd,operate(a,t,b));break;} / /Operación
}
return opnd.d[opnd.len-1] //Devuelve el valor de la expresión
}