Gracias Gracias:  0
Me Gusta Me Gusta:  0
No me Gusta No me Gusta:  0
Mostrando resultados del 1 al 1 de 1

Tema: [c y bc] Función para evaluar expresiones

  1. #1
    Fecha de Ingreso
    06-abril-2016
    Mensajes
    13
    Post Thanks / Like
    Poder de Credibilidad
    0

    [c y bc] Función para evaluar expresiones

    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í:

    Código:
    #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/ma...man1/bc.1.html
    Última edición por fernando12; 25-abr-2016 a las 21:58

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Temas Similares

  1. Guía: Instalar el controlador para tarjetas de vídeo NVIDIA
    By jcsl in forum FAQs, Manuales y Tutoriales
    Respuestas: 4
    Último mensaje: 21-jul-2012, 15:51
  2. Respuestas: 6
    Último mensaje: 09-mar-2011, 21:10
  3. Respuestas: 28
    Último mensaje: 01-oct-2010, 02:40
  4. Ares en Linux sin emular
    By willicl in forum Software
    Respuestas: 18
    Último mensaje: 11-ago-2009, 21:11
  5. Vocabulario Básico en GNU/Linux
    By karlggest in forum FAQs, Manuales y Tutoriales
    Respuestas: 2
    Último mensaje: 17-ene-2008, 21:33

Marcadores

Normas de Publicación

  • No puedes crear nuevos temas
  • No puedes responder mensajes
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •