Registrarse
Home
Foros
Miembros
Calendario
Normas
Ayuda

Foros de usuarios de openSUSE
Retroceder   ForoSUSE > Zona Técnica > Programación y Scripts > Scripts


Síguenos en Twitter Suscríbete a nuestras noticias Acompáñanos en Facebook

Respuesta
 
Herramientas Desplegado

[c y bc] Función para evaluar expresiones
  #1  
Antiguo 25-abr-2016, 21:37
fernando12 fernando12 está desconectado
Aforado
 
Fecha de Ingreso: 06-abril-2016
Versión: 13.2
Mensajes: 13
Agradecimientos: 0
Agradecido 7 Veces en 1 Mensaje
Poder de Credibilidad: 0
fernando12 está en el buen camino
[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
Responder Citando
Respuesta

Marcadores


(0 miembros y 1 visitantes)
 
Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los Códigos BB están Activado
Las Caritas están Activado
[IMG] está Activado
El Código HTML está Desactivado

Ir al Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guía: Instalar el controlador para tarjetas de vídeo NVIDIA jcsl FAQs, Manuales y Tutoriales 4 21-jul-2012 15:51
Traducción de SDB:AudioTroubleshooting de openSUSE tranzorx Hardware 6 09-mar-2011 20:10
Problemas con Yast2 e instalacion de paquetes en opensuse 11.3 ejdvc656 General OpenSUSE 28 01-oct-2010 02:40
Ares en Linux sin emular willicl Software 18 11-ago-2009 21:11
Vocabulario Básico en GNU/Linux karlggest FAQs, Manuales y Tutoriales 2 17-ene-2008 20:33



Síguenos en Twitter Suscríbete a nuestras noticias Acompáñanos en Facebook


La franja horaria es GMT +2. Ahora son las 19:53.
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.

Esta página está bajo una licencia de Creative Commons, salvo que no se indique lo contrario.
Creative Commons License

Valid CSS!

Diseño por:Designed by: vbdesigns.devbdesigns.de 
Contáctenos - ForoSUSE - Archivo - Declaración de Privacidad - Arriba