Precedente :: Successivo |
Autore |
Messaggio |
maddy Mortale devoto

Registrato: 21/09/09 12:38 Messaggi: 9
|
Inviato: 22 Set 2009 11:04 Oggetto: * come acquisire una funzione in input |
|
|
Ciao ragazzi sto scrivendo un programma in c++ ma non riesco ad acquisire una funzione del tipo y = f(x) da console
in matlab so che si usa il comando in line ma in c++?
Aiutatemi |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 22 Set 2009 14:29 Oggetto: Re: come acquisire una funzione in input |
|
|
... ma il C++ non è matlab, non puoi 'acquisire' una funzione, al massimo una stringa di caratteri. Con scanf() ad esempio. |
|
Top |
|
 |
maddy Mortale devoto

Registrato: 21/09/09 12:38 Messaggi: 9
|
Inviato: 22 Set 2009 14:48 Oggetto: acquisizione funzione |
|
|
cioe se io devo acquisire da console y = f(x) dove f(x) = sin(x) come devo fare????
 |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 22 Set 2009 16:56 Oggetto: Re: acquisizione funzione |
|
|
maddy ha scritto: | cioe se io devo acquisire da console y = f(x) dove f(x) = sin(x) come devo fare? |
Forse ti sfugge il funzionamento del C++? Dovrai costruirti classi e metodi (è un linguaggio ad oggetti) per implementare quello che desideri che, se ho capito cosa intendi, è un parser di funzioni.
Credo che su Internet si possano trovare esempi su come implementare semplici parser.
 |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 22 Set 2009 18:30 Oggetto: |
|
|
SverX ha ragione, non mi risulta che c++ abbia classi/funzioni/librerie standard per valutare un'espressione algebrica.
Puoi però provare con librerie esterne come già stai facendo con gmp.
Al volo ho trovato questa
Tratto dall'intro della guida
Citazione: |
Often people need to ask some mathematical expression from the user and then evaluate values for that expression. The simplest example is a program which draws the graphic of a user-defined function on screen.
This library adds C-style function string parsing to the program. This means that you can evaluate the string "sqrt(1-x^2+y^2)" with given values of 'x' and 'y'.
The library is intended to be very fast. It byte-compiles the function string at parse time and interpretes this byte-code at evaluation time. The evaluation is straightforward and no recursions are done (uses stack arithmetic).
Empirical tests show that it indeed is very fast (specially compared to libraries which evaluate functions by just interpreting the raw function string).
The library is made in ISO C++ and requires a standard-conforming C++ compiler.
|
Spero ti possa aiutare |
|
Top |
|
 |
maddy Mortale devoto

Registrato: 21/09/09 12:38 Messaggi: 9
|
Inviato: 22 Set 2009 21:23 Oggetto: ok |
|
|
ti ringrazio sicuramente misara utile |
|
Top |
|
 |
maddy Mortale devoto

