PDA

Ver la Versión Completa : [c y bc] Función para evaluar expresiones



fernando12
25-abr-2016, 21:37
Saludos de nuevo a todos.

Os dejo una chapucilla que puede alegrar la vida a alguien.

Como sabeis los C-nuxero/as para poder hacer virguerías matemáticas (tener un mathlab, o un eval y demás) en nuestras lineas de script hay que dejarse los ojos en la pantalla o acudir a truquitos para salir del paso.

Vamos a aprovecharnos de que tenemos en C el comando system() para invocar a la calculadora de Bash (bc), la cual se ejecutará desde una función en C y desde ahí le daremos como argumento la expresión matemática que nos parezca (con las reglas sintácticas de bc ofc).

El script de C ver.C98 (al que he llamado calcu.c) quedaría así:



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

/* Seccion de Datos */

float calcu(char *exp);
char *expr="x=10; y=2; x^y"; // Este es un ejemplo de función x^y

/* Seccion de Codigo */

void main(void)
{
float valor;
printf("[bc] %s\n", expr);
valor = calcu(expr);
printf("[C98] Resultado: %.7g\n", valor);
}

/* Seccion de Funciones */

float calcu(char *exp)
{
char b[60]; char v[60]; float vr;
snprintf(b,60,"echo \"%s\" | bc -l -q > tmp", exp); //El bc evalua la expresión dada antes y lo redirecciona a tmp
system(b); //orden para llamar al bc y haga todo lo expuesto
FILE *fp;
fp = fopen("tmp", "r"); //ya desde C recuperamos el resultado de tmp
fgets(v, 60, (FILE *)fp);
fclose(fp);
vr = atof(v);
return vr; //se reenvia a main
}



No olvideis compilarlo luego con gcc -o calcu calcu.c -lm para que haga el enlace a las librerías que OpenSuSe no guarda por defecto en el directorio /bin/bash

Mas info en el manual de BC (castellano):
http://es.tldp.org/Paginas-manual/man-pages-es-extra-0.8a/man1/bc.1.html