Il programmino non è completo, ma intanto fatti un'idea.
Manca un analizzatore di sintassi ma andrebbe anche migliorata la gestione degli errori, e queste sono due pecche che vanno aggiustate.

Un'altra cosa: avevo pensato di utilizzare le funzioni di libreria che fornisce la Borland (sotto forma di sorgenti c-asm) col compilatore per basare il tutto sui long double, così anche se non sono portabili si hanno a disposizione i sorgenti.
Tra l'altro così facendo si può implementare una gestione degli errori tutta personalizzata per il programma: non mi piace che se faccio log(-10) mi vedo scritto a video "DOMAIN error", me lo devo gestire IO!!



Ed ecco il main:

codice:
/******************************************\
|*  Analizzatore di Formule matematiche   *|
|*   e funzioni analitiche trascendenti   *|
|*                                        *|
|*                     by SnakePlissken   *|
|*                     aka AntonioMacrì   *|
\******************************************/


#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dos.h>

#include "ExprEval.c"


void visualizzaOperazioni(void);
void calcolaFormule(void);


int main()  {
	char scelta;
	while(1)  {
		clrscr();
		printf("\n%80s\n", "Analizzatore di formule matematiche - SnakePlissken  ");

		printf("\n  Menu principale\n\n");
		printf("   1. Visualizza operazioni disponibili\n");
		printf("   2. Calcola formule\n");
		printf("   3. Esci\n");

		do
			scelta = getch();
		while(scelta!='1' && scelta!='2' && scelta!='3');

		switch(scelta)  {
			case '1':
				visualizzaOperazioni();
				break;
			case '2':
				calcolaFormule();
				break;
			case '3':
				return(0);
		}
	}
}


void visualizzaOperazioni(void)  {
	clrscr();

	printf( "\n\n1. Operatori binari:\n\n"
		"  +      Esegue la somma\n"
		"  -      Esegue la sottrazione\n"
		"  /      Esegue la divisione\n"
		"  *      Esegue la moltiplicazione\n"
		"  ^      Eleva alla potenza\n"
		"  %      Calcola il modulo (il resto della divisione)\n");
	printf("\nPremi un tasto per visualizzare le funzioni aggiuntive...\n");
	getch();

	printf("\n\n2. Funzioni aggiuntive:\n\n"
		" Funzioni logaritmiche:\n"
		"    ln(N)           Calcola il logaritmo naturale (in base e) di N\n"
		"    log(N)          Calcola il logaritmo decimale di N\n"
		"    log(b,N)        Calcola il logaritmo in base b di N\n\n");
	printf(" Funzioni Trigonometriche:\n"
		"    sin(a)          Calcola il seno dell'angolo a misurato in radianti\n"
		"    cos()           Coseno\n"
		"    tan()           Tangente\n"
		"    sec()           Secante\n"
		"    cot()           Cotangente\n"
		"    cosec()         Cosecante\n"
		"    Varianti:\n"
		"      a-            Calcola l'arco- {-seno, -coseno, -tangente, ...}\n"
		"      -h            Calcola il {seno-, coseno-, tangente-, ...} iperbolico\n"
		"    Esempio:\n"
		"      acosh(.5)    Calcola l'arcocoseno iperbolico di un angolo di 0.5 radianti\n");
	printf("\nPremi un tasto per visualizzare le altre funzioni...\n");
	getch();
	printf("\n\n Altre funzioni:\n"
		"    exp(N)          Funzione esponenziale (calcola e^N)\n"
		"    d2r()           Converte i gradi in radianti\n"
		"    sqrt()          Calcola la radice quadrata\n"
		"    cbrt()          Calcola la radice cubica\n"
		"    root(n,x)       Calcola la radice n-esima di x\n"
		"    fact()          Calcola il fattoriale\n"
		"    fibo()          Calcola il numero di Fibonacci\n");

	printf("\nPremi un tasto per visualizzare le costanti disponibili...\n");
	getch();

	printf("\n\n3. Costanti:\n\n"
		"    PI              Valore del Pi greco ã\n"
		"    E               Valore di e\n");

	printf("\n\n\nNB: I parametri da passare alle funzioni vanno sempre messi tra parentesi.");
	printf("\n    Nell'uso di costanti, il loro nome deve essere preceduto da un '#'.");
	getch();
}


#define START 1
#define ELAPSEDTIME 2
double timeCounter(int todo)  {
	static struct time t1;
	if (todo == START)  {
		gettime(&t1);
	}
	else  {
		struct time t2;
		double dt1, dt2;
		gettime(&t2);
		dt1 = t1.ti_hour*360000 + t1.ti_min*6000 + t1.ti_sec*100 + t1.ti_hund;
		dt2 = t2.ti_hour*360000 + t2.ti_min*6000 + t2.ti_sec*100 + t2.ti_hund;
		return((dt2-dt1)/100);
	}
	return(0);
}


void calcolaFormule(void)  {
	char expr[150];
	double result, time;
	errorType *err;

	clrscr();
	printf("\n\nInserisci una formula:\n");
	while(gets(expr)[0])  {
		printf(" Sto calcolando... ");
		timeCounter(START);
		err = EvaluateExpression(expr, &result);
		time = timeCounter(ELAPSEDTIME);
		gotoxy(1, wherey());
		clreol();
		switch (err->flag)  {
			case 0:
				printf(" Risultato:  %lG\n", result);
				if(time > 3.0L)
					printf(" Tempo impiegato: %lG sec\n", time);
				break;
			case INVALP:
				printf(" Errore:\n  %s:   Parametro non valido!\n", err->funct);
				break;
			case DOMAIN:
				printf(" Errore:\n  %s:   Valore fuori dal dominio della funzione!\n", err->funct);
				break;
			case SYNTAXERROR:
				printf(" Errore di Sintassi!\n");
		}
		printf("\n\nInserisci un'altra formula:\n");
	}
}