Registrato: 21/09/09 12:38 Messaggi: 9
|
Inviato: 24 Set 2009 14:36 Oggetto: [MANUTENZIONE] acquisizione funzione |
|
|
ciao ragazzi ho acquisito una funzione del tipo y = f(x) da console
come mi e' stato suggerito usando un parser di funzioni c++
con il seguente codice :
Codice: | std::string function;
double minx, maxx,
step;
FunctionParser fparser;
while(true) {
std::cout << "f(x) = ";
std::getline(std::cin, function);
int res = fparser.Parse(function, "x");
if(res < 0) break;
std::cout << std::string(res+7, ' ') << "^\n" << fparser.ErrorMsg() << "\n\n";
} |
e devo dire che il tutto funziona!!
ora pero il mio problema e' come valutare la finzione in un punto.
nella documentazione e' scritto di usare il metodo eval che pero'accetta un double mentre io poiche sto usando le librerie gmp mi trovo un mpfr_class,ho pensato di fare un cast ma la mia paura e' ke potrei perdere precisione..se avete un altra idea fatemelo sapere |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 24 Set 2009 17:13 Oggetto: |
|
|
Scusa la risposta volante ma ho poco tempo: il manuale di gmp parla delle situazioni di cast?
Di fatto tu dovresti castare una classe in un tipo primitivo e questo non è libidinosissimo (azz, che fatica scrivere 'sta parola), non è che per caso c'è qualche metodo della classe che ti ritorna un valore tipo double (o long double)?
E' vero che la libreria nasce per avere una precisione infinita (teorica) ma oltre certi limiti i casi d'uso non sono poi molti.
Per curiosità, quanto precisa devi essere?
Se mi dici che devi arrivare la più a roba tipo 10e-50 vengo a cercarti e ti sposo perchè vuol dire che stai facendo della roba interessante!
P.S.
Ti chiedo di usare il bbcode [ code ]...[ /code ] per racchiudere il codice o lo pseudo codice che posti. Grazie. |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 24 Set 2009 17:14 Oggetto: Re: acquisizione funzione |
|
|
Come è definito il tipo mpfr_class? Può darsi che sia basato sui double... |
|
Top |
|
 |
maddy Mortale devoto

Registrato: 21/09/09 12:38 Messaggi: 9
|
Inviato: 25 Set 2009 13:40 Oggetto: valutazione funzione |
|
|
ciao ragazzi devo dire che grazie ai vostri suggerimenti sto riuscendo a risolvere tutti i miei problemi...ora pero sono di nuovo in difficolta sull' ultimo passaggio :
Codice: | string acquisisciFunzione() {
std::string function;
FunctionParser fparser;
while(true) {
cout << "f(x) = ";
getline(cin, function) ;
int res = fparser.Parse(function, "x");
if(res < 0) break;
cout << string(res+7, ' ') << "^\n" << fparser.ErrorMsg() << "\n\n";
}
return function;
}
void valutaf(mp_limb_t n,std::string &function,mpfr_class t[],mpfr_class v[]) {
FunctionParser fparser;
while(true) {
double tDouble[n];
double valoriF[n];
for(int i = 0; i < n; i++)
{
tDouble[i] = t[i].get_d();//
//cast da mpfr_class a double
//funzione eval richiede un double
valori[i] = fparser.Eval(tDouble);
}
}
|
il mio problema e' che la funzione eval non valuta i valori ke la funzione assume nei punti assegnati in tDouble e non riesco a capirne il motivo
se mi potete dare una mano perche devo consegnare il materiale entro martedi.. |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 25 Set 2009 15:36 Oggetto: Re: valutazione funzione |
|
|
non ho capito un cavolo ma secondo me hai dimenticato delle parentesi quadre e un indice dopo tDouble...
Codice: | valori[i] = fparser.Eval(tDouble[i]); |
|
|
Top |
|
 |
maddy Mortale devoto

Registrato: 21/09/09 12:38 Messaggi: 9
|
Inviato: 25 Set 2009 16:27 Oggetto: |
|
|
no nn funziona!!!! |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 26 Set 2009 00:06 Oggetto: |
|
|
Se stampi a video i valori di tDouble dopo che sono stati inseriti, vedi quello che ti aspetti?
Inoltre io credo che passi il ritorno di acquisisciFunzione a valutaf però all'interno di questa non mi pare che tu faccia mai riferimento al parametro function quindi a me non viene in mente un modo in cui il metodo Eval possa usare appunto questa funzione.
Ti chiedo ancora di wrappare il codice dentro l'appropriato bbcode perchè se no la gente fa fatica a leggere il sorgente. Grazie |
|
Top |
|
 |
maddy Mortale devoto

Registrato: 21/09/09 12:38 Messaggi: 9
|
Inviato: 28 Set 2009 11:09 Oggetto: risolto |
|
|
ho risolto!!!!
semplicemente non inizializzavo la funzione con parser.Function e quindi non veniva passata il reale valore!!!
comunque grazie a tutti per i suggerimenti che miavete inviato |
|
Top |
|
 |
|